You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中使用自定义变量优化目标函数无更新问题求助

问题原因及解决方案

核心问题是你在target_function里用torch.tensor()重新创建μr和θ时,切断了它们与原始params张量的梯度传播链路。新创建的μr和θ是独立张量,和输入的params没有关联,反向传播时params的梯度始终为0,优化器没法更新参数,目标函数值自然不变。

要保留μr和θ变量的前提下修复,只需直接对params做切片引用,不要重新创建张量:

修改后的目标函数

def target_function(params):
    vector = torch.zeros(10)
    # 直接从params切片,保留梯度连接
    μr = params[[0, 4]]
    θ = params[[3, 7]]
 
    for i in range(2):
        # 单个元素不需要sum,直接计算即可
        vector[i] += μr[i]**2 - θ[i]

    return torch.norm(vector)

完整可运行代码

注意补充优化器的导入语句:

import torch
import matplotlib.pyplot as plt
from torch.optim import SGD

def target_function(params):
    vector = torch.zeros(10)
    μr = params[[0, 4]]
    θ = params[[3, 7]]
 
    for i in range(2):
        vector[i] += μr[i]**2 - θ[i]

    return torch.norm(vector)

# Initialize parameters with random values between 0 and 1
params = torch.rand(10, requires_grad=True)

# Choose an optimizer (e.g., SGD) and specify the learning rate
optimizer = SGD([params], lr=0.01)

num_steps = 100

# Lists to store the values of the target function during optimization
target_values = []

# Optimization loop
for i in range(num_steps):
    # Zero gradients
    optimizer.zero_grad()
    
    # Compute the function value
    output = target_function(params)
    
    # Store the function value
    target_values.append(output.item())
    
    # Compute gradients
    output.backward()
    
    # Update parameters
    optimizer.step()

# Plot the values of the target function during optimization
plt.plot(target_values)
plt.xlabel('Iteration')
plt.ylabel('Target Function Value')
plt.title('Optimization Progress')
plt.show()

补充说明

  1. 原代码里先初始化μr = torch.zeros(2, requires_grad=True)再立刻覆盖,这两行完全多余,直接删除即可
  2. 切片params[[0,4]]返回的张量与原params共享数据,梯度会自动反向传播到原始params上
  3. 循环里的.sum()对单个标量无意义,去掉后不影响计算结果,还能简化代码

运行修改后的代码,就能看到目标函数值随着迭代逐步下降。

内容的提问来源于stack exchange,提问作者JTT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:57:41