畳み込み

畳み込み層を理解するには、まず畳み込み演算を理解する必要があります。
畳み込み (Convoluation) またはフィルタリング (filtering) は、画像処理の分野で画像の特徴を抽出するために昔から使われてきた手法です。
どのような働きをするかまず実際に見てみましょう。

画像はコンピューター上では配列で表現され、要素の値は画像のあるピクセルに対応しています。
下は MNIST から取ってきた数字5の手書き画像 (左)とコンピューター上での配列表現 (右)になります。
グレースケール画像なので、0~255の値で各ピクセルの濃淡を表現します。



ここでフィルタ (filter) またはカーネル (kernel) というものが登場します。
フィルタの各マス目は重みを持っています。



以下の 5×5 の画像を例にフィルタの処理の流れを説明します。



畳み込みでは、画像のフィルタが覆っている部分に対して、フィルタの重みと画像の値を乗算して足し合わせ、新しい値を生成します。これをフィルタをスライドさせながら行うことで新たな配列が得られます。
この配列は特徴マップ(feature map) と言われます。



畳み込み演算の数式表現



サイズが \(H_x \times W_x\) の画像に対して、サイズが \(H_f \times W_f\) フィルタを使用する畳み込みを考えます。

画像の要素は \(x_{ij}, (i = 1, 2, \cdots, H_x – 1, j = 1, 2, \cdots, W_x – 1)\)、フィルタの要素は \(w_{ij}, ( i = 1, 2, \cdots, H_f – 1, j = 1, 2, \cdots, W_f – 1\) と参照することにします。添字が0から始まっているのは、配列として画像を表現する際はインデックスが0から始まる事実に合わせたものです。
例えば、画像の一番左上のピクセルの値は \(x_{00}\) になります。

すると、畳み込みの結果、生成される特徴マップの各要素 \(u_{ij}\) は次のように計算できます。

\[{u_{ij}} = \sum\limits_{p = 0}^{{H_f} – 1} {\sum\limits_{q = 0}^{{W_f} – 1} {{x_{i + p,j + q}}\;{w_{pq}}} } \]

畳み込みをするとどうなるのか

畳み込みがどういう処理なのかはわかったと思うので、実際の画像に対して畳み込みを行い、どのような特徴マップが得られるのか見てます。

以下はそれぞれ sovel フィルタ、median フィルタと呼ばれるものをそれぞれ適用した例です。
sovel フィルタでは輪郭が抽出されており、一方 median フィルタでは全体的にぼんやりしたのがわかると思います。



About

ドロップアウト (Dropout) とは各反復前にニューロンを確率的に脱落させて学習を行う手法です。
ドロップアウトを適用した層では確率 \(p\) でその層のニューロンを残す割合を指定します。
脱落させるニューロンの選定は反復ごとに行います。
また推論時はドロップアウトによる脱落を行わず、すべてのニューロンを使用します。



キーワード

  • ドロップアウト (dropout)

続きを読む

About

ニューラルネットワークの表現能力を利用して回帰問題、クラス分類問題など多くの問題を解くことができます。

キーワード

  • 訓練データ (training data)
  • テストデータ (test data)
  • 誤差関数 (error function) /損失関数 (loss function)

ニューラルネットワークの表現能力

ニューラルネットワークは重み及びバイアスの係数によって特徴づけられる関数です。
すべての係数を順番に並べたベクトルを \(\mathbf{w}\) とし、ニューラルネットワークが表現する関数をパラメータ \(\mathbf{w}\) によって特徴づけられることを強調して \(f(\mathbf{x};\mathbf{w})\) と表します。
係数 \(\mathbf{w}\) 次第でニューラルネットワークは様々な関数を表現することができます。

目標関数と損失関数

ニューラルネットワークで表現したい関数を目標関数 (object function)といいます。
学習とは、ニューラルネットワークの表現する関数を目標関数に近づけることです

\[f(\mathbf{x};\mathbf{w}) \approx f^*(\mathbf{x})\]

そのためには現在の関数が目標関数とどのくらい乖離しているかを図る誤差関数 (error function) または損失関数 (loss function) が必要となります。
この損失関数は問題によって異なりますが、目標関数とピッタリ一致すれば \(0\) となり、目標関数から離れているほど大きな値になる関数が望ましいです。
そして、学習の過程で、損失関数の値が小さくなるように係数 \(\mathbf{w}\) を調整していきます。

参考文献

  • 岡谷貴之、深層学習 (機械学習プロフェッショナルシリーズ)、講談社、2015、P10 (2.4 出力層の設計と誤差関数)
  • 斎藤康毅、ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装、オライリー・ジャパン、2015、P83 (4 ニューラルネットワークの学習)
  • 岡谷貴之、深層学習 Deep Learning (監修:人工知能学会)、近代科学社、2015、P142 (4.5 活性化関数)

Web上の資料