深層モデルのための最適化

0.章の概要

深層学習モデルの性能を向上させるためには、適切な最適化アルゴリズムを選択することが重要です。この章では、最適化アルゴリズムの基本的な原理に加え、各アルゴリズムの利点と欠点を比較し、実際の問題にどのように適用するかを学びます。 また、効率的な学習を行うための重要技術である誤差逆伝播について、具体的な計算式を交えて解説していきます。

1.基本的なアルゴリズム

学習キーワード:確率的勾配降下法(SGD)、学習率、最急降下法、ミニバッチ、モメンタム、Pathological Curvature、Momentum、Nesterov Accelerated Gradient

概要

深層学習におけるモデル最適化の基本的な目標は、損失関数の値を最小化することです。この目標を達成するために、損失関数の勾配(傾き)を計算し、その勾配に基づいてモデルパラメータを更新します。具体的には、勾配の逆方向にパラメータを更新することで、損失関数の値が減少するように調整します。ここでは、基本的な最適化アルゴリズムの原理と、どのように勾配を更新していくのかを詳しくみていきましょう。

optimization

確率的勾配降下法(Stochastic Gradient Descent : SGD)

確率的勾配降下法(SGD)は、最急降下法の一種であり、損失関数の勾配を計算し、その勾配に基づいてパラメータを更新する方法です。

パラメータの更新は、次の式で表されます。

\[ w_{t+1} = w_t - \eta * \nabla L(w_t) \]

ここで、\(\mathbf{w}_t\) はt番目のイテレーションのパラメータ、\(\eta\) は学習率、\(\nabla L(\mathbf{w}_t)\) は損失関数 \(L(\mathbf{w})\) の \(t\) 番目のイテレーションの勾配を示しています。学習率 \(\eta\) は、パラメータをどの程度更新するかを制御しており、学習率が大きすぎると損失関数が発散し、小さすぎると収束が遅くなります。

※最急降下法とSGDの違い

SGDと最急降下法は、どちらも損失関数の勾配に基づいてパラメータを更新する最適化アルゴリズムですが、更新の頻度と範囲に大きな違いがあります。

最急降下法は、全ての訓練データを使用して損失関数の勾配を計算し、パラメータを更新します。これに対し、SGDは、各イテレーションでランダムに選択された1つの訓練データ、またはミニバッチを使用して損失関数の勾配を計算し、パラメータを更新します。

この違いにより、SGDは最急降下法よりも計算コストが低く、収束速度が速くなりますが、最急降下法よりも収束の安定性は劣ります。

利点
  • 計算コストが低い
  • 大規模なデータセットでも適用可能
欠点
  • 学習率が大きすぎると発散し、小さすぎると収束が遅くなる
  • 局所最適解に陥りやすい

SGDは現在も広く使われているアルゴリズムであり、適切な学習率を選択することで、効率的なモデル最適化が可能になります。


モメンタム(Momentum)

モメンタム(Momentum)は、SGDに基づいて開発された最適化アルゴリズムの一種であり、パラメータの更新に際して、前のイテレーションの更新量を考慮することで、収束の安定性を高めることを目的としています。言い換えれば、モメンタムは「過去の勾配を考慮することで急激な変化を抑える」最適化手法になります。

パラメータの更新は、次の式で表されます。

momentum
\[ v_t = \beta * v_{t-1} - \alpha * \nabla E(W_{t-1}) \] \[ W_t = W_{t-1} + v_t \]

ここで、\(\mathbf{W}_t\) は \(t\) 番目のイテレーションのパラメータ、\(\alpha\) は学習率、\(\nabla E(\mathbf{W}_{t-1})\) は損失関数 \(E(\mathbf{W})\) の \(t-1\) 番目のイテレーションの勾配、\(\beta\) はモメンタムの係数です。
モメンタムでは、物理で言う「速度」に当たる \(𝑣\) を足し、学習の移動量を調整する最適化します。モメンタム係数は加速の勢いを調整するパラメータで、0~1の値を用いることがほとんどです。

利点
  • SGDに比べて収束の安定性が高い
  • 局所最適解に陥りやすい問題を軽減することができる
