出力することがわかります。正の数ではないからです。ゲートの例から、パーセプトロンが単純な論理関数を計算できることが分かります。それどころか、パーセプトロンのネットワークさえあれば任意の論理関数を計算できることまで分かるのです。ゲートは論理計算において万能だからです。ゲートさえあればどんな計算でも構成できる、という意味です。ゲートを使って1ビットの二進数どうしを加算する回路を作ることができます。これらの和を表現するには二進数で二桁が必要です。なる繰り上がりビットです。$-2$の入力を二つ持ち、バイアスが$3$であるパーセプトロンに置き換えます。この置き換えを施すと、以下のようなネットワークができます。このニューラルネットワークの中でひとつ注目すべき点は、一番左のパーセプトロンからの出力が一番下のパーセプトロンの入力として二度使われている点です。パーセプトロンの定義を与えたとき、このような、同じ箇所に同一の出力が二回入力される場合が許されるのか否かについては言及しませんでした。実のところ、このような重複入力を許すかどうかは問題になりません。重みが-4の入力をひとつ使えばいいのです。(もし、あなたがこれを自明に思えないなら、ここで立ち止まって、等価性を自分で証明してみるべきです。この変更によって、ニューラルネットワークは以下のようになります。ここで、重みが書いてない矢印の重みはすべて-2で、すべてのバイアスは3で、ひとつだけ重みが書いてある矢印の重みは-4です。いった入力はパーセプトロンネットワークの左に浮いている変数として描いてきました。実は、入力を表現するには、入力層と呼ばれる追加の層を設けるやり方が標準的です。加算機の例は、パーセプトロンのネットワークがNANDゲートを多数含む回路をシミュレートすることに使える、ということの実例でした。NANDゲートの万能性(それさえあればどんな関数でも計算できるという性質)から、パーセプトロンもまた万能である、ということが導けます。パーセプトロンが計算論的万能性を持つということは、心強いと同時に残念な事実です。心強い、というのは、パーセプトロンが他のどの計算装置にも負けない強力さを持つことを、この事実は教えてくれるからです。残念だ、というのは、パーセプトロンはNANDゲートの亜種、四角い車輪の再発明に過ぎない、と感じられるからです。これでは、とても大したニュースとはいえません!ところが、現実はそれほど残念ではないのです。我々は、ニューラルネットワークの重みとバイアスを自動的に最適化するような、学習アルゴリズムを開発することができるからです。この最適化は、プログラマの直接介入なしに、外部刺激に反応して勝手に起こるものです。これらの学習アルゴリズムのおかげで、人工ニューロンは、従来の論理ゲートとは全く異なった使い方ができます。NANDゲートや他の種類の論理ゲートはすべて手動で配線してやる必要があったのに対し、ニューラルネットワークは問題の解き方を自発的に学習してくれます。ときには、従来型の回路を設計するのが非常に難しいような問題に対してさえも。シグモイドニューロン学習アルゴリズムとは大変すばらしい。かりに、私たちがある種の問題をパーセプトロンのネットワークを使って解こうとしている、としましょう。入力は手書き文字のスキャン画像の生ピクセルデータである、とか。ニューラルネットワークには、数字を正しく分類できるよう、重みとバイアスを学習してほしいわけです。学習がどのように働くのか知るために、ネットワークの中のいくつかの重みやバイアスを少しだけ変更するとしましょう。私たちとしては、このような小さな変更に対応する、ニューラルネットワークからの出力の変化もまた小さなものであってほしいわけです。まもなく出てきますが、この性質こそが学習を可能にするのです。図示すれば、こんな感じです(もちろん、図のニューラルネットワークは手書き文字認識をするには小規模すぎます!)もし、重みやバイアスを微小に変化させた場合の出力の変化もまた微小である、という性質が本当に成り立っていれば、その性質をつかって、ニューラルネットワークがより自分の思ったとおりの挙動を示すように重みとバイアスを修正できます。ニューラルネットワークがある「9」であるべき手書き文字を、間違って「8」に分類したとします。私たちは重みやバイアスに小さな変化を与えて、どうすればこのニューラルネットワークがこの画像を正しく「9」と分類する方向に近づくか探ることができます。この過程を繰り返し、重みとバイアスを変化させ続ければ、生成される結果は次第に改善されてゆくでしょう。ニューラルネットワークはこうして学習するのです。問題は、ニューラルネットワークがパーセプトロンで構成されていたとすると、このような学習は起こらない、ということです。実際、ニューラルネットワーク内のパーセプトロンのうち、どれか1つの重みやバイアスを少し変えてやると、そのパーセプトロンの出力は、変化がないか、もしくは$0$から$1$へというようにすっかり反転してしまいます。このように出力が反転すれば、ニューラルネットワーク内の他の部分の挙動も、連動して複雑に変わっていってしまいます。先程の手書き文字の「9」を、なんとか正しく数字の「9」に分類させることができたとしても、今度は「9」以外の全ての手書き文字に対するニューラルネットワークの挙動までもが完全に変わってしまい、その変化をコントロールすることは困難となります。したら、この問題を回避することのできる何らかの賢い方法があるかもしれませんが、今のところ、パーセプトロンで構成されたニューラルネットワークに上手に学習させる方法は明らかになっていません。この問題は、シグモイドニューロンと呼ばれる、新しいタイプの人工ニューロンを導入することによって克服することができます。シグモイドニューロンはパーセプトロンと似ていますが、シグモイドニューロンの重みやバイアスに微小な変化を与えたとき、それに応じて生じる出力の変化も微小なものに留まるように調整されています。このことは、シグモイドニューロンで構成されているニューラルネットワークの学習を可能にする、決定的な違いとなります。よし、それではシグモイドニューロンをご説明しましょう。x_2,\ldots$といった入力を取ります。これらの入力値は、単に$0$や$1$だけではなく、$0$から$1$の間のあらゆる値をとることができます。そのため、たとえば、$0.638\ldots$といった値も、シグモイドニューロンにとっては有効な入力値となります。w_2,\ldots$)を持ち、またニューロン全体に対するバイアスと呼ばれる値($b$)を持っています。出力は、$0$や$1$だけではありません。x+b)$という値をとります。ロジスティック・ニューロンと呼ぶことがあります。この用語を覚えておくと便利です。いえ、私たちは一貫してシグモイド関数という用語の方を使うことにします。明確に表現すると、シグモイドニューロンの出力は、入力が$x_1,x_2,\ldots$で、重みが$w_1,w_2,\ldots$で、そしてバイアスが$b$のとき、次の形を取ります。\tag{4}\end{eqnarray}一見すると、シグモイドニューロンはパーセプトロンとは大きく異なるように見えます。シグモイド関数の数式は、こういった表現方法に慣れていない人にとっては、理解困難で近づき難く感じられるかもしれません。実は、パーセプトロンとシグモイドニューロンには多くの共通点があり、シグモイド関数が代数形式で表現されていることは、真の理解の妨げになるどころか、技術的な細部を伝えてくれるものとなるでしょう。b$を大きな正の数としてみましょう。x+b$を大きな数であるとき、シグモイドニューロンの出力はほぼ$1$となり、パーセプトロンと同じになります。x+b$は大きな負の数とします。+b$が大きな負の数となるときも、シグモイドニューロンはパーセプトロンとほぼ同じ動きをします。x+b$がそこまで大きな数でない場合はパーセプトロンと同じにはなりません。実は、$\sigma$がなんであるかはそこまで重要ではありません。重要なのはどういう形のグラフになるかです。これがそのグラフの形です。このグラフはステップ関数のなめらか版です:もし$\sigma$が実際にステップ関数であれば、シグモイドニューロンはパーセプトロンと等しくなります。x+b$が負か正かになることで出力が$1$か$0$となるからです。0$のとき、ステップ関数の出力が$1$に対して、パーセプトロンの出力は$0$です。正確に言うと、この一点においてステップ関数を変更する必要があります。本当の$\sigma$関数を使うことによって、上にあるように、なめらかなパーセプトロンになります。確かに、$\sigma$関数の滑らかさは重大な事実ですが、本質ではありません。\mbox{output}$の小さな変化を生み出す、ということを意味しています。\mbox{output}$は大体上手くいっているとわかります。b$は$\mbox{output}$の偏微分を表し、それぞれに$w_j$と$b$をかけています。偏微分について知らなくてもパニックにならないでください!この記法は複雑に見えますが、全ての偏微分は実は非常にシンプルなことを表現しています(そしてとてもいいことです)。b$の変化に対して線形である、と言っているのです。この線形性は、欲しいoutputがどんな小さな変化でも、重みとバイアスを小さく変化させることで簡単に得られることを示しています。このことから、シグモイドニューロンはパーセプトロンとほぼ同等な動きをするにも関わらず、より容易に重みとバイアスの変化がoutputを変化させるかがわかります。b)$の出力を持つニューロンを考えます。別のアクティベーション関数を使った時の主な違いは、等式における偏微分の特定の値です。後々これらの偏微分を計算するとき、$\sigma$を使うことで代数的考えが楽になります。これは単に、指数関数の値は指数によって決まるからです。$\sigma$はニューラルネットでよく使われており、この本で最もよく使うアクティベーション関数です。シグモイドニューロンからの出力をどう変換すべきでしょうか?明らかなことですが、パーセプトロンとシグモイドニューロンの大きな違いの一つは、シグモイドニューロンの出力がちょうど$0$または$1$ではないことです。シグモイドニューロンは$0$から$1$の間のあらゆる実数を出力することが出来ます。正当な出力と言えます。このことはとても有用となりえます。出力値をニューラルネットワークに対する入力画像のピクセル平均色度合いとして表したい時です。時々厄介なものともなりえます。ネットワークからの出力を「入力画像が9」もしくは「入力画像が9でない」として示したいとします。明らかに、最も簡単は方法はパーセプトロンのように出力を$0$もしくは$1$とすることです。実際のところ、この例を扱うためにルールを設定することが出来ます。0.5より大きな出力は"9"とみなし、0.5以下の出力は"9ではない"とみなす方法です。混乱がないように、このようなルールを使うときは常に明示することにします。0$で定数倍するとします。このときネットワークの振る舞いは変わらないことを示してみてください。$\mbox{}$先ほどの問題(=パーセプトロンのネットワーク)と同じ設定で考えます。パーセプトロンネットワークへの入力全体はすでに選ばれているとします。ここで、入力の具体的な値は必要ではなく、入力値が固定されてさえいれば問題ありません。0$を満たしているものとします。0$となるような正の数で定数倍するとします。このシグモイドニューロンのネットワークはパーセプトロンの場合と全く同じように振る舞うことを示して下さい。この性質は成り立ちません。?ニューラルネットワークのアーキテクチャ次の章では、手書きの数字の分類においてとても上手く働くニューラルネットワークを紹介します。その準備として、いくつかの専門用語を説明するためにニューラルネットワークのそれぞれの部分に名前をつけておきましょう。neurons)と言います。neurons)から構成されています。上の場合では出力ニューロンは1つですね。layer)と呼ばれます。この"隠れ"という用語は少し不思議に聞こえるでしょう。私が初めてこの用語を聞いた時、何か哲学的または数学的意味があるのだと思いました。これは"入出力以外"ということを意味しているにすぎません。上記のニューラルネットワークはただ1つの隠れ層からできていますが、複数の隠れ層をもったニューラルネットワークも存在します。例として、下の4層ネットワークは2つの隠れ層をもっています。perceptrons)、またはMLPsと呼びます。これらはパーセプトロンではなく、シグモイドニューロンです。これらの用語は混乱を招くためこの本では用いませんが、その存在は知っておいてください。ニューラルネットワークの入出力層の設計はしばしば単純です。手書きの画像が9かそうでないかを判断したいとします。設計の自然な方法は、その画像のピクセルあたりの色の度合いを入力ニューロンにエンコードすることです。64$になり、色の度合いは明度を$0$から$1$の適切な値で表します。出力層は1つのニューロンからなり、出力値が$0.5$以上なら"入力画像は9である"ということを示し、$0.5$以下なら"入力画像は9ではない"ということを示します。入出力層の設計が単純なのに対し、隠れ層の設計はかなり創造的なものになり得ます。隠れ層の設計の過程をいくつかの単純で大雑把な方法で行うのは不可能です。そのかわり、ニューラルネットワークの研究者らは、多くの隠れ層の設計ヒューリスティクスを開発してきました。それらは人々を解放しました。例として、これらのヒューリスティクスは学習時間と隠れ層の数とのトレードオフに折り合いをつけることができます。私たちも後に、この本の中でそのいくつかの設計に触れることになるでしょう。これから、ある層の出力が次の層の入力になるようなニューラルネットワークについて考察してみましょう。networks)と呼ばれます。これはネットワーク内にループがないということを意味しています。情報は常に前へ伝わり、後ろへは戻りません。ループするならば、σ関数の入力はその出力に依存した状態になってしまうでしょう。なってはわけがわかりません。そのために私たちはそのようなループを許さないのです。フィードバックループを用いることが可能な、人工ニューラルネットワークモデルも存在します。networks)と呼ばれます。これらのモデルの着想は、静止するまでの限られた時間に発火するようなニューロンをもったモデルというものです。その発火が他のニューロンを刺激し、そのニューロンもまた限られた時間の中で少し遅れて発火します。やってさらなる発火を引き起こし、私たちは発火の連なりを得ることができます。これらのモデルにおいてループは問題にはなりません、なぜならその出力は即時ではなく、いくぶんか遅れてその入力に影響されるからです。再帰型ニューラルネットワークはフィードフォワードニューラルネットワークに比べてあまり影響力がありませんでした。その理由の一つは、再帰型ネットワークの学習アルゴリズムが非力だったことです。それでも再帰型ネットワークは非常に興味深いと言えます。それらはフィードフォワードネットワークに比べ、私たちの脳の働き方に近いのです。フィードフォワードネットワークでは困難な問題を、再帰型ネットワークでは解くことができるという可能性は十分にあります。この本では、より広く使われているフィードフォワードニューラルネットワークに焦点を当てたいと思います。手書き数字を分類する単純なネットワークニューラルネットワークの定義を終えて、いよいよ手書き数字の認識に戻ります。私たちは手書き数字認識の問題を2つの下位問題にわけることができます。1つは、複数桁の数字からなる画像を、それぞれの数字からなる分かれた画像の列にすることです。この画像を、6つの分かれた画像にします。problem)を容易に解くことができますが、コンピュータプログラムが正確に画像を分解することは容易ではありません。一度画像を分けてしまえば、あとは個々の数字を分類するだけです。上記の数字で、最初にプログラムに認識させるのは、5です。これから2つ目の問題、つまり各数字の分類問題を解くプログラムに焦点を当てます。この問題を解く良い方法がわかれば、1つ目の問題、つまり分割問題はそれほど難しくなくなるからです。分割問題へのアプローチは多数あります。そのひとつは、多くの異なる方法で画像を分割して、その画像の分類の結果から、それぞれの分割法を評価する方法です。すべての分割された画像で分類がうまくいけば、その分割法は高いスコアを得ます。逆にうまくいかなければそれはスコアの低い分割法となります。これは、分類でなにか問題が起これば、おそらくそれは誤った分割法を用いているからだ、というアイディアです。このアイディアやその他の派生した方法は、分割問題をうまく解くことができます。要するに私たちは、分割法に悩む代わりに、もっと面白くて難しい問題、つまり個々の手書き数字の認識問題を解くニューラルネットワークを開発していきます。それぞれの数字を認識するために、3層のニューラルネットワークを用います。ネットワークの入力層はピクセルの値をエンコードするニューロンを持っています。28$ピクセルの画像です。784$ニューロンからなるということです。簡単のため、上記の図ではニューロンの数を省略して書いています。入力ピクセルはグレースケールで、$0.0$は白を、$1.0$は黒を表し、その間の値はそれに応じた濃さのグレーを表します。二番目の層は隠れ層です。この隠れ層のニューロンの数を$n$とし、$n$の値を変えて実験します。15$ニューロンだけもつ小規模な隠れ層を表しています。出力層は10ニューロンから構成されています。1$)したら、それは、ネットワークがその数字を$0$だと思っていることを示しています。二番目のニューロンなら$1$、その他も同様です。正確に言えば、私たちは$0$から$9$の出力ニューロンをもっていて、どのニューロンが最も高く活性化するかを計算します。そのニューロンが$6$だとすると、ネットワークは入力の数字が$6$であると推測していることになります。他の出力ニューロンについても同様です。あなたは、なぜ私たちが10個の出力ニューロンを用いるか疑問に思ったでしょう。9$)なのか示すことなのです。これを行うのに自然だと思われる方法は、4つの出力ニューロンを用いて、それぞれのニューロンで出力が0または1に近いかどうかに応じてバイナリの値をとることです。答えをエンコードするには4つのニューロンで十分です。16$は入力の数字の$10$より多くの値をとることができるからです。私たちはその代わりに10個のニューロンを用いているのでしょうか。非効率的ではないのでしょうか。その究極の正当化は経験に基づくものです。私たちはそのどちらの方法も試し、この特定の問題においては、10個の出力ニューロンをもったネットワークの方が4つのそれよりうまく学習するということがわかったのです。同時に、なぜ10個の出力ニューロンを用いた方がうまくいくのかという疑問が残りました。なにか、私たちが4-出力エンコーディングの代わりに10-出力エンコーディングを用いるべきだというヒューリスティクスがあるのでしょうか。するのか理解するために、ニューラルネットワークが何をしているか、その原理から考えます。最初のケース、つまり$10$個の出力ニューロンを用いた場合を考察してください。最初の出力ニューロンに焦点を当ててみると、これはその数字が$0$かどうかを決めようとしていることがわかります。これは隠れ層からの情報を考量して行います。それらの隠れ層は何をしているのでしょうか。議論のためにとりあえず、隠れ層の最初のニューロンが、下記のような画像が存在するかどうかを検出すると思ってください。その検出は、その画像と重なった入力ピクセルに重く重み付けし、他の入力には軽い重み付けをすることで、行うことができます。隠れニューロンも、下記のような画像が存在するかどうかを検出すると思ってください。あなたが気付いているように、これらの4つの画像は合わせると、私たちが前に見た、数字の列の$0$の画像になります。その4つ全ての隠れニューロンが発火したら、私たちはその数字が$0$であると結論づけることができます。それだけが、その画像が$0$であると結論づく証拠ではありません。私たちは、その他の多くの方法で(例えば上記の画像の変換や僅かな歪みによって)合理的に$0$を得ることができます。少なくともこの場合では入力は$0$だと結論づけて差し支えないでしょう。ニューラルネットワークがこの方法で機能するとすれば、なぜ$10$出力ニューロンの方が$4$よりも良いのかについての尤もな説明を得ることができます。$4$つの出力だとすると、最初の出力ニューロンはその数字の最上位ビットが何なのか決めようとするでしょう。その最上位ビットを、上に示したような単純な形状に関連づける方法はありません。数字を構成する要素の形状が出力の最上位ビットに深く関係する、という歴史的な理由は想像しがたいでしょう。今言及したこれらのことは、すべてただのヒューリスティクスです。三層ニューラルネットワークは必ずしもこの方法、つまり私が説明した、隠れ層が単純な構成要素を検出するような方法で行う必要はありません。巧妙な学習アルゴリズムが、$4$出力ニューロンを使うような重みの割当てを見つけるでしょう。経験則的に、私が説明してきた考え方はとてもうまくいき、良いニューラルネットワークアーキテクチャを設計する上で、あなたの時間を節約することができます。エクササイズ3層ネットワークの上にもう一つ層を追加することで、数字のビットワイズ表現を定める方法があります。追加した層は、下記の図のように、前の層からの出力を二進数の表現に変換します。新しい出力層のための重みとバイアスを見つけてください。最初の3層は、3層目(すなわち古い出力層)の正しい出力が少なくとも$0.99$で活性化し、誤った出力が$0.01$以下で活性化するようなものと仮定してください。今や私たちはニューラルネットワークのデザインを手に入れましたが、それはどのように数字の認識を学習することができるのでしょうか。最初に必要になるものはそれを用いて学習するための所謂トレーニングデータセットです。私たちは数万件の手書き数字スキャン画像とその正しい分類からなるMNISTデータセットを用います。(NIST)によって収集および修正(Modify)された二つのデータセットから成り立っていることに由来しています。以下にMNISTの画像をいくつか示します。chapterで用いたものです。私たちのネットワークのテストには訓練用ではないものを用います!MNISTは二つの要素からなっています。一つ目は60,000個の訓練用の画像です。Bureauの従業員で残り半数は高校生です。これらの画像は28×28ピクセルのグレースケールとなっています。二つ目は10,000個のテスト用画像です。これらの画像も同様に28×28ピクセルのグレースケールとなっています。これらのテストデータを使ってニューラルネットワークが数字の認識についてどれくらい学習できているかを評価します。Bureauの従業員と高校生とでグループ分けされているにも関わらずです)。これによりシステムが認識できる数字を訓練中に経験していないと確信できます。