ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

畳み込みニューラル ネットワークの層の指定

新しい畳み込みニューラル ネットワーク (ConvNet) の作成と学習の最初のステップは、ネットワーク アーキテクチャの定義です。ここでは、ConvNet の層の詳細と、それらが ConvNet に現れる順序について説明します。深層学習層の詳細な一覧、およびそれらの層を作成する方法については、深層学習層の一覧を参照してください。シーケンス分類およびシーケンス回帰のための LSTM ネットワークについては、長短期記憶ネットワークを参照してください。独自のカスタム層を作成する方法については、カスタム深層学習層の定義を参照してください。

ネットワーク アーキテクチャは、含まれる層のタイプと数によって異なる可能性があります。含まれる層のタイプと数は、特定の用途またはデータによって変わります。たとえば、カテゴリカル応答がある場合、ソフトマックス層と分類層が必要です。一方、応答が連続的である場合はネットワークの最後に回帰層が必要です。畳み込み層が 1 つまたは 2 つしかない小規模なネットワークは、少量のグレースケール イメージ データを学習するには十分かもしれません。一方、数百万枚のカラー イメージを含むより複雑なデータについては、複数の畳み込み層と全結合層を持つ、より複雑なネットワークが必要になる場合があります。

すべての層が順に結合された深いネットワークのアーキテクチャを指定するには、層の配列を直接作成します。たとえば、28 x 28 のグレースケール イメージを 10 個のクラスに分類する深いネットワークを作成するには、次の層配列を指定します。

layers = [
    imageInputLayer([28 28 1])  
    convolution2dLayer(3,16,'Padding',1)
    batchNormalizationLayer
    reluLayer    
    maxPooling2dLayer(2,'Stride',2) 
    convolution2dLayer(3,32,'Padding',1)
    batchNormalizationLayer
    reluLayer 
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];
layersLayer オブジェクトの配列です。その後で、layers を学習関数 trainNetwork への入力として使用することができます。

すべての層が順に結合されたニューラル ネットワークのアーキテクチャを指定するには、層の配列を直接作成します。層に複数の入力または出力がある可能性があるネットワークのアーキテクチャを指定するには、LayerGraph オブジェクトを使用します。

イメージ入力層

イメージ入力層は、imageInputLayer を使用して作成します。

イメージ入力層は、ネットワークにイメージを入力し、データ正規化を適用します。

イメージのサイズは、引数 inputSize を使用して指定します。イメージのサイズは、そのイメージの高さ、幅、およびカラー チャネルの数に対応します。たとえば、グレースケール イメージの場合、チャネル数は 1 になり、カラー イメージの場合は 3 になります。

畳み込み層

2 次元畳み込み層は、入力にスライディング畳み込みフィルターを適用します。 2 次元畳み込み層は convolution2dLayer を使用して作成します。

畳み込み層はさまざまなコンポーネントで構成されます。[1]

フィルターとストライド

畳み込み層は、入力イメージまたは前の層の出力の小領域に結合するニューロンで構成されます。この層は、イメージをスキャンする間に、これらの領域で局所化された特徴を学習します。関数 convolution2dLayer を使用して層を作成するときに入力引数 filterSize を使用して、これらの領域のサイズを指定できます。

各領域に対しては、関数 trainNetwork が重みと入力のドット積を計算し、バイアス項を加算します。イメージの領域に適用される重みのセットは、"フィルター" と呼ばれます。フィルターは入力イメージに沿って垂直方向および水平方向に移動し、各領域に対して同じ計算を繰り返します。つまり、フィルターは入力を畳み込みます。

次のイメージは、入力をスキャンする 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。

フィルターが移動に使用するステップ サイズは "ストライド" と呼ばれます。ステップ サイズは、名前と値のペアの引数 Stride を使用して指定できます。ニューロンが結合する局所領域は、filterSize および 'Stride' の値によっては重なる可能性があります。

次のイメージは、ストライド 2 で入力をスキャンする 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。

フィルターの重みの数は、h * w * c です。h はフィルターの高さ、w はフィルターの幅、c は入力のチャネルの数です。たとえば、入力がカラー イメージの場合、カラー チャネルの数は 3 です。フィルターの数によって、畳み込み層にある出力のチャネルの数が決まります。関数 convolution2dLayer の引数 numFilters を使用して、フィルターの数を指定します。

