Main Content

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

新しい畳み込みニューラル ネットワーク (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 次元入力にスライディング畳み込みフィルターを適用します。2 次元畳み込み層は convolution2dLayer を使用して作成します。

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

フィルターとストライド

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

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

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

Animation showing a sliding 3-by-3 filter. At each step, the filter spans a patch of an input image (the lower map) and has output corresponding to single pixel of the output image (the upper map). The input is a 4-by-4 image. The ouptut is a 2-by-2 image.

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

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

Animation showing a sliding 3-by-3 filter with stride 2. At each step, the filter moves two pixels. The input is a 5-by-5 image. The ouptut is a 2-by-2 image.

フィルターの重みの数は、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 列のフィルターを示しています。下側のマップは入力を表し、上側のマップは出力を表します。

Animation showing a sliding dilated 3-by-3 filter. The filter spans a 5-by-5 region because it has a one pixel gap between each pixel. The input is a 7-by-7 image. The output is a 3-by-3 image.

特徴マップ

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

パディング

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

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

Animation showing a sliding 3-by-3 filter over a padded image. The input image is padded such that it is one pixel larger in each direction. When the filter slides over the input image, it can cover the padding regions. The input is a 5-by-5 image. The padded input is a 7-by-7 image. The output is a 5-by-5 image.

出力サイズ

畳み込み層の出力の高さと幅は (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) など、なんらかの形の非線形性を通過します。

学習パラメーター

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

層の数

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

バッチ正規化層

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

バッチ正規化層は、観測値全体におけるデータ ミニバッチの正規化を、各チャネルについて個別に行います。畳み込みニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用します。

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

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

ReLU 層

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

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

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

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

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

他にも、異なる処理を実行し、用途によってはネットワークの精度が改善される非線形活性化層があります。活性化層の一覧については、活性化層を参照してください。

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

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

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

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

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

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

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

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

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

2 次元平均プーリング層は、入力を矩形のプーリング領域に分割し、各領域の平均を計算することによって、ダウンサンプリングを実行します。平均プーリング層は 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 を使用して作成します。

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

学習時に、この層によってドロップアウト マスク rand(size(X))<Probability が適用され、入力要素がランダムにゼロに設定されます。ここで、X は層入力です。残りの要素は 1/(1-Probability) でスケーリングされます。この演算は、基になるネットワーク アーキテクチャを反復間で効果的に変更するため、ネットワークの過適合の防止に役立ちます[7][2]。大きい数値を指定するほど、学習時にドロップアウトされる要素の数が増加します。予測時には、この層の出力はその入力と等しくなります。

最大プーリング層および平均プーリング層と同様に、この層では学習は行われません。

全結合層

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

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

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

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

層への入力がシーケンスの場合 (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 がソフトマックス関数から値を取得し、1 対 K 符号化方式の交差エントロピー関数を使用して、K 個の互いに排他的なクラスのうちの 1 つに各入力を割り当てます[8]

loss=1Nn=1Ni=1Kwitnilnyni,

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

回帰層

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

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

1 つの観測値の場合、平均二乗誤差は次で求められます。

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

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

イメージ回帰ネットワークおよび sequence-to-one 回帰ネットワークの場合、回帰層の損失関数は R で正規化されるのではなく、予測応答の半平均二乗誤差になります。

loss=12i=1R(tiyi)2.

image-to-image 回帰ネットワークの場合、回帰層の損失関数は R で正規化されるのではなく、各ピクセルの予測応答の半平均二乗誤差になります。

loss=12p=1HWC(tpyp)2,

ここで、H、W、および C は、それぞれ出力の高さ、幅、チャネル数を表し、p は t および y の各要素 (ピクセル) に対して線形に付けたインデックスです。

sequence-to-sequence 回帰ネットワークの場合、回帰層の損失関数は R で正規化されるのではなく、各タイム ステップの予測応答の半平均二乗誤差になります。

loss=12Si=1Sj=1R(tijyij)2,

ここで、S はシーケンス長です。

学習時には、ミニバッチ内の観測値に対する平均損失が計算されます。

参照

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

[2] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Communications of the ACM 60, no. 6 (May 24, 2017): 84–90. https://doi.org/10.1145/3065386

[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, Nitish, Geoffrey Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov. "Dropout: A Simple Way to Prevent Neural Networks from Overfitting." The Journal of Machine Learning Research 15, no. 1 (January 1, 2014): 1929–58

[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, submitted March 2, 2015. https://arxiv.org/abs/1502.03167.

参考

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

関連するトピック


1 Image credit: Convolution arithmetic (License)