ここまで、深層畳み込みニューラルネットワークの作り方について、1つずつ説明してきましたが、よくある深層畳み込みニューラルネットワークは、多くのゼロパディング付きReLU層とプーリング層を重ね合わせたものなので、全結合層を追加したものになります。
モデル学習と訓練
深層畳み込みニューラルネットワークの構造で進める場合、実際の画像から、たくさんの抽象的な特徴を認識するようにモデルを学習させて、実際の問題に対して分類や推測が出来るようにします。この手順は、機械学習の分野では、訓練(train)とも呼ばれます。
モデルを訓練するとき、モデルは畳み込みニューロンと全結合ニューロンの重みの値を学習します。もし必要ならバイアスの値も学習します。それぞれの畳み込みニューロンには、受容野の形状が\(F✕F\)で入力データの深さが\(D\)のとき、\(F✕F✕D\)個の重みが必要です。全結合ニューロンでは、\(W✕W✕D\)の形の入力に対して、重みが\(W✕W✕D\)個必要です。
それでは、どうやってモデルの重みの値を学習するのでしょうか?それは次の3つのステップで行います。
・STEP1:損失\(E\)を定義する
・STEP2:重みの値\(w\)を初期化する
・STEP3:重みの値\(w\)を繰り返し修正する
<STEP1:損失\(E\)を定義する>
ステップ1では、出力と正解との違いを損失関数で判別できるようにします。ここでは手書き数字文字の分類について考えます。画像入力データ\(x\)、それぞれのデータがどの数字のクラスであるかを表すラベルを\(y\)として訓練データ\((x,y)\)が与えられるとします。
まず、訓練データの正解ラベルをワン・ホット(one-hot)と呼ばれるベクトル形式に書き換えます。このone-hotベクトルを使って、損失\(E\)は次の計算式で表せます。
\begin{eqnarray}
E({\bar{y}},y) = \displaystyle \frac{1}{10}\displaystyle \sum_{i=0}^9{({\bar{y_i}}-y_i)}^2 \tag{1}
\end{eqnarray}
\)
one-hotベクトルとは、リストの1つの要素のみが1で他の要素が0であるベクトルのことです。ここで\({\bar{y_i}}\)と\(y_i\)は、クラスレベル\(i\)に対して、その差分を2乗した平均値で、常に正の値を取ります。この損失関数は、平均二乗損失(Mean Squared Loss)または平均二乗誤差(Mean Squared Error)と呼ばれる関数です。簡単に言い換えると、それぞれのラベルの値が正解なら1との差分、不正解なら0との差分を二乗した値を平均したものになります。正解のラベルに対して1に近い高い確率を出力していれば、誤差は0に近い小さな値になり、その他の不正解のラベルに対して0に近い低い確率を出力していれば、誤差は0に近い小さな値になります。
<STEP2:重みの値\(w\)を初期化する>
ステップ2では、ニューロンの重みをランダムな値に設定します。これは深層畳み込みニューラルネットワークの初期化に相当します。初期化によっては、重みの値が異なる多くの局所的最適値(Local Optimum)となってしまう可能性があり、このため、初期値はできるだけ良い学習が出来るように重みの値を設定する必要がありますが、深層学習の研究分野では、どのような値に初期化すべきなのか未だ未解明なため、まずはニューロンの重みをランダムにします。
これは深層ニューラルネットワークが、非常に高次元な空間に複雑な関数で表現されるためです。モデルの重みが、局所的最適値(Local Optimum)ではなく、大域的最適値(Global Optimum)になるように、私達が待てる実時間内に訓練できるベストな初期化方法は、現在のところ見つかっていないのが現状です。
しかしながら、比較的良い性能の深層ニューラルネットワークモデルを構築するためには、適切な重みの初期化が必要なことは確かです。そのため、ニューロンの構造の情報を考慮する方法も考案されています。
<STEP3:重みの値\(w\)を繰り返し修正する>
ステップ3では、ニューロンの重みを学習します。具体的には、数万〜数百万もの訓練データ\((x_i,{\bar{y_i}})\)を深層畳み込みニューラルネットワークにに与え、平均損失\(E\)を計算します。この結果を受けて、以下の式を使って庭訓損失\(E\)が比較的に低い値になるまで、ニューロンの重み\(w\)を繰り返し修正していきます。重み\(w\)の更新式は以下です。
\begin{eqnarray}
w \quad = \quad w \quad – \quad α \quad ✕ \quad σw \tag{2}
\end{eqnarray}
\)
\(σw\)は重みパラメータ\(w\)に関する平均損失\(E\)の偏微分をしたときの変化量です。\(α\)が学習率と呼ばれるもので、学習率\(α\)と変化量\(σw\)を使って、以前の記事で説明した最急降下法を適用します。
・バッチ学習
実際の課題では、深層畳み込みニューラルネットワークに学習させるためには、多くの訓練データ(サンプル)を必要とします。また、演算処理の一部をGPUと共有することで処理の高速化を期待する場合、GPUメモリサイズの上限のために、全てのデータを読み込んで\(σw\)を計算できない場合もあります。この懸念の解消方法はサンプルを細かく分割し、学習を数回に分けて実行するバッチ学習(Batch Learning)と呼ばれる手法の適用です。複数のサンプルごとのバッチ処理を行って\(σw\)を計算し、重み\(w\)を更新します。このバッチ処理により、パラメータの更新を行う1サイクルを”epoch(エポック)”と呼びます。
・早期終了
一般的には、深層ニューラルネットワークモデルの学習のために、ステップ3では何エポックくらい訓練すればいいのか? という疑問が生じます。よくやる方法としては、早期終了(Early Stopping)があります。
基本的なアイデイアとしては、学習状況の確認のためにサンプルを分けて評価データ(Validation Data)を準備しておき、モデルの訓練の状況をモニタリングします。
1エポック終了するごとに、その時点でのモデルに評価データを与えて、ステップ1で説明した平均損失を計算し、前回のエポック損失の値と比較します。もし、評価した損失が下がっているならば、モデルは正常に学習していると言えます。逆に、何度エポックを繰り返しても評価した損失がさがらない場合は、その評価下損失が最も低い損失の値なので、その訓練は中断し、最終的なモデルとして保存すべきであるというわけです。
・ハイパーパラメータ
ステップ3の冒頭に紹介した重み\(w\)の更新式の中で、学習率\(α\)はモデルの訓練プロセスに大きな影響を与えます。モデル学習のための非常に重要なパラメータで、ハイパーパラメータと呼ばれています。ハイパーパラメータとは、学習モデルに直接組み込まれているパラメータではなく、学習の仕方に影響する上位のパラメータ、という意味でこの様に呼ばれています。