目录
?
梯度下降方法:SGD,Momentum,AdaGrad,RMSProp,Adam
批量梯度下降法(Batch gradient descent)
随机梯度下降法(Stochastic gradient descent)
朴素梯度下降法的局限:
- 学习率一致不变,如果太小则收敛慢且容易陷入局部最小,如果太大则容易发生震荡无法收敛
- 梯度更新只是参考了本次梯度的最新,并没有参考梯度变化的历史,
?
?
?
参考链接:https://blog.csdn.net/u010089444/article/details/76725843(最重要的链接)、https://zhuanlan.zhihu.com/p/147275344
深度学习入门的神视频:为什么随机梯度下降方法能够收敛? - YJango的回答 - 知乎 https://www.zhihu.com/question/27012077/answer/501362912
梯度的方向就是损失函数之变化最快的方向。
线性回归的梯度下降的例子:https://www.jianshu.com/p/c7e642877b0e
梯度下降算法(Gradient Descent Optimization)是神经网络模型训练最常用的优化算法。对于深度学习模型,基本都是采用梯度下降算法来进行优化训练的。梯度下降算法背后的原理:目标函数?关于参数??的梯度将是损失函数(loss function)上升最快的方向。而我们要最小化loss,只需要将参数沿着梯度相反的方向前进一个步长,就可以实现目标函数(loss function)的下降。这个步长?又称为学习速率。参数更新公式如下:
理想的梯度下降算法要满足两点:收敛速度要快;而且能全局收敛。
?
批量梯度下降法(Batch gradient descent)
每更新一个参数θj heta_jθj都遍历一遍样本集,在mmm很大时,该算法就显得比较低效。但是,批量梯度下降法能找到全局最优解:
优点:
- cost fuction若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值
缺点:
- 由于每轮迭代都需要在整个数据集上计算一次,所以批量梯度下降可能非常慢
- 训练数较多时,需要较大内存
- 批量梯度下降不允许在线更新模型,例如新增实例。
随机梯度下降法(Stochastic gradient descent)
又被称为在线学习
优点:
- 可以在线更新
- 有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优
- 针对大数据集,引入了随机梯度下降法。即得到了一个样本,就可以执行一次参数更新。所以其收敛速度会快一些,
-
相较于批量梯度下降法,随机梯度下降法每次更新θj heta_jθj只会用当前遍历的样本。虽然外层循环仍需要遍历所有样本,但是,往往在样本尚未遍历完时就已经收敛,因此,面临大数据集时,随机梯度下降法性能卓越
缺点:
- 容易收敛到局部最优,并且容易被困在鞍点
- 但是有可能出现目标函数值震荡现象,因为高频率的参数更新导致了高方差
小批量梯度下降
-
小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法,每计算bb次训练实例,便更新一次参数 hetaθ
难点:
- 选择适当的学习率α \alphaα?较为困难。太小的学习率会导致收敛缓慢,而学习速度太块会造成较大波动,妨碍收敛。
- 目前可采用的方法是在训练过程中调整学习率大小,例如模拟退火算法:预先定义一个迭代次数m,每执行完m次训练便减小学习率,或者当cost function的值低于一个阈值时减小学习率。然而迭代次数和阈值必须事先定义,因此无法适应数据集的特点。
- 上述方法中, 每个参数的 learning rate 都是相同的,这种做法是不合理的:如果训练数据是稀疏的,并且不同特征的出现频率差异较大,那么比较合理的做法是对于出现频率低的特征设置较大的学习速率,对于出现频率较大的特征数据设置较小的学习速率。
- 近期的的研究表明,深层神经网络之所以比较难训练,并不是因为容易进入local minimum。相反,由于网络结构非常复杂,在绝大多数情况下即使是 local minimum 也可以得到非常好的结果。而之所以难训练是因为学习过程容易陷入到马鞍面中,即在坡面上,一部分点是上升的,一部分点是下降的。而这种情况比较容易出现在平坦区域,在这种区域中,所有方向的梯度值都几乎是 0。
-
又被称为随机梯度下降
-
在线学习算法指的是对数据流而非离线的静态数据集的学习
-
在线学习的算法与随机梯度下降算法有些类似:对单一的实例进行学习,而非对一个提前定义的训练集进行循环,唯一的区别的是不会使用一个固定的数据集,而是获取一个用户样本,从那个样本中学习,然后丢弃那个样本并继续下去,如果某一种应用有一个连续的数据流,这样的算法可能会非常值得考虑
-
一旦对一个数据的学习完成了,便可以丢弃该数据,不需要再存储它了。这种方式的好处在于,算法可以很好适应用户的倾向性,针对用户的当前行为不断地更新模型以适应该用户
-
优点:如果有一个变化的用户群,又或者尝试预测的事情在缓慢变化,就像用户的品味在缓慢变化,在线学习算法可以慢慢地调试学习到的假设,将其调节更新到最新的用户行为
-
将数据集分配给多台计算机,让每一台计算机处理数据集的一个子集,然后将计算的结果汇总再求和,这样的方法叫做映射简化
-
如果任何学习算法能够表达为:对训练集的函数的求和
-
那么便能将这个任务分配给多台计算机(或者同一台计算机的不同 CPU 核心),以达到加速处理的目的
-
假定有 400400400 个训练实例,可以将批量梯度下降的求和任务分配给 444台计算机进行处理:
?
——补充:
可以作为大规模机器学习方法,参考链接:https://baozoulin.gitbook.io/-stanford-machine-learning/week-10/daguimojiqixuexi/156-ying-she-hua-jian-he-shu-ju-bing-xing
?
?
参考链接:https://zhuanlan.zhihu.com/p/31630368
SGD方法的一个缺点是其更新方向完全依赖于当前batch计算出的梯度,因而十分不稳定。Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:
?
delta = - learning_rate * gradient +?previous_delta * decay_rate?(方程1)
theta += delta?(方程2)
冲量梯度下降算法是Boris Polyak在1964年提出的,其基于这样一个物理事实:将一个小球从山顶滚下,其初始速率很慢,但在加速度作用下速率很快增加,并最终由于阻力的存在达到一个稳定速率。对于冲量梯度下降算法
多了一个超参 ,一般取接近1的值如0.9。相比原始梯度下降算法,冲量梯度下降算法有助于加速收敛。当梯度与冲量方向一致时,冲量项会增加,而相反时,冲量项减少,因此冲量梯度下降算法可以减少训练的震荡过程。
-
AdaGrad,Adaptive?Gradient?
-
AdaGrad是Duchi在2011年提出的一种学习速率自适应的梯度下降算法。在训练迭代过程,其学习速率是逐渐衰减的,经常更新的参数其学习速率衰减更快,这是一种自适应算法。
-
Adagrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。因此,Adagrad非常适合处理稀疏数据。
-
Adaptive?Gradient 算法,简称 AdaGrad,不是像动量一样跟踪梯度之和,而是跟踪梯度平方之和,并使用这种方法在不同的方向上调整梯度。?
-
Adagrad的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大,从而梯度趋近于0,使得训练提前结束。
-
在机器学习优化中,一些特征是非常稀疏的。 稀疏特征的平均梯度通常很小,所以这些特征的训练速度要慢得多。 解决这个问题的一种方法是为每个特征设置不同的学习率,但这很快就会变得混乱。
Adagrad 解决这个问题的思路是: 你已经更新的特征越多,你将来更新的就越少,这样就有机会让其它特征(例如稀疏特征)赶上来。 用可视化的术语来说,更新这个特征的程度即在这个维度中移动了多少,这个概念由梯度平方的累积和表达。 注意在上面的一步一步的网格插图中,如果没有重新缩放调整(1b) ,球大部分会垂直向下移动; 如果有调整(1d) ,它会沿对角线方向移动。 -
sum_of_gradient_squared = previous_sum_of_gradient_squared + gradient2
delta = -learning_rate * gradient?/ sqrt(sum_of_gradient_squared)
theta += delta
-
-
RMSprop,Root?Mean?Square?Propagation:
-
RMSprop是Hinton在他的课程上讲到的,其算是对Adagrad算法的改进,主要是解决学习速率过快衰减的问题。其实思路很简单,类似Momentum思想,引入一个超参数,在积累梯度平方项进行衰减:
-
Adagrad会累加之前所有的梯度平方和,因此只会增加而不会减小,而RMSprop仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
-
Rmsprop (Root?Mean?Square?Propagation)通过添加衰减因子来修复这个问题。
sum_of_gradient_squared = previous_sum_of_gradient_squared?* decay_rate+ gradient2?* (1- decay_rate)
delta = -learning_rate * gradient / sqrt(sum_of_gradient_squared)
theta += delta
-
-
Adam,Adaptive moment estimation:
-
Adam是Kingma等在2015年提出的一种新的优化算法,其结合了Momentum和RMSprop算法的思想。相比Momentum算法,其学习速率是自适应的,而相比RMSprop,其增加了冲量项。
-
它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
-
另外,在数据比较稀疏的时候,adaptive的方法能得到更好的效果,例如Adagrad,RMSprop, Adam 等。Adam 方法也会比 RMSprop方法收敛的结果要好一些, 所以在实际应用中 ,Adam为最常用的方法,可以比较快地得到一个预估结果。
-
同时兼顾了动量和 RMSProp 的优点。Adam 的速度来自于动量和RMSProp 适应不同方向的梯度的能力。 这两者的结合使它变得更强大。
-
sum_of_gradient = previous_sum_of_gradient * beta1 + gradient * (1 - beta1)?[Momentum]
sum_of_gradient_squared = previous_sum_of_gradient_squared * beta2 + gradient2 * (1- beta2)?[RMSProp]
delta = -learning_rate * sum_of_gradient / sqrt(sum_of_gradient_squared)
theta += delta
-