畳み込みニューラルネットワーク(CNN)をなるべくわかりやすく解説

畳み込みニューラルネットワーク(Convolutional Neural Network; CNN)をなるべくわかりやすく解説

こちらの記事では,深層学習(Deep Learning)の基本的な仕組みについて説明しました.

今回は,画像を深層学習で扱うときに現在最もよく使用されている畳み込みニューラルネットワーク(Convolutional Neural Network, 略してCNN)についてなるべくわかりやすく説明しようと思います.CNNは本当によく使用されている方法ですので,理解を深めることは大きなメリットになります.

Q. CNNとは何なのか?
A. CNNは画像を扱う際に,最もよく用いられている深層学習モデルの1つ

CNNで何ができるのか

CNNの具体的な説明に入る前に,CNNを使うことでどのようなことができるのか,簡単にいくつか例示したいと思います.

画像生成 (Image Generation)

突然ですが,以下の2つの画像のうち,どちらが本物で,どちらが人工的に作成したものだと思いますか?

[引用] http://www.whichfaceisreal.com

2つの画像とも本物に見えますが,どちらか一方はCNNと敵対的生成学習と呼ばれる方法を用いて人工的に作成した画像になります(敵対的生成学習についてはこちらの記事で解説しています).

このように,CNNを用いることで人間が区別できないほどリアルな画像を生成することも可能になりつつあります.ちなみにCNNで生成した画像は右の画像になります.もちろん,上記の顔画像以外にも風景や建造物の生成も可能です.

画像認識(Image Recognition)

画像をCNNに入力することで,画像にどんな物体が写っているのか,そしてその物体が画像のどこに写っているのかを特定することが可能です.

例えば,以下の例だと左側の画像をCNNに入力することで,右側の画像を得ることができます.右側の画像中のそれぞれの色は物体のカテゴリ(人,車,道路など)を表しています.

このようにCNNを応用することで,画像内のどこに何があるのかがわかるようになります.

セマンティックセグメンテーションの例(左:入力画像,右:出力画像)

ほかにも,画像中に何が写っているのかだけを推定する画像分類(Image Classification)のタスクにもCNNが適用されるケースが多いです.

画像分類の例.画像分類は画像に写っている物体の名称を当てるタスク.

上記に挙げたタスク以外の多くの画像に関する問題にもCNNが適用され,その性能の高さを示しています.

それでは,以降でCNNについて詳しく見ていきましょう.

CNNとは

畳み込みニューラルネットワーク(CNN)は畳み込み層とプーリング層が積み重なったニューラルネットワークのことです.以下に画像分類タスクを解く際のCNNの例を示します.

図1. 畳み込みニューラルネットワーク(CNN)の例.

画像分類の場合では,入力画像を畳み込み層とプーリング層を使って変換しながら,徐々に小さくしていき,最終的に各カテゴリの確率の値に変換します.

そして,こちらの記事で説明したように,人が与えた正解ラベルとCNNの出力結果が一致するように,パラメータの調整を行います.CNNで調整すべきパラメータは畳み込み層(conv)と最後の全結合層(fully connected)になります.

通常のニューラルネットワークとの違い

通常のニューラルネットワークでは,画像を入力する際に画像の形状を分解して1次元のデータにする必要がありました.

画像は通常,タテ・ヨコ・チャンネルの3次元の形状をしています.例えば,iPhone 8で撮影した写真は,\((4032, 3024, 3\))の形状をしたデータになります.$4032$と$3024$がそれぞれタテ・ヨコの画素数,最後の$3$がチャンネル数(=RGB成分)になります.そのため,仮にiPhone 8で撮影した画像を通常のニューラルネットワークで扱う際は,$36578304 (=4032\times 3024\times 3)$の1次元のデータに分解してから,入力する必要があります(=入力層のノード数が$36578304$).

このように1次元のデータに分解してから,処理を行うニューラルネットワークを全結合ニューラルネットワーク(Fully connectd neural network)と呼んだりします.

全結合ネットワークの欠点として,画像の空間的な情報が無視されてしまう点が挙げられます.例えば,空間的に近い場所にある画素同士は類似した画素値であったり,何かしらの関係性があるはずです.3次元データを1次元データに分解してから処理を行ってしまうと,こういった空間情報が失われてしまいます.

一方,CNNを用いる場合は,3次元という形状を維持したまま処理を行うため,空間情報を考慮した処理が可能になります.CNNにおける処理では,入力が$(H, W, C)$の3次元形状である場合,畳み込み層およびプーリング層の出力も$(H’, W’, C’)$のように3次元となります(出力のタテ・ヨコ・チャンネルの大きさは変わります).そのため,全結合ニューラルネットワークよりも,画像のような形状を有したデータを適切に処理できる可能性があります.

それでは,畳み込み層,プーリング層,全結合層について見ていきましょう.

畳み込み層 (Convolution layer)

畳み込み層 = フィルタによる画像変換

畳み込み層では,フィルタを使って画像を変換します.以下に例を示します.下記の例では,$(5, 5, 3)$のカラー画像に対してフィルタを適用して画像変換をしています.

カラー画像の場合,RGBの3チャンネルで表現されるので,それぞれのチャンネルに対応する3つのフィルタ($W^{1}_{0}, W^{2}_{0}, W^{3}_{0}$)を適用します.

図2. 畳み込み処理の例.

上図で示すように,フィルタの適用は,フィルタを画像に重ねあわせ,フィルタがもつ各重みと一致する場所の入力画像の画素値を乗算し,それらを足し合わせることで画素値を変換します.

