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

PyTorch参数未更新问题求助:循环中参数为何无变化?

为什么你的PyTorch参数没有更新?

你的代码中参数看似没有更新,核心原因是梯度量级过小加上学习率不足,导致参数更新幅度微乎其微,肉眼无法察觉。具体分析和修复方法如下:

核心问题

1. 梯度被总市值严重缩放

你的损失函数基于权重 w = (final_shares * prices) / sum(final_shares * prices),对参数 final_shares 求导时,导数公式为:
$$\frac{\partial w_i}{\partial s_i} = \frac{p_i \cdot (sum(mv) - s_i p_i)}{sum(mv)^2} = \frac{p_i \cdot (1 - w_i)}{sum(mv)}$$
初始状态下,sum(mv)(总市值)的数值极大(你的初始参数组合下,总市值轻松突破1万),直接把梯度压缩到 1e-5 甚至更小的量级。而你设置的学习率 eta=0.01,乘上梯度后每次参数更新量仅为 1e-7 级别,完全无法观察到变化。

2. 目标权重的尺度失衡

最后一个资产的价格固定为 1.,目标权重仅为 0.001,但初始份额是 1-50,导致该资产初始权重高于目标;而其他资产的初始权重已经接近目标值。这种失衡加上总市值的缩放效应,进一步稀释了调整最后一个资产份额的梯度,让更新变得更不明显。

修复方案

大幅提高学习率

把学习率从 0.01 调整到 1000(或根据实际收敛情况微调),让参数更新步长足够显著:

eta = 1000
optimizer = torch.optim.SGD([x_param], lr=eta)

可选:降低总市值的量级

可以对价格做归一化处理,避免总市值过大导致梯度被过度压缩:

prices = prices / torch.max(prices)  # 用最大值归一化,或用总和归一化

验证效果

修改后重新运行代码,你会看到 w 逐步向 target_weights_vec 收敛,x_param 的数值也会明显变化。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:33:37