【DeepLearning】逆伝播と数値微分

Deep Learning とは何なのか・・・まったく知らない状態から挑戦してみたいと思います!

機械学習において「勾配」を求めることは非常に重要な処理です。

勾配を求める方法は数値微分誤差逆伝播法の2つが存在するようです。

数値微分

数値微分は微小な変化量を用いて関数の勾配を近似的に求める方法です。
具体的には、ある点における関数の値を微小な幅で変化させた場合の関数の変化量を計算しその変化量を変化幅で割ることで勾配を求めます。
実際の関数の値を利用して勾配を近似的に求めるため、数値微分には計算コストがかかるという欠点があります。

誤差逆伝播法

誤差逆伝播法(Backpropagation)は、ニューラルネットワークを含む多層のモデルにおいて勾配を効率的に計算する手法です。
誤差逆伝播法では、出力層から入力層に向かって逆方向に誤差を伝播させながら各パラメータ(重みやバイアス)に関する勾配を求めます。
数値微分と比べて効率的に勾配を求めることができます。

具体的には、出力層の誤差を計算しその誤差を入力層に逆伝播させながら各層のパラメータに関する勾配を計算します。
逆伝播の際には連鎖率を利用して勾配を効率的に計算することができます。

数値微分の存在価値

数値微分は勾配を近似的に求める手法であり実際の関数の値を利用しますが計算コストが高いです。
誤差逆伝播法だけでよかったんじゃ・・・

いえいえ😀

数値微分にも「勾配確認」という重要な役割があるのです。

勾配確認とは

勾配確認とは数値微分を使用して計算された勾配誤差逆伝播法によって計算された勾配とを比較することで行われます。
数値微分による勾配は近似的な値であるため誤差逆伝播法による勾配と完全に一致することはないですよね。
勾配確認では「完全一致ではないけれどほぼほぼ正確だよね」という確認行います。

以下のような流れで勾配確認が行われます:

  1. モデルのパラメータを現在の値から微小な量だけ変化させる。
  2. 変化させたパラメータに対して、数値微分を使用して勾配を計算する。
  3. 同じパラメータに対して、誤差逆伝播法を使用して勾配を計算する。
  4. 数値微分による勾配と誤差逆伝播法による勾配を比較する。
  5. 差異が許容範囲内であれば、勾配の計算は正しく行われているとみなす。

勾配確認は実装した機械学習モデルが正しく動作しているかを確認するための重要な手法とされています。
計算のバグや実装ミスによって勾配の計算が誤っている場合、モデルの学習がうまく進まないなどの問題が発生する可能性があります。
勾配確認を行うことで、このような問題を早期に発見し修正することができます。

数値微分は ここでちゃんと仕事をします。
でも・・・数値微分なので時間がかかります。

なので大規模なモデルやデータセットに対しては時間がかかる可能性があります。
しかし勾配確認という作業は主にデバッグや実装の検証に使用される程度であるため思ったほど時間はかからないのだとか。

また、勾配確認はデバッグや実装の初期段階で行われることが多く、大規模なデータセットやモデルに適用する場合は一度だけ実行して結果を検証して、
その後は誤差逆伝播法の勾配を信頼して進めることが一般的のようです。