梯度下降法常见学习率的选择

 

        本文是笔者在学习机器学习的记录,若有错误欢迎指出修正,谢谢大家的监督了!

       一.引言/背景

        (引言:梯度下降法的来源)

        线性回归模型中,我们核心在于如何让损失函数J\left ( x \right )达到最小化。从高中知识来讲,无非求导寻找到极值点,然后确定最小值而已。下给出J\left ( x \right )求最小值的公式化推导(比较抽象,与本文关系不大,可以跳过)。

        已知:J\left ( w \right ) =\frac{1}{2l}\left \| Xw-y \right \|^{2}(由于我们是对特定样本(即X,y确定)寻找J的最小,故以参数w为自变量。在吴恩达课程中,常见的为\frac{\partial J}{\partial w},\frac{\partial J}{\partial b}两种表达方式。)

可得:J(w)=\frac{1}{2l}(Xw-y)^{T}(Xw-y)

J(w)=\frac{1}{2l}(w^{T}X^{T}Xw-(Xw)^{T}y-y^{T}Xw+y^{T}y)

=\frac{1}{2l}(w^{T}X^{T}Xw-2(X^{T}y)^{T}w+y^{T}y)

        对其求梯度得:

\triangledown _{w}J=\frac{1}{2l}(2X^{T}Xw-2X^{T}y)

        故其驻点方程为:

2X^{T}Xw=2X^{T}y

        为了判断是极大or极小值(你也不想得到一个损失值最大的人工智障对吧),再次对w求梯度得到黑塞矩阵:

\triangledown _{w}^{2}J=\frac{1}{2l}2X^{T}X=\frac{1}{l}X^{T}X

        对于较简单的二维矩阵(即两个label)可能较好应付,但是面对大量label,高维度的矩阵,计算将会是极为困难,甚至难以实现。由此,梯度下降方法孕育而生。

        在吴恩达课程中,梯度下降公式为:w=w-\alpha \frac{\partial J}{\partial w},b=b-\alpha \frac{\partial J}{\partial b},本文将同一使用梯度而非偏导表示。

        而由上文推导(毕竟numpy库里貌似没有求偏导的函数,所以了解如何进行矩阵偏导运算还是有必要的(但实际上调用一个sklearn的LinearRegression就好了)),实际实现公式为:

w=w-\frac{\alpha }{l} (-X^{T}y+X^{T}Xw)

        (2)学习率的选择

        在上式中,\alpha被称作学习率,是一项人工选择的参数。

        (不熟练使用各种绘图工具,能会意就彳亍了())

        如何选择一个合适的学习率则是本文探讨的重点:

        学习率较低时,收敛较慢,可能较长时间才能收敛到最低点。

        学习率较高时,收敛会快,但是容易振荡甚至不收敛

        二.梯度下降法的改进(即如何更好确定学习率)

        (1)动量项梯度下降法

        动量项梯度下降法核心在于,学习率是与上一次学习率相关的。由此它会保证继续以上一次梯度前进方向继续前进。就好像物理中的动量一样,即使受到重力(梯度),物体还是需要时间(Ft=mv)才能停下来,再此期间其仍然不断向上。

        更新公式引入了动量项:

        v_{k}=-\alpha \triangledown _{w}J+\mu v_{k-1}

w=w+v_{k}

        其好处在于:消除了病态条件下的振荡。可以这样理解:当我们下降过多去到对面山坡时,按照原本公式我们应该反向下降,但是由于学习率过大,我们方向下降再次过多回到原本山坡。而动量项让我们不再回头,或者强制性减小回头的影响。从而直接翻过这个坡,向另一个局部最低点前进。(既然得不到你那就扭头就走,走的很坚决)

        (2)AdaGrad(Adaptive Gradient)算法:

        此算法累积了全局的梯度值信息。核心在于:既然振荡原因是学习率过大,那我们走的步数越多学习率越小,就算一开始振荡,走久了也就荡不起来,慢慢的也会回到局部最小值。

        其迭代公式为:

w=w-\alpha \frac{g}{\sqrt{\sum_{}^{}g^{2}}+\varepsilon }

        其中,g表示迭代的梯度向量。至于加上\varepsilon,则是防止除0或者近0整数

        (3)RMSPrap算法

        AdaGrad算法遗留了一个很严重的问题:首先,需要大量的存储空间存储g(可解决)。其次,分母大量累计,学习率将会趋于0,造成无法有效梯度下降。既然大量的存储以前的梯度会造成无法下降,那我们为什么不直接去除大部分的梯度,只保留一点梯度,这样你才知道这是改进后的梯度下降呢?由此提出了RMSPrap算法。

        其核心答题不变。但是修改了如何累加g。此处我们记:E_{i}(g^{2})=\sum_{1}^{i}(g^{2})表示到第i次累加的梯度。

w=w-\alpha \frac{g}{\sqrt{E_{i}(g^{2}))}+\varepsilon }

        而E_{i}的迭代公式为:

E_{i}(g^{2})=\delta E_{i-1}(g^{2})+(1-\delta)g_{i}^{2}

        从公式中我们不难理解其原理:我们直接将过去的忘了不就好了吗?

        (4)AdaDelta算法:

        我们看到,AdaGrad算法最大的问题在于对全局梯度太过于依赖,AdaDelta算法则对AdaGrad算法进行了改进去除了对全局学习率的依赖。

        定义:RMS(g)_{k}=\sqrt{E(g^{2})_{k}+\varepsilon }(请问学计算机的一定要取这么奇怪的名字吗?)

        迭代公式为:\triangle w=-\frac{RMS(\triangle w)_{k-1}}{RMS(g)_{k}}g_{k}

        其中:

E_{i}(g^{2})=\delta E_{i-1}(g^{2})+(1-\delta)g_{i}^{2}

        与RMSPrap相同。但是其引入了

E_{i}(\triangle w^{2})=\delta E_{i-1}(\triangle w^{2})+(1-\delta)\triangle w_{i}^{2}

        从而:

        w=w+\triangle w

        (5)Cyclical Learning Rates:

        此方法是笔者在逛IEEE时无意间看到的。就文章的实验结果来说,此方法在准确率等并未有较明显提升,而在学习速度上有较小的提升(并未过大)。但文中提出部分思想具有前瞻性,故在此也一并讨论。

        原文源自:Cyclical Learning Rates for Training Neural Networks. Leslie N.Smith 2017 IEEE Winter Conference on Applications of Computer Vision.DOI 10.1109/WACV.2017.58

        Cyclical Learning Rate,顾名思义可知其学习率时周期性变化的。文中提出了一个很重要的观点:即使学习率过大导致跳出极小值的坑,并非无利的。这个观点与动量项的观点有些不谋而合。由此,其提出了学习率可以在一个周期内进行变化。

        而文中指出,周期选择需要以下几点:Maximum bound,Minimum bound,stepsize。而文中指出三角形作为最简单的图像适合作为周期。

        而如何确定Max与Min呢?Leslie建议,不妨先跑几轮epoch,从不同学习率的学习效果确定Max与Min。

        而对stepsize,Leslie将stepsize设成一个epoch所包含的iteration数量的2-10倍。由此,我们确定了最重要的几个参数。

        三 .总结

        如果学习方面不在此,以上全部不用看,直接调用sklearn的LinearRegression。如果要自己尝试的话,各个方法各自拥有各自的特点,建议按需索取,可以的话尝试多种方法。

        下一篇打算写最近学的正则化,但是发现书上就讲了L1和L2正则化,感觉写出来100字就没了(躺平)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值