人工知能と機械学習

最近、人工知能という言葉がテレビやインターネットで見られない日はありません。毎日頻繁に人工知能の進歩の状況や、人の仕事が人工知能にとって代わられる、などの様々な話題が報じられています。

この人工知能という言葉は、知能を持っているかのようなソフトウェアのことを指し示していますが、これは機械学習というプログラミング手法を利用しています。つまり、人口知能の内容を理解するには、機械学習とは何かを理解する必要があります。

機械学習には、次の三つの学習方法があります。
(1) 教師あり学習
(2) 教師なし学習
(3) 強化学習

教師あり学習はコンピュータ(機械)に入力した情報に対し、人がその正解を知っている場合の学習手法で、コンピュータの出力が正解に近づくように学習させます。手書き数字を判別する画像認識や、人が発する音声を理解する音声認識などの場合に利用する学習手法です。

教師なし学習はコンピュータに入力した情報に対し、人がその正解を知らない場合の学習手法です。ある判断ロジックをコンピュータに入れて、そのロジックに基づいて入力情報を処理し、コンピュータに答えを出させます。例えば、ある統計的分布を持つデータの解析では、どのような平均値と分散を持つ正規分布のデータがどのような割合で混ざり合っているか、などを算出します。また、256階調のカラー画像を4色カラーに変換するには、どのような変換式を用いるのが最適か、などを導くことができます。

強化学習はコンピュータに入力した情報に対する正解の出力は分からないが、最終的な正解は分かる場合に利用する学習手法です。例えば、囲碁では最終的な勝ち負けは獲得した領域の広さで決まるので、誰でも簡単に判断できるのですが、その途中段階では、人は正解となる布石を知らないことがほとんどです。そこで途中段階の一手をどこに打つかは、各場所に石を置いた場合の予想勝率をその後の布石を「適当」行って算出し、最も勝率の高い場所として決定します。また、インベーダーゲームでは、直近の連続した数枚の画像をコンピュータに入力しながら、最初はランダムにミサイルの発射の位置とタイミングを選択して、ミサイルを発射し、入力画像と発射の位置・タイミングを成功・不成功と関連づけていきます。これを多数回繰り返すことにより、徐々に成功するミサイル発射の位置・タイミングを学習します。そして最後には人間をも凌ぐ性能を持つようになってきています。

このように機械学習には大きく分けて三種類の学習方法があるので、実現する人工知能の特徴に合わせて適切な機械学習の手法を選ぶことが大切です。

ニューラルネットワークの訓練の問題点:過学習と局所的極小点

ニューラルネットワークモデルの訓練(training)では、過学習(over-fitting)が起きたり、局所的な極小点に陥り、性能が高くならないという問題が発生することがあります。

過学習
過学習は訓練データの数に対してパラメータの数が多い場合や、訓練データに偏りがある場合に起き易い現象です。図1はデータ数が少ない場合の入出力のグラフ(横軸入力、縦軸出力)ですが、このようにデータ数が少ない場合、各データにほぼ一致する曲線を見出す(パラメータを決定する)ことは難しくありません。

そして、もし図1の数少ないデータが、対象とするデータ全体の分布を代表していいるのであれば、図1の曲線は小さい誤差関数E(前の記事の式(5))を持つ、大域的な最小点に近い、正しい曲線を表していることになります。

しかし、もし図1のデータが、対象とするデータ全体の分布を代表しておらず、データ数を増やすと図2のような分布を示すのであれば、図1の曲線は過学習を表していることになり、正しい曲線は図2のようになります(図1のデータは全て図2に含まれています)。

また、パラメータの数が少ない場合には、仮にデータ数が少なくとも、図1に示すような複雑な曲線を出すことは出来ず、単純な曲線になるために、過学習が起きにくいという特徴があります。アナロジーで言えば、図1のデータに対して、パラメータが3つの放物線であれば図2のような曲線が得られますが、パラメータが7個の6次方程式であれば図1のような曲線が得られます。

このように過学習が起きやすいかどうかは、訓練データの数や偏り、パラメータの数に依存します。

局所的な極小点
過学習と同様に、ニューラルネットワークの性能が上がらない原因として、局所的な極小点に陥いることが上げられます。

図3は横軸がパラメータの値を、縦軸がニューラルネットワークの出力を示していますが、図の青●に示す局所的極小点につかまってしまい、学習を継続させてもそこから抜け出すことができず、大域的最小点赤●に到達できないことがよくあります。

このような過学習や局所的極小点トラップを防ぐ方法として、次の手段がよく使われます。

  1. 正則化(regularization)
  2. バッチ処理
  3. DropoutやDropconnect

