第5回 で手書き数字を読ませたとき、そして第7回 の終わりでも、同じ心残りに触れました。あのネットワークは784個のピクセルを、順番のないただの数の袋として扱っていて、それが本当は縦横28マスに並んだ一枚の絵だという事実を、まるで活かせていない、と。今回はいよいよ、この並びを活かす仕組みへ進みます。畳み込みと呼ばれる、画像を扱うAIの土台です。

並びを捨てるのは、もったいない

まず、これまでのやり方の何が惜しかったのかを、はっきりさせておきます。

第5回 のネットワークは全結合といって、28×28の画像をまず一列に並べ直し、784個の数の列にしてから、その全部を次のニューロンにつなぎます。ここで、縦横の並びという情報が消えてしまう。人間なら「このピクセルの右隣」「一つ上」といった位置関係を当たり前に使いますが、数の袋にした瞬間、隣どうしがもう隣だと分からなくなるのです。

左は全結合:2次元の画像を一列に潰して全部つなぐので、縦横の並びと隣どうしの関係が失われる。右は畳み込み:小さな窓を画像の上で滑らせ、並びを保ったまま局所の模様を反応マップに拾い上げ、同じ窓を全域で使い回す

もったいなさは、たとえばこう出ます。同じ「3」でも、数ピクセル右にずれて描かれただけで、一列に並べ直した784個の数はまったく別の並びになる。全結合のネットワークにとって、ずれた3は初めて見る他人のようなものです。位置がずれても同じ数字だという、人間には当たり前の感覚を、最初から持っていない。

畳み込みは、この並びを最後まで捨てません。画像を2次元のまま扱い、小さな窓を上で滑らせて、その場所にどんな模様があるかを一つずつ測っていきます。

小さな窓を、滑らせる

やっていることは、言葉にすると拍子抜けするほど単純です。3×3くらいの小さな窓(フィルタと呼びます)を用意し、画像の左上から右下へ、1マスずつずらしながら重ねていく。重なった9マスと、フィルタの9個の数を、それぞれ掛けて全部足す。その合計が一つの反応になり、滑らせた先々の反応を並べたものが、反応マップ(特徴マップ)です。

下のデモで、実際に窓を滑らせてみてください。

うまく表示されないときは、デモを別タブで開く

「縦エッジ」というフィルタを選ぶと、数字の縦向きの輪郭がくっきり光ります。「横エッジ」に変えると、今度は上の横棒がはっきり反応する。同じ画像でも、当てる窓を変えると、拾える模様が変わるわけです。「窓をスライドさせる」を押すと、フィルタが画像の全域を舐めていくのが見えます。ここが肝心で、フィルタは場所ごとに変わりません。たった一組の小さな窓を、画像のどこでも同じように使い回している。だから縦の輪郭は、右上にあろうと左下にあろうと、同じフィルタで見つかります。位置がずれても同じ模様は同じように拾える ── 全結合が持っていなかったこの感覚が、畳み込みには最初から備わっています。

フィルタは、手で決めない

ここで大事な断りを一つ入れます。デモでは「縦エッジ」「横エッジ」と、あらかじめ用意したフィルタを選んでもらいました。仕組みを見てもらうために、こちらで中身を決め打ちしただけです。本物の畳み込みネットワークでは、このフィルタの9個の数を人が決めることはしません。

では誰が決めるのか。学習が決めます。フィルタの一マス一マスは、この連載でずっと回してきた、あのつまみそのものです。最初はでたらめな値から始めて、手書き数字を大量に見せながら、第4回 の誤差逆伝播でつまみを少しずつ回していく。すると、数字を見分けるのに役立つ模様を拾うフィルタが、ひとりでに形づくられていきます。畳み込みは新しい魔法ではなく、これまでの部品を「小さな窓を全域で共有する」という形につなぎ替えただけなのです。

窓は、一枚ではない

ここまで窓を一枚だけ扱ってきましたが、本物の畳み込み層は、3×3の窓を何十枚も並べて同時に学習させます。窓が一枚あれば反応マップが一枚できるので、16枚の窓からは16枚の反応マップが生まれる。畳み込み層が吐き出すのは一枚の平たい画像ではなく、厚みを持った束です。そして、その束を受け取って10個の数字へ振り分けるのは、第5回 と同じ全結合の層。畳み込みがやっているのは「どんな模様がどこにあるか」を測って材料を並べるところまでで、判定そのものは後ろに任せています。

枚数がどれだけ効くのかは、測ってみるのが早い。窓の枚数だけを変えた小さなネットワークを手書き数字で学習させると、窓が1枚のときのテスト精度は88.5%でした。ところが、畳み込みを一切使わない全結合だけのネットワークも88.4%で、ほとんど変わりません。窓が一枚では、あってもなくても同じなのです。8枚にすると93.7%、16枚では95.7%まで上がりました。

なぜ一枚では効かないのか。学習を終えた窓の中身を覗くと、理由が見えます。一枚に制限したとき、学習が選んだのはエッジ検出器ではありませんでした。9マスのほとんどが同じ符号になり、輪郭を取るのではなく、その辺りにインクがどれだけあるかを測るだけの、ぼんやりした窓に落ち着きます。一枚しか持てないなら、下手に模様を抽出するより、画像をなるべくそのまま後ろへ渡したほうが得だというわけです。16枚あれば話は変わります。

MNISTで学習させたあとの3×3フィルタ16枚。上下で符号が反転した横エッジ、左右で反転した縦エッジ、斜めに反応するものなど、役割の違う窓がデータから自然に現れる。1枚に制限すると9マスがほぼ同符号のぼかしになる

上下で符号が反転した窓は横向きの輪郭を、左右で反転した窓は縦向きの輪郭を拾います。斜めや曲がりに反応するものもある。誰もそう指示していないのに、役割を分け合うように現れるわけです。

そして、こうして拾った模様をまた次の畳み込みに通すと、単純な線やカーブといった部品が組み合わさって、より大きな形 ── 数字の一部、目や鼻、車輪といったまとまり ── に反応する層ができていきます。層を重ねるほど、見ているものが「点や線」から「部分」へ、さらに「物」へと育っていく。写真から猫を見つけるような認識も、この積み重ねでできています。

畳み込みには、おまけの利点もあります。同じ窓を使い回すぶん、つまみの数は全結合よりずっと少なくて済む。つまみが少なければ、第7回 で見た丸暗記(過学習)にも陥りにくい。並びという手がかりを活かすことが、そのまま無駄のなさにもつながっています。

これで、この連載の前半 ── 一枚の画像を見分けるところ ── の道具立てがそろいました。ニューロンを重ね、勾配降下で学習させ、確率で答え、暗記を避け、そして並びを活かす。次回からは舞台を変えます。画像ではなく、ことば。「りんご」や「みかん」といった単語を、機械はどう数として扱うのか。意味を座標に置きかえる、埋め込みの話へ進みます。


連載「手で動かすAI」
← 前回 覚えるのと分かるのは違う