1.梯度下降原理
梯度下降的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。最常用的例子就是下山,例如每1步算是一次步长,每次向下走都找最陡峭的地方(不考虑摔死的情况...)。假设山体是近似光滑没有山谷的,那么最终会找到一条最短最快的下山路径,这个路径也是梯度最陡的地方。
公式: x1 = x0 + λ▽J(x) (1)
J是关于x的一个函数,我们当前所处的位置为x0点,要从这个点走到J的最小值点。首先确定前进的方向,也就是梯度的反向,然后λ的步长,就到达了x1这个点。以上就是梯度下降的直观解释。
2.深度学习中的梯度下降
2.1 sgd
深度学习一般都用小批量梯度下降算法(Mini-batch gradient descent)。下面再说sgd算法,实际上指的就是mini-batch gradient descent算法,没有人会去一次拿整个数据集或者一个样本进行优化。核心原理还是公式1。
优缺点;
(1) 学习率大小和策略选择困难。使用mini-batch的时候,可以收敛得很快.
(2) 学习率不够智能,对参数的各个维度一视同仁。
(3) 同时面临局部极值和鞍点的问题。不能解决局部最优解的问题
(4) 在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。
2.2 Momentum 动量法
动量法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成, 减少2.1方法带来的震荡,让梯度平缓一些。公式如下
vt = β * vt-1 + λ▽J(x) (2)
x1 = x0 + vt (3)
图示动量项就是公式2中的 (1 - λ)* vt-1 B点的梯度就是公式2中的λ▽J(x) 梯度更新方向就是 整个公式2
对比图 可以看出明显抖动小一些
2.3 NAG算法
前面三个算法代码如下;
class torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)[source]
实现随机梯度下降算法(momentum可选)。
参数:
params (iterable) – 待优化参数的iterable或者是定义了参数组的dict
lr (float) – 学习率
momentum (float, 可选) – 动量因子(默认:0)
weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)
dampening (float, 可选) – 动量的抑制因子(默认:0)
nesterov (bool, 可选) – 使用Nesterov动量(默认:False)
例子:
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()
未完 待续........
参考文献:
https://blog.csdn.net/qq_41800366/article/details/86583789
https://blog.csdn.net/weixin_36811328/article/details/83451096
https://blog.csdn.net/kyle1314608/article/details/104401836