<正則化>
正則化は誤差関数E(前の記事の式(5))に罰則項(penalty)を加えたもので、2次のL2ノルムの場合は下記のように表されます。
\[\widetilde { E } \left( w \right) =\frac { 1 }{ 2 } \sum _{ n=1 }^{ N }{ { \left\{ y\left( { x }_{ n },w \right) -{ T }_{ n } \right\} }^{ 2 } } +\frac { \lambda }{ 2 } { \left\| w \right\| }^{ 2 }\qquad (1)\]

ここで、\({ \left\| w \right\|  }^{ 2 }={ w }_{ 1 }^{ 2 }+{ w }_{ 2 }^{ 2 }+\quad \cdots \quad +{ w }_{ M }^{ 2 }\)であり、\(\lambda\)は係数で、\(n\)はデータ数、\(m\)はパラメータ数です。

式(1)右辺の罰則項\(w_j^2 , j=1,2,・・・,m\)は2乗で効いてくるので、大きな値を取るとその2乗でエネルギーが増大するため、大きな値とはなりにくくなります。逆に0に近づく力を持ちます。しかし、式(1)右辺第1項の二乗誤差にも\(w_j^2\)の項があり、\(w_j\)はある値(仮にpとする)に近づこうとします。つまり、0に近づこうとする罰則項とpに近づこうとする2乗誤差との綱引きの割合が係数\(\lambda\)で決められています。そのために、pだけに近づこうとする過学習を防ぐ効果が出るのです。L2ノルムの正則化は、意味の無い結合荷重\(w_j\)が減衰しやすいことから、荷重減衰(weight decay)とも呼ばれます。

これに対し1次のL1ノルムでは、罰則項として\(w_j\)の絶対値を加えます。

\[\widetilde { E } \left( w \right) =\frac { 1 }{ 2 } \sum _{ n=1 }^{ N }{ { \left\{ y\left( { x }_{ n },w \right) -{ T }_{ n } \right\} }^{ 2 } } +\frac { \lambda  }{ 2 } \sum _{ j=1 }^{ M }{ \left| { w }_{ j } \right|  } \qquad (2)\]

L2ノルムとの違いは、\(w_j\)が1乗か2乗かだけです。罰則項だけを次式のように置くと

\[a=\frac {\lambda}{ 2}\sum_{ j=1}^{ M }{ \left|{w}_{j}\right|} \qquad (3)\]

これは\(w_j\)パラメータ空間の直線式を表しています。\(a\)は\(w_j\)軸との交点となります。分かり易い例を上げるならば、\(w_1=x, w_2=y\)として、図4の\(a=|x|+|y|\)という直線を考えてみましょう(図4の緑色直線)。

この\(a\)が式(3)の罰則項のエネルギーであり、かつ\(\pm a\)がx軸、y軸の交点となります。つまり緑の正方形の辺の上では、全て同じエネルギー値\(a\)を持つことになります。一方、式(2)右辺の第1項の二乗誤差はpという中心点(青点)を持つ円()の半径rの2乗と考えることができます(厳密には楕円だが、簡単のために円とします)。従って、二乗誤差とL1ノルムを加えた合計エネルギーは\(r^2+a\)と解釈することができます。

赤い円緑の正方形は同じ\(x,y\)が満足しなければならないので、円と正方形との交点が求める解となります。そして、合計エネルギー\(r^2+a\)を最小にするのは、図4に示したように、正方形に円が接している場合となります。なぜならば、その場合に円の半径rと正方形の切片\(a\)がともに小さくなるからです。

切片\(\pm a\)の正方形と中心pの円が接する条件には、2種類あります。

(1)中心pが図4の白い背景の上にあり正方形の角に接している場合
(2)中心pが図4の薄青色の背景の上にあり正方形の辺に接している場合(p’)

ここで、薄青色の背景は正方形の辺の延長線が囲む領域です。中心pが白い背景の上にある場合には、円が正方形の角に接する場合にエネルギーが最小となりますが、これは\(x=0, y=a\)や\(x=a, y=0\)などを意味しており、パラメータの一方が0になることを示しています。つまり、L1ノルムの正則化を行うとパラメータの一部が確率的に0になり易い傾向がでてきます。それ故に、L1ノルムの導入はスパースモデリングと呼ばれます。

一方、中心pが薄青色の背景の上にある場合(p’)には、パラメータは両方とも0にはならず、\(x=a/2, y=a/2\)などの値を取り得ます。また、0へのドライビングフォースもありません。このように、L1ノルムによる正則化はパラメータの一部が0になる確率が高くなる、というように解釈すべきだと思います。

<バッチ処理、Dropout>
過学習や局所的極小点トラップを防ぐため、言い換えると、ニューラルネットワークの性能を向上させるために、バッチ処理やDropoutも利用されます。

