ニューラルネット 入門
ディープラーニング論文を読む前に必要な最低限のニューラルネット解剖学。4 つの短いトピックで、 どんなモデルの底にも座っている 1 個のニューロン、非線形性を可能にする活性化関数 (そしてなぜ非線形性が必要なのか)、ニューロンが層に組み上がる仕組み、 そしてそれらをつなぐ順伝播 —— 入力 → 層 → 層 → 出力 —— をカバーする。
1 個のニューロン
あらゆる現代モデルの「原子」。
どのディープラーニング論文でも、計算を底まで辿ると、必ず同じものに行き着く:ニューロン。数値をいくつか取り込み、重みのレシピで混ぜ、 バイアスを足し、非線形関数で挟み込み、1 つの数を返す。これを数十億個、正しい順に 積み上げたものが Transformer だ。1 つから始めよう。
1 個のニューロンの数式は 1 行:
output = activation(W · x + b)
4 つの要素、それぞれに役割がある:
- 入力
x—— 入ってくる数値のベクトル。生の特徴 (ピクセル、面積、トークン埋め込み)でも、前の層の出力でもよい。 - 重み
W—— 入力 1 つにつき 1 つの数。 このニューロンにとって各入力がどれだけ重要か、向きはどちらかを表す。 訓練で学習されるのはこれ。 - バイアス
b—— 加重和に足すスカラ。 入力とは独立に、ニューロンの活性を上下にずらすことを許す。 - 活性化関数 —— 非線形関数で、加重和をニューロンの出力に変える。 §2 のテーマ。
具体例。2 入力、1 ニューロン、ReLU 活性化。x = (1.5, −0.7)、W = (0.8, −0.3)、b = 0.2:
W · x = 0.8 · 1.5 + (−0.3) · (−0.7)
= 1.20 + 0.21
= 1.41
W · x + b = 1.41 + 0.20 = 1.61
ReLU(1.61) = max(0, 1.61) = 1.61 ← ニューロン出力W · x の部分は線形代数 primer §5 のドット積そのものだ。重みベクトルが 「どんな入力パターンがこのニューロンを発火させるか」を決める。あらゆるドット積は 類似度スコアと見なせるので、W · x は現在の入力が 「このニューロンが探しているもの」にどれだけ似ているかを測る。 ドット積が大きければ活性は高く、小さい(あるいは負)なら低い。
バイアスは単なる平行移動 —— 加重和がゼロのときのニューロンの「既定の出力」を定める。 バイアスがなければ、入力がすべて打ち消し合った瞬間、各ニューロンは activation(0)しか返せない。バイアスがあると、ニューロンは発火寄りにも沈黙寄りにもできる。 「原点を通らない」関係を表現する自由は、バイアスから来る。
「ニューロン」の比喩はどこから来たのか? ざっくりと生物学から。生物のニューロンは 樹状突起で信号を集め、合計が閾値を超えると軸索を電気パルスが伝わる。 この primer の人工ニューロンはそのとても大雑把な近似:加重和 + 閾値ふうの非線形性。 生物学と数学はとうの昔に分かれていて、現代の深層ネットは意味のある水準で 脳のモデルではない。だが名前は残った。
1 個のニューロン自体は、「線形分類器 + 押しつぶし関数」だ —— 教師あり primer の 線形回帰とほぼ同じもの。「ニューラルネット」への跳躍は、ニューロンを横に並べ(§3)、 さらに層に積む(§4)ことから生まれる。各ニューロン自体は GPT 規模のモデルでも これだけシンプルなままだ。
Transformer では:1 つのアテンションヘッドの出力、前方向(FF)層、 値投影 —— Transformer のすべての学習可能演算は、まさにこの形のニューロンから できていて、より大きな行列に積まれ、アテンションと残差接続で包まれている。 700 億パラメータの LLM を開いても、その底にあるのは特異な何かではなく、 700 億個分のこの W · x + b が正しい網目に糊付けされたものだ。
活性化関数(Activation)
行列積の積み重ねを「本当に強力なもの」に変えるのは、この一段の非線形性。
§1 のニューロンは加重和 W · x + b と、それを包む活性化関数からなる。 加重和は簡単 —— 線形代数だ。魔法は活性化関数で起こる。これがなければ、いくら深いネットでも 1 層分の線形変換以上の表現力を持てない。
論証:活性化なしの 2 つの線形層を重ねると、計算はW₂ · (W₁ · x + b₁) + b₂ になる。乗法を分配すると(W₂ · W₁) · x + (W₂ · b₁ + b₂) となり、2 層は代数的に潰れて重み W₂ · W₁、バイアス W₂ · b₁ + b₂ の単一の線形層と等価になる。 100 層積んでもなお単一の線形関数。どれだけ深くしても、結局直線をデコレートしているだけだ。
活性化関数こそ、この崩壊を止める仕組み。層と層の間に非線形関数 —— 直線でない何か —— を挟むと、層をひとつにまとめられなくなる。重ねることで本当に表現力が増す。 万能近似定理が効くのもこのとき:十分深く非線形活性化を持つネットは、 基本的にあらゆる連続関数を近似できる。
出会うほとんどの場面を 4 つの活性化でカバーできる:
- ReLU ——
max(0, x)。正の数はそのまま通し、負の数は 0 に。 身も蓋もなくシンプル:比較 1 回、超越関数の呼び出しは不要。速くて勾配にも優しい (導関数は 1 か 0 のみ)。2010 年前後から、ほとんどの順方向層の既定。 - シグモイド ——
σ(x) = 1 / (1 + e^(−x))。 0 から 1 へ向かう滑らかな S 字。最も古いニューラルネット活性化で、 出力を[0, 1]に収めたいとき(確率予測など)に有効。 隠れ層内では飽和端で勾配が消えるため、ほぼ置き換わった。 - tanh ——
tanh(x)。−1 から 1 までの S 字 —— ゼロ中心の sigmoid と思ってよい。古いリカレントネット(LSTM、GRU)で多用された。 ゼロ中心出力が必要なときは今も現役。 - GELU ——
x · Φ(x)、Φはガウス CDF。 「負の尾を少しだけ通す滑らかな ReLU」のような形。 現代 Transformer の前方向層の主流活性化(BERT、GPT、ほぼあらゆる最近の LLM で使われる)。 ReLU より勾配の流れが良く、超越関数 1 回分の計算コストを払う。
デモで気にしておきたい 3 点:
- 4 つとも非線形。どれも直線ではない —— それが要点だ。 ReLU が
x = 0で折れる 1 つの「カド」だけで万能近似を解錠するのに十分; sigmoid / tanh / GELU の滑らかな曲線は、それを連続な導関数で実現する。 - sigmoid と tanh は端で飽和する。0 から遠いところでは導関数が ほぼ 0 に縮む。逆伝播(微積分 primer §3)で、その小さな勾配が多くの層をまたいで 掛け合わさり、信号は最初の層に届く前に「消える」。これが現在 ReLU と GELU が主流である理由 —— 勾配が消えない。
- ReLU には「死の領域」がある。負の入力では出力も勾配も厳密にゼロ —— 訓練中ずっと負領域に居座ったニューロンは何も学習できない。 Leaky ReLU、PReLU、ELU、GELU といった派生は、一部この問題への回答だ。
活性化の選択は影響の大きい決定ではないことが多い;現代の経験則は 「ReLU でほぼ何でもよい、Transformer の既定は GELU、確率が必要なときだけ sigmoid」。 まずデータ、アーキテクチャ、オプティマイザを気にする;それらが片付いたら活性化に戻る。
Transformer では:各 Transformer ブロック内の前方向サブレイヤはGELU(x · W₁ + b₁) · W₂ + b₂ を計算する —— 2 つの線形層の間に GELU。 図中の「FFN」「MLP」とはまさにこれ。新しい変種(LLaMA・PaLM の SwiGLU)は GELU をやや凝ったゲート構造に置き換えるが、原則は同じ:非線形性を挟まなければ、スタック全体が 1 つの線形写像に潰れる。
層(Layers)
同じ入力を見るニューロンの列を、行列に組み上げる。
§1 のニューロンは入力ベクトルから 1 つの数を返す。これがボトルネックだ —— 役に立つ大半のモデルはステップごとに多くの数を出す。層はその自然な解:複数のニューロンを並べて同じ入力を与え、それぞれが自分の重みとバイアスを 適用し、出力を新しいベクトルに集める。これだけだ。 層とは、同じ入力を見るニューロンの列。
どんなネットにもある 3 つの役割:
- 入力層(input layer)—— 計算上の意味では「層」ではない —— モデルが受け取る入力ベクトル
xそのもの。 サイズは問題で決まる(特徴数、ピクセル数、トークン埋め込みの次元)。 - 隠れ層(hidden layers)—— ネットの中段。各隠れ層は 前層の出力を取り、自身の
Wとbを適用し、 次層用の新しいベクトルを生む。「深層」学習とはこれが多いこと。 - 出力層(output layer)—— 最後の層。サイズはタスクで決まる: 回帰なら 1、ImageNet 10 クラスなら 10、LLM の語彙なら 5 万。
ニューロンを層に並べると、線形代数 primer は「ドット積の列」を「行列 × ベクトル」1 つに まとめる。層が m 個の入力と n 個の出力を持つなら:
h = activation(W · x + b)
§1 と同じ式 —— ただし W は n × m 行列(ニューロンごとに 1 行)、b は長さ n のベクトル、出力 h も長さ n のベクトル。 線形代数 primer §6(行列積)が記録を担う。コンピュータ科学全体で見て、 「行列 × ベクトル」の最も重要な応用がニューラルネットの層だ。
具体例。入力 2、層に 3 ニューロン、ReLU 活性化。x = (1.5, −0.7):
x = ( 1.5, −0.7 )
W (3 × 2) = ┌ 0.8 −0.3 ┐ ← ニューロン 1 の重み
│ −0.4 0.6 │ ← ニューロン 2 の重み
└ 0.5 0.9 ┘ ← ニューロン 3 の重み
b = ( 0.2, 0.1, −0.5 )
W · x = ( 0.8·1.5 + (−0.3)·(−0.7),
−0.4·1.5 + 0.6 ·(−0.7),
0.5·1.5 + 0.9 ·(−0.7) )
= ( 1.41, −1.02, 0.12 )
+ b = ( 1.61, −0.92, −0.38 )
ReLU(·) = ( 1.61, 0.00, 0.00 ) ← 層の出力どの層も 2 つの次元で記述できる:
- 幅(width)。層内のニューロン数 —— つまり出力次元。 幅が大きい = 層あたりのパラメータが多い = 1 層の表現力が増す可能性。
- 深さ(depth)。積まれた層の数。深いほど 「特徴を抽出し、再結合し、さらに特徴を抽出する」回数が増える。
現代のモデル設計は「幅 vs 深さ」のトレードオフの中で生きている。幅を広げるとパラメータは 二乗で増える(入出力幅 w の層は w² 個の重みを持つ)。 深さを増やすと線形に増える(幅 w の層を 1 つ加えれば、何層あろうと追加はw² 個だけ)。よくある規模:
- 表形式データ用の小型 MLP。隠れ層 2-3、各層幅 64-256。 合計で数万パラメータ。
- ResNet-50(画像分類)。約 50 層、約 2500 万パラメータ。 2018 年頃の ImageNet SOTA。
- LLaMA 3(70B)。80 個の Transformer ブロック、 各ブロックに隠れ幅 8192 のサブレイヤ複数。700 億パラメータ。
スケールがどうあれ、1 層の内部演算は §1 の activation(W · x + b) のまま —— ただ行列が大きいだけ。
Transformer では:1 つの Transformer ブロックは複数の層を含み、 いずれもこの形だ。アテンションサブレイヤは各入力ベクトルを3 つの学習可能行列 (Q・K・V 投影 —— それぞれがここで言う「層」)を通す。前方向サブレイヤは 2 つの線形層の間に GELU(§2 の脚注)。LayerNorm と残差接続が周囲を包む。 700 億パラメータの LLM は、このブロックを 80 個直列につないだもの。 同じ W · x + b という積み木が 1 万回繰り返され、特定の網目に配置されているだけ。
順伝播(Forward Pass)
入力をすべての層に順に通す —— それがモデルの「やっていること」。
§3 で 1 つの層を見た;「深層」学習はそれを多数与える。順伝播とは、 それらをまとめて使う簡単なレシピだ:入力を 1 層目に渡し、1 層目の出力を 2 層目に、 2 層目の出力を 3 層目に、と続け、最終層がモデルの予測を出すまで。モデルが表す関数は、 各層の関数の合成だ。
1 行の式で表せる:
ŷ = fL( … f2( f1(x) ) … )
ここで各 fi は §3 の形をした層 activation(Wi · hi−1 + bi)。 順伝播は単なる関数の合成 —— 微積分 primer §3 (連鎖律)の概念を、 今度は最適化器ではなくモデル側から見たもの。
具体例。小さな MLP:入力 2 → 隠れ層 3 ニューロン(ReLU)→ 出力 1 ニューロン (回帰、活性化なし)。x = (1.5, −0.7)。§3 で 1 層目はすでに計算済みで、 出力は h₁ = (1.61, 0, 0)。2 層目がそれを受けて最終予測を生む:
1 層目(§3 で計算済み) ──────────────────────────────── x = (1.5, −0.7) W₁ · x + b₁ = (1.61, −0.92, −0.38) h₁ = ReLU(·) = (1.61, 0, 0) 2 層目(出力) ──────────────────────────────── W₂ = ( 0.6, −0.2, 0.4 ) (出力がスカラなので 1 行) b₂ = 0.1 W₂ · h₁ = 0.6·1.61 + (−0.2)·0 + 0.4·0 = 0.966 W₂ · h₁ + b₂ = 0.966 + 0.1 = 1.066 ŷ = 1.066 ← x = (1.5, −0.7) に対するモデルの予測
これがモデル全体だ:2 次元入力 (1.5, −0.7) をスカラ出力 1.066へ写す関数。訓練はすべての重みとバイアス —— 各 Wi とbi —— の上での探索で、ŷ がデータセット全体で 真のラベルにできるだけ一致する値を見つけること。教師あり primer §3 の最適化、 勾配降下 primer の訓練ループがやっているのはまさにそれだ、何十億回も繰り返す。
順伝播について身につけたい 3 点:
- 完全に決定論的。重みが固定されれば、順伝播は純粋関数: 同じ入力は常に同じ出力。現代の LLM の「同じプロンプトで毎回違う応答」のランダム性は、 出力分布からのサンプリング(確率統計 primer §2)から来るのであり、 ネットワーク内部にランダム性があるわけではない。
- 並列性が高い。各層の計算は行列積 1 つ —— GPU が高速に処理するよう 設計された演算そのもの。現代のアクセラレータなら、700 億パラメータの LLM での 1 入力分の順伝播はおよそ 50ms。
- 推論時と訓練時で形は同じ。訓練済みモデルを使う(推論)とき、 やることは順伝播だけ。訓練ではその上に逆伝播を載せて勾配を計算する (微積分 primer §3)が、順伝播そのものは両者で同一。
訓練と順伝播の関係は? 3 ステップを何百万回も繰り返す:
- 順伝播 —— 入力をすべての層に通し、予測から損失を計算。
- 逆伝播 —— 各層を逆向きにたどり、局所勾配を掛け合わせて (連鎖律)各重みに対する
∂L / ∂Wiを得る。 - 更新 —— 各
Wiとbiに 勾配降下のステップ(勾配降下 primer §1)を適用。
順伝播はこのループの 3 分の 1 だが、本番で唯一動く 3 分の 1 でもある。 訓練済みモデルを使うとき、ChatGPT API への呼び出し、拡散モデルが生む各画像、 AlphaFold が予測する各タンパク質 —— すべて 1 回の順伝播。
Transformer では:順伝播は入力トークンを通す経路 —— トークン埋め込み → 80 個の Transformer ブロック(各々アテンション、残差、LayerNorm、 §3 の前方向サブレイヤを含む)→ 語彙サイズへの最終線形投影 → softmax で 次トークン分布。ユーザ側から見ると、ChatGPT が応答をタイプしている様子は、 同じネットワーク上での何千回もの順伝播 —— 出力トークン 1 つにつき 1 回 —— に過ぎない。 Transformer はアーキテクチャ;順伝播はそれがやっていることだ。