計算物理ワークショップ 機械学習編 その２
前回 (機械学習編その１) ではもっとも簡単な機械学習である最小２乗法を例にとって、データにフィットする1 次関数の２つの係数を決定するための学習方法を学んだ。では、データ構造が極めて複雑で、それをどのような関数でフィッティングすればよいか見当がつかない場合はどうすれば良いか？そのようなときに威力を発揮するのが今回学ぶニューラルネットによる深層学習 (ディープラーニング) である。言い換えると深層学習とは、関数系を人間があらかじめ仮定せずともデータにフィットする関数を見つけてくれる強力な関数フィットツールである言える。例えば入力データとして多数のネコ (の画像) を見れば、人間であればなんとなくネコの定義を思い描き、ネコという概念を認識することができる。しかし、その認識を数式で表現しろと言われると困ってしまう。深層学
習は十分な数のデータ (猫の画像) を用意して現代的性能のコンピュータで学習を進めれば、ネコの定義をニューラルネット上に数式として構成してしまうのである (ただし、その数式は通常極めて複雑で、やはり人間にはほとんど把握不能なものになってしまうが)。

ニューロンとニューラルネット

図 1: 単一ニューロンの模式図
ニューラルネットの基本構成要素となるニューロンは、入力値 x に対して、重み w をかけた値にバイアス b を足した値を活性関数 A に入力して、その帰り値を y として出力する (図 1 参照)。これを数式で書くと

y = A(w x + b).

(1)

ここで、活性化関数 A としては、例えば図 2 に示すような Rectiﬁed Liner Unit(ReLU) 関数や Sigmoid 関数がよく用いられる。いずれの関数も、入力値が概ね 0 以上になると出力を返す特徴を持っていることが重要である (電気的刺激が一定値を超えると発火する脳のニューロンと同様の働きをするのである)。

図 2: 活性化関数の例：青線が ReLU 関数、赤線が Sigmoid 関数の振る舞いを示す。
ニューラルネットはこのニューロンを並べて図 3 のように多層化したものであり、調整可能なパラメーターである w = (w11 , w12 , · · · ), b = (b1 , b2 , · · · ) や w′ , b′ を調整すれば、どんな関数でも表現可能であることが知られ1ている。これらを調整する作業が学習作業となる。前回の授業でパラメータ w1 , w2 を学習したのを思い出すと良い。ニューラルネットで活性化関数をステップ関数にしたものはパーセプトロンと呼ばれ、AI 研究の黎明期に研究された。

図 3: 3 層ニューラルネットの例 (入力変数 2、中間層 3 ノード、出力変数 2 の場合)

教師データ
教師データとは何で、どのような関数を学習で最小化するのかを具体的にみていくために、有名でかつシンプルな排他的論理和問題について取り扱っていく。排他的論理和とは簡単に言うと、0 か 1 の 2 値を取る 2 つの数の和で、どちらかが 1 だと 1、どちらも 0 または 1 だと 0 を返す論理演算のことである。つまり、0 + 1 = 1, 1 + 0 =1, 0 + 0 = 0, 1 + 1 = 0 となる。このような演算が可能なニューラルネットを生成することを目的にする1 。教師
データは和をとる 2 つの数を組にして書けば

x=(0, 1), (1, 0), (0, 0), (1, 1),

(2)

t=

1, 1, 0, 0(3)となる。x をニューラルネットに入力したときに、その答えとして t が得られるような w や b を見つけるという過程が「学習」になる。
このあとニューラルネットが得意な 2 値分類問題としてネットワークを組んでいくために、出力 t を次のように定義しなおす。t もベクトルで表現し、第 1 成分を答えが 0 である確度、第 2 成分を答えが 1 である確度とする。
つまり、

x=

(0, 1), (1, 0), (0, 0), (1, 1),(4)t=(1, 0), (1, 0), (0, 1), (0, 1)(5)と表現する。こう表現すると、より高度な分類機能を目指し入力を動物の写真データとしたときに、出力の第 1 成分を写真がネコである確度、第 2 成分をイヌである確度、... とすることができて便利そうだと想像できるだろう。
このように正解ラベルを 1 として、それ以外は 0 で表す表記法は One-hot 表現と呼ばれよく使われるので覚えておくと良い。

損失関数2 乗和誤差: 前回の最小 2 乗法にならうと、教師データ x に対するニューラルネットの出力 y と正解データの差の 2 乗を誤差関数 E として利用できそうである。

E(w, b)=∑{ti − yi (w, b, xi )}2 .

i

1 簡単なことのように思えるが、この問題は線形分離不可能な非線形分離問題である。

2(6)このように誤差が定義できれば、あとはそれを最小にするような w, b を前回学んだ勾配降下法のような方法で探し出せば (学習すれば) 良い2 。機械学習の分野では誤差関数のことを損失関数と呼ぶことが多い。
交差エントロピー誤差: 最小 2 乗誤差でも悪くないが、次のような交差エントロピー誤差と呼ばれる損失関数は正解データを One-hot 表現で表したときに意味が分かりやすく、かつ勾配降下法との相性も良いことが知られている。

E(w, b)=−∑ti ln{yi (w, b, xi )}.

(7)

iOne-hot 表現を使うと正解以外の t の成分は 0 なので、正解の成分に対応する出力だけを誤差成分として計算することになる。誤差成分の大きさは − ln yi なので出力 y が小さいと誤差が大きく、出力が 1 だとちょうど 0 になる。

演習
ここまで解説した排他的論理和に対するニューラルネットの python プログラムが次のリンクからダウンロードできる。

https://colab.research.google.com/drive/1dn35q1925NGHqpbYvisXbT95gQ6V1gBs?usp=share_link• コードを実際に動かしてみて、ニューラルネットが排他的論理和を正しく計算できるまで学習させてみよう。
• 何エポック3 程度の学習で精度が 1 になるか？
• 層の数やノードの数を変化させたときに学習効率はどう変わるか？
課題: ニューラルネットにジャンケンのルールを理解させてみよう。例えばグーを (1, 0, 0), チョキを (0, 1, 0),パーを (0, 0, 1) と表現し、入力 x の最初の 3 列をこちらの手、次の 3 列を相手の手とると、こちらがグーで相手がパーのときは x = (1, 0, 0, 0, 0, 1), こちらがチョキで相手がグーのときは x = (0, 1, 0, 1, 0, 0), というように入力表現できる。出力は One-hot 表現でどう書けるか各自考えてみよ。

2 ニューラルネットで損失関数の勾配を計算する方法として、誤差逆伝播法と呼ばれる方法が生み出されたことがディープラーニングが発展したブレイクスルーの１つになっている。誤差逆伝播法を学ぶことで得られる知見は多いが、深く理解するには数回分の授業が必要になるので残念ながら割愛する
3 前回は学習の１過程をステップと呼んだ。機械学習の分野では全ての教師データを 1 度使って学習を行うことを 1 エポックと呼ぶ。

3