バッチ処理は、逆伝播法による結合荷重の更新を個々のデータに対して行うのではなく、複数のデータに対して一回行う手法です。これは複数のデータに対する平均的な結合荷重で更新するとも言えます。私のこれまでの実験結果から、バッチ処理はニューラルネットワークの性能向上に効くことが多いと言えます。やはり、個々のデータに対して逐一、逆伝播法で結合荷重を更新すると、その変動が大きくなるため、局所的な最小点に捕まり易くなり、大域的な最小点(最適解)に辿り着きにくくなるように思います。

これに対し、バッチ処理では、複数個のデータに対する平均的な結合荷重で更新するために、結合荷重の変動が比較的小さく、滑らかに収束する傾向があり、局所的な極小点に捕まりにくいために、性能低下が抑制されると考えられます。

ただし、データの種類によっては(例えば、ノイズの小さいデータなど)、バッチ処理ではなく、各データで結合荷重を更新した方が更新速度が速く、短時間で収束することもあるので、バッチ処理が常によいとは言えません。そのあたりは、少し注意が必要です。

また、Dropoutはニューラルネットワークのユニットをランダムに排除しながら、結合荷重を更新することで、局所的な極小点のトラップを抑制したり、層数が多くても逆伝播法による結合荷重の更新が入力層付近であっても適切に行われることを狙ったものです。

私もDropoutの性能を調べるために、DeepLearningによるMNISTデータの手書き数字認識に適用してみました。Dropoutなしの認識正解率が98.9%でしたが、Dropoutを導入しても、ほとんど性能は向上せず、むしろ0.1~0.3%ほど性能が下がりました。すでに十分性能が高かったが故に効果がなかったのかもしれません。そうであれば、Dropoutなどは性能が低いニューラルネットワークに対し、効果があるのかもしれない。このあたりはケースバイケースで、ニューラルネットワークの構成を考えていく必要があるようです。

ニューラルネットワークの誤差逆伝播式(バックプロパゲーション)

前の投稿「ニューラルネットワークの基本」に引き続き、バックプロパゲーション(逆伝播)を用いて、重みパラメータとバイアスパラメータを導出する方法について解説します。

最も基本的なニューラルネットワークとして、図1の入力層、隠れ層、出力層で構成された3層構造を考えます(入力層は非線形関数を持たず、ただ入力するだけなので、層としてカウントせず、これを2層構造と言う人もいる)。

図1.基本的なニューラルネットワークのモデル
〇は非線形活性化関数を持たないユニットを、縦線のある①はこれを持つユニットを表す

入力層の入力データ\(x_i\)の数を \(l\)個、出力データ\(y_k\)数を\(n\)個とすると、入力層と出力層のユニット数は各々 \(l+1\)個、\(n\)個となります。、隠れ層のユニット数は任意に設定することができますが、ここでは\(m+1\)個とします。入力層と隠れ層のユニット数に+1があるのは、バイアスパラメータを意味しています。

また、出力データ\(y_k\)に対応する正解データ\(T_k\)を準備する必要があります。正解データは教師データと呼ばれ、機械学習の結果、出力データを到達させる目標点となります。

それでは、ニューラルネットワークのパラメータ(結合荷重)を計算する方法を説明します。

まず、入力層に入力されたデータ\(x_i\)と隠れ層への入力値\(a_j\)、出力値\(z_j\)と出力層への入力値\(b_k\)、出力値\(y_k\)の間には、前の投稿の式(3)から、次式が得られます。

\[\begin{eqnarray*}
a_j&=&\sum_{i=1}^{l} w_{ji} x_i +w_{j0} \qquad (1)\\
\\z_j&=&f( a_j) \qquad \qquad \qquad (2)\\
\\b_k&=& \sum_{j=1}^{m} w_{kj} z_j +w_{k0} \qquad (3)\\
\\y_k&=&g( b_k) \qquad \qquad \qquad (4)
\end{eqnarray*}\]

ここで、\(f()\)、\(g()\)、\(w_{ji}\)、\(w_{kj}\)は隠れ層と出力層の非線形活性化関数と結合荷重(重みパラメータとバイアスパラメータ)を表しています。\(w_{ji}\)は隠れ層 j 番目のユニットと入力層 i 番目のユニットをつなぐ荷重結合で、\(w_{kj}\)は出力層 k 番目のユニットと隠れ層 j 番目のユニットをつなぐ結合荷重です。

非線形活性化関数として、シグモイド関数やハイパボリックタンジェント関数、Softmax関数が用いられるので、文末にそれらの関数と微分形を整理しておきます。

さて、入力データと正解データからパラメータを算出する目的は、出力値\(y_k\)を教師データ\(T_k\)に近づけることです。従って、出力値\(y_k\)と教師データ\(T_k\)との乖離を示す二乗誤差Eを最少にする結合荷重\(w_{ji}\)、\(w_{kj}\)を求めます。

