読者です 読者をやめる 読者になる 読者になる

めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

パーセプトロンを平易に解説してみる

領域判定器としてのニューロン

前回、多数のニューロンがシナプスを通して信号を伝えあうことで、特定の情報を「記憶」するということを確かめました。今回は、1つのニューロンだけを取り出して、その働きを調べてみます。「たった1つのニューロンが何かの役に立つの???」と思うかも知れませんが・・・・

まず、下図のように、3本のシナプスから信号を受けとれるようにしたニューロンを用意します。それぞれのシナプスの「伝達力」を「a, b, c」として、外部からシナプスに与える信号を「x, y, 1」とします。(ちょっとわけあって、3本目のシナプスには、必ず「1」の信号を与えるようにしています。)

前回の話を思い出すと、このニューロンは、「a*x + b*y + c*1」の信号を受け取って、これが正か負かによって、ニューロン自体の状態が「±1」に変化しました。ここでは、ぴったり0の場合を含めて、ニューロンは、次の3つの状態をとるようにします。(図の上部の矢印は、ニューロンの状態の値を取り出す「端子」のイメージです。)

・ax + by + c > 0 ⇒ +1
・ax + by + c = 0 ⇒ 0
・ax + by + c < 0 ⇒ -1

ここで、(a, b, c)を具体的な値に固定して、ニューロンへの入力(x, y)とニューロンの状態の関係を調べてみましょう。(xとyは任意の実数をとれるものとします。)たとえば、ニューロンの状態を「0」にするような(x, y)は、どのような値になるでしょうか?

・・・。えー。数学が得意な人には、一発で答えられそうですが・・・。念のために詳しく説明しておきます。

たとえば、(a, b, c) = (1, 2, -2) とすると、ニューロンの状態が0になる条件式は、つぎのように書き換えられます。

 x + 2y - 2 = 0 つまり、y = -(1/2)x + 1

したがって、(x, y)平面上で、下図の直線上の点がニューロンの状態を0にする入力値に対応します。直線の上部(領域A)の点は、+1で、下部(領域B)の点は、-1に対応することもすぐに分かるでしょう。これは、(x, y)平面上のある点が領域Aと領域Bのどちらにあるのかという「領域判定器」として、このニューロンが働いていることを表します。

「そんなもんニューロンとか使わんでも、図を見れば自分で判定できるがな」

とは言わないで、まあもう少し先へと進んでいきましょう。

ニューロン活用のシナリオ

前回、多数のニューロンを組み合わせたシステムにおいて、事前にシナプスの伝達力を「鍛える」ことで、さまざまな情報を記憶させることに成功しました。ここも同様に、先ほどのニューロンについて、3本のシナプスの伝達力「a, b, c」を適切に鍛えることで、実際に役立つ「領域判定器」を作る方法を考えます。

たとえば、こんなシナリオです。

某予備校では、入学時に「英語重点コース」と「数学重点コース」の2種類のコースを選ぶことができます。英語重点コースには英語が得意な生徒が、数学重点コースには数学が得意な生徒が多数在籍しています。そこで、新入学生については、事前に英語と数学の入学テストを受けてもらって、どちらのコースをおすすめするかを決めることにします。(英語が不得意な生徒が英語重点コースを選択した結果、授業についていけなくて、予備校の評価が下がることを避けたい、という意図があると思ってください。)

この時に考えないといけないのは、テストの結果と推奨コースをどのように関連付けるかです。「『英語の点>数学の点』だったら英語重点コースを推奨する」というような短絡的な判定はいまいちですよね。話題のビッグデータを駆使して、科学的に判断したいと思います。

そこでまず、ビッグデータを収集するために、在校生100人にサンプルとして入学テストと同じテストを受けてもらいました。(100人分のデータがビッグデータかどうかはさておき・・・。)結果を図示すると下図のようになりました。x軸が数学の点数で、y軸が英語の点数です。100人の生徒がテストを受講したので、全部で100個の点が打たれています。60個の○は、英語重点コースの60人で、40個の×は、数学重点コースの40人です。

この図を「じーーーーーっ」と見ていると、「英語重点コースの生徒」と「数学重点コースの生徒」を分割する直線が引けることが分かります。このような直線に対応するシナプスを持ったニューロンを用意すれば、このニューロンを「おすすめコース判定器」として利用できるのではないでしょうか?(テスト結果によっては、きれいに分割する直線が引けない場合もありますが、そのような場合は、ここでは一旦、無視しておきます。)

領域判定器としてニューロンをトレーニング

それでは、前述の直線に対応するシナプス(正確に言うと、その伝達力「a, b, c」の値)を決定する方法を考えましょう。もちろん、この例では、えいやっと直線を引いて、その傾きなどから、(a, b, c)を決めることは可能ですが、それは無しにします。たとえば、将来、「英語(文法)、英語(読解)、数学」の3種類のテストからどちらのコースをおすすめするか判定するようになるかも知れません。その場合は、3つのテストの点数を(x, y, z)として、三次元空間を2つに分割する平面:

・a*x + b*y + c*z + d = 0

