ChatGPTやClaudeのようなAIの中身って、結局どうなっているんだろう。そんな疑問を持って、大学のディープラーニング講義資料を読み込んでみたので、その内容を自分なりに整理しながらブログにまとめていきます。今回のテーマは、あらゆるディープラーニングの土台になっている「ニューラルネットワーク」の基本的な仕組みです。数式も出てきますが、一つ一つできるだけ丁寧に説明していくので、ゆっくり読み進めてもらえればと思います。
・そもそも「ニューラルネットワーク」って何の真似?
ニューラルネットワーク(神経回路網)という名前の通り、これはもともと人間の脳の中にある神経細胞(ニューロン)の仕組みを、数式でざっくり真似したものです。
私たちの脳の中では、1つのニューロンが「樹状突起」という部分で他のニューロンからの信号を受け取り、「軸索」を通じて電気信号として次のニューロンに伝えます。ニューロンとニューロンのつなぎ目は「シナプス」と呼ばれ、ここでは神経伝達物質という化学物質を介して信号がやり取りされています。
面白いのは、ニューロンの反応の仕方です。ニューロンは、受け取った刺激が一定の強さ(閾値)を超えるまでは「無反応」ですが、閾値を超えた瞬間に一気に「フル反応」します。中間がないんです。これは「全か無かの法則」と呼ばれる性質で、刺激が弱いうちはピクリとも反応しないのに、ある強さを超えた途端にスイッチが入ったように反応する、というイメージです。この「ある条件を超えたら反応する」という仕組みが、後で説明する人工ニューロンのモデルにもそのまま受け継がれています。
・人工ニューロンを数式にしてみる
この「ニューロンっぽい仕組み」を数式で表現したものが、人工ニューロン(パーセプトロンとも呼ばれます)です。基本的な形は次のようになります。
y = f( Σ wᵢxᵢ )
ちょっと記号が多いので、一つずつ分解してみます。
x₁, x₂, x₃...:
ニューロンへの入力です。画像のピクセル値だったり、文章の特徴量だったりします。
w₁, w₂, w₃...:
それぞれの入力に対する「重み」です。この重みが大きいほど、その入力がニューロンの反応に強く影響します。脳で言えば、シナプスの伝わりやすさのようなものだとイメージしてください。
Σ wᵢxᵢ:
それぞれの入力に重みを掛けて、全部足し合わせたものです。「重み付き総和」と呼ばれます。
f( ):
総和の結果を、最終的な出力に変換する関数です。これを「活性化関数」と呼びます。
y:
ニューロンの最終的な出力です。
つまり人工ニューロンは、「入力を重み付きで足し合わせて、それを活性化関数に通して出力する」という、とてもシンプルな仕組みでできています。
・活性化関数の種類
先ほど出てきた活性化関数 f(x) には、いくつか代表的な種類があります。
ステップ関数:
x が 0未満なら 0、0以上なら 1 を出力する関数です。「閾値を超えたら発火する」という、生物のニューロンの性質をそのまま数式にしたようなシンプルな関数です。
シグモイド関数:
f(x) = 1 / (1 + e⁻ˣ) という式で表される、なめらかなS字カーブを描く関数です。ステップ関数と違って、0と1の間を滑らかに変化するので、「勾配」(傾き)を計算する必要がある後述の学習の仕組みと相性が良く、長く使われてきました。
ReLU(レルー)関数:
f(x) = max(0, x) 、つまり「x が負の数なら0、正の数ならそのままx」というとてもシンプルな関数です。計算がシンプルで学習も進みやすいことから、近年のディープラーニングで最もよく使われている活性化関数です。
・具体例で計算してみる
たとえば、重みが w = (2.0, −1.5, 1.0) のニューロンに、入力 x = (1, 1, 1) が入ってきたとします。まず重み付き総和を計算すると、
2.0×1 + (−1.5)×1 + 1.0×1 = 1.5
となります。これをステップ関数に通すと、1.5は0以上なので出力は y = 1 になります。もし入力が x = (0, 1, 0) だったら、総和は −1.5 となり、出力は y = 0 です。このように、入力の組み合わせによってニューロンが「反応する・しない」を切り替えている、というのが人工ニューロンの基本動作です。
・バイアス項という小さな工夫
ここまでの式には、実はもう一つ大事な要素が抜けています。それが「バイアス項」です。先ほどの図式に、値が常に1の入力と、それに対応する重み w₀ を追加します。
このバイアス項は何のためにあるのかというと、「ニューロンがどれくらい反応しやすいか」という基準点をずらすための仕組みです。バイアスがないと、すべての入力が0のときニューロンの出力は必ず同じ値になってしまいますが、バイアスを加えることで、そうした「入力に関係のない反応のしやすさ」を自由に調整できるようになります。
・ニューロンをたくさんつなげて「多層」にする
1つのニューロンだけでは、できることはかなり限られています。そこで、ニューロンを縦横にたくさん並べて、層(レイヤー)を作り、それを何層も重ねていきます。これが「多層ニューラルネットワーク」で、いわゆる「ディープラーニング」の「ディープ(深い)」は、この層の数が多いことを指しています。
入力層から最初の中間層への変換は、実は行列とベクトルの掛け算として表現できます。例えば3つの入力(x₁, x₂, x₃)から3つの中間層のニューロンへの変換は、
u⁽¹⁾ = W⁽¹⁾ x
のように、重み行列 W⁽¹⁾ を入力ベクトル x に掛ける形で書けます。行列の中の一つ一つの成分が、それぞれのニューロン間のつながりの「重み」に対応しているわけです。この変換を、活性化関数を挟みながら層の数だけ繰り返していくことで、最終的な出力(y)が計算されます。層が深くなるほど、より複雑なパターンを表現できるようになる、というのがディープラーニングの基本的な考え方です。
・「正解」とのズレをどう測るか
ニューラルネットワークに学習させるには、まず「今の出力が、どれくらい正解からズレているか」を数値化する必要があります。この「ズレ」を表す関数を、誤差関数(損失関数)と呼びます。もっともシンプルな誤差関数の一つが、平均二乗誤差(MSE)です。
E(y) = (1/N) Σ (tₙ − yₙ)²
ここで tₙ は「正解」(教師データ)、yₙ はネットワークが実際に出した予測値、N はデータの個数です。予測と正解の差を2乗して平均を取ることで、「どれくらい外れているか」を1つの数値で表しています。2乗しているのは、プラスのズレとマイナスのズレを相殺させないようにするためです。
分類問題(画像がネコかイヌかを当てる、など)では、複数の候補に対する「確率」のような形で出力させたいことが多く、その場合は「ソフトマックス関数」がよく使われます。
yᵢ = softmax(u; i) = eᵘⁱ / Σⱼ eᵘʲ
各出力候補の値を指数関数(eの累乗)にしてから、全体の合計で割ることで、全出力の合計がちょうど1になる「確率っぽい」出力に変換してくれる関数です。
コラム:エントロピーという考え方
講義資料の中には、物理学の「エントロピー」という概念も少し登場していました。調べてみると、もともとは統計力学の用語で、ボルツマンの式 S = ln W (Wは「ありうる状態の数」)として知られているもので、これが情報理論の世界に応用されると、シャノンのエントロピー S = −Σ Pₙ ln Pₙ という形になり、「ある確率分布がどれくらい予測しづらい(不確かな)ものか」を数値化する道具として使われるらしいです。物理学と情報科学、AIが、こんなところでつながっているのは、個人的にはなかなか興味深いポイントでした。
どうやって「正解に近づける」のか:勾配降下法
誤差関数によって「今どれくらいズレているか」が分かったら、次はそのズレを小さくするように、重み(w)を少しずつ調整していきます。この調整方法の基本が「勾配降下法」です。
xₖ₊₁ = xₖ − α∇f(xₖ)
これは、「現在の位置(xₖ)から、関数の傾き(勾配、∇f)が急降下する方向に、少しだけ(学習率αの分だけ)進む」という操作を繰り返す式です。誤差関数を、山と谷がある地形のようなものだとイメージしてください。目隠しをした状態で、足元の傾きだけを頼りに一歩ずつ低い方向へ進んでいけば、いつかは谷底(誤差が最小になる場所)にたどり着けるはず、という発想です。この α(アルファ)は「学習率」と呼ばれ、一歩の歩幅を決める重要なパラメータです。歩幅が大きすぎると谷を飛び越えてしまいますし、小さすぎると学習に時間がかかりすぎてしまいます。
なお、この誤差関数の地形は、実際には谷が1つだけとは限らず、いくつもの谷(局所的な最小値)が存在する複雑な形をしていることが多いです。運悪く浅い谷にはまってしまうと、そこが本当の最適解ではないのに、そこで学習が止まってしまうことがあります。これは「局所最適解の問題」と呼ばれる、ニューラルネットワークの学習における昔からの悩みどころです。
誤差逆伝播法(バックプロパゲーション):層をまたいでズレを伝える
1層だけのシンプルなニューロンであれば、勾配降下法で重みを直接調整すれば済みます。しかし多層のネットワークになると、「最終的な出力のズレ」を、途中の各層の重みにどう反映させればいいのか、という問題が出てきます。これを解決する方法が、ディープラーニングの学習を支える最も重要なアルゴリズムの一つ、「誤差逆伝播法(バックプロパゲーション)」です。
考え方の核心は「連鎖律(チェインルール)」という微分の性質にあります。多層ネットワークの出力は、各層の関数を何重にも合成した形で表せます。
u⁽ⁿ⁾ = f(w⁽ⁿ⁾・u⁽ⁿ⁻¹⁾) = f(w⁽ⁿ⁾・f(w⁽ⁿ⁻¹⁾・u⁽ⁿ⁻²⁾)) = ... = f(w⁽ⁿ⁾・f(w⁽ⁿ⁻¹⁾...f(w⁽¹⁾・x)...))
この合成関数を、それぞれの層の重みで微分すると、連鎖律によって「出力層に近い層の情報」が「入力層に近い層の重みの更新式」の中にも登場することになります。実際に一番出力に近い層の重み w⁽ⁿ⁾ から更新式を作ってみると、
w⁽ⁿ⁾ → w⁽ⁿ⁾ + α(y − f(u⁽ⁿ⁾))f'(u⁽ⁿ⁾)f(u⁽ⁿ⁻¹⁾)
のような形になり、1つ手前の層の重み w⁽ⁿ⁻¹⁾ の更新式には、この w⁽ⁿ⁾ の情報がそのまま掛け合わされて登場します。つまり、出力層で計算した「ズレの情報」を、まるでバケツリレーのように後ろ向きに(出力層→中間層→入力層の順に)伝えていきながら、各層の重みを更新していくわけです。これが「誤差を逆方向に伝播させる」という名前の由来です。
一見複雑に見えますが、やっていることは「出力のズレに、それぞれの層がどれくらい関わっていたかを、連鎖律を使って辿り直しているだけ」です。この仕組みのおかげで、何層にも重なった巨大なネットワークでも、末端の重みまできちんと学習を届けることができるようになっています。
・まとめ
今回は、ニューラルネットワークの土台となる考え方を、脳のニューロンの仕組みから、人工ニューロンのモデル化、多層ネットワークへの拡張、誤差関数、勾配降下法、そして誤差逆伝播法まで一通り追いかけてみました。数式が多く出てきましたが、根っこにあるのは「入力に重みを掛けて足し合わせ、活性化関数を通す」というシンプルな操作の積み重ねと、「出力のズレを少しずつ小さくしていく」という地道な調整の繰り返しです。
次回は、この仕組みを画像の世界に応用した「CNN(畳み込みニューラルネットワーク)」について、画像の表現方法から代表的なモデルまで解説していきます。(お疲れ様でした)