計算物理ワークショップ 機械学習編 その３
前回に引き続きニューラルネットによる深層学習の取り扱いを具体的問題を通して学ぶ。前回は非常に小さなデータセットの単縦な例題を用いたが、今回は非自明な分類や、画像認識を問題にする。

アヤメの分類
アヤメはその多くが山野や草原に自生するアヤメ科アヤメ属の多年草である。Python のオープンソース機械学
習ライブラリである scikit-learn には「setosa」,「versicolor」,「virginica」と呼ばれる種類のアヤメ 150 個の (1)
がく片の長さ, (2) がく片の幅, (３) 花びらの長さ, (４) 花びらの幅がデータとして収録されている。このデータを用いてニューラルネットで学習することでアヤメの分類器を作ることを考える。
まずはデータがどのような分布をしているか見ることによって、問題が (人間には) 非自明な分類であることを確認しよう。下記のリンクにあるサンプルプログラムでは scikit-learn からデータを読み込み、そのデータをプロットしている。

https://colab.research.google.com/drive/1dyMbV-lDm-GKHW8Xy5dWcq0-DUgpQqVF?usp=sharing
ダウンロードして動かせたら、与えられた４次元のデータ空間の中から適当に２ (もしくは３) つの次元を選んでプロットしてみることで、分類が自明な曲線 (もしくは曲面) ではできなさそうなことを確認しよう。データの確認が終わったら、下記のリンクにあるサンプルプログラムを参考にアヤメの分類器を作ってみよう。

https://colab.research.google.com/drive/1QBhtxo2TmfOVNQffL69Bkn5jFCGKuIiu?usp=sharing
これまでとは異なり、正解データが 0-2 の多クラス分類となっている。そのため、出力層の活性化関数を、そのような分類に適した softmax 関数に選んである。softmax 関数は

exi
yi = ∑ nxk
k=1 e(1)で表される関数である。ここで、n は分類したクラスの数 (＝出力ノードの数) であり、ここでは 3 をとる。式の∑特性から
yi = 1 であるので、softmax 関数を用いれば、出力される各クラスに対する分類確度の合計が 1 となるので、結果の解釈を簡単にすることができる (実は 2 クラス分類でも softmax は sigmoid よりも便利だが学習量の都合上、ここで初めて登場した)。

手書き文字の認識
ここまでは入力 x が高々4 次元までの問題を扱ってきたが、最後にこれまでとは桁違いの入力次元を持つ画像の認識を取り扱ってみよう。ここまでにニューラルネットを構築するために利用してきた Keras ライブラリには、MNIST と呼ばれる 0 から 9 までの手書きアラビア数字の画像が数万枚収録されており、これを用いる。画像は28 × 28 ピクセルの範囲に収まるようにサイズが正規化され、かつ色はグレースケールに変換されている (白黒の明度が 0 − 255 で表現されている)。つまり x の入力次元は 28 × 28 = 784 となる。現代の PC(google colab. の場
合は google の無料サーバー) であればこの程度入力次元のネットワークであれば比較的短時間で学習できる。
下記のリンクにあるサンプルプログラムを参考に手書き文字の分類器を作ってみよう。

https://colab.research.google.com/drive/1rPdWXuinpjfEQF7ub3EB7Il3-GHw5kqx?usp=share_link
コードを動かせたら、１０分程度の学習時間でどの程度の識別精度が達成できるのか試してみよう。
ニューラルネット (より正確にはパーセプトロン) による手書き文字の分類器は 1979 年に当時 NHK 放送科学基礎研究所の研究員であった福島邦彦氏によって初めて開発されたことが知られている (ネオコグニトロン)。効率1

的に学習を行う誤差逆伝播法がまだ世に現れる前であったこと、パーセプトロンは非線形分離が不可能であると誤解された説が広まったこと、さらに当時はコンピューターの性能が低かったことなどによって、ネオコグニトロンは現代の AI ブームに直接繋がることはなかった。しかしながら、現代の AI の始祖とも言うべきものが日本で生まれていたことは記憶に値するだろう。

