keep learning blog(キープラーニングブログ)

自分が興味を持ったことを備忘録として残すブログです。

11.ニューラルネットワークの中身を知ろう

――我々は他人の知識によって物知りにはなれるが、賢くなるには、我々自身の知恵によるしかない。――

ミシェル・ド・モンテーニュ

 

 

ニューラルネットワークの中身を知ろう

いわゆる書き散らかし随想録「エッセイ」の走りで有名なモンテーニュ曰く、人から聞いたことで勉強した気になってはダメで、知識を自分のものにしなければ真の教養人にはなれないとのことです。

というわけで、また数式が出てきてつまらないかもしれませんが、私の研究トピックの中心にある「機械学習」の基本的な部分を分かりやすくまとめることで、私も真の教養人に近づきたいと思います。

以前もご説明したとおり、機械学習というのはコンピュータを教育する方法の総称であって、そこには公文式Z会のような様々な流派が存在します。決して流行りのディープニューラルネットワーク(DNN)だけがそのすべてではありません。

また、機械学習を勉強するときは、まず先に古典的な手法(ロジスティック回帰、サポートベクトルマシン、決定木・ランダムフォレスト、k-近傍法等)を歴史順に追った方がスムーズに理解できると思います*1。しかし、物理学科でも古典を理解するには2セメスター分くらいの講義が必要なので、このブログではニューラルネットワークに的を絞って説明したいと思います。

 

人が学習するということ

私たち人間にとって「学習」とは何でしょうか。解決すべき課題をはっきりさせるために、簡単な問題を設定しましょう。例えば、いま私たちはワインのテイスティングをしていて、目の前のワインが「ボルドー産」か「山梨産」か判別したいとします(分類問題)。このとき、人間はどうやってワインを判別するのでしょうか。

まず最初に人間が無意識に行っているのは特徴量抽出です。特徴量(Feature)とは、視覚や嗅覚・味覚といった感覚によって、ボルドー産ワインをボルドー産たらしめている情報のことを意味します。ワインの色は何色なのか、匂いは酸っぱいのか、味は苦いのか・・・こうした情報を拾い上げていく作業を特徴量抽出と呼びます。当然、何を特徴量に選ぶのかは各人の経験に依っており、それが精度に直結します*2

続いて、人間は過去に目にした、嗅いだ、味わったワインに関する記憶を呼び起こします。ボルドー産ワインはどちらかというと赤色が強かった、匂いはさほど酸っぱくなかった、味は苦かった・・・等です。このように、産地がすでに分かっている過去のワインの記憶のことを教師データ(Training data)と呼び、テストで使う産地不明のワインのことを評価データ(Evaluation data)と呼びます。

また、このように、本番一発勝負ではなく教師データに基づいて学習を行ってからテストに臨むことを教師あり学習(Supervised Learning)と呼びます。人間がきちんと準備してからテストに臨むように、多くの機械学習の手法もまた、この教師あり学習の範疇にあります*3

 

機械が学習するということ

以上のような教師データに基づく記憶の構築(教師あり学習)を機械に行わせるためには、上述した特徴量や産地をコンピュータに理解できる形で表現してやる必要があります。

例えば、先ほど特徴量として挙げたワインの赤さの度合いを x_{1}、酸っぱさの度合いを x_{2}、苦さの度合いを x_{3}と定義します。また、ワインの正解ラベルがボルドー産であることを y=1、山梨産であることを y=0と表現するのはどうでしょうか。

このとき、とあるボルドー産ワインの特徴量 xと正解ラベル yは以下のような数値の列になります。

 x_{1} = 0.4, \;\; x_{2}=0.1, \;\; x_{3}=0.9, \;\; y=1

他方、とある山梨産ワインの特徴量 xと正解ラベル yは以下のような数値の列になります。

 x_{1} = 0.8,\;\; x_{2}=0.6, \;\; x_{3}=0.2, \;\; y=0

上の例では適当な数字を入れていますが、こういったボルドー産ワインと山梨産ワインの特徴量と正解ラベルのセット(教師データ)を山ほど持ってきて、機械に学習させます。その学習方法については後述するとして、とにかく学習ができたとしましょう。

続いて学習した機械に提供されるのは、次のようなテスト用の産地不明ワインです。

 x_{1} = 0.5, \;\; x_{2}=0.2, \;\; x_{3}=0.3, \;\; y=??