を決定する必要がでてきます。これを「見た目」でやるのは大変ですよね。あくまで、機械的に(a, b, c)を決定する手法をあみだすことを考えます。

・・・そう、実はこれは「機械学習」の話だったんですね!

ここで利用する手法は、「順次誤差修正法」です。(これは筆者が勝手につけた名前です。本当は「確率的勾配降下法」と言います。)

最初は(a, b, c)の値をランダムに決めて、仮の「おすすめコース判定器」を作成します。そして、在校生のテスト結果について1つずつ順番に正しく判定できるかをチェックします。在校生については、すでにどちらのコースの生徒かがわかっているいるので、本当に現在受講しているコースをおすすめするかどうかをチェックするわけです。順番にチェックしていく中で、正しく判定できていない生徒がいた場合は、その分だけ(a, b, c)の値を修正して、次の生徒のチェックへと進みます。(修正方法は後述)。

最終的に全部の生徒をチェックし終わったら、再度、同じ作業を繰り返します。というのは、途中で (a, b, c) の値を修正しているので、その影響で最初は正しく判定できていなかった生徒が正しく判定できなくなってしまっている恐れもあるためです。これを何度か繰り返すと最後は、すべての生徒を正しく判定できる (a, b, c) にたどり着くと期待します。

えーと。

もちろん期待するのは勝手ですか、ほんとうにそんな都合よく修正していけるのでしょうか?

証明は思い切って省略してしまいますが、Frank Rosenblatt先生によると、次のようなルールで修正していくと、必ず、正しく判定できる (a, b, c) にたどり着くそうです。

・判定結果が「+1」(ax + by + c > 0)となるべき生徒(英語重点コースの生徒)について、誤って、「-1」と判定された場合は、

a ⇒ a + 「その生徒の数学の点数」
b ⇒ b + 「その生徒の英語の点数」
c ⇒ c + 1

と修正する。

・判定結果が「-1」(ax + by + c < 0)となるべき生徒(数学重点コースの生徒)について、誤って、「+1」と判定された場合は、

a ⇒ a - 「その生徒の数学の点数」
b ⇒ b - 「その生徒の英語の点数」
c ⇒ c - 1

と修正する。

ちょっと何をやっているのか意味不明かもしれませんが、コース分割ラインを数式で表すと

ax + by + c = 0 つまり、 y = -(a/b)x - (c/b) (図では直線の傾きは正なので、a < 0 になっている点に注意)

となっています。たとえば、英語重点コースの生徒を誤って数学重点コース向きと判定したということは、直線が上にありすぎたということです。英語重点コースの生徒は、英語の点が高いはずなので、上記のルールは、a, b, c すべての値を小さくしていますが、特に b の値が大きくさがります。上記の直線の式から、b をドーンと小さくすると、直線が下方に修正されることが分かります。英語が優秀な生徒について、判定を誤ると、その分だけ大きく修正されることになります。数学重点コースの生徒を誤って判定した場合は、この逆の操作になります。

ちなみに、このアルゴリズムによる分類器は、Frank Rosenblatt先生によって、パーセプトロン(Perceptron)と名付けられています。

本職の方へのコメント

ここでは、分割線が原点の遠くを通るサンプルを用いています。この場合、Bias項の入力を「1」にしたモデルでは、確率的勾配降下法の収束速度は極端に遅くなります。これは、Bias項の入力値をサンプルの特徴変数の平均的なオーダーの定数に変更することで改善されます。Bias項がある場合というのは、「Bias項を含めた特徴空間」において、原点を通る超平面分割を行っているわけですので、Bias項のオーダーが他の特徴変数と異なる(小さい)と、その方向の微調整が難しく、収束しにくくなる事が想像できると思います。以下の実際の計算例では、このBias項の値を調整するテクニックを用いています。

ランダムに生成したデータを元に、実際に上記のルールで分割線を決定した結果が下記になります。使用したコードは、こちらになります。

ここでは、綺麗に分割できるデータを利用していますが、あえて綺麗に分割できないデータを使って計算すると次のような結果が得られます。4つの例を示します。

この場合、先の計算をいくら繰り返しても(綺麗に分割できる状態にならず)計算が終わらないので、全データに対するチェックを100回繰り返したところで、計算を打ち切っています。もちろん、既存の生徒のデータが綺麗に分割できないことの方が自然で、綺麗に分割できないからこの計算結果が役に立たないということはないでしょう。あくまで、新入学生へのおすすめコースを決定する仕組みですから。

また、おすすめコースを2分割できっぱり決めるのではなく、「英語重点コース(お勧め度70%)」のようにお勧め度の割合を提示する方法も考えられます。この場合は、新入学生のテスト結果が分割線よりずっと遠い所にあるほど、その領域に対するおすすめ度は高くなりますので、下図のような関数 f を用いて、

・ f(ax + by + c) が正の時は、「英語重点コースを (f * 100)% のおすすめ度で推薦する」
・ f(ax + by + c)が負の時は、「数学重点コースをおすすめ度 (|f| * 100)% のおすすめ度で推薦する」