膨張畳み込み

膨張畳み込みとは、フィルターの要素間に挿入された空間によってフィルターが拡張される畳み込みです。'DilationFactor' プロパティを使用して膨張係数を指定します。

膨張畳み込みを使用して、パラメーターの数や計算量を増やさずに、層の受容野 (層で確認できる入力の領域) を増やすことができます。

各フィルター要素間にゼロを挿入すると、層のフィルターが拡張されます。膨張係数は、入力のサンプリングのステップ サイズ、またはこれと等価であるフィルターのアップサンプリング係数を決定します。これは、有効なフィルター サイズ (Filter Size – 1) .* Dilation Factor + 1 に相当します。たとえば、膨張係数 [2 2] の 3 行 3 列のフィルターは、要素間にゼロが挿入された 5 列 5 行のフィルターと等価です。

次のイメージは、入力をスキャンする、係数 2 で膨張処理された 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。

特徴マップ

フィルターが入力に沿って移動するのに合わせて、畳み込みと同じ重みのセットと同じバイアスを使用して、"特徴マップ" が形成されます。各特徴マップは、異なる重みセットと異なるバイアスを使用した畳み込みの結果です。そのため、特徴マップの数はフィルターの数に等しくなります。畳み込み層のパラメーターの総数は、((h*w*c + 1)*Number of Filters) になります。ここで、1 はバイアスに相当します。

ゼロ パディング

名前と値のペアの引数 'Padding' を使用して、入力イメージの垂直方向および水平方向の境界にゼロ パディングを適用できます。パディングとは、イメージ入力の境界に追加されたゼロの行と列です。パディングを調整することにより、層の出力サイズを制御できます。

次のイメージは、サイズ 1 のパディングで入力をスキャンする 3 行 3 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。

出力サイズ

畳み込み層の出力の高さと幅は (Input Size – ((Filter Size – 1)*Dilation Factor + 1) + 2*Padding)/Stride + 1 となります。この値は、イメージ全体を完全にカバーする整数でなければなりません。これらのパラメーターの組み合わせでイメージ全体を完全にカバーできない場合、既定では、畳み込みの右端と下端に沿ってイメージの残りの部分が無視されます。

ニューロンの数

出力の高さと幅の積によって、特徴マップのニューロンの総数 (Map Size) が求められます。畳み込み層のニューロンの総数 (出力サイズ) は、Map Size*Number of Filters になります。

たとえば、入力イメージが 32 x 32 x 3 のカラー イメージであるとします。8 個のフィルターを持つ畳み込み層で、フィルター サイズが 5 x 5 の場合、フィルターあたりの重みの数は 5 * 5 * 3 = 75、層のパラメーターの総数は (75 + 1) * 8 = 608 になります。各方向のストライドが 2 で、パディングのサイズとして 2 が指定されている場合、各特徴マップは 16 x 16 になります。これは、(32 – 5 + 2 * 2)/2 + 1 = 16.5 であり、イメージの右側と下側で最も外側のゼロ パディングの一部が破棄されるためです。最終的に、層のニューロンの総数は 16*16*8 = 2048 になります。

これらのニューロンからの結果は通常、正規化線形ユニット (ReLU) など、なんらかの形の非線形性を通過します。

学習パラメーター

畳み込み層の定義を行うときに、名前と値のペアの引数を使用して、層の学習率と正則化パラメーターを調整できます。これらのパラメーターを指定しないことを選択した場合、trainNetwork は関数 trainingOptions で定義されたグローバル学習パラメーターを使用します。グローバル学習オプションと層の学習オプションの詳細は、パラメーターの設定と畳み込みニューラル ネットワークの学習を参照してください。

層の数

畳み込みニューラル ネットワークは、1 つ以上の畳み込み層で構成されます。畳み込み層の数は、データの量と複雑度によって異なります。

バッチ正規化層

バッチ正規化層は batchNormalizationLayer を使用して作成します。

バッチ正規化層は、ミニバッチ全体で各入力チャネルを正規化します。畳み込みニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用します。