産地不明なので、 yの値は分かりません。ここで、先ほど学習させた機械にこの x_{1}, \; x_{2}, \; x_{3}の値を入力した結果、機械から y=1という答えが返ってくれば、機械はこのワインをボルドー産であると予測(Prediction)したことになります。

 

パーセプトロンモデル

肝心の学習方法について後回しにしたものの、以上で課題は整理されました。ようするに、私たちは特徴量と正解ラベルのセットからなる教師データを多数用意し、機械に学習させればよいのです。ここでは「パーセプトロン」という機械モデルをご紹介します。

ただし、一点注意すべきこととして、今回の記事でご紹介するパーセプトロンモデルは、1958年に心理学者のFrank Rosenblattが発表した原著論文に書かれたオリジナルモデルではなく、現代のディープニューラルネットワークで使われている、いわばアレンジ版です。活性化関数にステップ関数を使っていない点など、教科書的なパーセプトロンとは異なる記述があるのでご留意ください。

さて、巷で流行りのディープニューラルネットワークは、人間の神経細胞ニューロン)の働きを模したパーセプトロン(のアレンジ版)を並列化して深く積層したものです。ディープニューラルネットワークを理解するにはまずこのパーセプトロンの働きを正しく理解しなければなりません。

端的に言ってしまえば、今回の課題で扱うパーセプトロンは、特徴量(入力)の重み付き線形結合を非線形関数に代入して正解ラベル(出力)を得るモデルです。グラフィカルに理解するため、パーセプトロンの計算イメージを以下に図示します。

f:id:yuki0718:20190905005615j:plain

パーセプトロンの計算イメージ

これを数式で表すと、以下のようになります。

 u=x_{1}\times w^{in-out}_{1-1}+x_{2}\times w^{in-out}_{2-1}+x_{3}\times w^{in-out}_{3-1}

 y=f(u)

この非線形関数 f(u)活性化関数と呼ばれ、人間の脳のニューロンが発火する仕組みをモデル化したものです。脳のニューロンは、電気信号(重み付き線形結合)をそのまま通過させるのではなく、入ってきた電気エネルギーがある程度高くないと信号を出力しません*4

そんな活性化関数 f(u)としてよく用いられるのが、以下のシグモイド関数(Sigmoid Function)です。

 

f:id:yuki0718:20190903221830j:plain

シグモイド関数のプロット

シグモイド関数は、入ってきた重み付き線形結合 uの値がいくつであろうと、必ず0から1の間にある値を出力します。ボルドー産と山梨産の正解ラベルは1と0で表すことに決めたので、それとうまく対応することが分かります。

 

Widrow-Hoffの学習規則(導入)

以上のとおり、単なる掛け算と足し算とシグモイド関数への代入で特徴量(入力)から正解ラベル(出力)を計算できることが分かりました。しかし、これまで重み w^{in-out}_{1-1}, \; w^{in-out}_{2-1}, \; w^{in-out}_{3-1}の決め方については何も言及していません。特徴量の数 \times出力の数=3個存在する重み係数は、どのように決めるのでしょうか。

答えは明白で、パーセプトロンの重み係数 w^{in-out}を決める(理想的な値に近づける)という行為こそ、私たちがやろうとしていた機械学習に他なりません。教師データを使ってパーセプトロンの重み係数 w^{in-out}を学習するためには、以下のようなプロセスからなるWidrow-Hoff(ウィドロウ-ホフ)の学習規則が用いられます。

1.重み係数 w^{in-out}の初期値として適当なランダム値を設定する。

2.パーセプトロンに教師データのワイン特徴量 xを入力して出力 yを得る。

3.ワイン産地の真実(True)の正解ラベル tパーセプトロンが予測した出力 yとの誤差を計算する。

4.誤差を最小化するように重み係数を修正する。

5.上記2-4を教師データすべてについて繰り返す。 

この教師データすべてを使って学習させる一連の学習過程を1エポック(epoch)と呼びます。収束のスピードにもよりますが、通常は20エポック程度が採用されます。

 

誤差(損失関数)

Widrow-Hoffの学習規則をより具体化するために、プロセスごとに見ていきましょう。上記プロセス2では、上述したパーセプトロンの計算イメージのとおりに計算するだけです。そして、続く上記プロセス3では、誤差を表す損失関数 Eを課題に応じて定義する必要があります。

