畳み込み層:画像を得意にするしくみ
ニューラルネットワークが画像をどう扱うのかを学びます。基礎層では、全結合層との違いと、画像の一部分ずつを見る畳み込みのしくみをつかみます。深掘り層では、重みと線形関数、畳み込み操作のしくみ、カーネル・ストライド・パディング・特徴マップ、そして Atrous Convolution や Depthwise Separable Convolution などの発展形まで説明できるようになります。
ねらい
このレッスンでは、ニューラルネットワークが画像をうまく扱うためのしくみを学びます。
基礎
これまでの層との違いと、画像の一部分ずつを順に見ていく畳み込み(たたみこみ)のしくみをつかみます。
1. これまでの層は、すべての入力をまとめて受け取ります
ニューラルネットワークの基本の層では、前の層のすべての値を受け取って、次の値を計算します。すべての入力とつながっているので、この層を全結合層(ぜんけつごうそう)と呼びます。英語では fully connected layer(フリーコネクテッドレイヤー)と表記します。
全結合層は、多くの問題で役立ちます。しかし画像には向きません。理由は2つあります。
1つ目は、つながりの数が多くなりすぎることです。100万の点それぞれを次の層の多くの値につなぐと、覚えるべき数が天文学的な量になります。
2つ目は、位置がずれると同じものだと気づけないことです。全結合層は、点の位置ごとに別々に扱います。犬の耳が写真の左上にあるか右下にあるかで、まったく別の入力として処理してしまいます。
2. 畳み込みは、画像の一部分ずつを見ていきます
この2つの問題を解くのが、畳み込みです。畳み込みは、画像の全体を一度に見るのではなく、小さな窓を当てて、その一部分だけを見ます。そして窓を少しずつずらしながら、画像のすみずみまで、同じ見方で調べていきます。
虫めがねを思いうかべてください。大きな絵を一目で全部見るのではなく、虫めがねを当てて、少しずつずらしながら見ていくやり方です。しかも、当てる虫めがねはどこでも同じものです。だから、犬の耳が左上にあっても右下にあっても、同じ虫めがねが通りかかれば「耳らしい形」に気づけます。
このしくみを何層も重ねたネットワークを畳み込みニューラルネットワーク (CNN) といいます。CNN は、シーエヌエヌと読み、英語では convolutional neural network(コンボリューショナル・ニューラルネットワーク)と表記します。画像認識で大きな成果をあげ、今の画像を扱う人工知能の土台になっています。
ポイント
畳み込みは、小さな窓を画像全体にずらしながら当て、どこに同じ特徴があっても気づけるようにするしくみです。全体を一度に見る全結合層との、いちばんの違いがここにあります。
ここまでの要点
- 全結合層は、すべての入力をまとめて受け取る基本の層です。画像には向きません。
- 畳み込みは、小さな窓を画像にずらしながら当て、一部分ずつ見ていくしくみです。
- 畳み込みを重ねたネットワークを畳み込みニューラルネットワーク (CNN) と呼びます。
まずは全体像をつかめれば十分という人は、ここで区切って大丈夫です。「画像は、小さな窓をずらしながら見る」と押さえられていれば、この先の深掘りに進む土台はできています。
発展
ここからは、層の中で何が計算されているのかを重みと線形関数から順に組み立てます。
3. 全結合層がしているのは、重みつきの足し算です
まず、全結合層の中身を正確にとらえます。全結合層は、入力の値それぞれに重み(おもみ)をかけて、すべて足し合わせます。
重みとは、それぞれの入力をどれだけ重視するかを表す数です。学習とは、この重みをちょうどよい値に調整していく作業です。入力に重みをかけて足すだけの計算は、線形関数(せんけいかんすう)と呼ばれます。線形関数とは、入力を定数倍して足し合わせる形の関数で、グラフにするとまっすぐな直線や平面になる関係のことです。
全結合層は、この線形関数による計算を並べたものです。畳み込み層も、じつは同じ「重みつきの足し算」を使います。違うのは、その足し算を画像のどの範囲に当てるか、という点だけです。
理解の確認
全結合層は、入力それぞれに重みをかけて足し合わせます。この計算が線形関数です。畳み込み層も重みつきの足し算を使い、違いはその足し算を画像の一部分に当てる点にあります。
4. 畳み込み操作のしくみ
畳み込みでの「小さな窓」の正体は、小さな重みの表です。この重みの表をフィルタ、またはカーネルと呼びます。フィルタとカーネルは、ここでは同じものを指す2つの呼び名です。たとえば縦3点、横3点の小さな正方形に、9個の重みが並んだものを考えてください。
このフィルタを画像の左上に重ね、重なった点の値とフィルタの重みをそれぞれかけ合わせて、すべて足します。これも重みつきの足し算、つまり線形関数です。この足し算1回で、その位置の特徴を表す1つの数が得られます。この一連の計算を畳み込み操作といいます。
フィルタを少しずつずらしながら、この計算を画像全体でくり返します。ずらす幅をストライドといいます。ストライドが1なら1点ずつ、2なら2点ずつ、フィルタを動かします。ストライドを大きくすると、飛ばしながら見るので、結果は小さくなります。
計算した数をもとの画像と同じように縦横に並べ直したものを特徴マップといいます。特徴マップは、画像のどこに、そのフィルタが探している特徴があったかを表す地図です。フィルタが「たての線」を探すものなら、特徴マップは、たての線がどこにあったかを示します。
ここで1つ問題が起きます。フィルタを画像の内側だけで動かすと、端のほうは中心にできず、特徴マップがもとの画像より少し小さくなります。これを防ぐために、画像の周りを0で囲んで一回り大きくしてから畳み込むことがあります。この、周りを補う操作をパディングといいます。パディングをすると、特徴マップの大きさをもとの画像と同じに保てます。
大きさの関係は、式で書くと次のようになります。
特徴マップの一辺 = (画像の一辺 − フィルタの一辺 + パディングの幅 × 2) ÷ ストライド + 1
読み下すと、フィルタが端まで動ける長さをストライドで割り、動かし始めの1回分を足す、という意味です。3つの例で確かめます。一辺5の画像に一辺3のフィルタをパディング無し・ストライド1で当てると、(5 − 3 + 0)÷ 1 + 1 で3になり、少し小さくなります。パディングを1にすると、(5 − 3 + 2)÷ 1 + 1 で5になり、もとの大きさに戻ります。パディング無しでストライドを2にすると、(5 − 3 + 0)÷ 2 + 1 で2になり、飛ばして見たぶんだけ小さくなります。ここまで言葉で述べたことが、この1本の式にすべて入っています。
畳み込み層の大切な性質は、1枚のフィルタを画像のすべての位置で使い回すことです。同じ重みを場所を変えて何度も当てるので、覚えるべき重みは、フィルタの中のわずかな数だけで済みます。全結合層のように点ごとに別々の重みを持たないので、覚える数が大きく減ります。しかも、同じフィルタが全体を通るため、特徴が画像のどこにあっても見つけられます。これが、畳み込みが画像に強い理由です。
ポイント
フィルタ(カーネル)は小さな重みの表で、これを画像にずらしながら当てるのが畳み込み操作です。同じフィルタを全体で使い回すので、覚える重みが少なく、特徴の位置ずれにも強くなります。
理解の確認
畳み込み操作は、小さな重みの表であるフィルタ(カーネル)を画像に重ね、重みつきの足し算をして、特徴マップを作ります。ずらす幅をストライド、端を補う操作をパディングといいます。同じフィルタを全体で使い回すため、重みが少なく、位置ずれに強くなります。
動かして確かめる
ストライドを、下のトレーナーで実際に動かして確かめてみましょう。小さな画像の中央に明るいブロックを置き、 フィルタを当てたときの特徴マップと、そのあとの結果がどう変わるか見てください。トレーナーの右端には、 特徴マップをさらに小さくまとめる操作(最大値プーリング。窓の中でいちばん強い値だけを残して縮める操作で、 次のレッスンでくわしく扱います)も添えています。ストライドを広げすぎると、フィルタがブロックをまるごと 収める位置を見逃すことがあります。
スタディード / G検定 / 動く解説
ストライドを広げすぎると、フィルタが特徴を飛び越える。
6×6の画像の中央に、明るい2×2のブロックがあります。ストライド(フィルタをずらす幅)を動かして、特徴マップとプーリング結果がどう変わるか確かめてください。
5. 畳み込みの発展形
基本の畳み込みには、目的に応じたいくつかの発展形があります。代表的な3つを見ます。
1つ目は、Atrous Convolution(アトラス・コンボリューション)です。Dilated Convolution(ダイレイテッド・コンボリューション)とも呼ばれ、この2つは同じものを指します。ふつうの畳み込みが、となり合う点をすきまなく見るのに対し、この方法は、フィルタの重みの間にすきまを空けて、とびとびの点を見ます。すきまを空けるぶん、少ない重みのまま、より広い範囲を見わたせます。名前の atrous は、フランス語で「穴のある」という意味で、重みの間に穴を空けるようすを表しています。
2つ目は、Depthwise Separable Convolution(デプスワイズ・セパラブル・コンボリューション)です。ふつうの畳み込みは、色や特徴の重なり(チャンネル)をまとめて一度に処理します。この方法は、その処理を2段階に分けます。まず、チャンネルごとに別々に空間方向の畳み込みをし、次に、チャンネルどうしを混ぜ合わせる畳み込みをします。分けて計算すると、計算の量と重みの数を大きく減らせます。スマートフォンなど、計算する力が限られた機器で使う軽いモデルで、よく採用されています。
これらの発展形は、少ない重みで広い範囲を見たり、計算を軽くしたりするための工夫です。畳み込みという基本の考え方を保ったまま、目的に合わせて形を変えたものだと押さえてください。
理解の確認
Atrous Convolution は Dilated Convolution とも呼ばれ、フィルタの重みの間にすきまを空けて、少ない重みで広い範囲を見ます。Depthwise Separable Convolution は、空間方向とチャンネル方向の処理を2段階に分けて、計算を軽くします。どちらも基本の畳み込みを目的に合わせて変えた発展形です。
理解度の確認
説明できる項目にチェックを入れましょう。すべて確認できたら、完了ボタンで記録します。
分からなかった点・気になった点
読み込み中です。