欠点
  • SGDに比べて計算コストが高い
  • モメンタムの係数を適切に選択する必要がある

Nesterov Accelerated Gradient

Nesterov Accelerated Gradientは、モメンタムの改良版であり、モメンタムの係数を修正することで、収束の安定性を高めることを目的としています。

パラメータの更新は、次の式で表されます。

\[ v_t = \beta * v_{t-1} - \alpha * \nabla E(W_{t-1} + \beta * v_{t-1}) \] \[ W_t = W_{t-1} + v_t \]

ここで、\(\mathbf{W}_t\) はt番目のイテレーションのパラメータ、\(\alpha\) は学習率、\(\beta\) はモメンタムの係数です。

Nesterov Accelerated Gradientは、モメンタムに準じた式に変換された最適化アルゴリズムです。通常のモメンタムがパラメータを更新する直前の勾配を用いるのに対し、Nesterov Accelerated Gradientはパラメータの更新先を見越して勾配を計算します。これにより、更新すべき方向や速度を正確に調整でき、より効率的な学習がを行うことができます。


関連用語の補足
  • ミニバッチ:訓練データの一部をランダムに選択して、パラメータの更新に使用する小さなデータセットのことです。
  • バッチ学習:全ての訓練データを一括してパラメータの更新を行う学習方法です。安定した学習結果が得られ、データ数が少ない場合に使われます。
  • ミニバッチ学習:訓練データの一部をランダムに選択してパラメータの更新を行う学習方法です。パラメータの変化に対して損失関数が反応しやすく、学習が停滞しづらくなります。
  • オンライン学習:訓練データを一つずつ順番に処理してパラメータの更新を行う学習方法です。事前に全訓練データを用意する必要がないですが、データ順番やノイズデータによって、結果が不安定になることもあります。
  • イテレーション:モデルのパラメータを更新するために、データセットを何度も通過させるプロセスの一回を指します。例えば、SGDやモメンタムでは、各イテレーションでパラメータが一度更新されます。
  • イテレーション数:イテレーション数は、モデルのパラメータを更新するためにデータセットを何度も通過させるプロセスの回数を指します。例えば、100件のデータセットを20件ずつのミニバッチに分けると、イテレーション数は5 (=100/20)となります。
  • エポック数:エポック数は、データセットを一通り通過させることを1エポックとし、その回数を指します。例えばイテレーション数が5の場合で100回学習を行うと、エポック数は20 (=100/5)となります。
  • Pathological Curvature:損失関数の勾配が急激に変化する領域が存在する場合に発生する問題です。このような領域では、学習率が大きすぎると発散し、小さすぎると収束が遅くなるため、適切な学習率の選択や、モメンタムなどの最適化アルゴリズムの使用が有効です。

2.誤差逆伝播法

学習キーワード:誤差逆伝播法、連鎖律、偏微分によるデルタ、勾配消失、自動微分、計算グラフ

概要

誤差逆伝播法は、ニューラルネットワークの学習において、効率的にパラメータを更新するための基盤技術です。この手法は、連鎖律と偏微分によるデルタを使用して、各パラメータの更新量を効率的に計算します。ここでは、誤差逆伝播法を理解するのに必要な基本的概念や、具体的な計算手順を詳細に解説していきます。


連鎖律

連鎖律は、合成関数の微分を計算するための基本的なルールです。ニューラルネットワークは複数の関数が重ねられた合成関数であり、その学習においては、この連鎖率を利用した効率的な勾配計算が重要になります。一般的に、連鎖律は次の式で表されます。

\[ \frac{d}{dx} f(g(x)) = f'(g(x)) \cdot g'(x) \]

ここで、\(f\) と \(g\) は関数、\(x\) は変数、\(f'\) と \(g'\) はそれぞれの関数の微分です。この式は、合成関数の微分を計算するための基本的なルールです。

例えば、 \((2x)^2\) を微分したい場合、\(f(x) = x^2\) と \(g(x) = 2x\) として、連鎖律を適用すると、

\[ \frac{d}{dx} f(g(x)) = \frac{d}{dx} (2x)^2 = 2 \cdot 2x \cdot 2 = 8x \]

となります。

