確率的勾配降下法
確率的勾配降下法(かくりつてきこうばいこうかほう、stochastic gradient descent, SGD)は、連続最適化問題に対する勾配法の乱択アルゴリズム。バッチ学習である最急降下法をオンライン学習に改良したアルゴリズムである。目的関数が微分可能な和の形であることを必要とする。
下記の和の形の目的関数を最小化する問題を扱う。
Q(w) = \sum_{i=1}^n Q_i(w)
パラメータ w^* はQ(w) を最小化するように推定する。典型的には、Q_i は i 番目の訓練データ。
古典的な統計学において、和の最小化問題は、最小二乗問題や最尤推定問題などにあらわれる。一般的なケースでは、和を最小化する推定量はM推定量と呼ぶ。しかしながら、Thomas S. Fergusonの例などで示されるように、いくつかの最尤推定の問題において、最小解ではなく局所解を要求するだけでも制限が厳しすぎると長い間認識され続けてきた。それゆえ、現代の統計理論家は最尤関数の停留点(微分がゼロになる点)を考慮する事が多くなった。
和の最小化問題は経験損失最小化の問題にも現れる。Q_i(w) の値が i 番目の訓練データであるならば、Q(w) が経験損失である。
上記の関数 Q を最小化する際、標準的な最急降下法(バッチ学習)では、下記の反復を繰り返す。
w := w - \eta \nabla Q(w) = w - \eta \sum_{i=1}^n \nabla Q_i(w)
\eta はステップサイズと呼ばれる。機械学習においては学習率とも呼ばれる。
確率分布がパラメータが一つの指数型分布族などで、勾配の総和の計算が、小さな計算量で出来てしまう事もあるが、一つ一つの勾配を計算して総和を取らないといけない事も多い。そのような場合、和の全体ではなく、和の一部分だけを計算する事で、1回の反復の計算量を小さくする事ができる。これは大規模な機械学習の問題で効果的である。
確率的勾配降下法(オンライン学習)では、Q(w) の勾配は、1つの訓練データから計算した勾配で近似する。
上記の更新を1つ1つの訓練データで行い、訓練データ集合を一周する。収束するまで訓練データ集合を何周もする。一周するたびに訓練データはランダムにシャッフルする。AdaGrad などの適応学習率のアルゴリズムを使用すると収束が速くなる。
擬似コードでは、確率的勾配降下法は下記になる。
パラメータ w と学習率 \eta の初期値を選ぶ
while 収束するか所定の反復回数まで反復する do
Q_i(訓練データ)をランダムにシャッフルする
for each i = 1, 2, ..., n do
\! w := w - \eta \nabla Q_i(w)
全てではないが複数の訓練データで勾配を計算する方法をミニバッチと言う。この方法は、コンピュータのSIMDを有効活用でき計算を高速化できる。また、複数の訓練データを使うので収束がよりなめらかになる事もある。
確率的勾配降下法の収束性は凸最適化と確率近似の理論を使い解析されている。目的関数が凸関数もしくは疑似凸関数であり、学習率が適切な速度で減衰し、さらに、比較的緩い制約条件を付ければ、確率的勾配降下法はほとんど確実に最小解に収束する。目的関数が凸関数でない場合でも、ほとんど確実に局所解に収束する。これは Robbins-Siegmund の定理による。
Q_i(訓練データ)がランダムにシャッフルされる事により、確率的に局所解にはまりにくくなる効果がある。
基本的な確率的勾配降下法に対して多くの改良が提案されている。特に、機械学習において、ステップサイズ(学習率)の調整は重要問題として認識されている。学習率を大きくしすぎると発散し、小さくしすぎると収束まで遅くなる。
1951年に Herbert Robbins と Sutton Monro が発表。学習率をイテレーション回数の逆数で減衰させる方法。Robbins-Monro法とも言われる。
\eta_t = \frac{\eta_0}{t}
1983年に Yurii Nesterov が発表。
\begin{align}
x_0 &= w_0 \\
x_t &= w_{t-1} - \eta \nabla Q_i(w_{t-1}) \\
w_t &= x_t + \frac{t-1}{t+2}(x_t - x_{t-1})
\end{align}
1986年にデビッド・ラメルハートらがバックプロパゲーションと共に提案した方法。
\begin{align}
\Delta w &:= \eta \nabla Q_i(w) + \alpha \Delta w \\
w &:= w - \Delta w
\end{align}
1988年に David Ruppert が提案した方法。
\bar{w} = \frac{1}{t} \sum_{i=1}^{t} w_i
を計算し、最終的にパラメータの平均値を学習結果とする。
2009年に John Langford らが発表した方法。L1 正則化を含む場合、確率的勾配降下法だとパラメータが 0 になりにくいが、K 回毎にパラメータの大きさが θ 以下であれば、0にする方法。
2009年に Lin Xiao が発表した方法。目的関数が下記のように汎化能力を高めるために L1 正則化を含む場合、確率的勾配降下法だとパラメータが 0 になりにくく、そのための対策をした方法。以下、この手法では Q(w) には \lambda \|w\|_1 を含めずに、L1 正則化の効果を実現する。
Q(w) + \lambda \|w\|_1
まず、勾配の平均を計算する。
\overline{g}_t = \frac{1}{t} \sum_{t'=1}^t \nabla Q(w)_{t'}
その上で、パラメータの更新は以下の通り。ここでパラメータの初期値は0としている。
w_i := \begin{cases}
0 & \text{if } |\overline{g}_{t, i}| \le \lambda, \\
- \dfrac{ \sqrt{t} }{\gamma} \left( \overline{g}_{t, i} - \lambda \sgn(\overline{g}_{t, i}) \right) & \text{otherwise.}
\end{cases}
L1 正則化と L2 正則化を
Q(w) + \lambda \|w\|_1 + \frac{\sigma}{2} \|w\|_2^2
の形で混ぜる場合は、このようになる。
w_i := \begin{cases}
0 & \text{if } |\overline{g}_{t, i}| \le \lambda, \\
- \dfrac{1}{\sigma} \left(\overline{g}_{t, i} - \lambda \sgn(\overline{g}_{t, i}) \right) & \text{otherwise.}
\end{cases}
以下のように、\lambda を少しずつ大きくしていくと、疎になる度合いを徐々に高めていける。
\lambda = \lambda_0 + \rho / \sqrt{t}
2011年に John Duchi らが発表した方法。\circ はアダマール積(要素ごとの積)。下記計算、全てパラメータごと(要素ごと)に計算する。\epsilon は無限大に発散させないための正の小さな定数。
\begin{align}
r_0 &= \epsilon \\
r_t &= r_{t - 1} + \nabla Q_i(w) \circ \nabla Q_i(w) \\
\eta_t &= \frac{\eta_0}{\sqrt{r_t} \\
w_{t+1} &= w_t - \eta_t \circ \nabla Q_i(w)
\end{align}
正則化双対平均化法と AdaGrad を組み合わせる方法が、AdaGrad の発表と共に2011年に出ている。
\begin{align}
u &:= u + \nabla Q(w) \\
r &:= r + \nabla Q_i(w) \circ \nabla Q_i(w) \\
w_i &:= \begin{cases}
0 & \text{if } |u_i| / t \le \lambda, \\
- \sgn(u_i) \dfrac{\eta t}{\sqrt{r_i} \left( \dfrac{t} - \lambda \right) & \text{otherwise.}
\end{cases}
\end{align}
2012年に Tijmen Tieleman らが発表した方法。AdaGrad の変形。勾配の2乗の指数移動平均を取るように変更。\beta = 0.9 などを使用。
\begin{align}
r_t &= \beta r_{t - 1} + (1 - \beta) \nabla Q_i(w) \circ \nabla Q_i(w) \\
\eta_t &= \frac{\eta_0}{\sqrt{r_t + \epsilon} \\
w_{t+1} &= w_t - \eta_t \circ \nabla Q_i(w)
\end{align}
2012年に Matthew D. Zeiler が発表した方法。AdaGrad や RMSProp の変形。初期学習率のハイパーパラメータがなくなっている。
\begin{align}
r_t &= \beta r_{t - 1} + (1 - \beta) \nabla Q_i(w) \circ \nabla Q_i(w) \\
v_t &= \frac{\sqrt{s_t} + \epsilon}{\sqrt{r_t} + \epsilon} \circ \nabla Q_i(w) \\
s_{t+1} &= \beta s_t + (1 - \beta) v_t \circ v_t \\
w_{t+1} &= w_t - v_t
\end{align}
2014年に Jascha Sohl-Dickstein らが発表した方法。確率的勾配降下法と記憶制限準ニュートン法の L-BFGS を組み合わせた方法。二次収束するようになり、収束が AdaGrad などよりも速くなった。
2015年に Diederik P. Kingma らが発表した方法。AdaGrad, RMSProp, AdaDelta の変形。AdaGrad や Sum of Functions Optimizer よりも収束が速くなった。ハイパーパラメータは \alpha = 0.001, \beta_1 = 0.9, \beta_2 = 0.999, \epsilon = 10^{-8} を推奨。イテレーション回数 t は 1 から始める。
\begin{align}
m_0 &= v_0 = 0 \\
m_t &= \beta_1 m_{t-1} + (1 - \beta_1) \nabla Q_i(w) \\
v_t &= \beta_2 v_{t-1} + (1 - \beta_2) \nabla Q_i(w) \circ \nabla Q_i(w) \\
\hat{m}_t &= \frac{m_t}{1 - \beta_1^t} \\
\hat{v}_t &= \frac{v_t}{1 - \beta_2^t} \\
w_t &= w_{t - 1} - \alpha \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon}
\end{align}
2019年のICLRでLiangchen Luoらが発表した方法。
Adamに学習率の制限(Bound)を加え、ステップごとにSGDへ連続的に変化させることによって、Adamの収束速度とSGDの汎化性能の両立を目指した。論文中でのハイパーパラメータと学習率の下限・上限は \alpha = 0.001, \beta_1 = 0.9, \beta_2 = 0.999, \eta_l(t) = 0.1 - \frac{0.1}{(1 - \beta_2)t + 1} , \eta_u(t) = 0.1 + \frac{0.1}{(1 - \beta_2)t}であり、Adamと同様にt=1から始める。
\begin{align}
m_0 &= v_0 = 0 \\
g_t &= \nabla Q_i(w) \\
m_t &= \beta_1 m_{t-1} + (1 - \beta_1) g_t \\
v_t &= \beta_2 v_{t-1} + (1 - \beta_2) g_t^2, \text{and } V_t = \text{diag}(v_t) \\
\hat{\eta}_t &= \text{Clip}(\frac{\alpha}{\sqrt{V_t}, \eta_l(t), \eta_u(t)) \\
w_t &= w_{t-1} - \frac{\hat{\eta}_t}{\sqrt{t} \circ m_t
\end{align}
パラメータ w の初期値はなんらかの確率分布からランダムに選ぶ。どの確率分布を使うかは、最小値の近傍に収束する確率に影響がある。しかし、何が適切な確率分布かはモデル次第である。ニューラルネットワークの場合についてはバックプロパゲーションの項目を参照。
確率的勾配降下法は入力の値に極端に平均・分散が異なる物が混じると、うまく行かなくなる確率が上がる。よって、モデル自体に線形変換をかけるなどして、訓練データの正規化をして、平均0分散1になるように調整する方が良い。
学習データがリアルタイムで手に入るなど、事前に平均0分散1に調整できない場合のために、2013年に Stephane Ross らが正規化オンライン学習を発表している。データの絶対値の最大値を追跡して、それを元に調整する。