導入
ニューロンを横に並べたものが 層(レイヤー)、層を縦に重ねたものがネットワークです。入力を受け取り、層から層へ計算を流して出力を得る――この流れを 順伝播(forward) と呼びます。
説明
各層の計算は「行列の掛け算+バイアス、そして活性化関数」でまとめて書けます。ニューロンを1個ずつループする必要はなく、行列演算で一気に処理できるのが numpy / PyTorch の強みです。
flowchart LR x["入力層<br/>x (2)"] --> h["隠れ層<br/>a1 = f(W1·x + b1) (4)"] h --> o["出力層<br/>y = f(W2·a1 + b2) (1)"]
W1 は「隠れ層のニューロン数 × 入力数」の行列。層を重ねるたびに、この掛け算が繰り返されるだけです。
やってみよう
入力2 → 隠れ層3 → 出力1 の小さなネットワークで、順伝播を1回計算します。重みはランダムに初期化します(学習前なので出力は適当ですが、「入力が形を変えて出力まで流れる」感覚を掴んでください)。
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
np.random.seed(0)
x = np.array([0.5, -0.2]) # 入力(2)
W1 = np.random.randn(3, 2) * 0.5 # 隠れ層: 3ニューロン × 入力2
b1 = np.zeros(3)
W2 = np.random.randn(1, 3) * 0.5 # 出力層: 1ニューロン × 隠れ3
b2 = np.zeros(1)
a1 = sigmoid(W1 @ x + b1) # 隠れ層の出力(3)
y = sigmoid(W2 @ a1 + b2) # 最終出力(1)
print("隠れ層の出力 a1:", np.round(a1, 3))
print("最終出力 y :", np.round(y, 3))
演習
隠れ層のニューロン数を 3 から 5 に増やしてみましょう。W1 と b1 の形を変える必要があります。順伝播が最後まで通り、y が1つ表示されれば成功です。
ヒント1を見る
W1 = np.random.randn(5, 2) * 0.5、b1 = np.zeros(5) に変えます。
ヒント2を見る
出力層 W2 は隠れ層の数を受けるので np.random.randn(1, 5) にします。ここを直さないと行列の掛け算でエラーになります。
まとめ
- 層はニューロンの並び、順伝播は入力を層から層へ流して出力を得る計算。
- 各層は「行列の掛け算+バイアス+活性化関数」でまとめて計算できる。
- 隠れ層のニューロン数や層数を増やすほど、表現力(学べる複雑さ)が上がる。