隨機梯度下降(Stochastic gradient descent)

總目錄

一、 凸優化基礎(Convex Optimization basics)

  1. 凸優化基礎(Convex Optimization basics)

二、 一階梯度方法(First-order methods)

  1. 梯度下降(Gradient Descent)
  2. 次梯度(Subgradients)
  3. 近端梯度法(Proximal Gradient Descent)
  4. 隨機梯度下降(Stochastic gradient descent)
    待更新。。。

Introduction

前面介紹過了多種梯度下降的方法,當數據規模比較小時,我們可以使用這些方法計算在所有數據上的梯度並進行更新迭代。而當數據規模比較大時,每次計算所有數據梯度的開銷將會非常巨大。由於隨機梯度下降可以大大減小計算開銷,因此常用於大規模數據優化中。

隨機梯度下降

考慮這樣一個最優化問題
minx1mi=1mfi(x)\min_{x}\frac{1}{m}\sum^{m}_{i=1}f_i(x)
即最小化一系列函數的平均值。該問題的梯度爲i=1mfi(x)=i=1mfi(x)\nabla \sum^{m}_{i=1}f_i(x)=\sum^{m}_{i=1}\nabla f_i(x)。常規的梯度下降就是不斷迭代:
x(k)=x(k1)tk1mi=1mfi(x(k1)),k=1,2,3,...x^{(k)}=x^{(k-1)}-t_k\cdot \frac{1}{m}\sum^m_{i=1}\nabla f_i(x^{(k-1)}),\qquad k=1,2,3,...

而隨機梯度下降(SGD)則是迭代:
x(k)=x(k1)tkfik(x(k1)),k=1,2,3,...x^{(k)}=x^{(k-1)}-t_k\cdot \nabla f_{i_k}(x^{(k-1)}),\qquad k=1,2,3,...

其中,ik{1,...,m}i_k\in \{1,...,m\}是在第k次迭代中被選擇的函數索引。

有兩種方式選擇iki_k:

  • 隨機方式:從取值範圍中均勻隨機選擇ik{1,...,m}i_k\in \{1,...,m\}
  • 循環方式:依次選取il=1,2,...,m,1,2,...,m,...i_l=1,2,...,m,1,2,...,m,...

其中,隨機方式是實踐中最常用的,對於隨機方式來說:
E[fik(x)]=f(x)E[\nabla f_{i_k}(x)]=\nabla f(x)

因此我們可以把SGD的每一步看做是梯度的無偏估計。
SGD將每個函數看成是獨立的,每次只優化部分函數,可以大大節省內存消耗。

例子:隨機邏輯迴歸(stochastic logistic regression)
給定(xi,yi)Rp×{0,1},i=1,...,n(x_i,y_i)\in R^p\times \{0,1\},i=1,...,n,邏輯迴歸定義爲:
minβ1ni=1n(yixiTβ+log(1+exp(xiTβ)))\min_\beta \frac{1}{n}\sum^n_{i=1}(-y_ix^T_i\beta+log(1+\exp(x^T_i\beta)))

其梯度爲f(β)=1ni=1n(yipi(β))xi\nabla f(\beta)=\frac{1}{n}\sum^n_{i=1}(y_i-p_i(\beta))x_i
對於完全梯度下降來說:每次batch迭代更新的花費爲O(np)O(np),而對於SGD來說,每次隨機迭代更新的花費爲O(p)O(p)
我們取n=10n=10p=2p=2來看一下兩者收斂曲線的比較:
picture
我們可以看到SGD在離最優點比較遠時收斂得比較快,而在接近最優點時比較難收斂到最優點。

步長的選擇

通常SGD使用遞減的步長,比如tk=1/kt_k=1/k。如果使用固定步長,則在接近最優點時會很難繼續收斂。

收斂率

在以前的章節裏提到,對於凸函數ff,使用遞減步長的梯度下降方法的收斂率爲O(1/k)O(1/\sqrt{k})。當ff可微且有Lipshitz梯度時,對於合適的固定步長有O(1/k)O(1/k)的收斂率。那麼對於SGD如何呢?對於凸函數ff,使用遞減步長的SGD的期望收斂率爲O(1/(k))O(1/\sqrt(k))。然而,與梯度下降不同的是,SGD不會隨着進一步假設ff有Lipshitz梯度而提升。甚至當ff是強凸時會變得更糟。
ff是強凸且有Lipshitz梯度時,梯度下降有O(γk)O(\gamma^k)的收斂率,其中0<γ<10<\gamma<1。但是相同條件下,SGD只有O(1/k)O(1/k)的期望收斂率。那麼有沒有什麼方法可以提升SGD呢?

小批量隨機梯度下降

常用的SGD是小批量隨機梯度下降(mini-batch stochastic gradient descent)。我們隨機選取一個子集Ik{1,...,m}, Ik=bmI_k\subseteq \{1,...,m\},\ |I_k|=b\ll m,然後重複迭代:
x(k)=x(k1)tk1biIkfi(x(k1)),k=1,2,3,...x^{(k)}=x^{(k-1)}-t_k\cdot \frac{1}{b}\sum_{i\in I_k}\nabla f_i(x^{(k-1)}),\qquad k=1,2,3,...

使用小批量可以將方差減小1/b1/b,但同樣要多花費bb倍時間。同時收斂率也有所提升。
再次考慮上面例子中的邏輯迴歸問題,當n=10,000,p=20n=10,000, p=20時,所有方法都用固定步長,可以得到:
在這裏插入圖片描述
但從總體結果來看,使用小批量隨機梯度下降並不能顯著提升總的開銷和精度。

SGD在大規模機器學習中的應用

SGD被廣泛應用於大規模機器學習(ML)中。

  • 在許多ML問題中,我們往往不需要優化到很高的精度,因此固定步長常常應用於ML中
  • 一個trick是在整個數據集上運行SGD之前,先在一小部分上進行訓練,從而選取合適的步長。
  • 動量(mometum),自適應步長等許多SGD的變體都是實踐中常用的方法(如Adagrad,Adam等)
  • SGD尤其流行於大規模、連續的非凸優化問題中

參考資料

CMU:Convex Optimization

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章