\[E=\frac { 1 }{ 2 } \sum _{ k=1 }^{ n }{ { \left( { y }_{ k }-{ T }_{ k }\right)}^{ 2 }} \qquad (5)\]

先ず最初に、出力層と隠れ層をつなぐ結合荷重\(w_{kj}\)を、学習率ηを用いて求めます。1回の学習における微小更新量\(\Delta w_{kj}\)を次式のように設定します。

\[\Delta { w }_{ kj }=-\eta \frac {\partial E}{ \partial { w }_{ kj }}\qquad (6)\]

式(6)は一見どのように導出されたのか不思議に思われるかもしれないが、これはただ単に荷重結合\(w_{kj}\)が誤差Eに与える影響∂E/∂\(w_{kj}\)に対し、学習率ηで、Eが小さくなる方向に(-符号をつけて)\(w_{kj}\)を更新する、ということを意味しているに過ぎません。

式(6)は連鎖則(chain rule)により次式のように書くことができます。

\[\Delta { w }_{ kj }=-\eta \frac { \partial E }{ \partial {y}_{k}} \frac { \partial {y}_{k}}{ \partial { b}_{ k } } \frac { \partial { b}_{ k } }{ \partial { w }_{ kj } }\qquad (7)\]

式(7)の各項を見ていきましょう。

式(5)より

\[\frac { \partial E }{ \partial {y}_{k}}=\left( {y}_{k}-{ T }_{ k } \right)\qquad (8)\]

式(4)より

\[\frac { \partial { y }_{ k } }{ \partial { b }_{ k } } =\frac { \partial g\left( { b }_{ k } \right)}{ \partial { b }_{ k } } =g^{ \prime }\left( { b }_{ k } \right) \qquad (9)\]

式(3)より

\[\frac { \partial { b }_{ k } }{ \partial { w }_{ kj } } =\frac { \partial \sum _{ k=1 }^{n}{{w}_{ kj}{ z}_{j}}}{ \partial { w }_{ kj }}={z}_{j}\qquad (10)\]

よって、式(8)、(9)、(10)を用いることで、荷重結合の更新量は次式で表されます。

\[\begin{eqnarray*}\Delta {w}_{kj}&=&-\eta\left({y}_{k}-{T}_{k}\right)g^{\prime}\left({b}_{k}\right)z_j\qquad(11)\\ \\&=&-\eta{\delta}_{k}z_j\qquad(12)\end{eqnarray*}\]

