最近はやりのお絵描きAIに使われる、畳み込みニューラルネットワークについてまとめてみた(CNN) : その2
こんにちは、こんばんはteftefです。それではこちらの記事の後半パートです。前半パートではそもそも AI とは何なのか、ニューラルネットワーク、畳み込みの方法と畳み込む理由を書きました。
脳とAIの関連、ニューラルネットワーク畳み込みとはCNNの生い立ち
前回、画像はピクセルごとに値があり、縦と横のピクセルの関係が重要な情報であり情報を失わずに少ない入力数にするために畳み込み、プーリングを行いました。後半ではいよいよ畳み込んだ結果をニューラルネットワークに入力し、学習(training)をしていきます。といってもここは正直CNNの種類によって手順が異なるので、CNNの例をひとつずつ見ていくほうがわかりやすいです。
それでは行きます。
CNNの生い立ち
LeNet
1998年に登場した LeNet はCNNの最も原始的な形として登場しました。これは 0~9 の数字の描かれた画像を識別する『AI』として作られました。まず畳み込みとプーリング(LeNetではサンプリングというが)を繰り返しました。上の図のように『畳み込み→活性化関数→プーリング』を繰り返した結果を全結合層に入力して活性化関数 tanh を利用して10次元のベクトル(つまり 0~9 のどれかの 10 個)に出力します。シンプルですね。簡単にいうと LeNet は画像の情報を維持しつつ、圧縮し、特徴的な部分を活性化関数で抽出することで答えを出しています。これが後のCNNに大きく影響していきます。
AlexNet
2012年に発表されたこのAlexNetは画像分析コンテストの結果を大きく塗り替えました。AlexNetは3層の畳み込み層、2層のプーリング層、3層の全結合層で構成されています。AlexNetは224×224のサイズの画像をこのように上下に分けて学習し、最後に1つの全結合層にまとめ、1000個の分類になり出力されます。
AlexNetでは同時に過学習を防ぐためにデータ拡張が行われました。学習には『ImageNet』と呼ばれるデータセットが使用されていて、それぞれの画像に対して1000個の分類のラベル付けがされている。しかし1000個に分類するというのは同時に1つのコンテンツに対応する画像が少なくなってしまいます。(例えば10枚の画像を犬、猫、リンゴ、人、花に分類すると大体1つあたり2~3枚ほどになってしまう。)では「新しい画像を大量に突っ込めばいいではないか?」と思う(主も思った)がそんなことをするより、今ある画像を左右反転させたりちょっと変形させたり、カラー値を少し編集したりとすることで約2000倍のデータに増やすことができのです。賢いですね…
また図を見ると『Max pooling』が連続で2回行われているが、これは従来用いられていた『Ave pooling』では特徴マップがぼやけてしまうことを改善したり、画像を上下に分けて別々のGPUで並列学習することで効率化したりと様々な工夫がされていることがわかります。このネットワークはデータセットを増やし並列処理をすることで、CNNの効率を上げることに成功しました。
GoogleNet
2014年に発表されたこのネットワークは『Inception Module』と呼ばれる小さなネットワークを定義しました。まずはこのInception Moduleを見てみるとこのようになっています。
これはかなり難しいので今回は表面的にざっくり簡単に説明していきます。このネットワークは途中で枝分かれし、サイズの異なる畳み込みを行いそれらの出力をつなぎ合わせている。こうすることで畳み込み層の重みをスパースにできます。すぱーす?ってなりましたね。主もそうでした。「スパースってなんやねん、日本語で頼む」って思っていました。
スパース(Sparse)は日本語に訳すと『希薄』『まばら』と訳されます。データというのは多いだけでは意味がなく、無駄な情報を多く含んだデータはあまりいとは言えません。そこで必要のない(必要性が低い)データを取り除き、どこからが重要なデータであるかを抽出するということです。
簡単に言うと、このInception Moduleを通過させるとデータの無駄が省けてより精度よくかつ少ない情報量を出力できるというネットワークなのです。
ResNet
『ResNet』訳さずに書くと『Residual Network』は名前の通り残差(Residual)ブロックと呼ばれるものを導入した画期的なアイデアでした。CNNは畳み込みを行うことで、画像の縦横のつながりの情報を保持しつつ情報量を減らすことができました。しかしこれは言い換えると画像の重要な情報を少しずつ削いでしまっているのです。そのため、学習制度を高めようと深い層のニューラルネットワークを作っても情報を失いすぎて、性能が劣化してしまいます。そこで2015年に登場したこのResNetを使ったのです。
このように入力の一部の情報を何もせずにスキップし、残りを処理し、後で合わせることで『補間』しています。このようにして層を深くすることができたのです。
おまけ : IncResBlock
さあ大体の有名なネットワークを見てきました。ほんとはもっとたくさんのネットワークがあるのですが、主の知識不足と、多分ここまで来るとそろそろ飽きが来ているということで、少し2021年の最新情報を入れます。
先ほどの『Inception Module』『Residual Network』を組み合わせていいとこどりをした『IncResBlock』というものが出てきました。これを導入することでスパース性(重要なデータのみを残す)を確保+ResBlock による過学習防止をすることで、少ない情報量でなるべく多くのことを学習できる、なんか全部いいとこどりをしたようなネットワークとなりました。
まとめと次回予告
今回は様々なCNNの歴史を追いながらその使われ方と動作を書いてみました。主もまだまだ理解な不十分な部分が多いです。主もまだつい最近まで初学者であり、説明が間違っていたり勘違いがある可能性が0ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。次回はついにお絵描きAIに使われている技術にかなり踏み込んだGANについて開絶してみようと思っています。
出典および元になった論文
最後に紹介したCNNの論文を載せておきます。全部英語ですが興味のある方はじっくり読んでみると面白いかもしれません。
LeNet
http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
AlexNet
https://arxiv.org/pdf/1404.5997v2.pdf
GoogleNet
https://arxiv.org/pdf/1409.4842.pdf
ResNet
https://arxiv.org/pdf/1512.03385.pdf
おまけ : IncResBlock
https://arxiv.org/pdf/2103.03467.pdf
最後に
最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加してお絵描きAIを探ってみてはいかがでしょう。(teftef)
この記事が気に入ったらサポートをしてみませんか?