ここで、\(f(x) = x^2\) の微分は \(f'(x) = 2x\)、\(g(x) = 2x\) の微分は \(g'(x) = 2\) です。連鎖律を使用することで、合成関数の微分を簡単に計算することができます。

連鎖律を用いた逆伝播の計算

逆伝播では、連鎖律を使用して各ノードの出力に対する勾配を計算します。例として、\(z\) から始まり、\(y\)、\(x\)、\(w\) の順で逆伝播を行ってみます。(\(z\) が損失関数で、\(w\) がパラメータに当たるとイメージしてください。)

chain_rule
\[ \frac{\partial z}{\partial w} = \frac{\partial z}{\partial y} \cdot \frac{\partial y}{\partial x} \cdot \frac{\partial x}{\partial w} \]

ここで、\(\frac{\partial z}{\partial w}\) は \(z\) に対する\(w\) の勾配、\(\frac{\partial z}{\partial y}\) は\(z\) に対する\(y\) の勾配、\(\frac{\partial y}{\partial x}\) は\(y\) に対する\(x\) の勾配、\(\frac{\partial x}{\partial w}\) は\(x\) に対する\(w\) の勾配です。

各ノードの出力に対する勾配を計算することで、最終的に\(w\) に対する \(z\) の勾配が計算されます。これにより、\(w\) の更新量が計算され、モデルが最適化(学習)されます。


偏微分によるデルタ

偏微分によるデルタは、現在の勾配をどの程度更新するかを決定します。勾配が大きい場合、パラメータの更新量も大きくなり、逆に勾配が小さい場合は更新量も小さくなります。具体的な値は選択した最適化手法によります。
偏微分によるデルタは、次の式で表されます。

\[ \Delta w = - \eta \cdot \frac{\partial E}{\partial w} \]

ここで、\(\Delta w\) はパラメータの更新量、\(\eta\) は学習率、\(E\) は誤差関数、\(w\) はパラメータです。この式は、一般的な勾配降下法(Gradient Descent)に基づく式です。

誤差逆伝播法では、ネットワークの出力と実際の出力との誤差(損失関数として定義)を計算し、その誤差を各パラメータに対して逆伝播させます。この過程で、各パラメータの更新量(偏微分によるデルタ)が計算され、モデルのパラメータが更新されます。


誤差逆伝播法(自動微分、計算グラフ)

自動微分と計算グラフは、誤差逆伝播法において、各パラメータの更新量を効率的に計算するための手法です。

計算グラフは、ニューラルネットワークの学習プロセスを視覚化するためのツールです。計算グラフを使用することで、ニューラルネットワークの各層での計算の流れを追跡し、パラメータの更新プロセスを理解することができます。計算グラフは、計算の流れをノードとエッジで表現し、各ノードが計算の結果を表し、エッジが計算の流れを示します。
自動微分は、計算グラフを用いて、関数の微分を自動的に計算する技術です。数値微分に比べて、誤差が少なく、正確な勾配を得ることができ、複雑なモデルや関数に対しても適用可能です。

以下では計算グラフを用いて効率的に勾配を計算する(逆伝播する)方法を説明します。

加算ノードの逆伝播

加算ノードの逆伝播では、入力された勾配をそのまま出力します。具体的には、加算ノードの出力 \(y\) と入力 \(x_1, x_2\) に対する勾配 \(\frac{\partial y}{\partial x_1}, \frac{\partial y}{\partial x_2}\) は、次の式で表されます。

add_backward
\[ \frac{\partial y}{\partial x_1} = \frac{\partial y}{\partial x_2} = 1 \]

この式は、加算ノードの出力が入力の和であるため、入力に対する勾配は常に1であることを示しています。

つまり、加算の場合では逆伝播すると、前の偏微分の値がそのまま戻るということです。

乗算ノードの逆伝播

乗算ノードの逆伝播では、入力された勾配を各入力の値でスケーリングして出力します。具体的には、乗算ノードの出力 \(y\) と入力 \(x_1, x_2\) に対する勾配 \(\frac{\partial y}{\partial x_1}, \frac{\partial y}{\partial x_2}\) は、次の式で表されます。

