[李宏毅 機器學習] 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
理論上需要保證無限接近展開點,計算出的值纔是準確的,實際操作過程中,保證較小並且合適的學習速率就可以。

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