得到 loss function 之後,我們需要一種方法求解其最小值解 \(\theta = \arg \min l(\theta)\). 這種方法最好滿足以下條件:
對任何 loss function 都是通用的
在能求得目標解的條件下,越快越好
首先看第乙個條件. 怎樣才能找到對任何函式都能通用的辦法呢?想象一下假如我們在下山,但是對周圍的路況一無所知,我們如何判斷更低的地方在**呢?這個 task 太難了,我們得給出一些條件,比如 \(l(\theta)\) 是一階可微的,這樣我們就能環顧四周,從而知道哪個方向比目前所處的位置高,哪個方向比所處的位置低了. 我們猜想順著低處走就可以下山了,而且步子邁大一點就走得快,邁小一點就走得慢. 把下山整理成數學語言就是:
第 \(t\) 步梯度下降的公式
\[\theta^t = \theta^ - \eta^\nabla l(\theta^)
\]以上介紹的方法又稱為 vanilla gradient descent.
除優化器演算法之外,梯度下降的結果還受到以下幾個因素的影響:
仍以下山為例,如果步子太小,下山得下到猴年馬月啊;步子太大,乙個筋斗雲過去都不知道自己在哪兒了.
而在山頂的時候可以走快一點,到山腳就不用那麼著急了.
靜態觀點要求選擇乙個合適的初始值,這個值是 ad hoc 的(或者說是超引數);動態觀點要求適當地變化學習率. 一種方法是 adagrad(注意,很多 ada 開頭的模型指的都是 adaptive 的方法):
\[\theta^ = \theta^t - \frac^g^t\odot g^t}}\odot g^t
\]裡面的 \(\odot\) 表示 element-wise dot,其他運算子也都是 element-wise 操作. 這樣梯度越大的方向,分母上的懲罰也就越大,也就是限制往梯度最大的方向移動. 就好像人在山谷中行走,兩側梯度大,adagrad 方法會限制人盡量少地往兩邊走,這樣就能更快地前進. 又比如現在處在斜面上,vanilla 會先順著斜面衝到底,然後再考慮向左還是向右;adagrad 會一邊橫向走一邊順著斜面下降,這樣走得距離更短,還有可能避開 local minimum
還有一種解釋是模擬牛頓法,根號裡的內容可以看作是二階微分大小的一種表示,而且是通過歷史的一階微分來表示的。
調整 batchsize 時,需要相應調整學習率. batch 越大,學習率也越大,這樣才能保證 epoch 差不多時結果差不多.如果某個特徵 a 的範圍是 0~1000,另乙個特徵 b 的範圍是 0~1,那麼特徵 a 在損失函式中所佔的比重會遠遠高於特徵 b 的比重,梯度下降就會忽略特徵 b 而全力學習特徵 a. 為了消除這種不平衡,需要對先做 feature scaling,把每個特徵都轉化到大致相等的範圍內. 常用的方法有
對於非凸的損失函式,梯度下降可能陷入區域性極小值. 目前已知的凸函式模型有:
在訓練開始使用小學習率的一種技術。其可以使得在訓練的初始階段,梯度的變化更加平滑。這對使用記憶視窗的優化方法尤其重要。
現在簡單的資料集上進行訓練,然後再到較難的資料集上進一步訓練。
原理上有些類似 warm-up。
嚴格來說 fine-tuning 是一種節省計算資源的方法。但實際上使用 pretrained model 往往能提公升模型的表現能力。譬如 pose estimation 的 hrnet 模型使用 imagenet pretrained model 可以提公升 1% 的準確率。
sgd with momentum (sgdm)
\[v^ = \lambda v^t - \eta \nabla l(\theta^t) \\
\theta^ = \theta^t + v^
\]sgdm 的優點
rmsprop
\[\theta^ = \theta^t - \frac}\odot g^t \\
v^1 = g^0 \odot g^0 \\
v^t = \alpha v^ + (1-\alpha) g^ \odot g^
\]解決 adagrad 存在的一些問題:
adam
adam 相當於 sgdm 和 rmsprop 的結合
\[\theta^ = \theta^t - \frac}}\odot \hat m^t \\
m^t = \beta_1 m^ + (1-\beta_1) g^, \hat m^t = \frac\\
v^t = \beta_2 v^ + (1-\beta_v) g^ \odot g^, v^t = \frac\\
\beta_1=0.9, \beta_2=0.999, \epsilon=10^
\]到此為止,所有的模型訓練方法基本都被囊括了。一般**中能用到的模型也就是 adam 和 sgdm,二者的對比如下:
speed
generalization
stable
adam
√sgd√√
機器學習 梯度下降
參照 機器學習 這本書的第4.4.3節。一.解決目標及情景假設 當給定一些資料,輸入x向量已知,輸出y也已知,設計乙個線性函式y h x 去擬合這些資料。既然是線性函式,在此不妨設為h x w0 x0 w1 x1。此時我們遇到的問題就是如何確定w0和w1這兩個引數,即w w0,w1 這個向量。既然是...
機器學習 梯度下降
梯度下降法 如果讀者對方向導數和梯度的定義不太了解,請先閱讀上篇文章 方向導數與梯度 前些時間接觸了機器學習,發現梯度下降法是機器學習裡比較基礎又比較重要的乙個求最小值的演算法。梯度下降演算法過程如下 1 隨機初始值 2 迭代 在這裡,簡單談一下自己對梯度下降法的理解。首先,要明確梯度是乙個向量,是...
機器學習 梯度下降
1.引數要同時更新 2.初始化不同,獲得的最小值也不同,即得到的引數也不同,演算法收斂到不同的區域性最優解。凸函式只有全域性最優解,無論如何初始化,不必擔心陷入區域性最優解 3.越接近最小值時,收斂的速度最逐漸減慢,在學習率不變的情況下,越接近最小值 最優解 偏導數的絕對值會越來越小,所以演算法收斂...