[李宏毅 机器学习] 3. 梯度下降

您可以在我的个人博客 blog.pengwill.info 获得更好的阅读体验。

思维导图

在这里插入图片描述

回顾

在Step3中,我们需要根据loss function,对参数θ\theta进行优化,使用到的方法就是梯度下降算法。可以用如下的函数表示。
θ=argminθL(θ) \theta^{*}=\arg \min _{\theta} L(\theta)
其中LL表示loss function,θ\theta表示待优化的参数。

优化的方法是使参数θ\theta向其梯度方向减小,具体来说
θ:=θηL(θ) \theta:=\theta-\eta \nabla L\left(\theta\right)
η\eta称为学习速率,是一个超参数,需要手动进行调整。

Tip1: 调整学习速率

learning rate 太小,loss下降太慢;learning rate太大,loss震荡或者增加。建议画出随着loss值随迭代次数变化的曲线,根据曲线进行调整。

learning rate调整建议

  1. 将learning rate随迭代次数逐渐减小。在刚开始时候希望收敛的步子大一点,而在后面的时候learning rate随迭代次数逐渐减小。比如 η=ηt+1\eta = \frac{\eta}{\sqrt{t+1}},其中tt为迭代次数。
  2. 不同的参数设置不同的learning rate。

Adagrad

对每个参数设置不同的learning rate。在每次迭代时,将学习速率除以偏导和的均方根。


θi:=θiησLθi \theta_i:=\theta_i-\frac{\eta}{\sigma} \frac{\partial L}{\partial \theta_i}
其中σ\sigma为Loss function对θi\theta^i偏导累计和的均方根。decay项(1t+1\frac{1}{\sqrt{t+1}})和原本σ\sigma中的项相消掉了。

Tip2: 随机梯度下降

传统梯度下降,迭代时需要根据所有的样本来更新loss function,进而根据loss function对参数的偏导更新参数。当样本非常多的时候,单次迭代就可能花费大量的时间。

随机梯度下降,迭代时选择一个样本点来更新loss function,再根据loss function对参数的偏导更新参数值。这样的优点是速度更快。但是由于样本中可能含有噪声,单次迭代不一定向函数减小最快的方向更新,甚至有可能迭代后loss值会增加。

Tip3: 特征缩放

采用特征缩放是为了避免数据大小或者数据的量纲不同对学习过程造成的影响。

假如当前的loss function为L(θ)=θ0+x1θ1+x2θ2L(\theta) =\theta_0+ x_1\theta_1+x_2\theta_2。其中属性x1x_1的变化范围为1x11-1\le x_1\le1x2x_2的变化范围为100x21000100\le x_2 \le 1000。在学习过程中,因为x1x2|x_1|\le|x_2|,所以只要θ2\theta_2略微变化一点,就会对LL函数值造成很大影响;相反,θ1\theta_1的变化对函数值造成的影响不大。

我们更加希望数据的每个属性的尺度都接近。

标准化

对数据的每一个特征值,减去特征的均值,除以特征的标准差,最后可以使这个特征的均值为0,方差为1。

梯度下降的数学原理

泰勒展开

若一元函数h(x)h(x)x=x0x=x_0处无限可导,则可以用多项式来逼近函数h(x)h(x)
h(x)=k=0h(k)(x0)k!(xx0)k h(x)=\sum_{k=0}^\infty\frac{h^{(k)}(x_0)}{k!}(x-x_0)^k
二元函数的泰勒展开为:
h(x,y)=k=0k!khx(xx0)+k!khy(yy0) h(x, y) = \sum_{k=0}^\infty k!\frac{\partial^kh}{\partial x}(x-x_0)+k!\frac{\partial^kh}{\partial y}(y-y_0)
梯度下降算法在计算损失函数值时候,实际上为在原来参数点的一阶展开,即
L(θ)L(a,b)+L(a,b)θ1(θ1a)+L(a,b)θ2(θ2b) \mathrm{L}(\theta) \approx \mathrm{L}(a, b)+\frac{\partial \mathrm{L}(a, b)}{\partial \theta_{1}}\left(\theta_{1}-a\right)+\frac{\partial \mathrm{L}(a, b)}{\partial \theta_{2}}\left(\theta_{2}-b\right)

泰勒展开只在接近展开点的处的函数值是近似准确的,故需要对更新参数时加以限制,以保证在展开点附近。我们希望参数更新的时候,整体的函数值减小,即
L(θ)L(a,b)L(a,b)θ1(θ1a)+L(a,b)θ2(θ2b)<0L(a,b)θ1(Δθ1)+L(a,b)θ2(Δθ2)<0LΔθ<0 \mathrm{L}(\theta) - \mathrm{L}(a, b) \approx \frac{\partial \mathrm{L}(a, b)}{\partial \theta_{1}}\left(\theta_{1}-a\right)+\frac{\partial \mathrm{L}(a, b)}{\partial \theta_{2}}\left(\theta_{2}-b\right) < 0 \\ \frac{\partial \mathrm{L}(a, b)}{\partial \theta_{1}}\left(\Delta\theta_1\right)+\frac{\partial \mathrm{L}(a, b)}{\partial \theta_{2}}\left(\Delta\theta_2\right) < 0 \\ \nabla L · \Delta\theta < 0
其中L\nabla L是一个向量,当Δθ\Delta\thetaL\nabla L方向相反的时候,乘积为负值,且最大。故可以得出应该为梯度的反方向。同时需要注意,应该保证要在展开点的附近才可以,否则一阶泰勒展开不成立,则引入学习速率η\eta,即:
LηΔθ<0 \nabla L · \eta \Delta\theta <0
理论上需要保证无限接近展开点,计算出的值才是准确的,实际操作过程中,保证较小并且合适的学习速率就可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章