梯度下降偽代碼
梯度下降可以優化損失函數的值,使其盡量小,即可找到最好(在數據集上擬合效果最好)的模型參數。
現在假設模型\(f\)中只有一個參數\(w\),則損失函數為\(L(f)=L(w)\),梯度下降算法如下(若模型有多個參數,按相同方法更新各參數)
-
初始化參數
隨機選取一個\(w^0\)(\(w^0\)並不一定是隨機選取),令\(w=w^0\)。
-
計算梯度
\(\frac{dL(f)}{dw}|_{w=w^0}\)
如果小於0,此時\(w\)增大則\(L(f)\)會減小;如果大於0,此時\(w\)減小則\(L(w)\)會減小。
如果模型有多個參數,則計算損失函數在各個參數方向上的偏導數。
-
更新模型參數
\(w^1=w^0-lr\frac{dL(f)}{dw}|_{w=w^0}\)
\(w\)的變化量取決於梯度和學習率(Learning Rate)的大小:梯度絕對值或學習率越大,則\(w\)變化量越大。
如果模型有多個參數,則用上一步計算出的偏導數對應更新各參數。
-
重復第2步和第3步
經過多次參數更新/迭代(iteration),可以使損失函數的值達到局部最小(即局部最優,Local Optimal),但不一定是全局最優。
自適應學習率(Adaptive Learning Rate)
梯度下降過程中,固定學習率並不合理。學習率太大,可能導致loss不減小反而增大;學習率太小,loss會減小得很慢。
基本原則是隨着參數迭代更新,學習率應該越來越小,比如\(\eta^{t}=\frac{\eta}{\sqrt{t+1}}\)。
更好的方法:每個參數有各自的學習率,比如Adagrad。
Adagrad
Adaptive Gradient Descent,自適應梯度下降。2011年提出,核心是每個參數(parameter)有不同的學習率
定義
每次迭代中,學習率要除以它對應參數的之前梯度的均方根(RMS) 。
即\(w^{t+1}=w^t-\frac{\eta}{\sqrt{\sum_{i=0}^t(g^i)^2}}g^t\),其中\(t\)是迭代次數,\(w\)是參數,\(g\)是梯度,\(\eta\)是初始學習率。
隨着參數迭代,\(t\)越來越大,\(\sqrt{\sum_{i=0}^t(g^i)^2}\)也越來越大,因此學習率的變化趨勢是越來越小。
Adagrad的矛盾(Contradiction)
一般的梯度下降方法\(w^{t+1}=w^t-\eta^tg^t\)中,\(\eta^t\)是常量,梯度越大時,則參數更新的步幅越大,這是由\(g^t\)項決定的。
在Adagrad中,\(\eta\)是常量,梯度\(g^t\)越大時會使得參數更新的步幅越大,但\(\sqrt{\sum_{i=0}^t(g^i)^2}\)越大會使得參數更新的步幅越小,這是一個矛盾嗎?
為什么要除以之前梯度的均方根?
-
一種直觀的解釋:增強參數更新步幅變化的慣性
與之前梯度相比如果現在的梯度更大,則現在梯度除以之前梯度會使參數更新的步幅更大;如果現在的梯度更小,則會使步幅更新的步幅更小。
這樣就相當於增強了參數更新步幅變化的慣性,即如果參數更新的步幅突然變大或變小,就擴大這個趨勢。
-
同時考慮一次梯度和二次梯度
在Adagrad中,之前梯度的均方根是用來通過一次梯度估計二次梯度(雖然可以直接使用二次梯度,但其很難計算)。
-
只考慮一個參數
當參數只有一個或只考慮一個參數時,梯度越大,離最優點就越遠,參數更新的步幅應該越大。
-
考慮多個參數
當參數有多個或者考慮多個參數時,上述內容不一定成立。如果參數1的梯度比參數2的梯度大,但如果損失函數關於參數1的曲線比關於參數2的曲線更陡峭(即二次梯度更大),那參數1離最優點的距離可能比參數2更近。
所以當參數有多個或者考慮多個參數時,我們既要考慮一次梯度又要考慮二次梯度。
結論是一次梯度越大、二次梯度越小,離最優點就越遠,參數更新的步幅應該越大。
-
SGD
Stochastic Gradient Descent,隨機梯度下降,1847年提出,可以讓訓練過程更快。
普通梯度下降中需要計算所有樣本的Loss,而SGD只計算一個樣本的Loss,然后進行梯度下降。
梯度下降的數學理論
建議直接看李宏毅老師的本節視頻,從42分27秒開始看,老師講得很好。
- 初始化一組參數后,我們找到鄰域中另一個使損失函數值最小的一組參數並更新參數(然后不斷重復這一步驟)。
- 在極小的鄰域中,可以利用泰勒級數將損失函數簡化,然后求其最小值,損失函數簡化后,要使其最小即是讓其中兩個向量的內積最小,由此可以得出新的一組參數的值(具體過程略),這就是梯度下降。
- 學習率的作用是限制鄰域大小,學習率太大可能使鄰域太大,導致損失函數展開成泰勒級數時的誤差較大。
- 當然也可以將損失函數展開成2次(比如牛頓迭代法),但這並不實用,因為要計算二次微分,甚至可能要求出海森矩陣(Hessian Matrix)逆矩陣等等,這些在做深度學習時是不實用的。
梯度下降的局限性
梯度下降過程中,每次參數更新不一定都會使損失函數的值更小。
求出的只是局部最小值(Local Minima)甚至是鞍點(Saddle Point),不一定是全局最優解。
Github(github.com):@chouxianyu
Github Pages(github.io):@臭咸魚
知乎(zhihu.com):@臭咸魚
博客園(cnblogs.com):@臭咸魚
B站(bilibili.com):@絕版臭咸魚
微信公眾號:@臭咸魚的快樂生活
轉載請注明出處,歡迎討論和交流!