この層はまず、ミニバッチの平均を減算し、ミニバッチの標準偏差で除算することにより、各チャネルの活性化を正規化します。さらに、この層は、学習可能なオフセット β だけ入力をシフトし、それを学習可能なスケール係数 γ でスケーリングします。β と γ はそれら自体が学習可能なパラメーターであり、ネットワークの学習中に更新されます。

バッチ正規化層は、ニューラル ネットワークを通じて伝播される活性化と勾配を正規化します。これにより、ネットワークの学習は簡単な最適化問題になります。この事実を十分に活用するために、学習率を増やすことができます。この最適化問題は簡単なため、パラメーターの更新量が大きくなり、ネットワークの学習時間を短縮できます。また、L2 とドロップアウト正則化を小さくすることもできます。バッチ正規化層では、特定のイメージの活性化は確定的ではなく、同じミニバッチにどのイメージが現れるかによって異なります。この正則化の効果を十分に活用するには、すべての学習エポックの前に学習データをシャッフルします。学習中にデータをシャッフルする頻度を指定するには、trainingOptions の名前と値のペアの引数 'Shuffle' を使用します。

ReLU 層

ReLU 層は reluLayer を使用して作成します。

ReLU 層は、入力の各要素に対してしきい値処理を実行し、値がゼロよりも小さい場合はゼロに設定します。

通常、畳み込み層やバッチ正規化層の後には、ReLU 層によって指定される正規化線形ユニット (ReLU) などの非線形活性化関数が続きます。ReLU 層は、各要素に対してしきい値処理を実行し、次のように入力値がゼロよりも小さい場合はゼロに設定します。

