您可以在我的個人博客 blog.pengwill.info 獲得更好的閱讀體驗。
思維導圖
回顧
在Step3中,我們需要根據loss function,對參數θ進行優化,使用到的方法就是梯度下降算法。可以用如下的函數表示。
θ∗=argθminL(θ)
其中L表示loss function,θ表示待優化的參數。
優化的方法是使參數θ向其梯度方向減小,具體來說
θ:=θ−η∇L(θ)
η稱爲學習速率,是一個超參數,需要手動進行調整。
Tip1: 調整學習速率
learning rate 太小,loss下降太慢;learning rate太大,loss震盪或者增加。建議畫出隨着loss值隨迭代次數變化的曲線,根據曲線進行調整。
learning rate調整建議
- 將learning rate隨迭代次數逐漸減小。在剛開始時候希望收斂的步子大一點,而在後面的時候learning rate隨迭代次數逐漸減小。比如 η=t+1η,其中t爲迭代次數。
- 不同的參數設置不同的learning rate。
Adagrad
對每個參數設置不同的learning rate。在每次迭代時,將學習速率除以偏導和的均方根。
即
θi:=θi−ση∂θi∂L
其中σ爲Loss function對θi偏導累計和的均方根。decay項(t+11)和原本σ中的項相消掉了。
Tip2: 隨機梯度下降
傳統梯度下降,迭代時需要根據所有的樣本來更新loss function,進而根據loss function對參數的偏導更新參數。當樣本非常多的時候,單次迭代就可能花費大量的時間。
隨機梯度下降,迭代時選擇一個樣本點來更新loss function,再根據loss function對參數的偏導更新參數值。這樣的優點是速度更快。但是由於樣本中可能含有噪聲,單次迭代不一定向函數減小最快的方向更新,甚至有可能迭代後loss值會增加。
Tip3: 特徵縮放
採用特徵縮放是爲了避免數據大小或者數據的量綱不同對學習過程造成的影響。
假如當前的loss function爲L(θ)=θ0+x1θ1+x2θ2。其中屬性x1的變化範圍爲−1≤x1≤1,x2的變化範圍爲100≤x2≤1000。在學習過程中,因爲∣x1∣≤∣x2∣,所以只要θ2略微變化一點,就會對L函數值造成很大影響;相反,θ1的變化對函數值造成的影響不大。
我們更加希望數據的每個屬性的尺度都接近。
標準化
對數據的每一個特徵值,減去特徵的均值,除以特徵的標準差,最後可以使這個特徵的均值爲0,方差爲1。
梯度下降的數學原理
泰勒展開
若一元函數h(x)在x=x0處無限可導,則可以用多項式來逼近函數h(x)
h(x)=k=0∑∞k!h(k)(x0)(x−x0)k
二元函數的泰勒展開爲:
h(x,y)=k=0∑∞k!∂x∂kh(x−x0)+k!∂y∂kh(y−y0)
梯度下降算法在計算損失函數值時候,實際上爲在原來參數點的一階展開,即
L(θ)≈L(a,b)+∂θ1∂L(a,b)(θ1−a)+∂θ2∂L(a,b)(θ2−b)
泰勒展開只在接近展開點的處的函數值是近似準確的,故需要對更新參數時加以限制,以保證在展開點附近。我們希望參數更新的時候,整體的函數值減小,即
L(θ)−L(a,b)≈∂θ1∂L(a,b)(θ1−a)+∂θ2∂L(a,b)(θ2−b)<0∂θ1∂L(a,b)(Δθ1)+∂θ2∂L(a,b)(Δθ2)<0∇L⋅Δθ<0
其中∇L是一個向量,當Δθ和∇L方向相反的時候,乘積爲負值,且最大。故可以得出應該爲梯度的反方向。同時需要注意,應該保證要在展開點的附近纔可以,否則一階泰勒展開不成立,則引入學習速率η,即:
∇L⋅ηΔθ<0
理論上需要保證無限接近展開點,計算出的值纔是準確的,實際操作過程中,保證較小並且合適的學習速率就可以。