という判断を行います。(ここで言う「おすすめ度」をどう利用するかは、ビジネス上の判断です。おすすめ度が高い生徒ほど熱心に説得するとか、おすすめ度が50%以上の生徒だけを選んで推薦するなどの利用法が考えられます。)

なお、今回、シナプスの伝達力を決定する際に使用した計算ルールは、仮ぎめの伝達力で計算して、計算結果に含まれる間違い(誤差)を修正するように伝達力(モデルのパラメータ)を変更していきます。このように、結果から逆向きにパラメータを修正する手法は、一般に「バックプロパゲーション」と呼ばれます。

Neural Networkとの関係

今回、単一のニューロンの仕組みに注目して、「領域判定器」として利用する方法を解説しました。冷静に考えると、「ニューロンかどうかは関係なく、『a*x + b*y + c』という数式で判定しているだけじゃん」という気もします。しかもこの数式は、いわゆる線形方程式であり、「領域判定器」としても直線での分割しかできないというショボいものになっています。

それでは、より高度で複雑な「判定器」を作るにはどうすればいいのでしょうか?

1つの方法は、判定の数式をより複雑な非線形方程式に変更するというものです。しかしながら、そもそもどんな方針で、どんな方程式を用意すれば役に立つ(実用上、より適切な判定ができる)のか、という課題が残ります。

実は、複数のニューロンを連携して計算するNeural Networkは、単一ニューロンの線形方程式を組み合わせることで、結果として非線形の計算を行っていることになります。前回のHopfield Networkは、それぞれのニューロンが双方向に情報伝達して連携していますが、たとえば、次のように一方向に情報伝達するようなモデルを考えてみます。

まず、最初の入力値 (x, y) を最下段の3つのニューロンに与えます。それぞれのニューロンには、異なる「伝達力」のシナプスが接続されており、各ニューロンは、異なった判定値を出力します。その出力値をさらに、中段の複数のニューロンに伝えて、各ニューロンはあらたな判定値を出力します。その結果を最上段のニューロンが受け取って、最終的な判定値 (p, q, r)が揃うことになります。

これは、数学的には、(x, y) -> (p, q, r) という関数が定義されたことになります。それぞれのニューロンは単純な線形関数を提供していますが、最終的に得られたこの関数は、非常に複雑な非線形関数となります。各ニューロンの出力値にも色々な選択ができます。最初のようにきっぱりと「±1」を出力する他、先のグラフ(tanh)のように「-1」と「+1」を緩やかにつなぐ出力もあります。あるいは、ニューロンの出力は「-1〜+1」に限らないといけない決まりはありませんので、線形に大きくなる出力もありえます。ニューロンの出力値がある点を堺に急激に大きくなるようなグラフを採用した場合、実際にニューロンの出力値が大きくなることを「ニューロンが発火した」などと表現します。

また、このモデルをトレーニングして各シナプスの伝達力を決定する際は、先と同様にトレーンング用のデータを用意して、そのデータを正しく判定できるかを見ていきます。正しく判定できないデータがあった場合は、その「ズレ」を前段のシナプスからの伝達力を修正することで、無くしていくように計算を進めます。(いわゆる「教師付き学習」というやつです。教師なしの学習手法もちろんありますが。)

結局、機械学習というのは、データをうまく分類する(と期待する)方程式を用意して、その方程式のパラメータ値を大量データを元にした機械的な計算で決定するという手法に他なりません。機械学習といっても、すべてを機械が勝手にやってくれるわけではなくて、次のような判断は、人間が行う必要があります。

・そもそも何をどのように分類すれば、ビジネスの役に立つのかを考える。
・どんな方程式を使えば、適切な分類ができるのかを考えだす。
・考えだした方程式に対して、最適なパラメータ値をどのようなルール(アルゴリズム)で決定するのかを考えだす。

この時、どれほど複雑な方程式を考えだしても、そのパラメータ値を適切に計算するアルゴリズムが作れなければ役に立ちません。斬新なアルゴリズムで超高速に正確な計算ができる方程式をつくっても、その方程式がビジネス上意味のある分類を実施できなければ役に立ちません。あるいは、そのアルゴリズムに入力する元となるデータを持っていなければ、意味がありません。

そのために、機械学習に利用できる既存の方程式(モデル)とその計算アルゴリズムを理解した上で、ビジネス上の課題と収集可能なデータに応じて、適切な方程式(モデル)を選択していくことが「データサイエンティスト」の役割(の1つ)ということになります。このあたりのデータサイエンスとビジネスの関係は、下記の書籍が大変参考になります。

戦略的データサイエンス入門 ―ビジネスに活かすコンセプトとテクニック

戦略的データサイエンス入門 ―ビジネスに活かすコンセプトとテクニック

  • 作者: Foster Provost,Tom Fawcett,竹田正和(監訳),古畠敦,瀬戸山雅人,大木嘉人,藤野賢祐,宗定洋平,西谷雅史,砂子一徳,市川正和,佐藤正士
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2014/07/19
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (5件) を見る