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