深層モデルのための最適化
深層モデルの学習では、損失関数を最小化するようにパラメータを更新する最適化アルゴリズムが使われます。本ページは、SGD やその改良(モメンタム、NAG)、誤差逆伝播法、適応的学習率を持つ手法(AdaGrad、RMSProp、Adam)、パラメータの初期化戦略を扱います。
1. 基本的なアルゴリズム
最急降下法(Gradient Descent)
損失関数 $L(\theta)$ を最小化するために、パラメータ $\theta$ を勾配( $\nabla L(\theta)$ )と逆方向に少しずつ更新していく手法です。
\[\theta \leftarrow \theta - \eta \nabla L(\theta)\]- $\eta$(イータ):学習率(learning rate )。1 回の更新でどれだけ動くかを決めるハイパーパラメータ
- 学習率が大きすぎると発散しやすく、小さすぎると収束が遅くなる
最急降下法は全データを使って 1 回の勾配を計算するため、データ数が多いと 1 回の更新に時間がかかります。
ミニバッチと SGD(確率的勾配降下法: Stochastic Gradient Descent)
SGD は、全データではなく、ランダムに抽出した一部のデータ(ミニバッチ)だけを使って勾配を計算し、パラメータを更新します。
\[\theta \leftarrow \theta - \eta \nabla L_{\text{batch}}(\theta)\]-
ミニバッチ(mini-batch):1 回の更新に使う少数のデータの集合。バッチサイズはハイパーパラメータ
- 1 エポック(epoch):全データを 1 回使い切る単位。ミニバッチに分けて複数回の更新を行う
| 手法 | 1 回の更新に使うデータ数 | 特徴 |
|---|---|---|
| 最急降下法(バッチ勾配降下法) | 全データ | 勾配は安定するが計算コストが高い |
| SGD(狭義:1 件ずつ) | 1 件 | 更新が速いがノイズが大きい |
| ミニバッチ SGD | 数十〜数百件程度 | 実務で最も一般的。速度と安定性のバランスを取る |
一般に SGDと呼ぶ場合、実務では ミニバッチ SGD を指すことがほとんどです。
確率的とは、学習データの中からランダムに選んだ一部(1 個または少数)だけを使って勾配を計算するという意味です。
モメンタム(Momentum)
SGD は、谷底が細長い形状をした損失関数(Pathological Curvature、悪条件の曲率)で振動しやすいという弱点があります。
モメンタムは過去の勾配の方向を慣性のように蓄積して更新に加えることで振動を抑えます。
- $v$:速度(velocity )。過去の勾配の指数移動平均のようなもの
- $\gamma$(ガンマ):モメンタム係数。過去の勾配をどれだけ引き継ぐかを決める( 0.9 前後が使われることが多い)
- 谷の方向(一貫して同じ方向に進む方向)には加速し、振動する方向には打ち消し合う効果がある
Nesterov Accelerated Gradient(NAG)
モメンタムの改良版です。現在の位置ではなく、モメンタムで進んだ先(見込み位置)で勾配を計算してから更新することで、行き過ぎを事前に補正します。
2. 誤差逆伝播法
誤差逆伝播法(Backpropagation)
ニューラルネットワークの各層の重みに対する損失関数の勾配を、出力層から入力層に向かって連鎖律(chain rule)を使って効率よく計算する手法です。
ある層の入力を $x$、重みを $w$、線形出力を $z = wx + b$、活性化関数 $f$ を通した出力を $a = f(z)$ とします。損失 $L$ の重み $w$ に対する勾配は、連鎖律により次のように計算できます。
\[\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w} = \frac{\partial L}{\partial a} \cdot f'(z) \cdot x\]- 連鎖律:合成関数の微分を、途中の変数ごとの微分の積として計算できるという性質
- デルタ( $\delta = \frac{\partial L}{\partial z}$ ):層の線形出力 $z$ に対する損失の偏微分(誤差信号)。出力層側から順に計算され、前の層へ伝播していく
デルタを使うと、重みの勾配と、1つ手前の層へ渡す誤差信号は次のように書けます。
\[\delta = \frac{\partial L}{\partial a} \cdot f'(z), \qquad \frac{\partial L}{\partial w} = \delta \cdot x, \qquad \frac{\partial L}{\partial x} = \delta \cdot w\]勾配消失(Vanishing Gradient)
層が深くなるほど、逆伝播の際に勾配が繰り返し掛け合わされることで、勾配の値が 0 に近づいていく現象です。
- シグモイド関数のように、出力の値によっては微分値が小さい活性化関数を多層で使うと起こりやすい
- 入力層に近い層ほど重みがほとんど更新されなくなり、学習が進まなくなる
- 対策として、ReLU 系の活性化関数、残差接続(skip-connection )、適切な重みの初期化などが使われる
自動微分(Automatic Differentiation)
計算式を計算グラフ(computational graph )として表現し、連鎖律を使って各ノードの微分を機械的に計算する仕組みです。
- 計算グラフ:計算の手順を、変数と演算をノードとしたグラフ構造で表したもの
- 数式を人手で微分する必要がなく、フレームワーク(PyTorch など)が自動的に勾配を計算できる
- 誤差逆伝播法は、この自動微分の考え方をニューラルネットワークの損失関数に対して適用したものと位置づけられる
3. 適応的な学習率を持つアルゴリズム
学習率 $\eta$ を、パラメータごと・学習の進み具合に応じて自動的に調整するアルゴリズム群です。
AdaGrad
各パラメータの過去の勾配の二乗和を蓄積し、その平方根に反比例させて学習率を調整します。これまでに大きな勾配が積み重なったパラメータほど、有効な学習率が小さくなります。
\[G \leftarrow G + \nabla L(\theta) \odot \nabla L(\theta)\] \[\theta \leftarrow \theta - \frac{\eta}{\sqrt{G} + \epsilon} \odot \nabla L(\theta)\]- $G$:勾配の二乗和(パラメータごとの累積値)。$\theta$ と同じ形のベクトルで、初期値は $0$
- $\odot$:要素ごとの積。演算はすべてパラメータごとに行う
- $\epsilon$:$0$ による除算を防ぐための小さな定数($10^{-7}$ など)
- 更新頻度の低いパラメータ(まれにしか出現しない特徴量など)は勾配がほとんど $0$ で $G$ が小さいままなので、学習率を相対的に大きく保てる
- 弱点:$G$ は単調に増え続けるため、学習が進むにつれて学習率がどんどん小さくなり、途中で学習がほぼ止まってしまうことがある
RMSProp
\[G \leftarrow \rho \, G + (1 - \rho) \, \nabla L(\theta) \odot \nabla L(\theta)\] \[\theta \leftarrow \theta - \frac{\eta}{\sqrt{G} + \epsilon} \odot \nabla L(\theta)\]Adam(Adaptive Moment Estimation)
モメンタム(勾配の 1 次モーメント、平均)と RMSProp(勾配の 2 次モーメント、二乗の平均)の考え方を組み合わせたアルゴリズムです。
\[\begin{aligned} M_1 &\leftarrow \beta_1 M_1 + (1 - \beta_1) \, \nabla L(\theta) \\ M_2 &\leftarrow \beta_2 M_2 + (1 - \beta_2) \, \nabla L(\theta) \odot \nabla L(\theta) \end{aligned}\] \[\hat{M}_1 = \frac{M_1}{1 - \beta_1^{\,t}}, \qquad \hat{M}_2 = \frac{M_2}{1 - \beta_2^{\,t}}\] \[\theta \leftarrow \theta - \eta \, \frac{\hat{M}_1}{\sqrt{\hat{M}_2} + \epsilon}\]- $M_1$:勾配の指数移動平均(1 次モーメント)。モメンタムの速度に相当する。初期値は $0$
- $M_2$:勾配の二乗の指数移動平均(2 次モーメント)。RMSProp の $G$ に相当する。初期値は $0$
- $\beta_1,\ \beta_2$:減衰率($\beta_1 = 0.9$、$\beta_2 = 0.999$ が標準的)
- $t$:更新の回数(1 から数える)。$\beta^{\,t}$ は $\beta$ の $t$ 乗
- $\hat{M}_1,\ \hat{M}_2$:バイアス補正後の値。初期値を $0$ にしているため、学習初期は $M_1,\ M_2$ が $0$ 側に偏る。$1 - \beta^{\,t}$ で割ってこの偏りを補正する
- $\epsilon$:$0$ による除算を防ぐための小さな定数($10^{-8}$ など)
- 勾配の平均と二乗の平均の両方を指数移動平均で推定し、それぞれを使ってパラメータごとに更新量を調整する
- 実務でもっともよく使われる最適化アルゴリズムの一つ
| アルゴリズム | 使う統計量 | 特徴 |
|---|---|---|
| AdaGrad | 勾配の二乗和(累積) | 学習が進むと学習率が小さくなりすぎる |
| RMSProp | 勾配の二乗の指数移動平均 | AdaGrad の学習率が減衰しすぎる問題を緩和 |
| Adam | 勾配の平均( 1 次)と勾配の二乗の平均( 2 次)の指数移動平均 | モメンタムと RMSProp を組み合わせたもの |
4. パラメータの初期化戦略
重みの初期値が不適切だと、層を重ねるごとに出力の分散が極端に大きく(発散)または小さく(消失)なり、学習がうまく進みません。活性化関数の種類に応じた初期化方法が使われます。
Xavier 法(Glorot 法)
シグモイド関数や tanh のような、原点付近で線形に近い活性化関数向けの初期化方法です。入力と出力のユニット数を使って、各層の出力の分散が入力の分散と同程度になるように重みの初期値のスケールを決めます。
Kaiming 法(He 法)
ReLU のような、負の値を 0 にする活性化関数向けの初期化方法です。ReLU では出力の分散がおよそ半分になることを考慮し、Xavier 法よりも大きめの分散で重みを初期化します。
| 初期化手法 | 想定する活性化関数 |
|---|---|
| Xavier 法(Glorot 法) | シグモイド関数、tanh |
| Kaiming 法(He 法) | ReLU、Leaky ReLU |