CNNって、知ってるか?

CNNとは

説明しよう。CNNとはConvolutional Neural Networkである。

詳しいことは僕なんかに聞かずに、絵がいっぱい載ってる他の人の素晴らしい記事を読んでください。

この記事は何

CNN関連の用語集です。CNN周りは普段使わない用語がイッパイアッテナ。ちのーしすーの低い僕では到底覚えられないので、どこかに書き留めておこうという魂胆です。
用語とその意味を羅列していくだけなので悪しからず。

用語

Convolution層

別名:畳み込み層。CNNの名前の起源となっている層。まあ要するに、フィルター(後述)と呼ばれる物を入力データの各マスにかけていき出力データを得る。
これについては、オライリー社の出している O'Reilly Japan - ゼロから作るDeep Learning の209ページにある図がわかりやすい。持っている人は是非そこを見てほしい。恐らく一瞬で理解できる(本当は似た画像を探したかったが見つからなかった)。
畳み込み層って名前だけど、別に畳み込んでなく無い?WOWOWという意見もある。

フィルター

別名:カーネル。前述のConvolution層で入力データにかけるフィルターのこと。例えば、3x3マスの行列で表されるフィルターは、特定の注目要素とその周囲8マスにそれぞれフィルターの要素を掛け合わせる。で、最後にそれを足し合わせるのが畳み込み。
フィルターかフィルタかに拘る人間が僕は嫌いです。

パディング

畳み込みを行う前に、入力データの周囲を固定データ(0とか)で埋めること。例えば、4x4の入力データに3x3のフィルターをかけるような時、どう考えても端っこの要素にフィルターをかけることはできない(なぜなら、4x4の左上角の要素に3x3のフィルターをかけたら、フィルターがはみ出してしまう)。
なので、隅っこのデータにもちゃんとフィルタがけできるように、パディングで入力データを適当に拡張する。

ストライド

フィルターを適用する要素の間隔。直感的には、フィルターを1つずつずらして入力データの全ての要素についてフィルターをかけたくなると思う。この時のストライドが1である。が、別にその操作は必然性を持ったものでは無いので、要素を1つ飛ばしにしてフィルターをかけるとかでもできる(この場合ストライドは2となる)。

チャンネル

上述の説明は全て2次元で考えてきたが、3次元の畳み込みも存在する。まあ、フィルターを奥行き方向に重ねて、入力データ(2次元)も奥行き方向に重ねればいいだけだが。
その奥行きのことをチャンネルといい、フィルターと入力データのチャンネルは一致している必要がある。
これにバッチ処理が加わることで、入力データとか重みが4次元になって人の理解を超える。

プーリング層

縦・横方向に行列のサイズを縮める。縮めるってどうすんねん、と思うかもしれないが、色々と方法があって、例えばMaxPoolingだと、何マスかの中で最大値のものを代表値として取りだす。具体的に、4x4の行列があって、2x2のMaxPoolingを使うと、左上4マス中の最大値、右上4マス中の最大値、左下4マス中の最大値、右下4マス中の最大値を取り出して2x2の行列を出力する。

全結合層

英語ではAffineLayerとか呼ばれる。Conv層と対比して、インプットデータの全ての値に何かしらの重みをかけてバイアスを足して出力する。普通のNNで使われてるやつがこれ。

バッチ処理

学習の時にトレーニングデータを1つずつNeuralNetにぶち込んでいくのは非効率なので、まとめて100個とかぶち込むこと。それだけ。

平滑化

英語ではFlatten。CNNでは画像を2次元配列として持っているが、それを1次元配列に伸ばすこと。例えば、サイズ10x10の2次元配列ならサイズ100の1次元配列になる。これをすると、普通の全結合層にぶち込むことができる。

おわりに

最近まで、ずっとNeuralをNuralって書いてました。ヌーラルネット。