本文へスキップ
BecomeCoder

PyTorchコース · 第3章 ニューラルネットワークをnumpyで作る · レッスン9

順伝播 ― 層を重ねる

ブラウザで完結

導入

ニューロンを横に並べたものが 層(レイヤー)、層を縦に重ねたものがネットワークです。入力を受け取り、層から層へ計算を流して出力を得る――この流れを 順伝播(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 に増やしてみましょう。W1b1 の形を変える必要があります。順伝播が最後まで通り、y が1つ表示されれば成功です。

ヒント1を見る

W1 = np.random.randn(5, 2) * 0.5b1 = np.zeros(5) に変えます。

ヒント2を見る

出力層 W2 は隠れ層の数を受けるので np.random.randn(1, 5) にします。ここを直さないと行列の掛け算でエラーになります。

まとめ

  • はニューロンの並び、順伝播は入力を層から層へ流して出力を得る計算。
  • 各層は「行列の掛け算+バイアス+活性化関数」でまとめて計算できる。
  • 隠れ層のニューロン数や層数を増やすほど、表現力(学べる複雑さ)が上がる。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。