機器學習優化算法
優化算法——SGD、Momentum、Adagrad、RMSprop、Adam、AdamW
- 統一數學表達:設損失函數為\(\mathcal{L}(\theta)\),學習率為\(\eta\)。
- 每次迭代僅使用一個隨機小批量(mini-batch)數據計算梯度。
- 從訓練集中采樣包含小批量\(m\)個樣本\(\{x^{(1)},\cdots,x^{(m)}\}\),其對應的目標為\(\{y^{(1)},\cdots,y^{(m)}\}\)。則用于計算的梯度\(\displaystyle g=\frac{1}{m}\sum_{i=1}^m\nabla_\theta \mathcal{L} (f(x^{(i)};\theta),y^{(i)})\)。
- 本文中出現的數學表達式中的參數是單個元素,當參數為矩陣時,對矩陣中的每個元素進行相同的更新操作。比如\(g\)是矩陣,則\(g^2=g\odot g\)。
1. SGD
1.1 基本概念
-
隨機梯度下降,stochastic gradient descent。
-
更新公式\(\theta_{t+1}\leftarrow\theta_t-\eta\cdot g\)。
-
PyTorch中調用方法
# (params: _params_t, lr: float, momentum: float = ..., dampening: float = ..., weight_decay: float = ..., nesterov: bool = ...) -> None
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
1.2 Case study
- 更新不穩定
- 設\(J(x,y)=x^2+9y^2\),初始\((x_0,y_0)=(2,2)\),設置學習率\(\eta=0.1\)。假設用mini-batch求出來的梯度就是理論值,則更新公式為\((x,y)=(x-\eta\nabla_xJ,y-\eta\nabla_yJ)=(0.8x,-0.8y)\)。根據SGD優化到最低點\((0,0)\):\((2,2)\rightarrow(1.6,-1.6)\rightarrow(1.28,1.28)\rightarrow(1.024,-1.024)\rightarrow\cdots\)。由此看出梯度大時導致收斂不穩定,產生震蕩。
2 Momentum
- 動量法
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9)
2.1 指數加權平均
| day | 觀測值\(\theta\) | 代替\(\theta\)的估計值\(v\) |
|---|---|---|
| 1 | 100 | 30 |
| 2 | 107 | 53.1 |
| 3 | 105 | 68.67 |
| 4 | 110 | 81.069 |
| 5 | 126 | 94.5483 |
| 6 | 120 | 102.18381 |
| 7 | 130 | ? |
-
有什么用:刻畫數據變化的趨勢。比如上述表格中觀測值雖然不是單調遞增的,但其整體的趨勢是增長的,因此用\(v\)來刻畫該增長趨勢。
-
現在希望預測第7天的值,可以想到用加權平均\(\displaystyle v_7=\frac{1}{7}\sum_{i=1}^{7}\theta_i\)。但實際上越近期的數據權重應該更大,因此用指數加權平均:\(v_t=\beta v_{t-1}+(1-\beta)\theta_t\)。
-
初始\(v_0=0,\beta=0.7\)。填入表格。可以發現當時間序列較短時,最早幾天的\(v\)值很小,不準確。時間序列夠長,\(v_0\)的權重越小,即影響越小。
-
修正:\(\displaystyle v_t^{correct}=\frac{v_t}{1-\beta^t}\)。
2.2 基本概念
- 引入歷史梯度加權平均,在梯度方向一致時加速收斂,減少SGD中的震蕩,從而更加穩定。
- 數學表示:
- 速度更新(累計梯度):\(v_t=\gamma v_{t-1}+(1-\gamma)\cdot g\)。其中\(\gamma\)為動量系數,一般設置為0.9。
- 參數更新:\(\theta_t=\theta_{t-1}-\eta\cdot v_t\)。
3 Adagrad
-
Adaptive Gradient Algorithm。自適應學習率優化算法,根據參數的歷史梯度動態調整學習率,尤其適用于稀疏數據和高維優化問題。
-
數學表達:
- 累計梯度平方和:\(G=G+g^2\)。初始化\(G=0\)。
- 參數更新:\(\displaystyle \theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{G+\varepsilon}}\cdot g\)。其中\(\eta\)是全局學習率(超參數),\(\varepsilon\)是防止除0的很小的數。
-
問題:累計越來越大,導致后期收斂緩慢。
3.1 優化:RMSprop
- Root Mean Square Propagation。
- PyTorch調用:
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.01, momentum=0.9)
- 與Adagrad唯一不同的地方:
- 累計梯度平方換成了指數加權平均:\(G=\beta\cdot G+(1-\beta)\cdot g^2\)。
- 但后期容易在小范圍內產生震蕩。
4 ?Adam
- Adam = RMSprop + Momentum。對學習率(步長)不敏感,建議默認0.001。
- \(s,r\)初始化均為0;\(\beta_1=0.9,\beta_2=0.999\)。數學表達:
- 一階矩估計(Monmentum部分):\(s=\beta_1s+(1-\beta_1)\cdot g\)。
- 二階矩估計(RMSprop部分):\(r=\beta_2r+(1-\beta_2)\cdot g^2\)。
- 修正:\(\displaystyle\hat{s}=\frac{s}{1-\beta_1^t},\hat{r}=\frac{r}{1-\beta_2^t}\)。
- 更新:\(\displaystyle \theta\leftarrow\theta-\frac{\eta}{\sqrt{\hat{r}}+\varepsilon}\hat{s}\)。
- PyTorch調用:
optimizer = torch.optim.Adam(params, lr=learning_rate, weight_decay=weight_decay)
4.1 AdamW
- W:weight decay,權重衰減系數\(\lambda\)。達到泛化。
- 不是L2正則化(L2 Regularization):\(\displaystyle \mathcal{L}=\mathcal{L}(\theta)+\frac{\lambda}{2}\left \| \theta \right \|^2\)。因為修改了損失函數。
- 唯一不同:$\displaystyle \theta\leftarrow\theta-\frac{\eta}{\sqrt{\hat{r}}+\varepsilon}\hat{s}-{\color{Red} \lambda\cdot \eta\theta} $。
浙公網安備 33010602011771號