前一篇文章,使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started
本篇文章内容来自于 强化学习必修课:引领人工智能新时代【梗直哥瞿炜】
深度学习里面的而优化函数
- 发展历史
- [Momentum 动量法](#Momentum 动量法)
- [AdaGrad 算法](#AdaGrad 算法)
- [AdaDelta 算法](#AdaDelta 算法)
- [RMSProp 算法](#RMSProp 算法)
- [Adam 算法](#Adam 算法)
- Links
发展历史
机器学习,就是随机初始化参数,然后根据损失函数,不断的使用梯度更新参数。 因此,如何精确的调整参数,十分重要,这个参数更新的算法就是梯度下降,梯度下降算法出现后,不断的演进。
梯度下降变种算法提出时间轴:
- 1847 年 梯度下降算法
- 1957 年 随机梯度下降算法 SGD
- 1993 年 动量法
- 1994 年 小批量随机梯度动量法
- 2011 年 AdaGrad 算法
- 2011 年 AdaDelta 算法
- 2012 年 RMSProp/AdaDelta 算法
- 2014 年 Adam 算法
![](https://i-blog.csdnimg.cn/direct/4399ee4a397446f981af4b79e3f4981b.png)
不同梯度下降算法的原理概述
![](https://i-blog.csdnimg.cn/direct/0c7457f89c1f4215bde1f1694986d6af.png)
不同算法的区别,主要体现在 2,3 步。对于1、4 步,是通用的。
核心差异
- 更多参考文章 深度学习里面的而优化函数
![](https://i-blog.csdnimg.cn/direct/ed78c0ec91ea4e3abc27f57d86b1dfa5.png)
通过可视化比较,不同算法在梯度上,选择下降的方向是不同的,论文 《An empirical analysis of the optimization of deep network loss surfaces》。
比如,RMSProp 和 AdaDelta 算法
最佳策略的讨论
不能一下子确定哪个最好,要根据数据、问题进行尝试,通常的经验如下:
- 不想做精细的调优,那么就用 Adam;类似于开车上的自动挡
- 更加自如地控制优化迭代的各类参数,那么 SGD,选择性的添加动量等,相当于开车上的手动挡
- 先用 Adam 快速下降,再用 SGD 调优
![](https://i-blog.csdnimg.cn/direct/34fe44c872d74b848045ebf7de7d5d29.png)
- 还是熟悉自己的数据,如果数据是稀疏的,那么就是选择学习率自适应的算法
- 使用一个小规模的验证集,进行控制变量法的对比,看哪个算法能快速的收敛
![](https://i-blog.csdnimg.cn/direct/634e4659a1114e64810ddb3ba9890523.png)
Momentum 动量法
物理学中的动量
动量守恒定律:一个物质系统不受外力或所受外力之和为零,(即 F 合外力 = 0 F_{合外力}=0 F合外力=0 ),那么它的动量必定守恒 。这个定律用数学表达式记作:
![](https://i-blog.csdnimg.cn/direct/3a42b5c12b0b4df4b1ef7584872f82a4.png)
因为动量是矢量,所以动量守恒定律的等式是一个矢量方程。若物体的运动是一维的,那么可以通过规定正方向将这个方程标量化,其中"+"表示物体运动方向与正方向相同,"-"表示物体运动方向与正方向相反。若物体的运动是二维甚至更高维度,则求和符合矢量相加减的原则。
动量守恒定律不仅适用于二体体系,也适用于多体体系:不仅适用于惯性系,也适用于非惯性系。动量守恒定律的适用范围比牛顿运动定律广。
![](https://i-blog.csdnimg.cn/direct/7046d603c5534d24832677617dadd8a8.png)
深度学习中的动量
优化梯度下降的算法:动量有加速收敛的效果。
![](https://i-blog.csdnimg.cn/direct/2566198b76774c2cb69156abb5d17632.png)
梯度更新
动量随机梯度下降。
将当前的梯度与上一步的梯度加权平均来减少梯度的震荡。
![](https://i-blog.csdnimg.cn/direct/b42a5261bdb34a83ac12ac950777787c.png)
运动轨迹
直观的观察到,为什么动量可以优化学习过程 :
![](https://i-blog.csdnimg.cn/direct/fccb98a9d3a440c09926f52079599ff5.png)
优缺点
![](https://i-blog.csdnimg.cn/direct/ce5c68d0103b47cf88bffe1e8fb6ec17.png)
AdaGrad 算法
AdaGrad 是二阶随机梯度下降动量法的改进版本。二阶动量的出现,意味着自适应学习率优化算法时代的到来。(优化学习率的调整)
基本思想
![](https://i-blog.csdnimg.cn/direct/fe491b78e23c4c6bb6331ae403303c25.png)
对更新的很频繁的参数,更新的慢一点;对更新的不频繁的参数,当更新发生的时候,更新的大一点。更新过程:
- 计算一阶动量 g τ g_{\tau} gτ
- 根据一阶动量计算二阶动量 V t V_{t} Vt
- 根据二阶动量、一阶动量和学习率,计算 η t \eta_{t} ηt
- 根据 η t \eta_{t} ηt 更新参数 w w w
原理:参数更新越频繁, V t V_{t} Vt 越大,因为其出现在分母上,导致最终本次参数更新越小;与之相反,如果在更新过程历史中,参数更新越少,则 V t V_{t} Vt 越小,导致最终参数更新越大。
稀疏特征
当样本空间是稀疏特征矩阵的时候,AdaGrad 算法特别有效果。
![](https://i-blog.csdnimg.cn/direct/9cb5ec06fa194aa6993150b59a58f12b.png)
优缺点
AdaGrad 算法优缺点
左图是 标准的 SGD,右侧是 AdaGrad.
AdaDelta 算法
避免使用手动调整学习率的方法,来控制训练过程。自动调整学习率,使得训练过程更加顺畅。
基本原理
![](https://i-blog.csdnimg.cn/direct/dd075ecdf3044d709809f87f47fe1a04.png)
- 左侧是 RMSProp 算法,右侧是 AdaDelta 算法
- ϵ \epsilon ϵ 是一个正数,防止分母为零
- E 是对当前梯度 g 或 Δ w \Delta w Δw 求期望
优缺点
![](https://i-blog.csdnimg.cn/direct/e85f635f165b4b1e93e068e3720e5858.png)
RMSProp 算法
AdaGrad 存在学习率过小,学习收敛慢的问题。RMSProp 算法是对 AdaGrad 的问题的改进。
基本原理
![](https://i-blog.csdnimg.cn/direct/b8640287588343e3a6526e061f2187a2.png)
基本原理是:改变二阶动量计算方法的策略,不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。
优缺点
![](https://i-blog.csdnimg.cn/direct/14c4ae3fc57341c1a10ebe739aa928e2.png)
缺点:增加了超参数,对稀疏特征矩阵的学习效果变差。
Adam 算法
目前最流行的梯度算法改进。
基本思想
把一阶动量和二阶动量都用起来。自适应动量估计。
- 快速收敛
- 引入两个因子 β 1 \beta_{1} β1 控制一阶动量,通常使用 0.9; β 2 \beta_{2} β2 控制二阶动量,通常设置为 0.999
- m ^ t \widehat m_{t} m t 和 v ^ t \widehat v_{t} v t 分别是对一阶动量和二阶动量的偏差矫正
![](https://i-blog.csdnimg.cn/direct/b8acf6d1b7f84b378e7b0c8bda3e0a9c.png)