ニューラルネットワークを目で理解する


ニューラルネットワークって言葉は脳から来てるらしいにゃ。ライオン上司の頭にとりつけてやりたいにゃ。
ニューラルネットワークって言葉は脳から来てるらしいにゃ。ライオン上司の頭にとりつけてやりたいにゃ。


直訳すると神経ネットワークだけどね。ちょうど猫が興味を持ってくれたみたいだし、今日はニューラルネットワークについて実践も含めて解説してみるね。

直訳すると神経ネットワークだけどね。ちょうど猫が興味を持ってくれたみたいだし、今日はニューラルネットワークについて実践も含めて解説してみるね。

そうなのにゃ?じゃあいらない。あれ以上神経質になったら困るのにゃ。
そうなのにゃ?じゃあいらない。あれ以上神経質になったら困るのにゃ。

はじめに
AI(人工知能)とは、極めて多様な技術の総称ですが、その多くは共通の概念をもちます。それは、AIとは入力データ X を受け取り、出力データ Y を生成する一つの「関数 F」である、という考え方です。
どんなに複雑なAIも、突き詰めればこのシンプルな形で表現できます。
- 入力 (X): 画像、文章、音声、センサーの数値など
- 関数 (F): AIモデルそのもの
- 出力 (Y): 画像の認識結果、翻訳された文章、生成された画像など
Google Colaboratory

この記事では、ただ読むだけでなく、実際に手でAIを動かして「学習」の様子を確かめられるようにしたよ。そのために使うのが「Google Colaboratory」という便利なツールだ。

この記事では、ただ読むだけでなく、実際に手でAIを動かして「学習」の様子を確かめられるようにしたよ。そのために使うのが「Google Colaboratory」という便利なツールだ。
Google Colaboratory(略してColab)は、Googleが提供している基本無料のサービスで、Webブラウザ上で直接Pythonのプログラムを実行できます。とにかく環境構築がいらないのが最大のメリットで、PCやスマホで実行することができます。
今回の実験のプログラムをColaboratoryノートブックとして共有します。ぜひ自身の手で動いているところを確認しながら、AIおよびNNに対する理解を深めて下さい。

Google Colab
colab.research.google.com
Google Colab

colab.research.google.com
簡単な問題
まずは、とてもシンプルな問題から始めましょう。
【問題】物件の広さから家賃を予測
つまり、家賃 = F(物件の広さ) となる最適な関数 F を見つけるのがゴールです。
本当は家賃は広さだけで決まりませんが、ここではそういう単純な世界を仮定します。神になった気持ちで、この世界の「真の法則」を 家賃 = 2300 × 広さ + 30000 だと決めてしまいましょう。
この法則に従って、いくつかの物件データをランダムに生成してみます。ただし、現実のデータには必ず観測誤差(ノイズ)が含まれるので、それも少し加えてみましょう。

物件の広さと家賃の関係
さて、ここからが本番です。
私たちが手にしているのは、青い点(観測データ)だけ。この断片的な情報から、赤い線で示された「真の法則」をいかにして見つけ出すか。それこそがAIの挑戦です。
データ(青い点)の分布をじっと眺めると、どうやら「広くなるほど家賃が高くなる」という直線的な関係がありそうです。そこで、私たちはAIのモデル(関数の形)を、シンプルな直線で表現することに決めました。
この場合AIの学習とは、手元のデータを最もよく説明できる「最適な」パラメータ a と b を見つけ出すプロセスです。
では、何をもって「最適」と判断するのでしょうか?
それは、AIの予測値と実際の家賃との誤差を計算し、その総量が最も小さくなる状態を「最適」と定義します。つまり、手元のデータ全体を最も上手く説明できる直線を探す、ということです。
誤差の計算方法は色々ありますが、最も一般的なのが平均二乗誤差 (MSE) です。これは、各データでの誤差を2乗して(マイナスを消すため)、その平均をとる方法です。
AI学習の目標は、この誤差関数 E の値が最小になるような a と b を見つけることに他なりません。
今回の y = ax + b のようなシンプルなモデルでは、この誤差関数を最小化する a と b を、微分を使った計算一発で求めることができます。このように、計算式で解がピタッと求まることを「解析的に解ける」と言います。

ちょっと待つにゃ。急に微分とか出てきてさっぱりなのにゃ。
ちょっと待つにゃ。急に微分とか出てきてさっぱりなのにゃ。


今回の誤差関数をよく見ると、aとbについて二次関数になっているよね。

今回の誤差関数をよく見ると、aとbについて二次関数になっているよね。

だからなんにゃ
だからなんにゃ


