建设商城网站公司 百度百科,南京建设工程质量监督站网站,站长工具源码,网页制作平台有什么Adam 优化器于 2014 年推出#xff0c;其思想#xff1a;既然知道某些参数移动得更快、更远#xff0c;则每个参数不需要遵循相同的学习率#xff0c;因为最近梯度的平方代表每一个权重可以得到多少信号#xff0c;可以除以这个#xff0c;确保即使是最迟钝的权重也有机会… Adam 优化器于 2014 年推出其思想既然知道某些参数移动得更快、更远则每个参数不需要遵循相同的学习率因为最近梯度的平方代表每一个权重可以得到多少信号可以除以这个确保即使是最迟钝的权重也有机会起作用。Adam 在收敛性证方面有明显问题需要调整参数。 L2 正则化是减少过拟合的经典方法会向损失函数添加由模型所有权重的平方和组成的惩罚项并乘上特定的超参数以控制惩罚力度pytorch表示loss wd * weights.pow(2).sum()/2wd 为超参数控制惩罚力度称为权重衰减当运用原版 SGD 时等价于使用如下方程式更新权重w w - lr * w.grad - lr * wd * wlr 为学习率、w.grad 表示损失函数对 w 的导数wd * w 表示惩罚项对 w 的求导结果。每一次更新都会减去一小部分权重这就是「衰减」的来源。 通常实现库都使用第一种形式通过梯度 wd*w 而实现算法而不是真正地改变损失函数。因为不希望增加额外的计算量来修正损失。当添加动量或使用如 Adam 那样复杂的最优化方法L2 正则化第一个方程和权重衰减第二个方程会有很大的不同。在本文其余的部分中我们讨论权重衰减指的都是第二个方程式而讨论 L2 正则化都是讨论第一个经典方式。 如下在带动量的 SGD 中L2 正则化与权重衰减是不等价的。L2 正则化会将 wd*w 添加到梯度中但现在权重并不是直接减去梯度。首先需要计算移动均值moving_avg alpha * moving_avg (1 - alpha) * (w.grad wd * w)之后权重通过减去乘上了学习率的移动均值更新。w 更新中涉及到的正则化为 lr * (1 - alpha) * wd * w 加上已经在 moving_avg 中前面权重的组合。权重衰减的更新方式可以表示为 moving_avg alpha * moving_avg (1 - alpha) * w.grad w w - lr * moving_avg - lr * wd * w 从 w 中减去有关正则化的部分在两种方法中是不同的。使用 Adam 优化器时权重衰减的部分可能相差更大因为 Adam 中的 L2 正则化需要添加 wd * w 到梯度中分别计算梯度及其平方的移动均值再更新权重而权重衰减方法只是简单地更新权重并每次从权重中减去一点。显然这是两种不同的方法实验验证应该在 Adam 算法中使用权重衰减方法(AdamW)而不是经典深度学习库中实现的 L2 正则化。 使用 fastai 库时在使用 fit 函数时添加参数 use_wd_schedTrue 就能实现model.fit(lr, 1, wds1e-4, use_wd_schedTrue)。 在优化器中的阶梯函数只需要使用梯度修正参数不使用参数本身的值权重衰减在外部处理然后在最优化器之前实现权重衰减但仍需要在计算梯度后完成否则会影响梯度值。所以在训练循环中必须确定计算权重衰减的位置loss.backward()optimizer.step()在optimizer step 处做权重衰减最优化器应该设定 wd0否则其还会做一些 L2 正则化。现在在权重衰减的位置中可以在所有参数上写一个循环语句并依次采用权重衰减的更新。参数应该存储在优化器的字典 param_groups 中循环如下
loss.backward()
for group in optimizer.param_groups():for param in group[params]:param.data param.data.add(-wd * group[lr], param.data)
optimizer.step()参考
当前训练神经网络最快的方式AdamW优化算法超级收敛 - 知乎