赞
踩
如果每次调的太大,loss变化就很快:调的太小,loss变化的太慢,这样都找不到最小的loss。
那么,我们怎么调整学习率呢?很容易想到,一开始调的时候,设置的大一些,经过几次调整,快接近目标时,我们就把学习率调小一些。那么最好的情况应该是对于每一个不同的参数设置不同的学习率。于是就有了不同的梯度下降的方法。
采取这种方法调整参数的过程如下:第一个公式Vanilla Gradient descent
就是传统的梯度下降的方法,(请参考上一篇文章)第二种Adagrad就是在第一种的基础上加了一个σ,σ的计算过程如第二张图。
第二张图在这里:
约分简化如下:
那么问题来了,对于传统的梯度下降,梯度gradient越大,变化的越快,但是在Adagrad里g和分母正好变化相反,这里是什么原因呢,其实为了造成一种反差的效果。
其实,它加的分母是过去所有gradient的和,如果过去的gradient很大,说明比较陡,那么就用学习率除以大的数,让它下一次变化的小一点;如果过去的gradient比较小,那么就可以放心的走下去,让下次变化大一些。
RMSProp公式和Adagrad类似,只不过学习率除以的那个数不一样,Adagrad的那个分母是直接把所有过去的gradient加起来,但是RMSProp有点类似的借用SGDM的算法,确保学习率除以根号v不会永无止境的变大,在时间上和前面的梯度有联系,这样就不会出现Adgrad的问题(走没几步就因为前几步的梯度太大停下)。
但是这样还不能解决SGD存在的可能卡在gradient为0的位置,所以Adam算法就把SGDM和RMSProp结合起来。
传统的需要看完所有的输入x才更新参数,(内层的求和符号表示是对i求和,也就是第某个输入x的所有特征,外层的求和是对n求,表示n个输入),但是SGD每看到一个输入x(外层没求和),就更新一次参数,所以更快。
还有一种SGDM(SGD with Monmentum),为Monmentum定义一个向量,移动的时候受之前时刻的gradient的影响,这么做的原因是可以避免SGD中出现局部梯度为零的情况。
如下图,如果是SGD,到达第三个点的时候就不会动,如果到第四个点就会往回走,往左边移动,但是SGDM有过去时刻的梯度,就会往右边移动。
通过求对数或者指数使数据分布范围近似。
常见的方法,其中m是平均值,σ是标准差,
梯度下降的原理可以用泰勒级数来解释,把损失函数用泰勒级数展开如下,
然后在红圈里求最小的损失函数:
不难发现怎么让损失函数最小呢?就是让我, △θ最大,假设中心点向量为u,v,那么让△θ取和u,v相反的方向,且取到圈圈的边缘就可保证损失函数最小。所以△θ就是u,v乘以一个负数,保证反向。
代换一下如下图所示,就表示出了梯度下降。
通常在CV领域都用SGDM,在NLP大部分都会用Adam。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。