最近はやりのお絵描きAIに使われる、畳み込みニューラルネットワークについてまとめてみた(CNN) : その1
こんにちは、こんばんはteftefです。主はただいま大学4年生なのですが、研究室の研究を交えて、少し自分の知識を整理し、あわよくばAIの知識を初学者のためにわかりやすくまとめられたらなと思います。ただ私もまだつい最近まで初学者であり、説明が間違っていたり勘違いがある可能性が0ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。
今回の流れとしては
脳とAIの関連、ニューラルネットワーク
畳み込みとは
CNNの生い立ち
という順番で書いていきたいと思います。記事が長くなるため2~3回に分けて書きます。今回は、一番最初の「脳とAIの関連」まで書き、それでは畳み込みって何?を少し解説するところまで行きます。
それではどうぞ。
AIとは
AI(Artificial Intelligence)、人工知能というのは実は古くからあるもので、1960年代後半から70年代前半にさかのぼり、学習(training)、推論(prediction , inference)、判断(test)などの人間のような知能を持つコンピュータを意味しています。その中でもこの「知能」を実現するために必要とされる手法の中に『機械学習』だったり、『ディープラーニング』などがあります。今回はこの機械学習についてメインで、少しだけディープラーニングに触れていこうと思います。簡単にポイントだけまとめます。
人工知能を実現する手法に機械学習、その中の 1 手法にディープラーニングがある
機械学習・・・コンピュータが出力方法をや規則性を学ぶための技術
ディープラーニング・・・機械学習のうち特徴量をコンピュータ自身が学習する技術
脳とAIについて
人間の脳は数多くの神経細胞がそれぞれ、結びつき、一つのネットワークを形成しています。このような画像をよく見ますね。
ニューロン
この画像の丸がひとつひとつの『ニューロン』で、これらがつながっていて、つなぎ目である『シナプス』によって電気信号がやり取りされています。「それではニューロンのやっていることを機械に似たようなことをやらせればいいんでね?」というのが人口ニューロンであり、「実際の脳みたいにたいんニューロンをたくさんつなごう」というのがニューラルネットワークの考え方です。
人口ニューロンは下の図のような仕組みになっています。入力データ x に重み w を掛け合わせ、バイアス b を足し合わせ関数 f に代入、その出力 y がニューロンの出力となります。
私たちの脳内でも似たような仕組みになっていて、ニューロンは入力によってさまざまな状態をとります。しかしすべてのニューロンが常に活性化 ( 奮い立っている、興奮 ) しているわけではなく、それを決めるために活性化関数 f が必要とされています。今回は詳しく触れませんが、簡単に言うと、f は y を出力させる(活性化させる)かどうかを決定します。
ニューラルネットワーク
それではこのニューロンを複数繋げてネットワークにしてみます。例えば図のようにします。
ちなみに番号が0から始まるのはコンピュータ関係では0から始まることが多いので、その慣習にのっとっているだけです。
例えば得たい数字を 0.5 として重みを調整し、出力として 0.8 という数字が出力された場合これは間違いと分かります。そこで重みを変更するために『逆伝播』することで 0.8 に近づけていきます。この操作を数千、数万のニューロンで行い、得たい出力をトレーニングしていきます。ここで注意すべきなのが『学習率』を間違えてしまうと、答えがあっていないのに学習した気になってしまったりしてしまいます。そのため学習率の最適化は大きな問題となります。これらを注意して適切に重みとニューロンの数を調整されたネットワークを私たちが『AI』として使用しているのです。
畳み込みニューラルネットワーク(CNN)
それでは本題の畳み込みニューラルネットワーク(CNN)についてです。どんな操作をやっているかを大雑把に載せておきます。これを見ながら、今どこにいるのかを確認すると読みやすいんじゃないかなと思います。
画像
まず私たちの見ている画像を拡大してみるとこのようになっています。今回は簡単のために白黒画像で説明します。カラーの場合はこの正方形のマスが3層になっていると思ってください。このマス一つ一つが色の濃淡の具合を示しています。詳しくはこちらの記事でも説明しています。
このピクセルの値はそれぞれ横と縦につながりを持っていて、このつながりを私たちは認識し、この画像が女の子であることを認識できています。
畳み込みする理由
それでは「この画像が何を表しているか」を出力してくれるネットワークを考えてみます。この画像の数値を全てニューラルネットワークの入力として学習させ、重みを決定し、調整して完成!と言いたいところなんですが…これだと画像間のつながりの情報が失われてしまうことがあります。(実はこの方法でも分け方によっては縦もしくは横どちらか一方の情報は保持されるため、一定の精度を得ることがある。)ピクセル間の情報(カラーの場合はチャンネル間も)を保持しながら入力データとして扱う必要があるのです。このように縦横2次元の情報を保持しつつ、ニューラルネットワークが処理しやすい形にするために畳み込みをする必要があります。
畳み込み
それでは実際に畳み込みのやり方です。今回は簡単にが入力画像を0と1の2値画像とします。まずはフィルターを使用し入力画像に対して畳み込みを行います。(今回使うフィルターは固定してありますが、実際はこのフィルターに用いる重み(数値)も学習されて決まります。)
左上の2の計算方法は1✕1+0✕0+1✕0+1✕1=2となります。
続いてプーリング層に通して出力の解像度を下げます。今回は平均プーリングを使用しました。
全結合層からニューラルネットワークへ
ここまで来たらいよいよニューラルネットワークに入力するための 1 次元の数列にします。これを全結合層と呼び、いよいよ最後の学習です。あとはニューラルネットワークに入力し、フィルターの重みなども学習、調整し、求める結果が得られるまでトレーニングするだけです。ニューラルネットワークについては一番上で説明したのでここでは省きます。またCNNによって使うネットワークが異なることがあるため、後半パートで例を見ていきます。
最後に
盛り上がってきたところですが、今回はここまでです。次回はCNNでどのような処理をしているか、どのようなCNNがあるかを詳しく説明します。最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加してお絵描きAIを探ってみてはいかがでしょう。(teftef)
この記事が気に入ったらサポートをしてみませんか?