Python環境を起動中... 初回のみ数秒かかります
Lesson 11 / 12

NumPyで作るAIの土台

このレッスンで学ぶこと

  • AI推論を構成する 4つの部品を理解できる
  • ReLU / Sigmoid / Softmax をNumPyで実装できる
  • 全結合層の順伝播 X @ W + b を書ける
  • NumPyだけで 2層のニューラルネットの順伝播を完成させられる

1. AI推論の中身を覗いてみよう

📘 このレッスンの読み方(AI未経験の方へ):

このレッスンは他のレッスンと比べて AI(ニューラルネット)特有の用語 が多く登場します。 ただし「AI知識がないと進められない」というものではなく、各用語はその場で「🤖 AI用語メモ」として簡単に補足します。

難しいと感じたら、用語の意味を完全に理解するよりも 「NumPyでこういう計算ができる」という体験 を優先してください。 コードを実行して動きを眺めるだけでも十分価値があります。詳しいAI理論は E資格対策コース等で改めて学べます。

ここまで学んできたNumPyの知識(配列・shape・スライス・ブロードキャスト・行列積)を組み合わせると、 AIの推論(順伝播)処理がそのままコードになります。 このレッスンでは、シンプルな分類モデルの「予測の流れ」をNumPyだけで実装してみます。

🤖 AI用語メモ — 「順伝播(forward pass)」とは?
AIモデルが入力データを受け取り、内部の計算を経て予測結果を出力するまでの「行き」の処理のことです。 学習時には逆向きの「逆伝播(backward pass)」もありますが、このレッスンでは扱いません。 「すでに学習済みのモデルが予測する流れ」に絞って実装します。

一般的な分類AIの順伝播は、次の4つの部品で構成されます。

  1. データ正規化:入力データを平均0・標準偏差1にそろえる(L09で学習)
  2. 全結合層:入力 × 重み + バイアス(L10で学習)
  3. 活性化関数:非線形な変換を加える(このレッスンで学習)
  4. Softmax:最終層の出力を確率に変換(このレッスンで学習)

①〜④を組み合わせることで、PyTorch や TensorFlow が裏でやっているのと 本質的に同じ計算 がNumPyで再現できます。

2. データの正規化(おさらい)

まずは入力データの前処理から。AIモデルは 各特徴量のスケールが揃っていることを前提に動きます。 L09で学んだZスコア正規化をそのまま使います。

sample_1.py
Ctrl+Enter
出力

💡 なぜ正規化するのか: 年齢(数十)・BMI(20台)・SBP(100台)のようにスケールが違うと、AIが「大きい数字の特徴を重視」してしまう偏りが生じます。 正規化で全特徴量を同じ尺度(平均0・標準偏差1)にすることで、各特徴量を公平に扱えるようになります。

3. 活性化関数 — ReLU・Sigmoid・Softmax

活性化関数は、AIの中間層・出力層で値を「非線形に変換する」装置です。 これがないと、AIは「複雑な決定境界」を学習できません。代表的な3つを NumPy で実装してみましょう。

🤖 AI用語メモ — 「活性化関数」「非線形変換」とは?
全結合層(X @ W + b)だけだと、いくら層を重ねても結局は「直線的な変換」しか表現できません。 複雑なパターン(曲がった決定境界)を学ぶには、間に「直線では表せない関数」を挟む必要があります。 これが 活性化関数 で、ReLU・Sigmoid・Softmax などが代表例です。詳細はAI関連コースで扱います。

sample_2.py
Ctrl+Enter
出力
関数出力範囲主な使い所
ReLUmax(0, x)0以上中間層(最も標準的)
Sigmoid1 / (1 + exp(-x))0〜12クラス分類の出力
Softmax各要素の exp / 全要素の exp の和0〜1(合計1)多クラス分類の出力

4. 全結合層の順伝播

L10で学んだ通り、全結合層の計算は X @ W + b です。 関数として切り出しておくと、後で何度も使い回せます。

sample_3.py
Ctrl+Enter
出力

🤖 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. 入力データを正規化
  2. 全結合層1(線形変換)
  3. ReLU で非線形化
  4. 全結合層2(出力層への変換)
  5. Softmax で確率に変換
  6. argmax で最も確率の高いクラスを選ぶ
sample_4.py
Ctrl+Enter
出力

💡 これがAIモデル推論の本質: たった数十行のコードで、AI分類モデルの「予測」の流れを完全に再現できました。 PyTorchやTensorFlowの nn.Linearnn.ReLUnn.Softmax も、内部では 本質的にこれと同じ計算をしています。 違いは「学習(重みの最適化)が自動化されているか」と「GPUで高速化されているか」だけです。

⚠ 注意: このコードでは重み W1W2乱数のまま使っているため、出力は「学習されていないモデルの予測」です。 実際のAIは大量のデータで学習し、重みを最適な値に調整します。 「学習」の中身(逆伝播・勾配降下法) は本コースの範囲を超えるため、E資格対策コースや専門書で学んでください。

6. 練習問題

問題 1

ReLU を実装しよう

配列 x = np.array([-3, -1, 0, 2, 5, -7, 4]) に対して、 ReLU関数(負の値を0に、正の値はそのまま)を適用してください。 np.maximum または np.where を使います。

exercise_1.py
出力
ヒントを見る(答え+解説)
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 の魅力です。

問題 2

Sigmoid を実装しよう

配列 logits = np.array([-2.0, 0.0, 2.0, 4.0]) に対して、 Sigmoid関数 1 / (1 + exp(-x)) を適用してください。 結果は 0〜1の範囲 に収まるはずです。

exercise_2.py
出力
ヒントを見る(答え+解説)
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.5x が大きくなると1に、小さくなると0に近づきます。「確率らしい」値を返す関数として、2クラス分類の出力層で頻出します。

問題 3

全結合層を計算しよう

入力 X(2サンプル × 3特徴量)、重み W(3 × 2)、バイアス b(2要素)から、 全結合層の出力 X @ W + b を計算してください。 出力 shape は (2, 2) になるはずです。

exercise_3.py
出力
ヒントを見る(答え+解説)
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
  • ReLUnp.maximum(0, x) / Sigmoid1/(1+np.exp(-x)) / Softmax:確率分布化
  • 全結合層X @ W + b でブロードキャストを活用
  • 2層ニューラルネットの順伝播はNumPyだけで実装可能
  • PyTorch/TensorFlow の内部処理も 本質的に同じ計算

自由に試してみましょう:

free_practice.py
出力

完了するとコース一覧に進捗が記録されます