Pythonで学ぶニューロンと活性化関数
人工ニューロンはとても小さな関数です。各入力に重みを掛けてバイアスを足し、その結果を活性化関数に通して、どれだけ強く「発火」するかを決めます。
やさしい言葉で概念を理解する
人工ニューロンはとても小さな関数です。各入力に重みを掛けてバイアスを足し、その結果を活性化関数に通して、どれだけ強く「発火」するかを決めます。
純粋なPythonで人工ニューロンを作ります。入力の重み付き和にバイアスを足し、sigmoidやReLUに通します。
重要なポイント
- 重みは各入力の重要度を表し、バイアスは結果を上下にずらします。
- 活性化関数がなければ、ニューロンを重ねても直線的な(線形)モデルにしかなりません。
- sigmoidは0から1の値を出すので、確率に向いています。
- ReLUは計算が速く、現代のネットワークの隠れ層でよく使われます。
どのような場面で使う?
- ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
- 対応するチャレンジで実装する前に考え方をつかむ。
- 機械学習の講座、面接、プロジェクトに備える。
動かして理解する
スライダーで入力・重み・バイアスを変えてみましょう。重み付き和zがsigmoidとReLUの曲線上を動く様子がわかります。
サンプルコード
main.py
import math
# A neuron multiplies each input by a weight, adds them up and adds a bias.
def dot(a, b):
return sum(x * y for x, y in zip(a, b))
def sigmoid(z):
return 1 / (1 + math.exp(-z)) # squashes any number into (0, 1)
def relu(z):
return max(0.0, z) # keeps positives, turns negatives into 0
inputs = [0.5, -1.0, 2.0]
weights = [0.8, 0.2, -0.5]
bias = 0.1
z = dot(inputs, weights) + bias # weighted sum
print("weighted sum z =", round(z, 3))
print("sigmoid(z) =", round(sigmoid(z), 3))
print("relu(z) =", relu(z))
# The activation decides how strongly the neuron "fires".
for value in [-2, 0, 2]:
print(f"z={value:>2} sigmoid={sigmoid(value):.3f} relu={relu(value)}")
期待される出力
weighted sum z = -0.7
sigmoid(z) = 0.332
relu(z) = 0.0
z=-2 sigmoid=0.119 relu=0.0
z= 0 sigmoid=0.500 relu=0.0
z= 2 sigmoid=0.881 relu=2
仕組み
dot()は重み付き和zを計算します。sigmoidはzを0から1の間に押し込み、ReLUは正の値をそのまま残し、負の値を0にします。ループでは、負・0・正の入力にそれぞれの活性化関数がどう反応するかを示しています。
値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。
練習問題
入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。
- 入力や重みを変えて、実行前に出力を予想してみましょう。
- 途中の値を出力して、計算の各ステップを追いましょう。
- 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- 2つのベクトルの内積 2つのベクトルを要素ごとに掛けて合計します。すべてのニューロンの中心となる計算です。 簡単
- 活性化関数 リストの各値に sigmoid、ReLU、Leaky ReLU、tanh のいずれかを適用します。 簡単
- 1つの人工ニューロン 入力の重み付き和にバイアスを加え、sigmoid を通して1つのニューロンの出力を計算します。 簡単