我正在充满动力地研究 SGD,并且遇到了两个版本的更新公式。
第一个来自维基:
dw = a * w - lr * dL/dw # w: weights; lr: learning rate; dL/dw: drivatives of loss function over w
w := w + dw
第二个版本更常见:
dw = a * w - (1 - a) * dL/dw
w := w + dw
我的问题是:为什么
dL/dw
项的系数必须是(1-a)
?在我看来,即使lr != (1 - a)
,这仍然有意义。我问chatgpt,它告诉我第一个版本不正确,但没有提供原因。
你应该将梯度
dL/dw
视为一个数字序列,那么动量的想法就是跟踪序列 dL/dw
的移动平均值,并朝着该平均值的方向前进,而不是沿着实际梯度,可能会有噪音,因为它是从单个示例/小批量计算得出的。
公式
dw = a * dw - (1 - a) * dL/dw
代表了一种轻松计算每一步指数移动平均线 (EMA) 的方法。回答你的问题:如果第二项的系数不是(1-a)
,那么结果就不能被合理地描述为平均值。
dL/dw
是一个常数序列会发生什么,
(1-a)
意味着 dw
将是常数并且等于 dL/dw
dw
要么收敛到零,要么发散如果你想改变学习率,你应该使用:
dw = a * dw - (1 - a) * dL/dw
w := w + lr * dw