介绍一些深度学习的优化器 参考覃秉丰教程
在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提前知道它要去哪里,它还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。γvt−1会用来修改W的值,计算W−γvt−1可以表示小球下一个位置大概在哪里。从而我们可以提前计算下一个位置的梯度,然后使用到当前位置。
上面提到的方法对于所有参数都使用了同一个更新速率。但是同一个更新速率不一定适合所有参数。比如有的参数可能已经到了仅需要微调的阶段,但又有些参数由于对应样本少等原因,还需要较大幅度的调动。于是提出了Adagrad算法,为不同分类设置了不同的学习率。简单的说,就是这类数据出现的越多,这类数据的学习率越小,这类数据出现的越少,这类数据学习率越大。
它是基于SGD的一种算法,它的核心思想是对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数。
它很适合应用于数据稀疏的数据集(比如一个图片数据集,有10000张狗的照片,10000张猫的照片,只有100张大象的照片)。比较稀疏的数据集是指猫和狗的照片很多,而大象的照片很少,即照片分布不均匀。
举例说明:
设置狗是第一个分类(i=1),猫是第二个分类(i=2),大象是第三个分类(i=3)。
第一次抽到狗,即i=1,t=1(第1次抽到狗这个分类),计算g11(第一分类的代价函数的导数(梯度))的平方,此时狗分类学习率η=η/(g11的平方+ε)。
第二次又抽到狗,即i=1,t=2(第2次抽到狗这个分类),计算g21(第一分类的代价函数的导数(梯度))的平方,此时狗分类学习率η=η/(g11的平方+g21的平方+ε)。
第三次还抽到狗,即i=1,t=3(第3次抽到狗这个分类),计算g31(第一分类的代价函数的导数(梯度))的平方,此时狗分类学习率η=η/(g11的平方+g21的平方+g31的平方+ε)。
第四次抽到的是猫,即i=2,t=1(第1次抽到猫这个分类),计算g12(第二分类的代价函数的导数(梯度))的平方,此时猫分类学习率η=η/(g12的平方+ε)。
第五次抽到的是象,即i=3,t=1(第1次抽到象这个分类),计算g13(第三分类的代价函数的导数(梯度))的平方,此时象分类学习率η=η/(g13的平方+ε)。
第六次抽到的还是猫,即i=2,t=2(第2次抽到猫这个分类),计算g22(第二分类的代价函数的导数(梯度))的平方,此时猫分类学习率η=η/(g12的平方+g22的平方+ε)。
以此类推
优点:从举例中可以看出,Adagrad确实可以达到对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数这个目的。
缺点:Adagrad主要的优势在于不需要人为的调节学习率,它可以自动调节。它的缺点在于,随着迭代次数的增多,学习率也会越来越低,最终会趋向于0。
RMS(Root Mean Square)均方根
RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前t-1次梯度平方的平均值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop**不会出现学习率越来越低的问题,而且也能自己调节学习率,并且可以有一个比较好的效果**。
ΔWt等于负的学习率除以前t次的梯度平方的平均值加上ε的和的平方根点乘当前这次(也就是第t次)的梯度
分子对上一次(t-1)的ΔW求均方根,分母对这一次(t)的梯度求均方根。
使用Adadelta我们甚至不需要设置一个默认学习率,在Adadelta不需要使用学习率也可以达到一个非常好的效
果。
就像Adadelta和RMSprop一样Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些
处理之后再使用类似Adadelta和RMSprop的方式更新参数。
这里的速度是指模型收敛的速度,也就是得到正确模型的速度。虽然SDG的收敛速度可能会比其他优化器慢,但是模型识别的准确率不一定是最差的。
五角星位置为全局最小值,Adadelta最快,SGD最慢。
马鞍问题,除了SGD以外其他方法均能够逃离马鞍,找到最正确的位置。