UNISIA-SE Tech Blog

気まぐれお勉強日記

[Python] [14] ニューラルネットワークの学習 (まとめ)

1. 前提条件


このページでは、下記で触れたニューラルネットワークの学習に関する基本的な概念を処理の流れに沿ってまとめたものを記載する。

以下、必要な前提知識。

▼ 下記ページを理解していること。
[Python] [1] 単純パーセプトロンの概念と実装サンプル
[Python] [2] 多層パーセプトロンの概念と実装サンプル
[Python] [3] ニューラルネットワークの活性化関数と実装サンプル
[Python] [4] 活性化関数の実装サンプルまとめ(ステップ / シグモイド …
[Python] [5] MNISTのダウンロード方法 (手書き数字画像セットを取込む)
[Python] [6] MNISTを使ったニューラルネットワークの推論処理と実装サンプル
[Python] [7] MNISTを使った推論バッチ処理の実装サンプル
[Python] [8] 損失関数 (2 乗和誤差、交差エントロピー誤差) と実装サンプル
[Python] [9] ミニバッチ学習 (交差エントロピー誤差) の実装サンプル
[Python] [10] 損失関数と数値微分(勾配)の実装サンプル
[Python] [11] 偏微分と勾配の実装サンプル
[Python] [12] 勾配降下法の実装サンプル
[Python] [13] 重みに対する損失関数の勾配法と実装サンプル

2. 学習アルゴリズムの流れ (まとめ)


ニューラルネットワークの学習とは、訓練データを基に意図した結果となる最適な重みパラメータを判別する 処理を指す。

その処理を大きく分類すると、以下の手順 (1) ~ (4) の4つ分かれ、これを繰り返すことで限りなく 最適な重みパラメータ に近づけていく。

その結果 最適な重みパラメータ によって、正解率がほぼ100%となる画像認識膨大なデータに基づく根拠ある推測 が実現できるようになる。


(1) 訓練データの抽出 (ミニバッチの決定)
訓練データの中からランダムに 100件程度(ある程度信頼性がある件数) 抽出した データ群ミニバッチ といい、以降の (2) ~ (4) では、この ミニバッチ 単位に 損失関数の結果勾配 を求めるアルゴリズムになっている。

※ (1) の参考ページ
[Python] [9] ミニバッチ学習 (交差エントロピー誤差) の実装サンプル >「ミニバッチ学習とは」

(2) 損失関数の結果取得
ニューラルネットワークの学習では、損失関数 という ニューラルネットワークの性能の悪さ表す指標 を基準にする。

損失関数 の有名どころでは 2 乗和誤差交差エントロピー誤差 があるが、このシリーズでは、交差エントロピー誤差 にスポットを当てた実装サンプルを記載してる。

※ (2) の参考ページ
[Python] [8] 損失関数 (2 乗和誤差、交差エントロピー誤差) と実装サンプル >「2. 乗和誤差」
[Python] [8] 損失関数 (2 乗和誤差、交差エントロピー誤差) と実装サンプル >「4. 交差エントロピー誤差」
[Python] [9] ミニバッチ学習 (交差エントロピー誤差) の実装サンプル >「5. 交差エントロピー誤差のミニバッチ学習 (Python実装サンプル)」

(3) 勾配の取得
損失関数 の結果が 最も小さい値となる重み となるように 自己探索(最適な重みパラメータを探す) していくことになる。

損失関数 の結果は、小さいほど正解に近づいている わけだが、もちろんそこで終わりではなく 今の結果より正解に近い パラメータ候補 (重み、バイアス) を決めてさらに正解に近づけていく必要がある。

そこで基準になるのが 重みパラメータの微分結果(勾配値)。

※ (3) の参考ページ
[Python] [10] 損失関数と数値微分(勾配)の実装サンプル >「2. 損失関数と微分の関係」
[Python] [10] 損失関数と数値微分(勾配)の実装サンプル >「3. 微分のおさらい」
[Python] [10] 損失関数と数値微分(勾配)の実装サンプル >「4. 数値微分の関数定義 (Python実装サンプル)」
[Python] [10] 損失関数と数値微分(勾配)の実装サンプル >「5. 数値微分の例 (Python実装サンプル)」
[Python] [11] 偏微分と勾配の実装サンプル >「2. 偏微分のおさらい」
[Python] [11] 偏微分と勾配の実装サンプル >「3. 偏微分のPython実装サンプル」
[Python] [11] 偏微分と勾配の実装サンプル >「4. 勾配のPython実装サンプル」
[Python] [13] 重みに対する損失関数の勾配法と実装サンプル >「2. 重みに対する勾配法とは」
[Python] [13] 重みに対する損失関数の勾配法と実装サンプル >「3. 重みに対する勾配のPython実装サンプル」

(4) 重みパラメータの更新
重みパラメータを 勾配方向(より損失が少ない重みパラメータへ) へ微小量だけ更新する。

※ (4) の参考ページ
[Python] [13] 重みに対する損失関数の勾配法と実装サンプル >「4. 実装サンプルの実行確認」

3. 勾配法についての補足


上記「2. 学習アルゴリズムの流れ (まとめ)」の 勾配 に関する記述は、すべて 勾配降下法 によってパラメータを更新する方法となる。

そして ミニバッチは、ランダム抽出したデータ群であることから 確率的勾配降下法 といい、ディープラーニングのフレームワークでは、SGD(stochastic gradient descent) と呼ばれることがほとんど。

※ 勾配法の参考ページ
[Python] [12] 勾配降下法の実装サンプル >「2. 勾配法とは」
[Python] [12] 勾配降下法の実装サンプル >「3. 勾配降下法のPython実装サンプル」
[Python] [12] 勾配降下法の実装サンプル >「4. 勾配降下法の実装サンプル実行例」


以上。


【参考文献】
斎藤 康毅 (2018) 『ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装』株式会社オライリー・ジャパン


Copyright UNISIA-SE All Rights Reserved.
s-hama@unisia-se.jp