前回は、ニューラルネットワークの基本的な仕組みを、ニューロンの模倣から誤差逆伝播法まで一通り解説しました。今回はその応用編として、画像認識AIの心臓部にあたる「CNN(畳み込みニューラルネットワーク)」の仕組みを見ていきます。「画像を判断するAI」がコンピューターの中でどんな計算をしているのか、図解のイメージを言葉で補いながら説明していきます。
・そもそも、コンピューターは画像をどう見ているのか
私たちが写真を見るとき、そこには「人の顔」や「猫」といった意味のある情報が映っていますが、コンピューターにとって画像は、単なる数字の集まりでしかありません。1枚の画像は、細かい格子状のマス目(画素、ピクセル)に分割され、それぞれのマスに明るさや色を表す数値が割り当てられています。白黒画像であれば、1つの画素につき「0(真っ黒)から255(真っ白)までの256段階」といった具合に、明るさが数値化されているイメージです。
このとき、1つの画素をどれくらい細かい段階で表現するかを「ビット深度」と呼びます。8ビットなら256段階、4ビットなら16段階、2ビットなら4段階、1ビットなら白と黒の2段階しか表現できません。段階が少なくなるほど、画像はのっぺりとした荒い表現になっていきます。同様に、画素そのものの「数」が少なくなる(解像度が下がる)ほど、画像はぼやけていきます。画素数が多いほどきれいに画像を表現できる、というのは直感的にも分かりやすいと思います。
カラー画像の場合は、赤(R)・緑(G)・青(B)の3つの数値の組み合わせで色を表現する「RGB」方式が広く使われています。これは光の3原色をベースにした「加法混色」の考え方で、ディスプレイのように自ら発光する機器の色表示に使われます。一方、プリンターや印刷の世界では、シアン・マゼンダ・黄色を基本とした「YMCK」という色の3原色(減法混色。色を重ねるほど暗くなっていく)の考え方が使われており、両者は「発光して色を作るか」「光を吸収して色を作るか」という根本的な仕組みの違いがあります。
・CNN(畳み込みニューラルネットワーク)の全体像
前回紹介した「多層ニューラルネットワーク」を画像認識向けに工夫したものがCNNです。CNNの全体の流れは、おおよそ次のような構造になっています。
入力(画像) → 畳み込み層 → 畳み込み層 → プーリング層 → (局所コントラスト正規化) → 畳み込み層 → プーリング層 → 全結合層 → 全結合層 → ソフトマックス → 出力(ラベル)
聞き慣れない言葉が並んでいますが、大きく分けると「畳み込み層」と「プーリング層」という、CNNならではの2種類の処理を繰り返した後、前回学んだ普通の(全結合の)ニューラルネットワークにバトンタッチして、最終的にソフトマックス関数で「この画像はどのラベル(カテゴリ)に当てはまるか」を確率として出力する、という流れになっています。
・畳み込み層:画像の「特徴」を抜き出す
CNNの名前の由来にもなっている「畳み込み(コンボリューション)」という処理は、画像の中から線やエッジ(輪郭)といった特徴を抜き出すための計算です。
やっていることは意外とシンプルで、小さな正方形の「フィルタ(カーネル)」を画像の上に少しずつスライドさせながら、フィルタの数値と、それが重なっている部分の画素の数値を掛け合わせて全部足す、という計算を繰り返します。数式で書くと、
uᵢⱼ = Σ wₚqxᵢ₊ₚ,ⱼ₊q
となり、これは「フィルタの重み(w)と、対応する位置の画素の値(x)を掛けて全部足したものが、出力(u)の1マス分になる」ということを表しています。
たとえば、3×3のフィルタ (−1,0,1 / −2,0,2 / −1,0,1) を画像に当てはめると、横方向に明るさが急に変化している部分(=縦のエッジ)が強く反応するようになります。実際にこのようなフィルタを写真全体に適用すると、人物の輪郭や帽子の縁、髪の毛の流れといった「線」だけが浮かび上がった、まるで鉛筆画のような画像に変換されます。
こうしたエッジ検出フィルタは、実は「微分」の考え方とつながっています。画像の明るさの変化量(1次微分)を近似的に計算するフィルタは (0,−1,1) のような数値の並びになりますし、変化の変化量(2次微分)を捉えるフィルタは (1,−2,1) のような数値になります。数学的な「傾きの変化」を検出する仕組みが、そのまま「輪郭を検出する」という画像処理の役割を果たしているわけです。
CNNのすごいところは、こうしたフィルタの数値(w)を、人間があらかじめ設計するのではなく、前回解説した誤差逆伝播法によって、大量の画像データから自動的に学習させてしまう点です。「エッジを検出するフィルタ」も「特定の模様に反応するフィルタ」も、すべて学習によって自然に獲得されていきます。
・プーリング層:情報を「間引いて」要約する
畳み込み層の次によく登場するのが「プーリング層」です。これは、畳み込みによって得られた特徴の情報を、少し粗くまとめる(間引く)処理です。
代表的なものに、「マックスプーリング」と「アベレージプーリング」があります。たとえば4×4の数値の集まりを、2×2ずつの4つのブロックに分け、それぞれのブロックの中から最大値を採用するのがマックスプーリング、平均値を採用するのがアベレージプーリングです。
この処理によって、データのサイズは小さくなりますが、「その特徴がだいたいどのあたりにあったか」という大まかな位置情報は保ったまま、細かい位置のズレには影響されにくくなる、という効果があります。写っている猫が写真の中で少し左右にズレていても「猫」だと認識できるのは、こうしたプーリングの働きも一因です。
・代表的なCNNモデル:AlexNetとResNet
CNNの歴史の中で、特に重要な2つのモデルを紹介します。
AlexNet(2012年) は、世界的な画像認識コンテスト「ILSVRC」で2012年に優勝し、ディープラーニングブームの火付け役になったモデルです。8層というシンプルな構造ながら、活性化関数にReLUを採用し、GPUによる並列計算を活用することで、当時としては圧倒的な精度を叩き出しました。この「多層のCNNは実用的に機能する」ことを世に示した点が、AlexNetの最大の功績とされています。
ResNet(2015年) は、同じくILSVRCで2015年に優勝したモデルで、152層を超えるという、当時としては桁違いに深いネットワークを実現しました。層を増やせば増やすほど表現力が上がりそうなものですが、実際には層を深くしすぎると「勾配消失問題」という、学習に必要な誤差の情報が層を逆伝播していくうちに薄まって消えてしまう問題が起きます。ResNetは「Residual Block(残差ブロック)」と呼ばれる、層の入力を出力にそのまま足し合わせる「Skip Connection(近道)」という仕組みを導入することで、この勾配消失問題を解決し、超がつくほど深いネットワークの学習を可能にしました。
AlexNetからResNetへの進化は、「とにかく層を増やせば性能が上がる」という単純な話ではなく、「深いネットワークをちゃんと学習させるための工夫」が積み重ねられてきた歴史でもある、というのがよく分かる比較だと思います。
・おまけ:画像を「作り出す」GAN(敵対的生成ネットワーク)
ここまでは画像を「認識する」仕組みを見てきましたが、CNNは画像を「生成する」AIにも応用されています。その代表格が「GAN(Generative Adversarial Network、敵対的生成ネットワーク)」です。
GANの仕組みはユニークで、2つのネットワークを競わせることで学習を進めます。
* 生成器(Generator):ランダムなノイズから、本物そっくりの画像を作り出そうとする、いわば「偽造者」の役割です。
* 識別器(Discriminator):渡された画像が、本物のデータなのか、生成器が作った偽物なのかを見分けようとする、いわば「鑑定士」の役割です。
この2つを敵対的に(Adversarial)学習させることで、生成器は「識別器を騙せるくらい本物そっくりの画像」を作れるように腕を上げていき、識別器も「巧妙な偽物でも見破れる」ように精度を上げていきます。最終的な理想の状態は、識別器がどちらを見せられても「本物である確率は五分五分(0.5)」としか判定できなくなること、つまり生成器が本物と見分けがつかないデータを作れるようになった状態です。イタチごっこのような競争を通じて、どちらのネットワークも賢くなっていく、という発想が面白いポイントです。
・まとめ
今回は、画像を認識するAIの仕組みとして、画素とビット深度による画像の表現方法、畳み込み層によるエッジ・特徴の抽出、プーリング層による情報の要約、そしてAlexNetからResNetへの発展の歴史、さらにおまけとして画像を生成するGANの仕組みまで見てきました。「画像を数字の集まりとして扱い、小さなフィルタで特徴を拾い上げていく」という発想が、CNNの根っこにある考え方だとまとめられそうです。
次回は、こうしたモデルが「本当にちゃんと機能しているか」をどう評価するのか、そして実際の社会でどんな形で応用されているのかを紹介していきます。