元々の目的は、誤差関数 E の値を最小にすることだった。そして、この誤差関数は a と b について二次関数、つまりお椀のような形をしている。
そして、お椀の一番底の部分(つまり誤差が最小になる点)は、傾きがゼロになる唯一の場所だ。
つまり、「誤差を最小にする a, b を探す」という問題が、「関数の傾き(微分)が 0 になる a, b を探す」という数学の問題にすり替わるんだ。だから微分が必要になるんだよ。

元々の目的は、誤差関数 E の値を最小にすることだった。そして、この誤差関数は a と b について二次関数、つまりお椀のような形をしている。
そして、お椀の一番底の部分(つまり誤差が最小になる点)は、傾きがゼロになる唯一の場所だ。
つまり、「誤差を最小にする a, b を探す」という問題が、「関数の傾き(微分)が 0 になる a, b を探す」という数学の問題にすり替わるんだ。だから微分が必要になるんだよ。

観測データにAIの予測直線がフィットしているグラフ。
計算で求めたパラメータは a = 2294.4, b = 31833.3 となり、神のみぞ知る真のパラメータ(a=2300, b=30000)に非常に近い値になりました。
緑の線が、AIがデータから学習して導き出した「最適」な予測直線です。データ全体の傾向を見事に捉えています。
複雑な問題
次はもう少し複雑な問題に挑戦しましょう。
【問題】コーヒーを飲んだ後のカフェイン血中濃度の推移を予測
この世界の真の関数は という、山なりのカーブを描く少し複雑な形だとします。
山なりのカーブを描く散布図。
前回のモデルと違い、この関数の誤差関数は微分しても「a = ..., b = ...」という綺麗な形に変形できません。つまり、解析解が存在しません。
そこで登場するのが勾配降下法です。これは一気に誤差関数が最小になる点を見つけようとするのではなく、「誤差が減るだろう方向」に微調整を何度も繰り返すことで、最適なパラメータを見つける方法です。この、「誤差が減るだろう方向」こそが微分、つまり勾配です。
- スタート地点を決める: まず、パラメータ a, b を適当な初期値に設定します。
- 傾きを調べる: その地点での「勾配(最も傾きが急な方向)」を微分で計算します。
- 少し進む: 勾配が最も下を向いている方向に、パラメータ a, b をほんの少しだけ動かします。
- 繰り返す: 2と3を何度も何度も繰り返します。
これを繰り返すことで、最終的に誤差が最も小さくなる地点(最適パラメータ)にたどり着くことができます。
実際に、この方法で最適パラメータを探してみましょう。

単純な勾配降下法(SGD)による予測結果
どうでしょうか。ある程度はデータの分布にかぶっています。が、とても満足とは言えない結果になりましたね。
誤差関数が、なんどもアップダウンを繰り返すような複雑な形になることは珍しくありません。すると、ちょっとしたくぼみを「最適」と勘違いして学習をやめてしまうことがあります。この問題を解決するために、AIのパラメータ調整にもさまざまな技術が開発されました。
その一つがモメンタム (Momentum) です。ボールが転がる際に「慣性」を持たせるような仕組みで、よりスムーズに、そして速く谷底に到達できます。(もちろん確実ではないですが)

Momentum付きSGDによる予測結果
モメンタムを加えたことで、a は2.50、b は-0.79と、真の値(a=2.5, b=-0.8)に近づき、誤差も小さくなりました。このように、最適化の方法も、AIを効果的に学習させる上で非常に重要な選択です。

難しいことはいいから最強を教えるのにゃ
難しいことはいいから最強を教えるのにゃ


そうだね。基本的にはAdamというアルゴリズムをつかっておくと間違いないよ。今回のモメンタムと、RMSPropという学習の不安定さを解決する手法のいいとこどりみたいな最適化手法で、一番使われている最適化手法といっても過言じゃないと思う。このあと、ニューラルネットワークの学習を試すけどそのときに使ってみようか。

そうだね。基本的にはAdamというアルゴリズムをつかっておくと間違いないよ。今回のモメンタムと、RMSPropという学習の不安定さを解決する手法のいいとこどりみたいな最適化手法で、一番使われている最適化手法といっても過言じゃないと思う。このあと、ニューラルネットワークの学習を試すけどそのときに使ってみようか。
ニューラルネットワーク
さて、ここまでは「AIの関数の形がである」と設定しました。これは真の関数と同じ形をしているため、適切に学習を行えばパラメータが一致することに不思議はありません。しかし、現実の問題では、データの背後にある真の関数の形など誰にもわかりません。ニューラルネットワークは、単純な計算を行う「ノード」を大量につなぎ合わせた関数です。ノードの数や層の数を増やすことで、理論上どんなに複雑な関数でも真似することができます。では、今回の関数はどうでしょうか。
まずは、中間層が1層で、ノード数が10個という比較的小さなニューラルネットワークで学習させてみます。