Convolutional Neural Network
ニューラルネットがよく適応される画像認識の場合、入力データが大きくなるので学習にかかる計算量もそれに応じて当然大きくなる。したがって、これまで用いてきたような (層内全てのニューロンが結合した) 全結合層のみを重ねたネットワークよりも、画像認識に特化したより効率的に学習できるネットワークが必要になる。

Convolutional Neural Network (CNN) は画像認識で最もよく使われるネットワークであり、応用性が非常に高いので最後に CNN による画像認識を取り上げる。

CNN はその名の通り、ニューラルネットに Convolution(畳み込み) と呼ばれる画像データの変換を組み込んだネットワークである。以下では具体例をもとに畳み込み操作で行われる処理を見ていく。図 1 は 3 × 3 のフィル
ター (もしくはカーネル) と呼ばれる行列を用いた畳み込み操作の手順を示している。ここでは例として 0 もしく
は 1 の成分値を持ったフィルター Fi,j (i, j = 0, 1, 2) を考えているが、実際の CNN では 1 つ 1 つの成分 Fi,j が自由な値を取れる学習パラメーターとなる。フィルターは畳み込みを取りたい入力画像に被せられ、入力画像の各ピクセルが持つ値 D とフィルターの成分値の積を取った値の、フィルターが被さった全ピクセルについての和 Gが出力される。いまフィルターの中心が入力画像の k 行 l 列の位置にあるとすると、出力されるのは

Gk,l =2 ∑2∑

Dk+i−1,l+j−1 Fi,j(2)i=0 j=0となる。フィルターを縦横に動かしながら畳み込みを取っていくと、最終的にもとの画像よりも縦横共にサイズが2 ピクセルだけ小さくなった画像が出力として得られる。図 1 のように、L 字型のフィルターを考えると、元の画像に L 字型の形状をした要素があると、その部分で出力が大きくなる。このように、畳み込み操作は入力された画像が特定の特徴 (形状) を持っているかどうかを教えてくれるのである。これまでの深層学習の例にもれず、我々はあらかじめフィルターを推定しておく必要はない。通常学習を行う際には、ランダムな成分値 Fi,j を持つフィルターからスタートし、認識したい画像 (教師データ) の特徴に応じたフィルターが学習の結果として生成される。

図 1: 畳み込み演算の例

2よく用いられる CNN では、畳み込みの前後でプーリング (pooling) と呼ばれる画像の縮小変換も組み合わせて行われる。プーリングにも様々な種類があるが、例えば Max Pooling と呼ばれる操作では、2 × 2 のフィルターを被せて、その中から最大値をもったピクセルの値を出力する (図 2 参照)。畳み込みとは異なり、プーリングではフィルターを縦横にずらしていく時に、フィルターが被らないようにスライドさせていく。すると、2 × 2 のフィルターの場合は元の画像の半分のサイズ (面積は 1/4) の画像が出力される。Max Pooling を行うと、特徴を保ちながら画像解像度を落とすことができ、特定のフィルターに反応するような特徴をもった部分の位置ずれに対して頑健なネットワークにすることができる。

図 2: プーリング演算の例
典型的な CNN は、畳み込みやプーリングによって処理された画像を活性化関数を通してつないだものをネットワーク化することで構成される。ネットワークの具体例を図 3 に示す。この例では入力画像に対して 4 種の 3 × 3のフィルターで畳み込みを行い、その後にプーリング層を挟んだ後に、さらに畳み込み＋プーリングを重ね、最後に (データを１次元化して) 全結合層を通して 6 次元の出力 (6 種の画像判定) を得るネットワークになっている。

図 3: CNN の実装例

3

図で示したものと類似したネットワークで MNIST 画像を分類するサンプルプログラムが下記アドレスから取得できるので動かしてみよう。

https://colab.research.google.com/drive/1Tbo7HhtqsrjGLLV8u1lXs-F-mgkOqUQz?usp=sharing
コードを動かせたら、10 分程度の学習時間でどの程度の識別精度が達成できるのか試してみよう。課題：全結合層のみの場合と比べてどう結果が変わるかを、学習時間と精度の観点から調べてみよう。

4