mul_backward
\[ \frac{\partial y}{\partial x_1} = x_2, \frac{\partial y}{\partial x_2} = x_1 \]

この式は、乗算ノードの出力が入力の積であるため、各入力に対する勾配はもう一方の入力の値であることを示しています。

つまり、つまり、乗算の場合では逆伝播すると、前の偏微分の値に、他方の入力をかけた値が戻るということです。

シグモイドレイヤの逆伝播

シグモイドレイヤの逆伝播では、シグモイド関数の微分を計算して出力します。具体的には、シグモイドレイヤの出力 \(y\) と入力 \(x\) に対する勾配 \(\frac{\partial y}{\partial x}\) は、次の式で表されます。

\[ \frac{\partial y}{\partial x} = y(1-y) \]

この式は、シグモイド関数の微分がその出力値に依存することを示しています。

ReLUレイヤの逆伝播

ReLUレイヤの逆伝播では、入力が正の場合は1、負の場合は0を出力します。具体的には、ReLUレイヤの出力 \(y\) と入力 \(x\) に対する勾配 \(\frac{\partial y}{\partial x}\) は、次の式で表されます。

\[ \frac{\partial y}{\partial x} = \begin{cases} 1 & \text{if } x > 0 \\ 0 & \text{if } x \leq 0 \end{cases} \]

この式は、ReLU関数の微分が入力の符号に依存することを示しています。

Affineレイヤの逆伝播

Affineレイヤは、ニューラルネットワークの中で、入力データに対して重み付けを行い、バイアスを加える処理を指します。この処理は、入力データを適切に変換し、次の層への入力として渡すためのものです。実際のネットワークでは効率よく計算を進めるために、入力された勾配を重み行列として計算します。Affineレイヤの出力 \(Y\) と入力 \(X\)、重み行列 \(W\)、バイアス \(B\) に対する勾配 \(\frac{\partial L}{\partial X}\), \(\frac{\partial L}{\partial W}\), \(\frac{\partial L}{\partial B}\) は、次の式で表されます。

\[ \frac{\partial L}{\partial X} = \frac{\partial L}{\partial Y} \cdot W^T \] \[ \frac{\partial L}{\partial W} = X^T \cdot \frac{\partial L}{\partial Y} \] \[ \frac{\partial L}{\partial B} = \sum \frac{\partial L}{\partial Y} \]

この式は、Affineレイヤの出力が入力と重み行列の積、バイアスの加算、活性化関数の適用によって計算されるため、入力、重み、バイアスに対する勾配が、それぞれ重み行列の転置、入力の転置、1(または全体の和)であることも示しています。

ここでの \(\frac{\partial L}{\partial Y}\) は、損失関数 \(L\) から連鎖律を用いて渡ってきた値であり、出力 \(Y\) に対する損失の変化を示しています。

もう少し具体的なイメージ図を以下に示します。

affine_backward
誤差逆伝播の計算例

以下は、みかんの個数が変化したときに合計額がどの程度動くかを計算した例です。

みかんの金額:\(150\)円

みかんの個数:\(3\)個

消費税:\(1.1\)

合計額:\(495\)円

orange_example

逆伝播の計算により、みかんの個数が変化したとき(1個増えたとき)に合計額は165円変動することがわかりました。ニューラルネットワークでは上記例の合計額を損失関数、みかんの個数や金額を入力データや重みに置き換えて計算がされていきます。


関連用語の補足
  • 勾配消失:勾配消失は、ニューラルネットワークの学習において、勾配が急激に小さくなる現象です。この現象が発生すると、学習が遅くなったり、局所最適解に陥りやすくなります。この問題を軽減するためには、適切な初期化方法や活性化関数の選択、またはバッチ正規化などの手法を使用することが有効です。
  • 合成関数:合成関数は、2つ以上の関数を組み合わせた関数です。例えば、\(f(x) = x^2\) と \(g(x) = 2x\) の合成関数は \(f(g(x)) = (2x)^2\) です。

3.適応的な学習率を持つアルゴリズム

学習キーワード:AdaGrad、RMSProp、Adam

AdaGrad