ここで、\(\delta_k = (y_k-T_k)g'(b_k)\)と置き換えています。

以上のように、結合荷重の更新量は式(12)で表されるので、p回学習した結合荷重を\(w_{kj}^p\)で表すと

\[{ w }_{ kj }^{ p+1 }={ w }_{ kj }^{ p }+\Delta { w }_{ kj}\qquad (13)\]

となります。出力\(y_k\)が教師データ\(T_k\)に近づくと、式(11)の荷重結合の更新量も小さくなり、収束に向かうことが分かります。

次に、隠れ層と入力層の間の荷重結合の微小更新量\(\Delta w_{ji}\)を式(6)と同様に設定します。

\[\Delta { w }_{ ji }=-\eta \frac {\partial E}{ \partial { w }_{ ji }}\qquad (14)\]

隠れ層からの出力\(z_j\)は出力層の全てのユニットに広がって連結された後に、誤差Eに影響するために、連鎖則(Chain Rule)では、連結されている全てのユニットを考慮して、式(14)は次式のように展開します。

\[\begin{eqnarray*}\Delta { w }_{ ji }&=&-\eta  \frac { \partial E}{ \partial { z }_{ j } }\frac { \partial { z }_{ j } }{ \partial { a }_{ j } } \frac { \partial { a }_{ j } }{ \partial { w }_{ ji } }\\ \\&=&-\eta  \frac { \partial \left\{ \sum _{ k=1 }^{ n }{  { E }}\right\} }{ \partial { z }_{ j } }\frac { \partial { z }_{ j } }{ \partial { a }_{ j } } \frac { \partial { a }_{ j } }{ \partial { w }_{ ji } }\\ \\&=&-\eta \left\{ \sum _{ k=1 }^{ n }{ \frac { \partial E }{ \partial { z }_{ j } }}\right\} \frac { \partial { z }_{ j } }{ \partial { a }_{ j } } \frac { \partial { a }_{ j } }{ \partial { w }_{ ji } }\qquad (15)\\ \\&=&-\eta \left\{ \sum _{ k=1 }^{ n }{ \frac { \partial E }{ \partial { y }_{ j }}\frac { \partial { y }_{ j } }{ \partial { b }_{ j } } \frac { \partial { b }_{ j }}{ \partial { z }_{ j } }}\right\} \frac { \partial { z }_{ j } }{ \partial { a }_{ j } } \frac { \partial { a }_{ j } }{ \partial { w }_{ ji } } \qquad (16)\end{eqnarray*}\]

式(16)の各項を見ていきます。

式(8)より、\(\partial E/\partial y_k\)が、式(9)より、\(\partial y_k/\partial b_k\)が得られ、また

\[\frac { \partial { b }_{ k } }{ \partial { z }_{ j }} =\frac { \partial \sum _{ k=1 }^{ n }{{w}_{ kj }{z}_{k}}}{ \partial {z}_{j}}={w}_{ kj }\qquad (17)\]

となる。式(2)より

\[\frac { \partial { z }_{ j } }{ \partial { a }_{ j } } =\frac { \partial f\left( { a }_{ j } \right)}{ \partial { a }_{ j } } =f^{ \prime }\left( { a }_{ j } \right)\qquad (18)\]

となり、式(16)の最後の項は

\[\frac { \partial { a }_{ j } }{ \partial { w }_{ ji } } =\frac { \partial \sum _{ i=1 }^{ l }{ { w }_{ ji }{ x }_{ i } }}{ \partial { w }_{ ji } } ={ x }_{ i }\qquad (19)\]

となる。よって

\[\Delta { w }_{ ji }=-\eta \left\{ \sum _{ k=1 }^{ n }{ \left( { y }_{ k }-{ T }_{ k } \right) g^{\prime}\left( { b }_{ k } \right) { w }_{ kj } } \right\} f^{ \prime }\left( { z }_{ j } \right) { x }_{ i }\qquad (20)\\ =-\eta \left\{ \sum _{ k=1 }^{ n }{ { w }_{ kj }{ \delta}_{k}}\right\} f^{\prime}\left( { z }_{ j } \right) { x }_{ i }\qquad (21)\]

\[ =-\eta { \delta}_{j}{ x }_{ i }\qquad (22)\]

のように荷重結合の更新量が得られました。ただし、ここでは次式を利用しています。

\[{ \delta }_{ j }=f^{ \prime }\left( { z }_{ j } \right) \sum _{ k=1 }^{ n }{ { w }_{ kj }{ \delta}_{ k } } \qquad (23)\]

従って、式(13)と同様に、p回の更新によって、入力層と隠れ層の間の荷重結合\(w_{ji}^p\)は、次式のように表されます。

\[{ w }_{ ji }^{ p+1 }={ w }_{ ji }^{ p }+\Delta { w }_{ ji }\qquad (24)\]

式(13)と合わせると、全ての結合荷重が算出できました。これがニューラルネットワークの誤差逆伝播で行うパラメータ更新の内容です。

多くのデータを用いて学習させ、結合荷重を収束させて、決定することが出来たならば、それを用いてニューラルネットワークの式(1)~(4)を構築します。そして、新たな入力データに対してフィードフォワードの計算することで、簡単に出力を得ることができます。その出力は、新たな入力データを過去データに基づいて判断した答えというになります。

ただ、学習用のデータセットに対しては式(5)の誤差Eが局所的極小点(Local Minimum)に落ち込み比較的小さい値を示すものの、その後の新規データに対してはEの値が大きく、結果がよくないことがしばしば起こります。これを過学習(overfitting)と言います。この過学習を防ぐための工夫について、次回お話します。
---------------------------
<お勧め書籍>
機械学習について丁寧に書かれた良書です。本格的に勉強したい人には必携のお勧め本です。

======== 非線形活性化関数 ========

シグモイド関数

\[h\left( x \right) =\frac { 1 }{ 1+exp\left( -x \right)}\qquad (a1)\]

\[\frac { \partial h\left( x \right)}{ \partial x } =h\left( x \right) \left( 1-h\left( x \right) \right) \qquad (a2)\]

ハイパボリックタンジェント関数

\[h\left( { x } \right) =tanh\left( x \right)=\frac { exp\left( x \right) -exp\left( -x \right)}{ exp\left( x \right) +exp\left( -x \right)}\qquad (a3)\]

\[\frac { \partial h\left( x \right)}{ \partial x } =1-h\left( x \right) \cdot h\left( x \right)\qquad (a4)\]

Softmax関数

\[h\left( { x } \right) =\frac { exp\left( { x }_{ i } \right)}{ \sum _{ j=1 }^{ n }{ exp\left( { x }_{ j } \right)}}\qquad (a5)\]

\[\frac { \partial h\left( { { x }_{ i } } \right)}{ \partial { x }_{ i } } =h\left( { x }_{ i } \right) \qquad (a6)\]

Softmax関数はその層にある全ユニットの出力値の合計を分母とし、注目ユニットの出力を分子に持っています。これは全てのユニットの出力合計を1に規格化するためであり、出力を確率に変換する際などに利用されます。

ニューラルネットワークの基本 ~フィードフォワードネットワーク~

人工知能の代表的な技術の一つに人工ニューラルネットワーク(Artificial Neural Network)があります。

人工ニューラルネットワークは、脳の神経細胞ニューロンの構造を真似て作成したもので、複数のニューロンが存在する層を積層し、異なる層のニューロンを接続して信号を伝達します。

今、\(p\)番目の層(\(p\)層とする)の\(j\)番目のユニット(ニューロン)について考えます。\(p-1\)層の\(i\)番目のユニットの出力を\(x_i\)とすると、これに重みパラメータ\(w_{ji}^{(p)}\)を乗じた項の線形和\(a_j\)が\(p\)層の\(j\)番目のユニットへの入力となります。

\[a_j= \sum_{i=0}^{m} w_{ji}^{(p)}x_i \qquad (1)\]

ここで、\(w_{ji}^{(p)}\)は\(p-1\)層の\(i\)番目のユニットから\(p\)層の\(j\)番目のユニットへの重みパラメータ\(w\)を表しており、\(a_j\)は活性と呼ばれます。

そして、\(p\)層、\(j\)番目のユニットへの入力\(a_j\)は、微分可能な非線形活性化関数\(h()\)により出力\(z_j\)に変換されます。

\[z_j=h(a_j) \qquad (2)\]

ここでは\(i=0\)の時、\(x_0=1\)として、入力信号の影響を受けない項\(w_{j0}^{(p)}\)としています。これをバイアスパラメータと呼びます。

図1 ニューラルネットワークの構成図

重みパラメータとバイアスパラメータを区別し、式(1)、(2)をまとめて書くと、

\[z_j=h( \sum_{i=1}^{m} w_{ji}^{(p)}x_i +w_{j0}^{(p)}) \qquad (3)\]

となり、\(p\)層の\(j\)番目のユニットへの入力\(x_i\)と出力\(z_j\)が表されます。

図1では、\(p-1\)層の全てのユニットから\(p\)層の\(j\)番目のユニットへの接続線しか表示されていないのですが、\(p-1\)層の全てのユニットは\(p\)層の全てのユニットに接続されています。

そして、重みパラメータとバイアスパラメータの値、および非線形活性化関数により、入力を所望の出力に変換させることを狙いとしています。

非線形活性化関数\(h()\)には、ロジステックシグモイド関数やtanh関数などのシグモイド関数が利用されます。

ロジステックシグモイド関数 \(\sigma\left(\right)\)

\[\sigma \left( a_j \right) =\frac { 1 }{ 1+exp\left({ -a_j }\right) } \qquad (4)\]

ハイパーボリックタンジェント関数 \(tanh\left(\right)\)

\[tanh \left( a_j \right) =\frac { exp\left({ a_j }\right)-exp\left({ -a_j }\right) }{ exp\left({ a_j }\right)+exp\left({ -a_j }\right) } \qquad (5)\]

式(3)の出力\(z_j\)は次の層への入力信号となり、順次これが繰り返され、最終的な出力が得られます。

分かり易い例として、図1のような、\(p-1\)層が入力層で、\(p\)層が隠れ層、\(p+1\)層が出力層となる3層構造を考えてみましょう。

これを用いて、例えば、30画素×30画素の白黒画像の数字0~9を認識させる場合であれば、入力層のユニット数を900個とし、ここに900画素の輝度値を入力します。つまり、輝度値が図1の\(x_i\)となります。ただし、輝度値\(x_i\)は0~1の間に収まるように規格化するのが一般的です。そして、式(3)を用いて隠れ層の出力\(z_j\)を計算します。この出力が3番目の出力層への入力信号となります。

隠れ層のユニット数は自由に設定することができます。言い換えると、性能が良くなるユニット数を実験から見出さねばなりません。

出力層のユニット数は10個とし、数字の0~9に対応させます。そして、例えば、数字の2の画像(900画素の輝度値)を入力したら、その正解出力は、出力層の2番目のユニットが1となり、その他は0となります。数字の5であれば、正解出力は出力層の5番目のユニットが1となり、その他は0となります。このような正解出力が出るように重みパラメータとバイアスパラメータを決定します。正解出力から逆方向に遡ってパラメータを決める過程をバックプロパゲーションと呼びます。また、0~9までの数字画像を次々と入力し、正解出力を与えて、その計算過程にあるパラメータを決めるプロセスは、まるで機械が学習をしているようなので、機械学習と呼ばれます。

次回は、バックプロパゲーションによりパラメータを算出する方法を解説します。

---------------------------
<お勧め書籍>
機械学習について丁寧に書かれた良書です。本格的に勉強したい人には必携のお勧め本です。

擬似逆行列と回帰方程式(最小二乗法)

前の投稿では擬似逆行列を用いて、回帰直線を得る方法を解説しました。

今回は、擬似逆行列を用いて、高次の回帰曲線を得る方法を説明します。

一般に、n次元曲線の方程式は次のように表現されます。

\[y={ a }_{ 0 }+{ a }_{ 1 }{ x }+{ a }_{ 1 }{ x }^{2}+\cdots +{ a }_{ n }{ x }^{ n } \qquad (1)\]

この\(x,y\)が、点\((x_1,y_1)\)、\((x_2,y_2)\)、\((x_3,y_3)\)、、、やその近傍を通過して欲しいならば、式(1)に代入して、その係数を求めます。その際、点の数は係数\(a_i\) \((i=0\)~\(n)\)の数\(n+1\)以上が必要です。今その点数を\(m\)個とすると、以下のように書き下せます。

\[{ y }_{ 1 }={ a }_{ 0 }+{ a }_{ 1 }{ x }_{ 1 }+{ a }_{ 2 }{ x }_{ 1 }^{ 2 }\cdots +{ a }_{ n }{ x }_{ 1 }^{ n }\qquad (2)\]

\[{ y }_{2}={ a }_{ 0 }+{ a }_{ 1 }{ x }_{2}+{ a }_{ 2 }{ x }_{2}^{ 2 }\cdots +{ a }_{ n }{ x }_{2}^{ n }\qquad (3)\]

\[\cdot \cdot \cdot \cdot \cdot \cdot \cdot \]

\[{ y }_{m}={ a }_{ 0 }+{ a }_{ 1 }{ x }_{m}+{ a }_{ 2 }{ x }_{m}^{ 2 }\cdots +{ a }_{ n }{ x }_{m}^{ n }\qquad (4)\]

これを行列で表すと

\[\left[ \begin{matrix} { y }_{ 1 } \\ { y }_{ 2 } \\\cdot\\ { y }_{ m } \end{matrix} \right] =\left[ \begin{matrix} 1 & { x }_{1} & { x }_{1}^2 & \cdots & { x }_{1}^{n} \\ 1 & { x }_{ 2 } & { x }_{2}^2 & \cdots & { x }_{2}^{n} \\ \cdot & \cdot & \cdot & \cdots & \cdot \\ 1 & { x }_{ m } & { x }_{m}^2 & \cdot & { x }_{ m }^{n} \end{matrix} \right] \left[ \begin{matrix} { a }_{ 0 } \\ { a }_{ 1 } \\ { a }_{2}\\\cdot\\ { a }_{n} \end{matrix} \right] \qquad (5)\]
となります。これは前の投稿の式(5)と同じ式に簡略化できます。

\[Y = XA\qquad (6)\]

従って、前の投稿と同じ方法で係数\(A\)を求めることができるので、前の投稿の式(15)と同じ次の結果が得られます。

\[A = (X^TX)^{-1}X^TY\qquad (7)\]

このように、擬似逆行列を用いれば、高次の回帰曲線であろうが、単なる回帰直線であろうが、同じ計算手法で簡易に算出することができます。なんと有り難い計算手法でしょう!これは最小二乗法などを用いた場合の煩雑な計算に較べ、大きな特長といえます。

擬似逆行列と回帰直線(最小二乗法)

数学の美しさ、完璧さに幾度となく驚いた私でしたが、擬似逆行列もその一つでした。その例を一つご紹介します。
直線の方程式は次のようにあらわされます。
\[y= ax + b\qquad (1)\]
この直線が点(\(x_1,y_1\))と点(\(x_2,y_2\))を通過するならば、
\[y_1= ax_1 + b\qquad (2)\]

\[y_2= ax_2 + b\qquad (3)\]が成立します。これを行列で書くと

\[\left[ \begin{matrix} y_1 \\ y_2 \end{matrix} \right]=\left[ \begin{matrix} { x }_{ 1 } & 1 \\ { x }_{ 2 } & 1 \end{matrix} \right]\left[ \begin{matrix} a \\ b \end{matrix} \right] \qquad (4)\]

となります。各行列を簡略化して表すと

\[Y= XA\qquad (5)\]となります。

\(X\)が逆行列\({ X }^{ -1 }\)を持つならば(正則行列)、式(5)の両辺に左側から\({ X }^{ -1 }\)を乗じて

\[{ X }^{ -1 }Y= { X }^{ -1 }XA\qquad (6)\]

ここで、

\[{ X }^{ -1 }X= E\qquad (7)\]

\(E\)は単位行列。よって、式(6)は下記となります。

\[{ X }^{ -1 }Y = A \qquad (8)\]

結果として得られた式(8)は、式(5)の\(X, Y\)が単なる変数である場合に得られる

\[A=\frac { Y }{ X }\qquad (9)\]

と同様の形をしています。

まあ、ここまでは普通の逆行列を用いた計算で、そういう風に表現できるんだ、で済む話ですが、ここから擬似逆行列が本領を発揮します。

式(1)は2点を通る直線という条件において、式(8)により係数\(a,b\)を出すことができます。しかし、一直線上にない3点以上が与えられた場合、式(8)から1組の係数\(a,b\)を出すことは出来ません。

それは、3点以上が与えられた場合、式(5)の各項は下記のようになり、

\[Y=\left[ \begin{matrix} y_1 \\ y_2 \\ y_3 \end{matrix} \right] \qquad (10)\]

\[A=\left[ \begin{matrix} a \\ b \end{matrix} \right]\qquad (11)\]

\[X=\left[ \begin{matrix} { x }_{ 1 } & 1 \\ { x }_{ 2 } & 1 \\ { x }_{ 3 } & 1 \end{matrix} \right] \qquad (12)\]

\(X\)は正方行列ではなくなり、逆行列をもてないからです。

しかし、行列演算をうまく行うと、式(10)、式(11)、式(12)で構成された\(Y=XA\)から、一組の\(A\)を出すことができるのです。

その方法は\(A\)の前にある行列項を、行列演算して正方行列に変換することです。

式(5)の両辺に左から、\(X\)の転置行列\(X^T\)を乗じます。
\[X^TY= X^TXA\qquad (13)\]

\(X^TX\)は正方行列になるので、これが正則行列であるならば、逆行列\((X^TX)^{-1}\)が存在します。逆行列を式(13)の左から掛けると
\[(X^TX)^{-1}X^TY= (X^TX)^{-1}X^TXA\qquad (14)\]
右辺\(A\)の前の行列演算結果は単位行列\(E\)となるので、次式が得られます。
\[(X^TX)^{-1}X^TY = A \qquad (15)\]

このようにして一組の係数\(A\)が得られました。

このように逆行列を持てない行列に対し、転置行列を乗じて正方行列に転換し、逆行列を作成することを擬似逆行列と呼びます。

ううう~ん、擬似逆行列、恐ろしや、3点以上を直線式に代入しても、一つの直線式を算出することができたのです。

ところで、この直線は何を意味しているのでしょうか?

これこそが代入した全ての点の回帰直線、即ち、点から直線までの距離の二乗の和が最も小さい直線なのです。

図1.回帰直線

私はこの手法を知った時に、数学の美しさというか完璧さというか一貫性というか、そういうものに感動しました。

回帰直線は、最小二乗法を用いて算出することがよく行われていますが、その導出過程の考え方の煩雑さに対し、擬似逆行列では式(5)から\(A\)を算出するという非常にシンプルな考え方になっています。

人工知能は技術屋なら誰でも使えるようになる

人工知能と聞くと、技術屋であっても「自分には関係ない世界の話だ」とか、「理論が難しくて理解できない」、などと反応されるかもしれません。

しかし、人工知能は決して難しい技術ではありません。

基本的な数学が分かる人であれば、少し努力すれば、誰でも人工知能技術を理解し、利用できるようになります。また、技術屋であれば、自分でコーディングして、これを作ることも決して無理なことではありません。

基本的なことをしっかり把握すれば、後は慣れることで、深く理解することができます。

人工知能という技術は、人間のような問題処理能力を持つコンピュータソフトのことであり、最近、急速に進化してきました。

例えば、画像認識の分野では、ここ数年で飛躍的に性能を上げてきており、手書き文字が何であるかを認識したり、写真に写っている多数の対象物が何であるかをそれぞれ識別するまでになってきました。

また、音声認識などでも、とても高い認識率を出しており、その利用価値はますます高まっています。

人工知能の代表的な技術は、人工ニューラルネットワーク(神経回路網)です。

人間の脳の構造を真似てプログラミングされた計算手法ですが、人間の脳を真似た所が非常に重要で、その構造ゆえに、人間の脳のように、多種多様な問題に対応することができるのです。

これまでのプログラミングでは、多くの場合、適用先は限定的でした。しかし、ニューラルネットワークは幅広い問題に適用できるのです。

皆さんもご自分の問題の解決に、是非とも人口知能を利用してみてください。うまくいけば、人工知能の有能性に驚かれることでしょう。

コンピューターによる画像認識を今の仕事の改善に利用できないか、とか、大量の過去データを元にして、今後の傾向の予想したい、とか、あるいは今起きている事象から次に起こりうる事象を予想できるか、など、様々な問題の解決に利用できます。

是非とも、人工知能技術を使って、ものごとを論理的に捉え、有利に進展させることを考えられるとよいのではないかと思います。

このサイトでは人口知能の利用方法についてお伝えし、皆様がこの技術を使えるようになれるようにサポートします。

ただし、人工知能を用いれば何でも解決できる、というモノではないことは、理解しておく必要があります。まだまだ発展途上の技術です。