1. 程式人生 > >從零開始深度學習 T2. Gradient Descent

從零開始深度學習 T2. Gradient Descent

上一篇文章中介紹了迴歸分析,其中提到了求解最優引數的梯度下降法(Gradient Descent),這篇文章中,我們將針對Gradient Descent進行展開說明。
如圖,Gradient Descent是沿著Loss function的等高線的法線方向更新引數的

Gradient descent

Gradient Descent的原理十分簡單,但是在實際操作過程中可能會遇到一些問題,對此有一些針對性的tips。關於梯度下降優化更詳細的內容,請參照這篇 譯文

Tip 1: Tuning your learning rates

回顧Gradient Descent的引數更新過程:

θθηL
η代表引數更新的速度,當引數更新過快時,很可能跳過極值點,為此可以在引數更新的過程中不斷調整引數的更新速度,在引數接近極值點的時候,使引數更新的慢一點。
步長調整方式有以下幾種:

Vanilla Gradient descent

gt=L(θt)w
ηt=ηt+1
wt+1wtηtgt
從Vanilla Gradient descent的公式中,我們可以看出,隨著引數的更新,步長ηt越來越小,這比較符合直覺,因為隨著引數的更新,引數很可能越來越接近極值點,此時我們需要更加小心的更新引數。

Adagrad

Adagrad可以表示為如下公式:

gt=L(θt)w
wt+1wtηti=0(gi)2gt
Adagrad與Vanilla Gradient descent的不同點在於,Adagrad多考慮了一種情況:當某時刻某方向的梯度gt非常大時,ηtgt也會非常大,此時引數更新仍然會“邁出一個大步子”,這也可能使我們錯過極值點。Adagrad公式中的
ti=0
(gi)2
避免了這種情況。

Tip 2: Stochastic Gradient Descent

之前提到的Gradient Descent在每一次引數更新時,都要計算全體資料集在新的引數下的Loss,當資料集很大的時候,這會造成巨大的計算開銷。Stochastic Gradient Descent是解決該問題的一種技術手段,在Stochastic Gradient Descent的每一次迭代中,會隨機取樣(x,y),並只針對(x,y)計算Loss以及梯度。這可以大大加快training的速度(不過在training的過程中,也會引入一些噪音)。

Tip 3: Feature Scaling

不同的feature可能有不同的大小範圍,如果沒有對feature進行任何預處理,某些波動範圍很大的feature在引數更新過程中就可能佔據主導作用,從而使引數更新過程走很多彎路。如下圖所示,當feature x1 的範圍遠遠小於 feature x2時,w2y的影響就遠遠大於w1,這就造成了梯度線呈橢圓形,此時法線方向並不指向橢圓中心,於是進行引數更新的時候,就不是朝著最低點更新了。

feature scaling處理起來非常簡便,只需對輸入引數進行如下處理即可:

xrixrimiσi
其中mi為training集中feature xi的平均數,σi為training集中feature xi的方差。

Warning Limitation of Gradient Descent

Gradient Descent進行引數更新的依據是每個引數的偏微分,因此當引數的偏微分很小的時候,引數更新會很慢,甚至停止。下圖中出現的情況需要引起我們的注意:

至於怎麼解決這些問題呢?我們會在以後的部落格中進行介紹。