f(x)={x,x00,x<0.

ReLU 層は入力のサイズを変更しません。

標準の ReLU 層とは多少異なる処理を実行し、用途によっては性能が改善される、拡張版の ReLU 層があります。漏洩 ReLU 層は、しきい値処理を実行し、入力値がゼロよりも小さい場合は固定のスカラーによって乗算されます。漏洩 ReLU 層は leakyReluLayer を使用して作成します。クリップされた ReLU 層は、しきい値処理を実行し、入力値がゼロよりも小さい場合はゼロに設定して、値が "クリップ上限" を超える場合はそのクリップ上限に設定します。このクリップにより、出力が大きくなりすぎるのを防ぎます。クリップされた ReLU 層は clippedReluLayer を使用して作成します。

クロス チャネル正規化 (局所応答正規化) 層

クロス チャネル正規化層は crossChannelNormalizationLayer を使用して作成します。

チャネル単位の局所応答 (クロス チャネル) 正規化層は、チャネル単位の正規化を行います。

この層では、チャネル単位の局所応答正規化を実行します。通常は ReLU 活性化層の後に配置されます。この層は、各要素を、一定数の隣接し合うチャネルからの要素 (正規化ウィンドウの要素) を使用して取得する正規化済みの値に置き換えます。つまり、入力の各要素 x に対して、trainNetwork は正規化された値 x'

x'=x(K+α*sswindowChannelSize)β,

を使用して計算します。ここで、K、α、および β は正規化でのハイパーパラメーターで、ss は正規化ウィンドウの要素の平方和です [2]。関数 crossChannelNormalizationLayer の引数 windowChannelSize を使用して、正規化ウィンドウのサイズを指定しなければなりません。また、名前と値のペアの引数 AlphaBeta、および K を使用して、ハイパーパラメーターを指定できます。

前述の正規化式は[2]に記載されている式と少し異なります。alpha の値と windowChannelSize を乗算すると、等価な式を求めることができます。

最大プーリング層と平均プーリング層

最大プーリング層は、入力を四角形のプーリング領域に分割し、各領域の最大値を計算することによって、ダウンサンプリングを実行します。 最大プーリング層は maxPooling2dLayer を使用して作成します。

平均プーリング層は、入力を四角形のプーリング領域に分割し、各領域の平均値を計算することによって、ダウンサンプリングを実行します。 平均プーリング層は averagePooling2dLayer を使用して作成します。

プーリング層は、畳み込み層の後にあり、ダウンサンプリングを行います。これにより、後続の層への結合の数が少なくなります。これら自体は学習を一切行いませんが、後続の層で学習されるパラメーターの数を減らします。また、過適合を抑えるためにも役立ちます。

最大プーリング層は、入力の矩形領域の最大値を返します。矩形領域のサイズは maxPoolingLayer の引数 poolSize によって決まります。たとえば、poolSize[2,3] に等しい場合、この層は高さ 2、幅 3 の領域内の最大値を返します。 平均プーリング層は、入力の矩形領域の平均値を出力します。矩形領域のサイズは averagePoolingLayer の引数 poolSize によって決まります。たとえば、poolSize が [2,3] の場合、この層は高さ 2、幅 3 の領域の平均値を返します。

プーリング層は、名前と値のペアの引数 'Stride' を使用して指定できるステップ サイズで、入力を水平方向と垂直方向にスキャンします。プール サイズがストライド以下である場合、プーリング領域は重なりません。

重ならない領域 (Pool Size と Stride が等しい) については、プーリング層への入力が n x n であり、プーリング領域のサイズが h x h である場合、プーリング層は領域を h でダウンサンプリングします [6]。つまり、畳み込み層の 1 つのチャネルの最大プーリング層と平均プーリング層の出力は、n/h x n/h になります。重なる領域については、プーリング層の出力は (Input Size – Pool Size + 2*Padding)/Stride + 1 になります。

ドロップアウト層

ドロップアウト層は dropoutLayer を使用して作成します。

ドロップアウト層は、与えられた確率でランダムに、入力要素をゼロに設定します。

予測時には、ドロップアウト層の出力はその入力と等しくなります。学習時には、ランダムに選択されたユニットと、ネットワークからそのユニットへのすべての結合を、一時的に無視することに相当します。そのため、新しい入力要素それぞれに対して、trainNetwork はニューロンのサブセットをランダムに選択し、別の層アーキテクチャを形成します。これらのアーキテクチャは共通の重みを使用しますが、学習は特定のニューロンと結合に依存しないため、ドロップアウト層によって過適合を防ぐことができる場合があります [7][2]。最大プーリング層および平均プーリング層と同様に、この層では学習は行われません。

全結合層

全結合層は fullyConnectedLayer を使用して作成します。

全結合層は、入力に重み行列を乗算し、バイアス ベクトルを加算します。

畳み込み層 (およびダウンサンプリング層) の後には、1 つ以上の全結合層が配置されます。

その名前からわかるように、全結合層のすべてのニューロンは前の層にあるすべてのニューロンに結合しています。この層は、前の層によってイメージ全体で学習されたすべての特徴 (ローカル情報) を組み合わせて、より大きなパターンを特定します。分類問題の場合、最後の全結合層は、特徴を組み合わせてイメージを分類します。そのため、ネットワークにある最後の全結合層の引数 outputSize は、データセットのクラスの数と等しくなります。回帰問題の場合、出力サイズは応答変数の数と等しくなければなりません。

全結合層を作成するときに、関連する名前と値のペアの引数を使用して、この層の学習率と正則化パラメーターも調整できます。調整しないことを選択した場合、trainNetwork は関数 trainingOptions で定義されたグローバル学習パラメーターを使用します。グローバル学習オプションと層の学習オプションの詳細は、パラメーターの設定と畳み込みニューラル ネットワークの学習を参照してください。

全結合層は、入力に重み行列 W を乗算し、バイアス ベクトル b を加算します。

層への入力がシーケンスの場合 (LSTM ネットワークの場合など)、全結合層は各タイム ステップで独立に動作します。たとえば、全結合層の前の層が、サイズ D x N x S の配列 X を出力する場合、全結合層はサイズ outputSize x N x S の配列 Z を出力します。タイム ステップ t で、Z の対応するエントリは WXt+b です。ここで、Xt は、タイム ステップ t の X を表します。

出力層

ソフトマックス層と分類層

ソフトマックス層は、入力にソフトマックス関数を適用します。 ソフトマックス層は softmaxLayer を使用して作成します。

分類層は、互いに排他的なクラスを含むマルチクラス分類問題の交差エントロピー損失を計算します。 分類層は classificationLayer を使用して作成します。

分類問題の場合、ソフトマックス層とその後の分類層は、最後の全結合層の後に配置しなければなりません。

出力ユニットの活性化関数は次のソフトマックス関数です。

yr(x)=exp(ar(x))j=1kexp(aj(x)),

ここで、0yr1 および j=1kyj=1 です。

ソフトマックス関数は、マルチクラス分類問題の場合、最後の全結合層の後の出力ユニットの活性化関数です。

P(cr|x,θ)=P(x,θ|cr)P(cr)j=1kP(x,θ|cj)P(cj)=exp(ar(x,θ))j=1kexp(aj(x,θ)),

ここで、0P(cr|x,θ)1 および j=1kP(cj|x,θ)=1 です。また、ar=ln(P(x,θ|cr)P(cr)) です。P(x,θ|cr) はクラス r である場合の標本の条件付き確率で、P(cr) はクラスの事前確率です。

ソフトマックス関数は、"正規化指数関数" とも呼ばれ、ロジスティック シグモイド関数のマルチクラスへの汎化と見なすことができます [8]

一般的な分類ネットワークでは、分類層はソフトマックス層の後に続かなければなりません。分類層では、trainNetwork がソフトマックス関数から値を取得し、各入力を K 個の互いに排他的なクラスのうちの 1 つに、1 対 K 符号化方式の交差エントロピー関数を使用して割り当てます [8]

loss=i=1Nj=1Ktijlnyij,

ここで、N は標本の数、K はクラスの数、tij は i 番目の標本が j 番目のクラスに属することを表すインジケーターです。yij はクラス j の標本 i の出力で、この場合はソフトマックス関数からの値です。つまり、ネットワークが i 番目の入力をクラス j に関連付ける確率です。

回帰層

回帰層は regressionLayer を使用して作成します。

回帰層は、回帰問題の半平均二乗誤差損失を計算します。 一般的な回帰問題の場合、回帰層が最後の全結合層の後に続かなければなりません。

平均二乗誤差は次で求められます。

MSE=i=1R(tiyi)2R,

ここで、R は応答の数、ti はターゲット出力、yi は観察値 i に対応する応答変数に対するネットワークの予測値です。

回帰層の損失関数は、半平均二乗誤差です。

参照

[1] Murphy, K. P. Machine Learning: A Probabilistic Perspective. Cambridge, Massachusetts: The MIT Press, 2012.

[2] Krizhevsky, A., I. Sutskever, and G. E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in Neural Information Processing Systems. Vol 25, 2012.

[3] LeCun, Y., Boser, B., Denker, J.S., Henderson, D., Howard, R.E., Hubbard, W., Jackel, L.D., et al. ''Handwritten Digit Recognition with a Back-propagation Network.'' In Advances of Neural Information Processing Systems, 1990.

[4] LeCun, Y., L. Bottou, Y. Bengio, and P. Haffner. ''Gradient-based Learning Applied to Document Recognition.'' Proceedings of the IEEE. Vol 86, pp. 2278–2324, 1998.

[5] Nair, V. and G. E. Hinton. "Rectified linear units improve restricted boltzmann machines." In Proc. 27th International Conference on Machine Learning, 2010.

[6] Nagi, J., F. Ducatelle, G. A. Di Caro, D. Ciresan, U. Meier, A. Giusti, F. Nagi, J. Schmidhuber, L. M. Gambardella. ''Max-Pooling Convolutional Neural Networks for Vision-based Hand Gesture Recognition''. IEEE International Conference on Signal and Image Processing Applications (ICSIPA2011), 2011.

[7] Srivastava, N., G. Hinton, A. Krizhevsky, I. Sutskever, R. Salakhutdinov. "Dropout: A Simple Way to Prevent Neural Networks from Overfitting." Journal of Machine Learning Research. Vol. 15, pp. 1929-1958, 2014.

[8] Bishop, C. M. Pattern Recognition and Machine Learning. Springer, New York, NY, 2006.

[9] Ioffe, Sergey, and Christian Szegedy. "Batch normalization: Accelerating deep network training by reducing internal covariate shift." preprint, arXiv:1502.03167 (2015).

参考

| | | | | | | | | | | | | | |

関連するトピック


[1] Image credit: Convolution arithmetic (License)