小批量随机梯度下降
小批量隨機梯度下降
在每一次迭代中,梯度下降使用整個訓練數據集來計算梯度,因此它有時也被稱為批量梯度下降(batch gradient descent)。
- 隨機梯度下降在每次迭代中只隨機采樣一個樣本來計算梯度。
- 可以在每輪迭代中隨機均勻采樣多個樣本來組成一個小批量,然后使用這個小批量來計算梯度。
下面就來描述小批量隨機梯度下降
- 設目標函數f(x):Rd→Rf(\boldsymbol{x}): \mathbb{R}^d \rightarrow \mathbb{R}f(x):Rd→R。
- 在迭代開始前的時間步設為0。
- 該時間步的自變量記為x0∈Rd\boldsymbol{x}_0\in \mathbb{R}^dx0?∈Rd,通常由隨機初始化得到
在接下來的每一個時間步t>0t>0t>0中,小批量隨機梯度下降隨機均勻采樣一個由訓練數據樣本索引組成的小批量Bt\mathcal{B}_tBt?。我們可以通過重復采樣(sampling with replacement)或者不重復采樣(sampling without replacement)得到一個小批量中的各個樣本。前者允許同一個小批量中出現重復的樣本,后者則不允許如此,且更常見。對于這兩者間的任一種方式,都可以使用
gt←?fBt(xt?1)=1∣B∣∑i∈Bt?fi(xt?1)\boldsymbol{g}_t \leftarrow \nabla f_{\mathcal{B}_t}(\boldsymbol{x}_{t-1}) = \frac{1}{|\mathcal{B}|} \sum_{i \in \mathcal{B}_t}\nabla f_i(\boldsymbol{x}_{t-1}) gt?←?fBt??(xt?1?)=∣B∣1?i∈Bt?∑??fi?(xt?1?)
來計算時間步ttt的小批量Bt\mathcal{B}_tBt?上目標函數位于xt?1\boldsymbol{x}_{t-1}xt?1?處的梯度gt\boldsymbol{g}_tgt?。這里∣B∣|\mathcal{B}|∣B∣代表批量大小,即小批量中樣本的個數,是一個超參數。同隨機梯度一樣,重復采樣所得的小批量隨機梯度gt\boldsymbol{g}_tgt?也是對梯度?f(xt?1)\nabla f(\boldsymbol{x}_{t-1})?f(xt?1?)的無偏估計。給定學習率ηt\eta_tηt?(取正數),小批量隨機梯度下降對自變量的迭代如下:
xt←xt?1?ηtgt.\boldsymbol{x}_t \leftarrow \boldsymbol{x}_{t-1} - \eta_t \boldsymbol{g}_t.xt?←xt?1??ηt?gt?.
基于隨機采樣得到的梯度的方差在迭代過程中無法減小,因此在實際中,(小批量)隨機梯度下降的學習率可以在迭代過程中自我衰減,例如ηt=ηtα\eta_t=\eta t^\alphaηt?=ηtα(通常α=?1\alpha=-1α=?1或者?0.5-0.5?0.5)、ηt=ηαt\eta_t = \eta \alpha^tηt?=ηαt(如α=0.95\alpha=0.95α=0.95)或者每迭代若干次后將學習率衰減一次。如此一來,
- 學習率和(小批量)隨機梯度乘積的方差會減小
- 而梯度下降在迭代過程中一直使用目標函數的真實梯度,無須自我衰減學習率
小批量隨機梯度下降中每次迭代的計算開銷為O(∣B∣)\mathcal{O}(|\mathcal{B}|)O(∣B∣)。
- 當批量大小為1時,該算法即為隨機梯度下降;當批量大小等于訓練數據樣本數時,該算法即為梯度下降。
- 當批量較小時,每次迭代中使用的樣本少,這會導致并行處理和內存使用效率變低。這使得在計算同樣數目樣本的情況下比使用更大批量時所花時間更多。
- 當批量較大時,每個小批量梯度里可能含有更多的冗余信息。
- 為了得到較好的解,批量較大時比批量較小時需要計算的樣本數目可能更多,例如增大迭代周期數。
實現小批量隨機梯度下降
- 使用一個來自NASA的測試不同飛機機翼噪音的數據集來比較各個優化算法
- 使用該數據集的前1,500個樣本和5個特征
- 使用標準化對數據進行預處理。
飛機機翼噪音數據集
當批量大小為樣本總數1,500時,優化使用的是梯度下降。梯度下降的1個迭代周期對模型參數只迭代1次。可以看到6次迭代后目標函數值(訓練損失)的下降趨向了平穩。
def train_sgd(lr, batch_size, num_epochs=2):train_ch7(sgd, None, {'lr': lr}, features, labels, batch_size, num_epochs)train_sgd(1, 1500, 6)當批量大小為1時,優化使用的是隨機梯度下降。為了簡化實現,有關(小批量)隨機梯度下降的實驗中,我們未對學習率進行自我衰減,而是直接采用較小的常數學習率。隨機梯度下降中,每處理一個樣本會更新一次自變量(模型參數),一個迭代周期里會對自變量進行1,500次更新。可以看到,目標函數值的下降在1個迭代周期后就變得較為平緩。
train_sgd(0.005, 1)雖然隨機梯度下降和梯度下降在一個迭代周期里都處理了1,500個樣本,但實驗中隨機梯度下降的一個迭代周期耗時更多。這是因為隨機梯度下降在一個迭代周期里做了更多次的自變量迭代,而且單樣本的梯度計算難以有效利用矢量計算。
當批量大小為10時,優化使用的是小批量隨機梯度下降。它在每個迭代周期的耗時介于梯度下降和隨機梯度下降的耗時之間。
train_sgd(0.05, 10)- 小批量隨機梯度每次隨機均勻采樣一個小批量的訓練樣本來計算梯度。
- 在實際中,(小批量)隨機梯度下降的學習率可以在迭代過程中自我衰減。
- 通常,小批量隨機梯度在每個迭代周期的耗時介于梯度下降和隨機梯度下降的耗時之間。
總結
- 上一篇: (pytorch-深度学习)SE-Res
- 下一篇: 2接口详解_java集合【2】——— C