畳み込み演算は、データに含まれるノイズを緩和し、重要な情報を抽出するために使われる。画像解析における畳み込み演算は、画像中に含まれる特徴量を抽出している。一枚の画像に対して、畳み込み演算を繰り返すことで、はじめの方の畳み込み演算で、画像中に含まれる縦線や斜め線などの抽象的な特徴が抽出され、最後の方の畳み込み演算で、画像中に含まれる車の形や人の顔などの具体的な特徴が抽出される。
このような畳み込み演算による特徴抽出は、画像に対して使われているだけでなく、時系列データに対しても一般的に使われている。例えば、時系列データから移動平均を計算することが、畳み込み演算を行なっていることと等しい。
時系列データに対する畳み込み演算
x1, x2, x3, ... のように数列あるいはベクトルとして表現される系列データは、左右に順序関係があり、系列となったときに初めて意味を持つようになる。このような系列データに対して、個々のデータだけを見たときに、ノイズが多くて、データの全体の傾向を把握できないが、連続したいくつかのデータを同時に見たときに、何らかの傾向を見出せるようになる。時系列データ解析で、移動平均を求めることが、データのノイズを減らし、データ全体の傾向を把握しやすくようにするためである。
時系列データの移動平均を求める演算は、畳み込み演算とよぶことができる。例えば、3 日間時間平均を求める場合は、長さ 3 で、要素が (1/3, 1/3, 1/3) のフィルタを時系列全体にかけて、時系列を畳み込んでいることになる。
計算例を図示すると、次のようになる。まず、時系列データの最初の 3 要素それぞれに 1/3 をかけ、その和を出力する。次の例では、1×(1/3) + 2×(1/3) + 0×(1/3) = 1 である。
次に、枠を 1 ステップ右へずらして、もう一度計算する。次の例では、2×(1/3) + 0×(1/3) + 4×(1/3) = 2 である。
系列データの最後まで、枠を 1 ステップ右へずらして畳み込み演算を行う。
モノクロ画像に対する畳み込み演算
モノクロ画像のデータは行列として表現できる。行列の行数が画像の縦幅であり、列数が横幅であり、そして、行列の各要素の値は、そのモノクロ画像の黒色の濃さを表す。画像の場合は、あるピクセル領域の色が、その上下左右と何らかの関係を持っている。そのため、画像に対する、畳み込み演算では、フィルタとして行列を用いる。
畳み込み演算では、入力画像(行列データ)の全体に対して、行列上 1 マスずつ動かしながら、フィルタをかけている。例えば、3 × 3 の行列を用意して、これをフィルタとして、モノクロ画像(1 チャンネル)の左上から畳み込み演算を行うと次のようになる。
次に、右へ 1 ピクセルをずらして、もう一度畳み込み演算を行う。
右へ 1 ピクセルをずらして、畳み込み演算を行う。
右へ 1 ピクセルをずらして、畳み込み演算を行う。
1 行目の畳み込みが完了すると、2 行目に移動してから引き続き畳み込み演算を行う。
このような畳み込み演算を行うと、最終的に画像は次のように畳み込まれる。
ゼロパッティング
畳み込み演算を行うと、出力行列のサイズが入力行列のサイズよりも小さくなる。そのため、畳み込みを複数回行うことによって、画像サイズが大幅に小さくなる。また、畳み込み演算で畳み込まれる回数について、行列(画像)中央にあるデータと行列の四辺にあるデータに差が生じる。そのため、画像中央にある特徴が極端に強調され、画像のエッジにある情報が徐々に消えてしまうリスクが生じる。
そこで、畳み込み演算前の画像と後の画像のサイズが同じとなるように、入力画像の周りにゼロを埋める作業が行われる。これをゼロパッティングという。画像解析用の畳み込みニューラルネットワークでは、畳み込み演算を行う前にゼロパッティングすることが一般的である。画像のサイズを縮小させたい場合は、プーリング演算で対応する。
カラー画像に対する畳み込み演算
カラー画像の場合は、R、G、B の 3 つのチャンネルが存在する。この場合、R、G、B それぞれのチャンネルに対してフィルタをかけて、それぞれの畳み込み後の行列の総和を計算して、1 枚の新しいチャンネルを出力する。
もう 1 セットのフィルタ行列を用意することで、新たにチャンネルを 1 つ出力できる。
さらに別の 1 セットのフィルタ行列を用意することで、新たにチャンネルを 1 つ出力できる。
このようにフィルタ行列を数多く用意することで、複数のチャンネルを新たに生成できるようになる。以下のように、1 枚のカラー画像を入力すると、うまくフィルタ行列の値を調整することで、横線の特徴量を検出できたり、縦線の特徴量を検出できたり、あるいは輪郭線を検出できたりすることができるようになる。フィルタ行列の各要素の値を、学習を通して決めている。
References
- 定番の Convolutional Neural Network をゼロから理解する. DeepAge. 2016. LINK: Website