概要
ニューラルネットワークの学習アルゴリズムを、ミニバッチ、推論、損失関数、勾配、パラメータ更新の流れとして整理する。
これまで扱った個別の処理は、学習ループの中で順番につながっている。
ここでは、入力データから損失を計算し、勾配を求めて重みを更新するまでの全体像をまとめる。
この記事の構成
- 学習アルゴリズムの流れ(まとめ)
学習アルゴリズムの流れ(まとめ)を順にたどり、各処理の役割を整理。 - 勾配法についての補足
勾配法についての補足として、理解を深めるための要点を確認。
学習アルゴリズムの流れ(まとめ)
ニューラルネットワークの学習とは、訓練データに対する損失が小さくなるように重みパラメータを更新する処理を指す。
その処理を大きく分類すると、以下の手順(*1)~(*4)の4つに分かれる。この手順を繰り返し、損失が小さくなる重みパラメータへ近づけていく。
学習によって損失が小さい重みを得ると、未知データに対する予測性能の向上が期待できる。ただし、訓練データの損失が小さいことと、未知データで高い精度を得られることは同じではない。
-
(*1)訓練データの抽出(ミニバッチの決定)
訓練データの中から一部をランダムに抽出したデータ群をミニバッチといい、以降の(*2)~(*4)では、このミニバッチ単位に損失関数の結果と勾配を求める。このシリーズの例では100件とするが、バッチサイズに一律の正解はなく、推定のばらつき、計算効率、メモリ使用量などを考慮して決める。※ 参考
Python - ニューラルネットワーク: 交差エントロピー誤差のミニバッチ学習と実装サンプル > ミニバッチ学習とは -
(*2)損失関数の結果取得
ニューラルネットワークの学習では、損失関数というニューラルネットワークの性能の悪さ表す指標を基準にする。損失関数の有名どころでは2乗和誤差と交差エントロピー誤差があるが、このシリーズでは、交差エントロピー誤差にスポットを当てた実装サンプルを記載している。
※ 参考
-
(*3)勾配の取得
損失関数の値が小さくなる重みを探索する。一般のニューラルネットワークでは、大域的に最小の値へ到達するとは限らない。損失関数の結果は、小さいほど正解に近づいているわけだが、もちろんそこで終わりではなく今の結果より正解に近いパラメータ候補(重み、バイアス)を決めてさらに正解に近づけていく必要がある。
そこで基準になるのが重みパラメータの微分結果(勾配値)。
※ 参考
- Python - ニューラルネットワーク: 損失関数と数値微分(勾配)の実装サンプル > 損失関数と微分の関係
- Python - ニューラルネットワーク: 損失関数と数値微分(勾配)の実装サンプル > 微分のおさらい
- Python - ニューラルネットワーク: 損失関数と数値微分(勾配)の実装サンプル > 数値微分の関数定義(Python実装サンプル)
- Python - ニューラルネットワーク: 損失関数と数値微分(勾配)の実装サンプル > 数値微分の例(Python実装サンプル)
- Python - ニューラルネットワーク: 偏微分と勾配の実装サンプル > 偏微分のおさらい
- Python - ニューラルネットワーク: 偏微分と勾配の実装サンプル > 偏微分のPython実装サンプル
- Python - ニューラルネットワーク: 偏微分と勾配の実装サンプル > 勾配のPython実装サンプル
-
(*4)重みパラメータの更新
重みパラメータを勾配の逆方向へ微小量だけ更新。※ 参考
勾配法についての補足
上記の勾配に関する記述は、すべて勾配降下法によってパラメータを更新する方法となる。
ランダムに抽出したミニバッチで全データの勾配を近似し、パラメータを更新する方法は、確率的勾配降下法(SGD)またはミニバッチSGDと呼ばれることが多い。「SGD」が1件ごとの更新だけを指すか、ミニバッチ更新も含めるかは、資料やフレームワークで用語が異なる。
※ 参考
- Python - ニューラルネットワーク: 勾配降下法の実装サンプル > 勾配法とは
- Python - ニューラルネットワーク: 勾配降下法の実装サンプル > 勾配降下法のPython実装サンプル
- Python - ニューラルネットワーク: 勾配降下法の実装サンプル > 勾配降下法の実装サンプル実行例
まとめ
- 推論は学習済みの重みから予測を求め、学習はミニバッチ抽出、推論、損失計算、勾配計算、重み更新を繰り返す。
- 損失関数はモデルの悪さを測り、勾配を使ってパラメータを動かした結果として損失を下げる。
- 一回で最適化されるわけではなく、ミニバッチを変えながら更新を繰り返す。この流れは深層学習フレームワークを理解する基礎となる。