QuestionsSponsors著者と共にこの本を作り出してくださったサポーターの皆様に感謝いたします。バグ発見者の殿堂に名を連ねる皆様にも感謝いたします。日本語版の出版にあたっては、翻訳者の皆様に深く感謝いたします。この本は目下のところベータ版で、開発続行中です。その他の質問については、まずはFAQをごらんください。訳:「ニューラルネットワークと深層学習」翻訳プロジェクト人間の視覚がどんなに不思議なものか、考えたことはありますか?次の手書き数列を読んでみてください:大抵の人にとってはごく簡単に504192と読めると思います。こっていることは簡単どころではありません。プスからなる領域が存在しています。像処理に携わっています。私たちの頭部には、数億年にわたる進化によって洗練され、視覚世界を理解するのに驚くべき適応をとげたスーパーコンピューターが内蔵されているのです。手書き数字認識が簡単なのではありません。どちらかというと、私たち人類が、目に見えるものを解釈するという作業をとても、とても得意としているのです。その作業はほとんど無意識のうちに行われるのです。私たちは普段、自分の視覚系がいかに複雑な問題を解いてくれているかに、感謝を払うこともないのです。ひとたび、さっきの手書き数字を認識するプログラムを書こうとすれば、視覚パターン認識の困難さが明らかになります。自分でやればこんなに簡単に思えることが、突然ものすごく難しくなったように感じるでしょう。数字を認識するための直感的で単純なルール---「数字の9は、上に輪があって、右下から下に向かって線が生えている形」---をアルゴリズムで表現するのはけっして単純ではないことに気づくでしょう。このようなルールを正確にプログラムとして表現しようとすれば、すぐに膨大な例外、落とし穴、特殊ケースに気づくはずです。ニューラルネットワークはこのような問題に違った角度から迫ります。ニューラルネットワークの発想は、手書き数字のデータをあらかじめ沢山用意して(このようなデータを訓練例といいます)その上で、訓練例から学習することのできるシステムを開発する、というものです。言い換えれば、ニューラルネットワークは、訓練例をもとに、数字認識のルールを自動的に推論します。訓練例を増やすほど、ニューラルネットワークは手書き文字に関する知識をより多く獲得し、精度が向上します。いう訓練例を与えることで、よりよい手書き数字認識機を作ることができるかもしれません。この章では、手書き数字認識を学習するニューラルネットワークを実装することを目標とします。実装するプログラムはたったの74行に収まり、しかも特別なニューラルネットワークライブラリを使うわけではありません。それでも、この短いプログラムは人手の介入なしに、96%以上の精度で数字を認識することができます。2章以降で導入する新しいアイデアを組み込めば、この性能はさらに99%を上回るまで向上します。実は、現在最高レベルの商用ニューラルネットワークは、銀行での小切手の処理や郵便局での住所認識に使われるほどの高い性能に達しています。手書き文字認識は、ニューラルネットワーク一般について解説するうえでうってつけの題材なので、まずは手書き文字認識に話を絞ることにします。いうのも、手書き文字認識というのは、決して一筋縄ではゆかない歯ごたえのある課題です。それでいて例えば極めて複雑な解法を必要とするとか、莫大な計算資源を必要とするとかの、非常に困難な課題というわけでもなく、ちょうどいい難易度の課題なのです。手書き文字認識は、深層学習といった発展的な技術の題材としても適しています。いうわけで、この本では繰り返し、手書き文字認識という課題に立ち戻ることにします。その他の分野への応用をあつかいます。この章の目的がただ手書き数字を認識するプログラムを書くことだけだったなら、この章はもっと短くなったでしょう!しかし、この章では、手書き文字認識を実装する過程で、ニューラルネットワークの鍵となるアイデアをいくつも開発します。その中には、二種類の重要な人工ニューロン(パーセプトロンと、シグモイドニューロン)や、ニューラルネットワークの標準的な学習アルゴリズムである確率的勾配降下法が含まれます。本書を通じて、私は現行の手法を紹介するだけでなく*なぜ*その手法が選ばれたのかについて解説することで、あなたのニューラルネットワークにまつわる直感を鍛えてゆければと思います。おかげで、本章は流行りのトピックをただ並べた解説などよりはもずいぶん長くなってしまいますが、あなたがより深い理解に達することを思えばその価値はあると思います。本章を読み終わるころには、私たちは、深層学習とは何なのか、なぜ重要なのか、の理解に到達するでしょう。パーセプトロンニューラルネットワークとは何か、という解説を始めるにあたり、まずはパーセプトロンと呼ばれる種類の人工ニューロンから話を始めたいと思います。今日では、パーセプトロン以外の人工ニューロンモデルを扱うことが一般的です。この本では、そして現代のニューラルネットワーク研究の多くでは、シグモイドニューロンと呼ばれるモデルが主に使われています。この本でも、もうすぐシグモイドニューロンが登場します。パーセプトロンを理解することに時間をさく価値があると言えるでしょう。入力にとり、ひとつの二進数($0$または$1$)を出力します。一般的には、入力はいくつでも構いません。ローゼンブラット(カタカナ表記は正しい?)は、出力を計算する簡単なルールを提案しました。$w_1,w_2,\ldots$という概念を導入しました。重みとは、それぞれの入力が出力に及ぼす影響の大きさを表す実数です。x_j$と閾値の大小比較で決まります。重みと同じく、閾値もパーセプトロンの挙動を決める実数パラメータです。複数の情報に、重みをつけながら決定をくだす機械だと言えます。今から出すのは簡単な例ですが、あまり現実的な例ではありません。現実的な例が出てきます。週末が近づいているとしましょう。週末には、あなたの住んでいる街で「チーズ祭り」が催されるそうです。あなたはチーズが好物で、チーズ祭りに行くかどうか決めようとしています。あなたの判断に影響を及ぼしそうなファクターは、三つあります。天気はいいか?あなたの恋人も一緒に行きたがっているか?祭りの会場は駅から近いか?(あなたは自家用車を持っていません。$x_3$で表現することができます。0$ならそうではありません。$x_3$と駅も同様です。あなたはチーズが大好物で、あなたの大切な人が何と言おうが、会場が駅から遠かろうが、喜んでチーズ祭りに行くつもりだとしましょう。あなたは雨が何より苦手で、もし天気が悪かったら絶対に行くつもりはありません。パーセプトロンは、このような意思決定を表現することができます。$w_1$の値が大きいことは、あなたにとって天気がとても重要であること---恋人の意思や駅からの距離よりもずっとずっと重要であることを表しています。以上のパラメータ設定により、パーセプトロンであなたの意思決定モデルを実装できました。このパーセプトロンは、天気が良ければ必ず$1$を出力し、天気が悪ければ必ず$0$を出力します。あなたの恋人の意思や、駅からの距離によって結論が変わることはありません。重みと閾値とを変化させることで、様々に異なった意思決定モデルを得ることができます。閾値を$5$から$3$に変えましょうか。「天気が良い」または「会場が駅から近く、かつあなたの恋人が一緒に行きたがっている」となります。意思決定モデルが変化したのです。閾値を下げることは、あなたが祭りに行きたがっていることを意味します。いえ、パーセプトロンは異なる種類の情報を考慮し、重みをつけたうえで判断を下す能力があることを、先ほどの例は示しています。入力情報に重みをつけて、とても単純な判断を行っています。それでは、第二層のパーセプトロンは何をしているのでしょう?これらのパーセプトロンは、第一層のパーセプトロンの下した判断に重みをつけることで、判断を下しています。これら第二層のパーセプトロンは、第一層のパーセプトロンよりも複雑で、抽象的な判断を下しているといえそうです。第三層のパーセプトロンは、さらに複雑な判断を行っています。このように、多層のニューラルネットワークは高度な意思決定を行うことができるのです。先ほどパーセプトロンを定義した時には、パーセプトロンは出力をひとつしか持たないと言いました。ところが上図のネットワークの中のパーセプトロンは、複数の出力を持つように描かれていますね。パーセプトロンの出力はひとつなんです。出力の矢印が複数あるのは、ただ、あるパーセプトロンの出力が複数のパーセプトロンへの入力として使われることを示しているにすぎません。すれば、一つの出力矢印を描いてから分岐させるよりも、若干見やすくなりますからね。パーセプトロンの記法をもっと簡潔にしましょう。そこで、これをもっと簡単に書ける記法を導入することにします。x_j$と書くことにします。ここで、$w$と$x$はそれぞれ重みと入力を要素にもつベクトルです。\equiv-\mbox{threshold}$と呼ばれる量に置き換えます。バイアスは、パーセプトロンが$1$を出力する傾向の高さを表す量だとみなすことができます。する傾向の高さを表すといえます。パーセプトロンが$1$を出力するのはとても簡単なことでしょう。逆に、パーセプトロンのバイアスが負の数なら、$1$を出力させるのは骨が折れそうです。見てのとおり、閾値の代わりにバイアスを使うのは、パーセプトロンの表記をほんの少し変更するにすぎません。バイアスを使ったほうがもっとシンプルになる場合がのちほど出てきます。いうわけで、この本では今後、閾値ではなくバイアスを使うことにします。ここまでの解説では、パーセプトロンを入力情報に重みをつけて判断を行う手続きとして用いてきました。パーセプトロンには他の用途もあります。それは、論理関数を計算することです。あらゆる計算は、AND、OR、そしてNANDといった基本的な論理関数から構成されている、とみなすことができます。パーセプトロンは、こういった論理関数を表現できるのです。二つの入力をとり、どちらも重みが$-2$で、全体のバイアスが$3$であるようなパーセプトロンを考えてみましょう。出力することがわかります。