前言
极大似然,反向传播,梯度下降
这仨都不了解的话,不要继续往下看了,搞懂了再来看。这些内容细写起来都是很长的。
推荐学习顺序 概率论(频率学派和贝叶斯区别搞清楚)->lr,softmax(极大似然)->反向传播。(极大似然从概率图来切入更深刻,lr这种判别式直接给定义的,理解很难深刻)
1 优化算法是什么
拿lr举例,极大似然公式如下
极大似然是把问题建模为概率分布P(w,b|x,y)(联合概率就是生成,条件概率就是判别式),也就是我们天天说的cost function(当然cost function也是可以写一篇文章的)。
所以,找到w,b让P(w,b|x,y)为极大值,(当然最小二乘就是极小值)的算法就是优化算法。
2 batch
2.1 batch是啥
拿lr的极大似然举例,如下为梯度的公式
很明显,梯度需要所有样本来计算
现在神经网络动不动上百万训练样本,迭代一次计算量太夸张。
现在的主流方案就是一次取n(0<n<<N)个来计算,也就是我们天天说的batch。
2.2 为何能收敛
我们每次只取了一小部分样本,且训练样本中,往往noisy不少,计算的梯度是真的是全局最优,真的能收敛?
首先,收敛是在一定条件下才能收敛,而不是无条件收敛。(需要合理的学习率和batch大小)
具体的数学证明谁有兴趣就自己推吧,参看这三篇文章https://people.eecs.berkeley.edu/~brecht/cs294docs/week1/09.Nemirovski.pdfhttps://arxiv.org/abs/1606.04838https://www.zhihu.com/question/27012077/answer/122946984
2.3 碰到的问题(主要针对一阶求导)2.3.1 学习率的选择
随机取n个,计算的梯度往往不是最佳梯度。所以,学习率一旦过大,加上梯度本来就不是很准,会导致最终在极值点来回波动。2.3.2 不同的参数学习率往往不同
如上,最佳的学习率,不同的情况下,往往不一样,这就带来了一个问题,每次我们都要大量迭代来寻找一个最优学习率。2.3.3 很容陷入局部最小值
特别对于非凸问题,陷入局部最优就出不来了
3 无导数优化算法
这里简单提一嘴,业界主流都是对cost function一阶求导,然后梯度下降来找极值点。但事实上还是有无导数优化方法的。3.1 选点法 蒙特卡洛方法,黄金切割等3.2 子空间迭代法,如 JFNK算法等3.3 智能优选方法,如模拟退火,粒子群,遗传算法
4 一阶导数优化方法
顾名思义,对cost function求导,然后朝着梯度的方向前进。4.1 梯度下降法 (业界主流,也是本篇文章重点)
方法如下,看起来很多,但抽象起来也就几种,这里重点介绍和adam相关的算法(因为这种算法大部分情况下用起来效果最好)
所有的方法都是基于如下公式来优化的,这个公式我就不介绍内容了,看不懂参看前言。
4.1.1 动量(Momentum)——exponential moving average
从公式可以看到,这个方法是用历史积累的梯度和现在的梯度来更新。
当β=0,基础公式没啥区别了。β常用的取值为0.9
优点——sgd往往计算的梯度不是全局最优,且因为noisy的存在,梯度甚至会跟最优梯度有很大差距,导致震荡。考虑历史积累的梯度能保证迭代的平缓。
缺点——很明显,学习率还是需要我们自己设定初始值
4.1.2 Adagrad
S初始化为0,
很明显,一开始S值较小,学习率高,随着迭代S累积值越大,学习率变得越来越小。以及用平方(二阶矩类似L2,L2能够对数值起到平滑的效果) 优点——快速接近极值点。迭代多了梯度开始变小,此时理论上已经接近极值点了,小学习率更能找到极值点。 问题——什么时候理论上接近极值点不可控,可能离极值点很远,学习率已经衰减的的非常厉害了。
这里不介绍的两种优化方法,窗口方和牛顿法 https:// blog.csdn.net/XiangJiao Jun_/article/details/83960136
4.1.3 RMSprop
针对Adagrad的问题的优化,公式如下
核心区别在于S不是累加而是借鉴了动量的思路,S的波动更合理
4.1.4 Adam
adam是对RMSprop和Momentum的一个结合,公式如下。
优点自然是结合了两种算法的优点,V和S都初始化为0,
4.1.4 Nesterov梯度加速法
与Momentum类似,但使用的V为投影梯度(projected gradients)的exponential moving average。
具体细节自己了解吧——
[On the importance of initialization and momentum in deep learning](On the importance of initialization and momentum in deep learning)
4.1.5 LAMB
这个算法的提出的是针对大batch的训练的优化方案,有多大。google用这个算法从512扩展到65536.
以及,你肯定忍不住想问个问题,扩大batch会导致什么问题,导致需要针对大batch做一个算法。
这里有两篇paper研究过。
第一,如果batch过小,那么肯定batch之间的梯度差别很大,会导致不利于收敛。但是如果batch过大,每次梯度差别不大,一路就到最底部了,看着很好,但这样容易陷入局部最优。
第二,我们的训练样本量级是固定的,batch大了自然步数就变小了,且这个时候learning rate还更准了。所以下降的梯度整体变少了。
详情参看这个回答——https://www.zhihu.com/question/32673260/answer/675161450
特别链式传播,越是底层,往往梯度越小(因为连续乘,梯度消失)。所以,lamb在adam的基础上,还考虑了当前优化的参数的信息。
https://zhuanlan.zhihu.com/p/86529347
4.2 坐标下降法与随机梯度下降法等,对于大规模问题减小梯度法的计算量
4.3 次梯度法,如次梯度投影法等,用于次可微函数
4.4 拟牛顿法,如PFP法,BFGS法,L-BFGS法等,近似Hessian矩阵减少计算量,用于大规模问题
4.5 共轭梯度法,复杂度只有O(n),用于大规模问题
4.6 椭球法,用于拟凸函数问题
4.7 罚函数法与拉格朗日乘子法,把约束条件当做惩罚项或考虑鞍点问题,用于约束优化问题
5 二阶导数优化方法
不常用,因为二阶导数算起来麻烦,不过有模拟二阶算法的思路。
5.1 牛顿法
5.2 序列二次规划法(SQP),用于约束优化问题
5.3 内点法,用于约束优化问题,也有内点法属于一阶优化算法
6 其他(机器学习不常见的传统优化领域算法)
6.1 信赖域法,与以上的线搜索方法不同的思路
6.2 线性规划方法,如单纯形法,最大流与最小割算法等
6.3 半定规划方法(SDP),与上述算法有很多结合
6.4 组合优化方法
6.5 量子优化方法,如量子退火,量子半定规划(QSDP),量子逼近优化算法(QAOA)等
结论,可以看到优化算法非常多,但实际上深度学习用的就那么一小块内容。并且公式其实也很简单。
参考文章
什么是梯度下降法? - 陈琛的回答 - 知乎 https://www.zhihu.com/question/305638940/answer/770984541
一文看懂各种神经网络优化算法:从梯度下降到Adam方法 - 量子学园的文章 - 知乎 https://zhuanlan.zhihu.com/p/27449596
机器学习与运筹优化(七)常见优化算法小结 - 量子星图-蜜汁酱的文章 - 知乎 https://zhuanlan.zhihu.com/p/43909822