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()
补充说明
- 原代码里先初始化
μr = torch.zeros(2, requires_grad=True)再立刻覆盖,这两行完全多余,直接删除即可 - 切片
params[[0,4]]返回的张量与原params共享数据,梯度会自动反向传播到原始params上 - 循环里的
.sum()对单个标量无意义,去掉后不影响计算结果,还能简化代码
运行修改后的代码,就能看到目标函数值随着迭代逐步下降。
内容的提问来源于stack exchange,提问作者JTT
相关产品推荐
相关产品推荐

