梯度下降虛擬碼
梯度下降可以優化損失函式的值,使其儘量小,即可找到最好(在資料集上擬合效果最好)的模型引數。
現在假設模型\(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):@絕版臭鹹魚
微信公眾號:@臭鹹魚的快樂生活
轉載請註明出處,歡迎討論和交流!