本文へスキップ
BecomeCoder

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

ニューロンと活性化関数

ブラウザで完結

導入

ニューラルネットワークの最小部品が ニューロン です。やることは単純で、「入力に重みを掛けて足し、活性化関数を通す」だけ。この小さな部品を大量に繋ぐと、驚くほど複雑なことができます。

説明

1つのニューロンの計算はこうです。

flowchart LR
  x1["入力 x1"] --> sum["重み付き和<br/>z = w1x1 + w2x2 + b"]
  x2["入力 x2"] --> sum
  sum --> act["活性化関数<br/>a = f(z)"]
  act --> out["出力 a"]

もし活性化関数がなければ、何層重ねても結局ただの直線(1次式)にしかなりません。活性化関数という「曲げ」を挟むことで、初めて非線形な(曲がった)関係を表せるようになります。これが NN の力の源です。

代表的な活性化関数:

  • シグモイド:出力を 0〜1 に押し込む。確率のように扱える。1 / (1 + exp(-z))
  • ReLU:負なら0、正ならそのまま。max(0, z)。深いネットで主流。

やってみよう

シグモイドと ReLU を numpy で実装し、いくつかの入力に対する出力を見ます。シグモイドが 0〜1 に収まること、ReLU が負をバッサリ 0 にすることを確かめましょう。

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def relu(z):
    return np.maximum(0, z)

zs = np.array([-3.0, -1.0, 0.0, 1.0, 3.0])
print("入力 z      :", zs)
print("sigmoid(z) :", np.round(sigmoid(zs), 3))
print("relu(z)    :", relu(zs))

演習

ニューロン1個を計算してみましょう。入力 x = [1.0, 2.0]、重み w = [0.5, -1.0]、バイアス b = 0.5 のとき、z = w·x + b を求め、sigmoid(z) を表示してください。

ヒント1を見る

重み付き和は z = np.dot(w, x) + b。内積 np.dotw1*x1 + w2*x2 を計算します。

ヒント2を見る

z = 0.5*1.0 + (-1.0)*2.0 + 0.5 = -1.0。その sigmoid(-1.0) はおよそ 0.269 です。

まとめ

  • ニューロン=「重み付き和 → 活性化関数」の小さな計算単位。
  • 活性化関数(sigmoid/ReLU)の非線形な「曲げ」が、NNに複雑な表現力を与える。
  • 活性化関数がなければ、何層重ねてもただの1次式にしかならない。

実際に動かしてみよう

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

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

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