誤差と聞いて誰もが最初に思いつくのは、以下のような二乗和誤差ではないでしょうか。

二乗和誤差 E=(y-t)^{2}

損失関数が大きければ大きいほど、出力 yは真実の正解ラベル tから乖離していることを表します。もちろんこれでも構わないのですが、今回の課題のように正解ラベル tが0または1の値に限定された分類問題では、より誤差に敏感な交差エントロピーという損失関数が用いられます。

交差エントロピーは、情報エントロピー S(p)=-p\log{p}*5を二変数 t, yに拡張したような形をしており、 \; t=0, \; y=0 \;または \; t=1, \; y=1 \;のとき、すなわち \; t \; \; y \;が完全一致したときに最小値 0 をとり、 \; t=0, \; y=1 \;または \; t=1, \; y=0 \;のとき、すなわち \; t \; \; y \;が完全不一致のときに無限大に発散します。

 

勾配降下法

上記プロセス4では、上記プロセス3で計算された損失関数に基づいて、重み係数 w^{in-out}を理想的な値に近づけます。ここで言う理想とは、誤差を表す損失関数が最小になることです。

上述したとおり、損失関数 E=-t\log{y}-(1-t)\log{(1-y)}は真実の正解ラベル tパーセプトロンの出力 yを使って表現されます。しかし、一つの教師データを入力した時点で、真実の正解ラベル tは固定値(定数)であり、出力 yを計算する過程で使う xもまた固定値(定数)なので、損失関数は3個の重み係数 w^{in-out}のみに依存する3変数関数とみなせます。

このような多変数関数の最小化問題をコンピューターで解くための手法として、勾配降下法と呼ばれる方法があります。勾配降下法の2次元におけるイメージを以下に図示します。

f:id:yuki0718:20190904223721j:plain

勾配降下法のイメージ

図から理解できるように、勾配降下法は、ちょうど多変数関数の上に載っている球を傾きと逆方向に向かって変化させていくというシンプルな方法です。傾きの何倍くらいの割合で変化させるかを決める係数 \eta学習率と呼びます。

学習率は通常0.001くらいに設定されることが多く、値が小さいとゆっくり最小値に向かい、大きいと速やかに最小値に向かいます(その代わり通り過ぎてしまうこともある)。なお、この図は w_{3-1}への依存性だけを切り取った二次元図であり、実際の損失関数は四次元空間でもっと複雑な形状をしています*6

 

偏微分の計算

勾配降下法の修正式には、3個の重み係数 w^{in-out}に依存する損失関数の偏微分が現れました。この偏微分は、合成関数の微分法を用いて解析的に計算を進めることができます。

まずおさらいすると、パーセプトロンの計算は以下の式で行われるのでした。

 u=x_{1}\times w^{in-out}_{1-1}+x_{2}\times w^{in-out}_{2-1}+x_{3}\times w^{in-out}_{3-1}

 y=f(u)

 \displaystyle f(u)=\frac{1}{1+e^{-u}}

そして、正解ラベル tと出力 yに基づいて誤差を表す損失関数として、交差エントロピー

 E=-t\log{y}-(1-t)\log{(1-y)}

が定義されました。ここで、合成関数の微分公式に基づけば、損失関数の w^{in-out}_{3-1}による偏微分係数は以下のように計算されます。

 \displaystyle \frac{\partial E}{\partial w^{in-out}_{3-1}}=\frac{\partial E}{\partial y} \times \frac{\partial y}{\partial u} \times \frac{\partial u}{\partial w^{in-out}_{3-1}}

対数の微分公式 \log'{x}=1/xシグモイド関数微分の性質 f'(u)=f(u)(1-f(u))(高校数学のレベルで簡単に証明できます)により、

 \displaystyle \frac{\partial E}{\partial w^{in-out}_{3-1}}=(-\frac{t}{y}+\frac{1-t}{1-y}) \times y(1-y) \times x_{3}

交差エントロピー微分シグモイド関数微分とがうまく約分されることで、

 \displaystyle \frac{\partial E}{\partial w^{in-out}_{3-1}}=(y-t) \times x_{3}

というきわめてシンプルな式に整理できます。これを勾配降下法の修正式に代入し、

 \displaystyle w^{New}_{3-1}=w^{Old}_{3-1}-\eta \times (y-t) \times x_{3}