AdaGradは、適応的な学習率を持つ最適化アルゴリズムの一種です。各パラメータの学習率を、勾配の大きさに応じて調整することで、パラメータの更新をより効率的に行うことができます。AdaGradは大きく更新されてきたパラメータほど更新されにくくなる特徴があります。

\[ h_t = h_{t-1} + \nabla E(W_t) \odot \nabla E(W_t) \] \[ \alpha_t = \frac{\alpha_0}{\sqrt{h_t + \epsilon}} \] \[ W_{t+1} = W_t - \alpha_t \nabla E(W_t) \]

ここで、\(h_t\) は \(t\) 番目のイテレーションの勾配の二乗和の累積、\(\alpha_t\) は \(t\) 番目のイテレーションの学習率、\(\alpha_0\) は初期学習率、\(\epsilon\) は小さな値、\(W_t\) は \(t\) 番目のイテレーションのパラメータ、\(\nabla E(W_t)\) は \(t\) 番目のイテレーションの勾配、\(\nabla E(W_t) \odot \nabla E(W_t)\) は勾配の要素ごとの積(アダマール積)です。

利点
  • SGDに比べて収束の安定性が高い
  • パラメータの更新をより効率的に行うことができる
欠点
  • \(ℎ_𝑡\) がどんどん大きくなることで、学習率 \(\alpha_t\) はどんどん小さくなり、学習が停滞することがある。

AdaGradはSGDに比べて収束の安定性が高い最適化アルゴリズムであり、適切な学習率を選択することで、効率的なモデル最適化が可能になります。


RMSProp

RMSPropは、AdaGradの改良版であり、適応的な学習率を持つ最適化アルゴリズムの一種です。AdaGradと異なり、過去の勾配の二乗和に移動平均を適用することで、最近の勾配に重きを置いて学習率を調整します。この特徴により、RMSPropは、過去の重みよりも最近の情報を優先することができ、非静的な問題に対しても適切に学習率を調整することができます。

\[ h_t = \beta h_{t-1} + (1-\beta) \nabla E(W_t) \odot \nabla E(W_t) \] \[ \alpha_t = \frac{\alpha_0}{\sqrt{h_t + \epsilon}} \] \[ W_{t+1} = W_t - \alpha_t \nabla E(W_t) \]

ここで、\(\mathbf{W}_t\) は \(t\) 番目のイテレーションのパラメータ、\(\beta\) は減衰率、\(\alpha_0\) は初期学習率、\(\nabla E(W_t)\) は \(t\) 番目のイテレーションの勾配、\(\epsilon\) は小さな値です。

利点
  • AdaGradに比べて収束の安定性が高い(学習を進めていくと更新量が0になってしまう問題を改善)
  • 最近の勾配に重きを置いて学習率を調整できる
欠点
  • AdaGradに比べて計算コストが高い

RMSPropはAdaGradに比べて収束の安定性が高い最適化アルゴリズムであり、適切な学習率を選択することで、効率的なモデル最適化が可能になります。


Adam(Adaptive Momentum)

Adamは、適応的な学習率を持つ最適化アルゴリズムの一種です。モメンタムとRMSPropを組み合わせたようなアルゴリズムになっており、過去の勾配の移動平均と過去の勾配の二乗の移動平均を考慮します。

\[ m_{t+1} = \beta_1 m_t + (1-\beta_1) \nabla E(W_t) \] \[ v_{t+1} = \beta_2 v_t + (1-\beta_2) \nabla E(W_t)^2 \] \[ \hat{m} = \frac{m_{t+1}}{1-\beta_1^t} \] \[ \hat{v} = \frac{v_{t+1}}{1-\beta_2^t} \] \[ W_{t+1} = W_t - \alpha \frac{\hat{m}}{\sqrt{\hat{v}} + \epsilon} \]

ここで、\(\mathbf{W}_t\) は \(t\) 番目のイテレーションのパラメータ、\(\alpha\) は学習率、\(\beta_1\) と \(\beta_2\) は減衰率、\(\epsilon\) は小さな値、\(\nabla E(W_t)\) は \(t\) 番目のイテレーションの勾配です。

利点
  • RMSPropに比べて収束の安定性が高い
  • 過去の勾配の移動平均を考慮することで、学習率をより適切に調整できる