小さなニューラルネットワークによる予測
関数の形を一切教えなかったにもかかわらず、ニューラルネットワークはデータから山なりのパターンを自動で学習し、真の関数とかなり重なる予測をすることができました。
ニューラルネットワークは表現力が高いのが強みです。では、モデルをより大きくすれば性能はもっと上がるのでしょうか?中間層を8層に増やして実験してみましょう。

大きなニューラルネットワークの予測結果

ひどいのにゃ!
ひどいのにゃ!


そうだね。これは、モデルの表現力が高すぎるあまり、訓練データの細かいノイズにまで過剰にフィットしようとして、データ全体の滑らかな傾向を捉えられなくなった状態。これを過学習 (Overfitting) と呼ぶんだ。

そうだね。これは、モデルの表現力が高すぎるあまり、訓練データの細かいノイズにまで過剰にフィットしようとして、データ全体の滑らかな傾向を捉えられなくなった状態。これを過学習 (Overfitting) と呼ぶんだ。
過学習を防ぐためのテクニックも数多く存在し、その代表例が Dropout です。これは、学習中にランダムに一部のノードを「休ませる」ことで、モデルが訓練データに依存しすぎるのを防ぐ手法です。

Dropoutを加えた大きなニューラルネットワークの予測結果
Dropoutを加えたことで、予測線の動きが抑えられています。MSEの値も0.0160にまで改善しました。

改善はされてるけど、なんかカクカクしてるにゃ。
改善はされてるけど、なんかカクカクしてるにゃ。


鋭いね。僕も正直この現象に対して正確な回答はできない。ニューラルネットワークはモデルの非線形性を実現するために、間に活性化関数というのを挟む。ここでは、Tanhという非線形な関数を使っているんだけど、これの出力が1または0になるような、つまりステップ関数のような挙動をしたのかなと予想している。確かなことを言うにはもっと調査が必要だけどね。

鋭いね。僕も正直この現象に対して正確な回答はできない。ニューラルネットワークはモデルの非線形性を実現するために、間に活性化関数というのを挟む。ここでは、Tanhという非線形な関数を使っているんだけど、これの出力が1または0になるような、つまりステップ関数のような挙動をしたのかなと予想している。確かなことを言うにはもっと調査が必要だけどね。
あらためて:ここまでの実験について
今回の内容を実際に手を動かしながら試してみたい方は、以下のGoogle Colaboratoryノートブックをご利用ください。

Google Colab
colab.research.google.com
Google Colab

colab.research.google.com
おわりに
- AIの基本概念:AIは一つの「関数」
- どんなAIも、入力データ(X)を受け取り、出力データ(Y)を生成する「関数 F」と考えることができます。AIの学習とは、手元にあるデータ(ヒント)を元に、現実世界を支配する「真の関数」を可能な限り正確に再現しようとするプロセスです。
- 簡単な問題と「解析解」
- 家賃予測(y = ax + b)のように、AIのモデルが単純な場合、誤差を最小にする最適なパラメータ(a, b)を微分計算で一発で求めることができます。これを「解析的に解ける」といいます。
- 複雑な問題と「勾配降下法」
- モデルが複雑になると、計算一発では解けなくなります。そこで使われるのが勾配降下法です。誤差が最も急に減る方向(勾配)を頼りに、パラメータを少しずつ更新し、最適解に近づけていきます。より効率的に学習するため、MomentumやAdamといった改良された最適化手法が広く使われています。
- 万能近似:ニューラルネットワークの強力さ
- 現実の問題では、背後にある「真の関数」の形は誰も知りません。ニューラルネットワーク (NN) は、単純な計算ユニット(ノード)を多数組み合わせることで、理論上どんなに複雑な関数でも再現できるという強力な特性を持ちます。これにより、NNによって真の関数の形を知らなくても、データから自動的にその形を学習できるのです。
- 過学習に注意
- モデルを大きくしすぎると、訓練データの細かいノイズまで学習してしまい、未知のデータに対してうまく機能しなくなります。この現象を過学習 (Overfitting) と呼びます。過学習を防ぐため、Dropout(学習中に一部のノードを休ませる)などの様々なテクニックが編み出されました。
もっと深く広く知りたい方へ
オンライン教育プラットフォームUdemyの人気講師が教えるディープラーニングの基礎。ディープラーニングのベースであるニューラルネットワークと、ニューラルネットワークを学習させる際に用いられるアルゴリズムであるバックプロパゲーション(誤差逆伝播法)を初学者にもわかりやすく解説。また画像認識の分野で高い効率性を発揮する畳み込みニューラルネットワークについてもコード付きで解説することにより、入門書であるにもかかわらず本格的AI開発の入り口まで学ぶことができます。