これが重み係数 w^{in-out}_{3-1}の修正式です。残り2つの重み係数についても同様に導けるでしょう。これを使って、誤差を表す損失関数が最小値になるまで重み係数の修正を繰り返せば、パーセプトロンの学習は終了し、学習済みのパーセプトロン学習済みモデル)が完成します。

 

Widrow-Hoffの学習規則(まとめ)

ここまで説明してきた数式を組み込んで、Widrow-Hoffの学習規則をまとめ直すと以下のようになります。

1.重み係数 w^{in-out}の初期値として適当なランダム値を設定する。

2.以下のパーセプトロンの計算式にワイン特徴量 xを入力して出力 yを得る。

 u=x_{1}\times w^{in-out}_{1-1}+x_{2}\times w^{in-out}_{2-1}+x_{3}\times w^{in-out}_{3-1}

 y=f(u)

 \displaystyle f(u)=\frac{1}{1+e^{-u}}

3.以下の交差エントロピーに基づいて損失関数を定義し、ワイン産地の真実(True)の正解ラベル tパーセプトロンが予測した出力 yとの誤差を計算する。

 E=-t\log{y}-(1-t)\log{(1-y)}

4.3個の重み係数 w^{in-out}すべてについて、以下の修正式に基づいて重み係数を修正する。

 \displaystyle w^{New}_{1-1}=w^{Old}_{1-1}-\eta \times (y-t) \times x_{1}

 \displaystyle w^{New}_{2-1}=w^{Old}_{2-1}-\eta \times (y-t) \times x_{2}

 \displaystyle w^{New}_{3-1}=w^{Old}_{3-1}-\eta \times (y-t) \times x_{3}

5.上記2-4を教師データすべてについて繰り返す。

 

以上でパーセプトロンモデルに関する説明は終わりです。ニューラルネットワークの中で行われている計算内容がかなり明確になったのではないでしょうか。そして、次回はいよいよこのパーセプトロンを並列多層に重ねたディープニューラルネットワークをご紹介する予定です。

実は、今回の記事で重み係数を w_{2}のように書かずに無駄な記号を付加して w^{in-out}_{2-1}と書いてきたのは、並列化するときの番号指定(2番から1番)と多層化するときの層番号指定(in層からout層)に自然な流れで移行するためです*7

稚文をお読みいただきありがとうございました。

*1:私は教科書を読んで勉強したので普通に古典から理解していきました。

*2:年末くらいによく放送されている芸能人格付けチェックでGacktさんが連続正解していますが、あれはひとえにGacktさんがその対象の特徴量を拾い上げることに長けているからだと思われます。一般芸能人とは全く別の特徴量を捉えているからこそ、違いが分かるのです。

*3:教師なし学習(Unsupervised Learning)の例として、クラスタリングや敵対的生成ネットワーク(Generative Adversarial Networks:GAN)などがあります。

*4:私もよく人の名前を思い出せそうで思い出せないことがありますが、そんなとき私の脳内では非線形関数を突破できる電気エネルギーを絞り出そうと頑張っているのかもしれません。

*5:情報エントロピーは、天気予報などの確率分布 pが与えられたとき、晴れや雨といった天気ごとの実現回数を表現するために必要な最小ビット数 -\log{p}に、確率 pをかけたものです。すなわち、情報エントロピーは、天気間で平均化された最小ビット数(情報量)の期待値を表しています。他方、交差エントロピーは情報量の期待値を異なる確率分布 tに対して求めたような定義になっています。

*6:思慮深い方なら、もし球の初期値が図の一番左にあった場合には、真の最小値ではなく少し高い位置にある左側の極小値(擬似解)にハマってしまうのではないかと危惧するのではないでしょうか。実は、多変数関数ではどこかの次元から滑り落ちる確率が高いので、二次元ほどそれは問題になりません。とはいえ、いかなる最適化手法を使って損失関数を最小化するのかという問題は、機械学習の分野でも一つの大きな研究課題になっています。

*7:重み係数というのは必ず「〇番号ニューロンから△番号ニューロンへの重み係数」として定義されるので、始点と終点のニューロンを番号指定して区別します。つまり、数学的な観点で言えば重み係数は行列やテンソルとして扱うのがよさそうだと分かります。