#05 人工知能入門 DNN基礎
順伝播——入力から予測値を計算する流れ
順伝播とは
順伝播(フォワードパス、Forward Propagation)とは、入力データをネットワークに流し、出力(予測値)を計算することです。「順方向」に層を流れていくので「順伝播」と呼ばれます。
学習ではなく「推論」の場面で使われます——例えば「この画像は猫か犬か?」と聞いたとき、ネットワークが答えを出す過程がまさにフォワードパスです。
使うネットワークの構成
今回は次の小さなネットワークで手計算します。
入力層 (2ノード) → 隠れ層 (3ノード) → 出力層 (1ノード)
- 入力: x1 = 1.0, x2 = 0.5
- 活性化関数: 隠れ層はReLU、出力層はSigmoid
STEP 1: 入力 → 隠れ層
隠れ層の各ノードは「入力×重み + バイアス」を計算します。
重みの設定:
w11=0.3, w12=0.4 (入力1,2 → 隠れノード1)
w21=0.2, w22=0.5 (入力1,2 → 隠れノード2)
w31=0.6, w32=0.1 (入力1,2 → 隠れノード3)
バイアス: b1=0.1, b2=-0.2, b3=0.3
各ノードの計算(活性化関数を適用する前の値を「z」と書きます):
z1 = x1×w11 + x2×w12 + b1
= 1.0×0.3 + 0.5×0.4 + 0.1
= 0.3 + 0.2 + 0.1 = 0.6
z2 = x1×w21 + x2×w22 + b2
= 1.0×0.2 + 0.5×0.5 + (-0.2)
= 0.2 + 0.25 - 0.2 = 0.25
z3 = x1×w31 + x2×w32 + b3
= 1.0×0.6 + 0.5×0.1 + 0.3
= 0.6 + 0.05 + 0.3 = 0.95
ReLU適用(0以下は0、それ以上はそのまま):
h1 = ReLU(0.6) = 0.6
h2 = ReLU(0.25) = 0.25
h3 = ReLU(0.95) = 0.95
STEP 2: 隠れ層 → 出力層
出力層の重みとバイアス:
v1=0.4, v2=0.7, v3=-0.3 (各隠れノードの重み)
c = 0.2 (出力バイアス)
計算:
z_out = h1×v1 + h2×v2 + h3×v3 + c
= 0.6×0.4 + 0.25×0.7 + 0.95×(-0.3) + 0.2
= 0.24 + 0.175 - 0.285 + 0.2
= 0.33
Sigmoid適用:
y = Sigmoid(0.33) = 1 / (1 + e^(-0.33))
≈ 1 / (1 + 0.719)
≈ 0.582
計算結果の意味
出力値 0.582 は「58.2%の確率でポジティブ(クラス1)」と読み取れます。
入力層 隠れ層 出力層
[1.0]─────→ [0.6 ]──────────→
[0.5]─────→ [0.25]──────────→ [0.582]
[0.95]──────────→
これがフォワードパスの全体像です。
コードで確認する
Pythonで同じ計算を書くとこうなります:
import numpy as np
# 入力
x = np.array([1.0, 0.5])
# 隠れ層の重みとバイアス
W1 = np.array([[0.3, 0.4],
[0.2, 0.5],
[0.6, 0.1]])
b1 = np.array([0.1, -0.2, 0.3])
# 出力層の重みとバイアス
W2 = np.array([0.4, 0.7, -0.3])
b2 = 0.2
# フォワードパス
z1 = W1 @ x + b1 # 行列積で一括計算
h1 = np.maximum(0, z1) # ReLU
z2 = W2 @ h1 + b2
y = 1 / (1 + np.exp(-z2)) # Sigmoid
print(y) # 約 0.582
W1 @ x は行列積で、3つのノードの計算を一行で表しています。実際のフレームワーク(PyTorch, TensorFlowなど)でも内部でこのような計算が行われています。
実際のモデルとの違い
今回は13個のパラメータの小さなネットワークでした。実際のモデルでは:
| モデル | パラメータ数 |
|---|---|
| LeNet(古典的CNN) | 約6万 |
| ResNet-50 | 約2,500万 |
| GPT-3 | 約1,750億 |
数値の規模は違いますが、基本的な計算の仕組みは今回と同じです。「入力×重み→活性化関数→次の層へ」の繰り返しです。
まとめ
- 順伝播は「入力→各層を順番に計算→予測値を出力」する流れ
- 各ノードは「入力×重みの合計 + バイアス」を計算し、活性化関数を通す
- この流れを層の数だけ繰り返すと最終的な予測値が得られる
- 計算の仕組み自体はシンプルで、パラメータ数が増えても原理は同じ
次回は「予測値がどれだけ正解からズレているか」を測る損失関数について学びます。