さらに,RGBそれぞれのチャンネルに対応するフィルタを適用した後に,それらの変換後の各値を足し合わせることで1つの出力値を計算します(上の例だと,$1+27+20=48$の部分).

そして下図に示すように,フィルタを画像上でスライドしながら適用することで,画像全体を変換します.

図3. 畳み込み処理の例.1つのフィルタから出力される画像は常に1チャンネルの画像

このように,畳み込み層では入力のチャンネル数によらず,1つのフィルタからの出力は常に1チャンネルになります.つまり,$M$個のフィルタを用いることで,$M$チャンネルの画像を出力することができます.

通常のCNNでは,下図のように,入力の\(K\)チャンネル画像に対して,$M$個($M\ge K$)のフィルタを用いて$M$チャンネル画像を出力する畳み込み層を積み重ねることが多いです.

図4. 畳み込み層の入出力関係

CNNでは入力のカラー画像(3チャンネル)を畳み込み層によって多チャンネル画像に変換しつつ,画像サイズを小さくしていくことで,画像認識に必要な情報を抽出していきます.例えば,ネコの画像を変換していくことで徐々にネコらしさを表す情報(=特徴量)を抽出していくイメージです.

畳み込み層の後には,全結合ニューラルネットワークと同様に活性化関数を出力画像の各画素に適用してから,次の層に渡します.

そして,畳み込み層で調整すべきパラメータは各フィルタの重みになります.こちらの記事で解説したように,損失関数に対する各フィルタの偏微分を算出し,誤差逆伝播法によって各フィルタの重みを更新します.

パディング

図2や3で示したように,フィルタを画像に適用するとき,画像からフィルタがはみ出すような位置にフィルタを重ねることができません.そのため,畳み込み処理による出力画像は入力画像よりも小さくなります.

そこで,ゼロパディングと呼ばれる方法を用いて,出力画像が入力画像と同じサイズになるようにするアプローチがよく用いられています.ゼロパディングはとてもシンプルで,フィルタを適用する前に,入力画像の外側に画素値0の画素を配置するだけです(下図).

図5. ゼロパディングの例.入力画像と出力画像のサイズが同じになる.

ストライド

図3で示した例では,画像上を縦横方向に1画素ずつフィルタをずらしながら,各重なりで両者の積和を計算することで出力画像を生成していました.このフィルタを適用する際のずらし幅をストライドと呼びます.

ストライド$s$を用いた際の出力画像のサイズは,入力画像に対して$1/s$になります.

そのため,ストライド$s$の値を2以上に設定することで画像サイズを小さく変換することができます.

画像サイズを小さくする際は,ストライドを2にして畳み込み処理を行うか,後述するプーリング処理のストライドを2にして画像を処理し,画像サイズを半分にすることが多いです.

プーリング層 (Pooling layer)

プーリング層では,画像内の局所的な情報をまとめる操作を行います.具体的には,Max PoolingとAverage Poolingと呼ばれる2種類のプーリング操作がよく使用されています.

Max Poolingでは,画像内の局所領域(以下では$2\times2$画素領域)のうち最大画素値を出力することで,画像を変換します.

Max Poolingの例.上の例では,画像中の\(2\times2\)の領域の最大値を出力することで,画像を変換している.

Average Poolingでは,局所領域の画素値の平均値を出力することで,画像を変換します.

Average Poolingの例.画像中の\(2\times2\)の領域の平均値を出力することで,画像を変換する.

Max Pooling,Average Poolingともに上記の操作をスライドさせながら画像全体に対して行うことで,画像全体を変換します.

操作対象の局所領域サイズ(フィルタサイズ)や,ストライドの値によって出力画像のサイズを調整することができます.

なお,プーリング層には誤差逆伝播法によって調整すべきパラメータは存在しません.

画像分類タスクでは,プーリング層で画像サイズを半分にすることが多いです(=フィルタサイズ$2\times 2$,ストライド$s=2$).

全結合層 (Fully connected layer)

CNNの最終的な出力が画像以外の場合(例えば,物体の名称)に,CNNの最後に使用されるのが全結合層になります.

畳み込み層もしくはプーリング層の出力は$(H, W, C)$の3次元データになっているため,これらを1列に$H\times W\times C$個並べた1次元のベクトルにし,全結合層に入力します.

全結合層

全結合層は通常のニューラルネットワークと同様に,各ノードに割り当てられた重みとバイアスを用いて入力値を変換します.そして,画像分類の場合なら,最後にソフトマックス関数を適用することで確率の表現に変換します.

畳み込み層のフィルタと同様に,CNNの学習では誤差逆伝播法によって全結合層の重み$w_i$とバイアス$b$を更新します.

CNNの出力が画像の場合は,全結合層ではなく,画像を拡大することが可能なTransposed Convolution (Deconvolution)という操作を行うことで,画像→画像の処理も可能になります.これに関してはまた別の機会に解説したいと思います.

まとめ

  • 畳み込みニューラルネットワーク(CNN)とは,畳み込み層とプーリング層を積み重ねたニューラルネットワークのこと
  • 画像を扱う際に最もよく使用されているニューラルネットワーク

さて,CNNの解説はいかがだったでしょうか.ざっくり言えば,フィルタを用いて画像を変換しているだけですので,思っていたよりは難しくなかったのではないでしょうか.
実際にCNNを用いて画像分類を実行するプログラムをこちらの記事で紹介していますので,もしよろしければ参考にしてみて下さい.

また,これを機会に人工知能に関する勉強やプログラミングを始めたい方は以下の記事も参考にしてみてください.

タイトルとURLをコピーしました