1. AI推論の中身を覗いてみよう
📘 このレッスンの読み方(AI未経験の方へ):
このレッスンは他のレッスンと比べて AI(ニューラルネット)特有の用語 が多く登場します。 ただし「AI知識がないと進められない」というものではなく、各用語はその場で「🤖 AI用語メモ」として簡単に補足します。
難しいと感じたら、用語の意味を完全に理解するよりも 「NumPyでこういう計算ができる」という体験 を優先してください。 コードを実行して動きを眺めるだけでも十分価値があります。詳しいAI理論は E資格対策コース等で改めて学べます。
ここまで学んできたNumPyの知識(配列・shape・スライス・ブロードキャスト・行列積)を組み合わせると、 AIの推論(順伝播)処理がそのままコードになります。 このレッスンでは、シンプルな分類モデルの「予測の流れ」をNumPyだけで実装してみます。
🤖 AI用語メモ — 「順伝播(forward pass)」とは?
AIモデルが入力データを受け取り、内部の計算を経て予測結果を出力するまでの「行き」の処理のことです。
学習時には逆向きの「逆伝播(backward pass)」もありますが、このレッスンでは扱いません。
「すでに学習済みのモデルが予測する流れ」に絞って実装します。
一般的な分類AIの順伝播は、次の4つの部品で構成されます。
- データ正規化:入力データを平均0・標準偏差1にそろえる(L09で学習)
- 全結合層:入力 × 重み + バイアス(L10で学習)
- 活性化関数:非線形な変換を加える(このレッスンで学習)
- Softmax:最終層の出力を確率に変換(このレッスンで学習)
①〜④を組み合わせることで、PyTorch や TensorFlow が裏でやっているのと 本質的に同じ計算 がNumPyで再現できます。
2. データの正規化(おさらい)
まずは入力データの前処理から。AIモデルは 各特徴量のスケールが揃っていることを前提に動きます。 L09で学んだZスコア正規化をそのまま使います。
💡 なぜ正規化するのか: 年齢(数十)・BMI(20台)・SBP(100台)のようにスケールが違うと、AIが「大きい数字の特徴を重視」してしまう偏りが生じます。 正規化で全特徴量を同じ尺度(平均0・標準偏差1)にすることで、各特徴量を公平に扱えるようになります。
3. 活性化関数 — ReLU・Sigmoid・Softmax
活性化関数は、AIの中間層・出力層で値を「非線形に変換する」装置です。 これがないと、AIは「複雑な決定境界」を学習できません。代表的な3つを NumPy で実装してみましょう。
🤖 AI用語メモ — 「活性化関数」「非線形変換」とは?
全結合層(X @ W + b)だけだと、いくら層を重ねても結局は「直線的な変換」しか表現できません。
複雑なパターン(曲がった決定境界)を学ぶには、間に「直線では表せない関数」を挟む必要があります。
これが 活性化関数 で、ReLU・Sigmoid・Softmax などが代表例です。詳細はAI関連コースで扱います。
| 関数 | 式 | 出力範囲 | 主な使い所 |
|---|---|---|---|
| ReLU | max(0, x) | 0以上 | 中間層(最も標準的) |
| Sigmoid | 1 / (1 + exp(-x)) | 0〜1 | 2クラス分類の出力 |
| Softmax | 各要素の exp / 全要素の exp の和 | 0〜1(合計1) | 多クラス分類の出力 |
4. 全結合層の順伝播
L10で学んだ通り、全結合層の計算は X @ W + b です。
関数として切り出しておくと、後で何度も使い回せます。
🤖 AI用語メモ — 「重みに * 0.5 を掛けるのはなぜ?」
AIモデルの重み(W)を初期化するときは、「適切に小さな値からスタートする」のが定石です。理由は次の2点。
- 大きすぎる重み → 出力が爆発的に大きくなり、学習が不安定になる
- 小さすぎる重み → 信号が層を通過するうちに消えてしまう(勾配消失)
実用的なAI(PyTorch等)では Xavier初期化・He初期化 といった、より数学的に最適な方法が使われます。
本レッスンでは「小さな値でスケーリングする」というイメージを掴むために * 0.5(適当な小さい係数)を使っています。
0.1〜0.5 あたりの値ならどれでも似たような挙動になります(次セクション以降では * 0.3 も登場しますが、同じ意味です)。
実装上のポイントは「重みは小さい値で初期化する」だけ覚えておけばOKです。
PyTorch等のフレームワークでは nn.Linear がこの初期化を自動で行ってくれます。
💡 全結合層の解釈:
(4, 3) @ (3, 5) → (4, 5) という変換は、
「3特徴量を持つ4患者を、5次元の 「より抽象的な特徴空間」 に写す」と解釈できます。
学習が済んだ重み W は、有用な特徴の組み合わせを自動的に発見した結果です。
5. 2層ニューラルネットの順伝播(総合)
部品が揃いました。これらを組み合わせて 「2層のニューラルネット」を組み立ててみましょう。 流れは次の通りです。
- 入力データを正規化
- 全結合層1(線形変換)
- ReLU で非線形化
- 全結合層2(出力層への変換)
- Softmax で確率に変換
- argmax で最も確率の高いクラスを選ぶ
💡 これがAIモデル推論の本質:
たった数十行のコードで、AI分類モデルの「予測」の流れを完全に再現できました。
PyTorchやTensorFlowの nn.Linear・nn.ReLU・nn.Softmax も、内部では 本質的にこれと同じ計算をしています。
違いは「学習(重みの最適化)が自動化されているか」と「GPUで高速化されているか」だけです。
⚠ 注意:
このコードでは重み W1・W2 を 乱数のまま使っているため、出力は「学習されていないモデルの予測」です。
実際のAIは大量のデータで学習し、重みを最適な値に調整します。
「学習」の中身(逆伝播・勾配降下法) は本コースの範囲を超えるため、E資格対策コースや専門書で学んでください。
6. 練習問題
ReLU を実装しよう
配列 x = np.array([-3, -1, 0, 2, 5, -7, 4]) に対して、
ReLU関数(負の値を0に、正の値はそのまま)を適用してください。
np.maximum または np.where を使います。
ヒントを見る(答え+解説)
import numpy as np
x = np.array([-3, -1, 0, 2, 5, -7, 4])
# ReLU を適用してください
y = np.maximum(0, x)
# 代替: y = np.where(x > 0, x, 0)
print("入力:", x)
print("出力:", y) # [0 0 0 2 5 0 4]
np.maximum(0, x) は「0と各要素のうち大きい方」を返すため、負の値は0に、正の値はそのままになります。ReLUの定義そのものです。1行で実装できるシンプルさが NumPy + AI の魅力です。
Sigmoid を実装しよう
配列 logits = np.array([-2.0, 0.0, 2.0, 4.0]) に対して、
Sigmoid関数 1 / (1 + exp(-x)) を適用してください。
結果は 0〜1の範囲 に収まるはずです。
ヒントを見る(答え+解説)
import numpy as np
logits = np.array([-2.0, 0.0, 2.0, 4.0])
# Sigmoid を適用してください
y = 1 / (1 + np.exp(-logits))
print("入力:", logits)
print("出力:", y.round(3))
# → [0.119 0.5 0.881 0.982]
x=0 のとき Sigmoid(0) = 0.5、x が大きくなると1に、小さくなると0に近づきます。「確率らしい」値を返す関数として、2クラス分類の出力層で頻出します。
全結合層を計算しよう
入力 X(2サンプル × 3特徴量)、重み W(3 × 2)、バイアス b(2要素)から、
全結合層の出力 X @ W + b を計算してください。
出力 shape は (2, 2) になるはずです。
ヒントを見る(答え+解説)
import numpy as np
X = np.array([
[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0]
])
W = np.array([
[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6]
])
b = np.array([1.0, -1.0])
# 全結合層の出力を計算してください
out = X @ W + b
print("出力:")
print(out)
# [[3.2 1.8]
# [6.2 5.4]]
print("shape:", out.shape) # (2, 2)
(2, 3) @ (3, 2) → (2, 2) の行列積に、shape (2,) の b がブロードキャストで各行に足されます。1行のコードに、これまで学んできた行列積・ブロードキャストの知識がすべて詰まっています。
7. まとめ
このレッスンのポイント
- AI推論(順伝播)の4部品:正規化 / 全結合層 / 活性化関数 / Softmax
- ReLU:
np.maximum(0, x)/ Sigmoid:1/(1+np.exp(-x))/ Softmax:確率分布化 - 全結合層:
X @ W + bでブロードキャストを活用 - 2層ニューラルネットの順伝播はNumPyだけで実装可能
- PyTorch/TensorFlow の内部処理も 本質的に同じ計算
自由に試してみましょう:
完了するとコース一覧に進捗が記録されます