欠点
  • RMSPropに比べて計算コストが高い

AdamはRMSPropに比べて収束の安定性が高い最適化アルゴリズムであり、適切な学習率を選択することで、効率的なモデル最適化が可能になります。

モーメンタムとの違いは、モーメンタムは過去の更新量を考慮するのに対し、Adamは過去の勾配の移動平均と過去の勾配の二乗の移動平均を考慮する点にあります。

最適化手法の選択について

最適化手法の選択は、モデル最適化の成功に大きく影響します。各手法には特徴があり、実務では様々な最適化手法を試して決定することが重要です。

  • SGD:シンプルで計算コストが低いため、初期の試験やプロトタイプの開発に適しています。
  • モーメンタム:過去の更新量を考慮することで、局所最適解に陥るのを避けることができますので、局所最適解に陥りやすい問題に適しています。
  • AdaGrad:パラメータの更新に際して各パラメータの勾配の大きさに応じて学習率を調整するため、異なるスケールのパラメータを持つモデルに適しています。
  • RMSProp:AdaGradの改良版であり、最近の勾配に重きを置いて学習率を調整するため、非静的な問題に適しています。
  • Adam:RMSPropに加えて過去の勾配の移動平均も考慮するため、最も広く適用される最適化手法の一つです。

最適化手法の選択は、問題の特性、データの特性、モデル構造などを考慮して行う必要があります。適切な最適化手法を選択することで、モデル最適化の効率と性能が向上させましょう。

4.パラメータの初期化戦略

学習キーワード:Xavier法/Glorot法、Kaiming法/He法

概要

パラメータ(ニューラルネットワークの重みやバイアスなどの学習可能な変数)の初期化戦略は、深層学習モデルの性能に大きく影響し、適切な初期化方法を選択することで、モデルの収束速度と性能が向上します。初期化が不適切な場合、モデルは不適切な状態で開始し、収束が遅れたり局所最適解に陥る可能性が高まります。
例えば、パラメータを0で初期化すると、全てのパラメータが同じ値を持つことになり、モデルは異なる特徴を学習することができません。また、ランダムで適当な値を選択すると、モデルは不必要な方向に学習し、収束が遅くなるかもしれません。ここでは、初期化方法として有名であるXavier法/Glorot法Kaiming法/He法について紹介します。

Xavier法/Glorot法

Xavier法(Glorot法)は、パラメータの初期化に広く使用される方法でXavier GlorotとYoshua Bengioによって提案されました。重みの初期値は、ガウス分布(正規分布)からのランダムな数値を利用されることが多く、Xavier法では、標準偏差が次のように設定されます。

\[ SD = \sqrt{\frac{1}{n_i}} \]

ここで、\(SD\) は標準偏差、\(n_i\) は前の層のノード数です。この設定により、活性化関数の出力の分散が保たれ、学習が安定します。特に、活性化関数の出力が0に集中しないために、学習がより効率的に進むようになります。

Xavier法は活性化関数にシグモイド関数やtanh関数を使う際に用いられます。
Kaiming法/He法

Kaiming法(He法)は、Xavier法の改良版です。Kaiming HeとXiangyu Zhangによって提案されました。Kaiming法では、標準偏差は次のように設定されます。

\[ SD = \sqrt{\frac{2}{n_i}} \]

ここで、\(SD\) は標準偏差、\(n_i\) は前の層のノード数です。この設定により、勾配消失問題を軽減し、学習の効率を向上させることが期待されます。

Kaiming法は活性化関数にReLU関数を使う際に用いられます。

他のセクションで紹介した最適化アルゴリズムとの組み合わせで、適切なパラメータ初期値を選択することで、モデル最適化の効率と性能が向上します。

キーワードまとめ

確率的勾配降下法(SGD)、学習率、最急降下法、ミニバッチ、モメンタム、Pathological Curvature、Momentum、Nesterov Accelerated Gradien、誤差逆伝播法、連鎖律、偏微分によるデルタ、勾配消失、自動微分、計算グラフ、AdaGrad、RMSProp、Adam、Xavier法/Glorot法、Kaiming法/He法