生成AIが流行り、「LLM」の「スケーリング則」とか、Deep Search がどうとか、専門的な単語が耳に入るようになり、きっとすごい専門家が私にはわからないすごいことをやっているのだろう、と感じる方、「ニューラルネットワーク」がなにか高尚なものに感じる方もいるかも知れません。しかし実際は段階を追って本質さえ掴めば、その基本的な要素や本質は高校生でも十分にわかります。いわゆる「ディープラーニング」も話題の生成AIも、土台となる基礎は同じです。本記事では、脳の“発火システム”からスタートし、ニューラルネットワークの基本要素を一から整理していきます。本記事を通じて土台を固めておけば、今後のディープラーニングや生成AIについても、より深く楽しみながら学べるはずです。
本記事と合わせて、以下2つの続きの記事で、ディープラーニングの最低限の基本的な概念と数式的な理解ができます。ページトップか下のリンクから御覧ください。
電気信号のバケツリレー「発火」
ディープラーニングとは、脳の神経のつながりを数式でモデル化した「ニューラルネットワーク」に基づいた機械学習の手法です。この仕組みの理解は一見シンプルですが、非常に複雑なロジックの学習が可能で、ChatGPTなどのLLM (Large Language Model) の基盤にもなっています。
脳は膨大なニューロン(神経細胞)が集まって形成される中枢神経系です。目や耳などから入った情報が、ニューロンのネットワークを電気信号として伝わりながら処理され、結果として「思考」が行われます。ニューロン同士の接続部分に着目すると、複数のニューロンから伝達される電気信号が一定の強さを超えたとき、信号を受け取ったニューロンが「発火」し、次のニューロンに信号を送ります。このようにして信号が次々と伝搬していき、バケツリレーのように情報処理が進むのです。
このニューロン間の信号伝達を簡単な数式でモデル化したものがニューラルネットワークです。一見単純な仕組みに見えますが、実は日常の様々な判断もこの「発火システム」に分解して説明できます。例えば、「彼(彼女)の顔が少し不機嫌に見える」「大きな音を立ててドアを閉めた」「さっき少し言い争いをした」という3つの情報があるとします。このうち1つだけでは相手が本気で怒っているかはわかりませんが、3つが揃えば流石に「相手は本気で怒っている」と結論づけることができます。ディープラーニングでは、こうした要素の情報(インプット)がニューラルネットワークに大量に入り込み、発火システムによって複雑に処理され、特定のアウトプットを導き出します。
ニューロンの発火システムを数式で表す
では、脳内の発火システムをもう少し具体的にモデル化してみましょう。まずは複数のニューロン(上図 \(x_1, x_2, x_3\))から1つ(上図 \(z\))のニューロンに電気信号が伝わっていると考えます。このとき、流れ込むそれぞれの電気信号の強度を \(x_1, x_2, …\) とし、これらをすべて合計したものを \(\sum_{i} x_i\) とします。先程の例であれば、\(x_1\) は「表情の不機嫌さ」、\(x_2\) は「ドアの音の大きさ」、\(x_3\) は「言い争った時の緊張感」となります。もしこの合計がある閾値以下であれば出力は「0:相手は怒っていない」、閾値を超えた場合に「0より大きな値:相手は怒っている」を返すと考えましょう。こうした発火の処理には「ReLU関数」というものが適しており、これを \(\varphi\) と表します。すると、発火システムは \(\varphi\left(\sum_i x_i\right)\) のように表されます。他にもモデルの用途に応じて様々な関数が使われ、これらを総称して活性化関数と呼ばれます。
さらに実際のニューロン同士の結合には強弱があり、信号の伝わりやすさがあります。これは前後の因果関係の関連性の強さを表します。これを反映するために、それぞれの \(x_i\) に重み \(w_i\) を掛けてから合計し、\(w_i x_i\) とします。そして全体の発火閾値、すなわち発火のしやすさを調整する(下駄を履かせる)ため、バイアス項 \(b\) を加えます。先程の例であれば、「表情の不機嫌さ」は「彼が怒っている」という結論に直接的に関連するので \(w_1\) は大きい、といった具合です。こうしてニューラルネットワークの基本的な構造が完成します。式を具体的に書くと、\(z = \varphi \left(\sum w_ix_i + b \right)\) となり、上の図のようになります。
なぜこの仕組みで複雑な推論が可能なのか
次に、この数学モデルをもとに、なぜディープラーニングが複雑な推論を行えるのかを、もう少し論理的な面から考えてみましょう。ReLU 関数はインプットが閾値以下なら 0、閾値を超えると比例してアウトプットを増加させます。この動作はプログラミングの「if 文」に非常に似ています。もしある条件が成り立つ(入力が 0 以上)なら 0 以上の値を、条件が成り立たない(入力が 0 より小さい)なら 0 を返すため、入力に応じてある種、「Yes」「No」のような質的に異なる応答をします。さらにこのYesにはグラデーションがあって、出力が入力に比例するので、より柔軟な条件分岐が可能です。
ところでif文は論理の基本要素であり、実際、世の中のほとんどの推論はこのような「if」に分解できます。したがって、大量のニューロンを ReLU 関数で接続すれば、あらゆる推論が可能になるのです。複数のニューロンが1つのニューロンに繋がっていれば、「もし A1 かつ A2 かつ… AN かつ not B1 かつ not B2 かつ….ならば C 」といった複雑な条件をいくつも設定でき、適切なアウトプットを導き出せるのです。
コメント