今回の記事では触れなかった部分も含めて、かなり網羅的に書いてあるよ。たとえば、今回は1入力を扱ったけどもっとたくさんの入力を同時に扱う方法とか、複雑な関数で勾配を求めるための方法とかね。何よりデザインが良い。随所に挟まれる図や表、コード、すべてストレスなく読み進めることができるよ。おすすめ。

今回の記事では触れなかった部分も含めて、かなり網羅的に書いてあるよ。たとえば、今回は1入力を扱ったけどもっとたくさんの入力を同時に扱う方法とか、複雑な関数で勾配を求めるための方法とかね。何よりデザインが良い。随所に挟まれる図や表、コード、すべてストレスなく読み進めることができるよ。おすすめ。
東京大学特任准教授 松尾 豊氏 推薦! 人工知能プログラミングに必要な数学を、ゼロから抜け漏れなく、体系的に学ぶ! 数学を復習したいエンジニアに! 大人気「10秒で始める人工知能プログラミング学習サービス」の代表者がおくる、人工知能プログラミングに必要な数学を、やさしく学ぶ参考書が登場! キホンのキホンからおさらいするから、ニガテな人でも大丈夫! 後半では、Pythonのコードを動かしてさらに理解を深められます! kindle版かつkindleunlimited加入なら0円!

数学的に理解したい人はこっちだね。でも、平方根や累乗といった数学的用語レベルから丁寧に導入してくれるし、ハードルは低めだと思う。随所に差し込まれる演習問題や例題も適度な難易度でとてもいい。各節の最初に「おさえるポイント」が書いてある工夫も素晴らしいと思う。

数学的に理解したい人はこっちだね。でも、平方根や累乗といった数学的用語レベルから丁寧に導入してくれるし、ハードルは低めだと思う。随所に差し込まれる演習問題や例題も適度な難易度でとてもいい。各節の最初に「おさえるポイント」が書いてある工夫も素晴らしいと思う。
おすすめ記事

AIをつくる側になるための考え方
「AIで仕事を自動化したいけど、何から学べば…?」その答えは、AIを「入力→出力」というシンプルな箱として捉えることにあります。この記事を読めば、AIの専門用語に惑わされず、その本質的な仕組みが分かります。「AIを作ってみたい」「AIで業務を効率化したい」と考えるあなたのための、第一歩となる知識がここにあります。
AIをつくる側になるための考え方

「AIで仕事を自動化したいけど、何から学べば…?」その答えは、AIを「入力→出力」というシンプルな箱として捉えることにあります。この記事を読めば、AIの専門用語に惑わされず、その本質的な仕組みが分かります。「AIを作ってみたい」「AIで業務を効率化したい」と考えるあなたのための、第一歩となる知識がここにあります。
蛇足

ここまで読んでくれてありがとう。今回の記事では、ニューラルネットワークと旧来の機械学習との違いを、実際の学習結果を見ながら説明したよ。また、万能と呼ばれるニューラルネットワークだけど、弱点があることも分かったと思う。ほら、猫。もう終わったから起きて。よだれ垂れてるよ。汚い。

ここまで読んでくれてありがとう。今回の記事では、ニューラルネットワークと旧来の機械学習との違いを、実際の学習結果を見ながら説明したよ。また、万能と呼ばれるニューラルネットワークだけど、弱点があることも分かったと思う。ほら、猫。もう終わったから起きて。よだれ垂れてるよ。汚い。

はっ、意識が飛んでたのにゃ。
汚いって何にゃ。無神経にもほどがあるのにゃ。
はっ、意識が飛んでたのにゃ。
汚いって何にゃ。無神経にもほどがあるのにゃ。


今回の内容が分かりやすかったと思った方は、ぜひTwitterなどで発信していただけると泣いて喜びます。今後も、「読んだ人がITの力を最大限に活用したい」と思えるような記事を更新していきます。ぜひブックマークして今後ともよろしくお願いします。

今回の内容が分かりやすかったと思った方は、ぜひTwitterなどで発信していただけると泣いて喜びます。今後も、「読んだ人がITの力を最大限に活用したい」と思えるような記事を更新していきます。ぜひブックマークして今後ともよろしくお願いします。