わかりやすく CNN とは
前のレッスンは、ひとつの問いを残して終わりました。写真のように、どの値が手がかりになるかを人が一つずつ選びにくいデータは、どう扱えばよいのでしょうか。写真一枚は、数万から数百万もの小さな点でできています。この点を一列に並べて普通のニューラルネットワークに入れると、学ぶべきつながりが多すぎます。しかも同じ猫が少し横にずれただけで、まったく別の入力になってしまいます。そこで、人の目のように小さな部分を順に見ていき、特徴を探すネットワークが考え出されました。それが畳み込みニューラルネットワーク、略してCNNです。
写真は数の格子です
私たちには絵に見えますが、コンピュータに写真を渡すには、結局は数に変えなければなりません。写真をうんと近くで見ると、ピクセルという小さな点が方眼紙のマス目のようにぎっしり並んでいます。白黒写真なら、点の一つ一つが明るさを一つの数で持っています。明るい点は大きな数、暗い点は小さな数です。
カラー写真では、点ごとに赤・緑・青の強さを三つの数で持ちます。どちらにしても、写真一枚はマスごとに数が入った格子です。
拡大ボタンを押してみましょう。手書きの数字に見えていた絵が、近くで見るとマスごとの明るさの数に変わり、写真が数の格子だとわかります。
拡大すると、マスごとに数が見えました。人はひと目でどの数字かわかりますが、コンピュータが受け取るのは数がぎっしり並んだ表だけです。この数の山から、エッジや曲線のような特徴をどうやって見つければよいのでしょう。
一度に全部を見るには多すぎるので、小さな部分から順に調べていきます。
小さなフィルターで特徴を探す
特徴を探す道具がフィルターです。フィルターは画像よりずっと小さな数の板で、虫めがねを一か所に当てるのに似ています。たとえば縦のエッジを探すフィルターは、左が暗く右が明るい模様に反応します。
フィルターを画像の一か所に重ね、そこの数がフィルターの模様にどれだけ似ているかを点数にします。このウィジェットでは、右の二マスの明るさの合計から左の二マスの合計を引いた値が点数です。模様がよく合えば点数は高く、合わなければ低くなります。
格子の場所を選んでフィルターを当ててみましょう。フィルターと同じく左が暗く右が明るい場所では点数が高くなり、そこを縦のエッジが通っているとわかります。
場所ごとに点数が違いました。暗いマスと明るいマスが接するところで点数がいちばん高く、そこがまさに縦のエッジです。明るさがそろったところでは、点数はゼロ近くにとどまりました。
ここで大事なことが一つあります。同じフィルターは、どこに当てても同じ特徴を探します。エッジが絵の左にあっても右にあっても、同じように見つけられます。それなら一か所だけで終わらせず、フィルターで格子全体をなぞればよいわけです。
フィルターを滑らせて特徴マップを作る
では、フィルターを一マスずつ動かします。左上から始めて右へ一マスずつ進み、行の端まで来たら一行下がって、また左から見ていきます。場所ごとの点数を同じ位置に書いておくと、点数が集まって新しい小さな格子になります。
この格子を特徴マップと呼びます。特徴マップを見れば、その特徴がどこで強いかがひと目でわかります。
「一マス滑らせる」ボタンを押して、フィルターを動かしてみましょう。場所ごとの点数が特徴マップの同じ位置に入り、全部なぞり終えると、縦のエッジが強い場所が明るく浮かび上がります。
フィルターが格子全体をなぞり終えると、特徴マップが完成しました。縦横五マスの格子から縦横四マスの特徴マップができたので元より少し小さくなりましたが、縦のエッジが通る列がはっきり明るく見えます。フィルター一つが探す特徴は一種類だけです。
そのため実際のCNNは、縦のエッジ、横のエッジ、曲線など、模様の違うフィルターを数十、数百と同時に使います。しかもフィルターの中の数値は人が決めるのではありません。前に学んだ勾配降下法と誤差逆伝播法で、誤差が小さくなる向きに少しずつ直しながら学びます。人が特徴を選んでいた仕事を、ネットワークが自分でこなすようになったのです。
層を重ねるほど大きな特徴
特徴マップの上をもう一度フィルターでなぞると、小さな特徴が集まって大きな特徴になります。最初の層は短いエッジのような小さなかけらをとらえ、その上の層はエッジを組み合わせて目や鼻のような部分をとらえます。さらに上の層は部分を集めて顔全体を見分けます。
ニューロンを層に重ねたニューラルネットワークと同じ考え方ですが、CNNでは層ごとにフィルターでなぞる点が違います。層が上がるほど一マスが元の写真のより広い範囲を表すようになり、そのぶん抽象的な特徴をとらえます。
「層を上げる」ボタンを押して、一段ずつ上がってみましょう。エッジのかけらから目や鼻のような部分へ、さらに顔全体へと、見えるものがだんだん大きくなります。
層を上げるたびに、見えるものが大きくなりました。低い層は小さく単純なかけらを見て、高い層はそれらを組み合わせて意味のある形を見ます。線を見て、部分を見分け、最後に全体をつかむ流れは、人がものを見分ける過程にも似ています。
実際、学習を終えたCNNの中をのぞくと、下の層のフィルターはエッジや色の境目に、上の層のフィルターは目や車輪のような部分に反応していることがよくあります。ウィジェットの顔の絵は、この流れを単純に描いたものです。
まとめ
まとめるとこうです。写真はマスごとに明るさの数が入った格子です。CNNは小さなフィルターを一か所に当て、探す特徴があるかどうかを点数にします。同じフィルターで格子全体をなぞると、特徴がどこにあっても見つける特徴マップができます。
こうした層を何枚も重ねると、エッジから目や鼻へ、さらに顔へと、だんだん抽象的な特徴をとらえます。フィルターの中の数値はデータから学びます。
要点を順に押して振り返りましょう。(写真は明るさの数の格子 → 小さなフィルターで特徴に点数 → なぞって特徴マップ → 層を上げるほど抽象的な特徴)
これで、コンピュータが絵をどう見ているかがわかりました。写真を数の格子に変え、小さなフィルターでなぞって特徴を探し、層を重ねてだんだん大きな特徴をとらえます。同じフィルターが写真全体をなぞるので、猫が横にずれていても見つけられます。
けれども、単語や文は写真のように最初から数の格子として与えられるわけではありません。次のレッスンでは、単語を数に変える方法、エンベディングを扱います。