「ニューラルネットワークって、どうやって答えを出すの?」
「順伝播と逆伝播の違いが分からない…」
AIや機械学習の基礎となるのが、順伝播(Forward Propagation)です。
この記事では、ニューラルネットワークにおける順伝播の仕組みについて、基礎から実践まで分かりやすく解説していきますね。
順伝播の基本概念

順伝播って何?
順伝播(Forward Propagation)は、ニューラルネットワークが入力データから予測結果を計算するプロセスです。
データが入力層から隠れ層を通って出力層へと、一方向に流れていく様子から「順伝播」と呼ばれています。
水が高いところから低いところへ流れるように、情報が前方向に伝わっていくイメージですね。
なぜ順伝播が重要なの?
順伝播は、ニューラルネットワークの「予測」を行う部分です。
予測の実行
画像認識なら「これは猫の画像」、数値予測なら「明日の気温は25度」といった結果を出します。
学習の前提
逆伝播による学習を行うには、まず順伝播で予測値を計算する必要があります。
推論フェーズ
学習が終わった後、実際にモデルを使う時は順伝播だけを実行するんですね。
身近な例で理解する
レストランでの注文処理に例えてみましょう。
入力層: お客さんの注文(料理名、個数)
隠れ層: 厨房での調理プロセス(材料の準備、調理、盛り付け)
出力層: 完成した料理
注文から料理が出てくるまでの一連の流れが、順伝播に相当しますよ。
ニューラルネットワークの基本構造
3つの層
ニューラルネットワークは、複数の層で構成されています。
入力層(Input Layer)
データを受け取る最初の層です。
画像なら各ピクセルの値、数値データなら各特徴量が入力されます。
隠れ層(Hidden Layer)
データを変換・処理する中間層です。
複数の隠れ層を持つネットワークを「ディープニューラルネットワーク」と呼びますね。
出力層(Output Layer)
最終的な予測結果を出力する層です。
分類問題なら各クラスの確率、回帰問題なら予測値が出力されます。
ニューロン(ノード)
各層は、複数のニューロンで構成されています。
役割:
- 複数の入力を受け取る
- それぞれの入力に重み(weight)を掛ける
- バイアス(bias)を足す
- 活性化関数を適用して出力
人間の脳の神経細胞を模倣した設計なんです。
重みとバイアス
ニューラルネットワークが学習する主なパラメータです。
重み(Weight):
各入力の重要度を表す数値です。
重要な特徴には大きな重みが、重要でない特徴には小さな重みが設定されます。
バイアス(Bias):
出力を調整するための定数項です。
関数全体を上下にシフトさせる役割を果たしますね。
順伝播の計算プロセス
ステップ1:入力データの準備
最初に、データをネットワークに入力できる形式に変換します。
例:手書き数字認識の場合
28×28ピクセルの画像を、784個の数値(各ピクセルの明るさ)に変換します。
この784個の数値が、入力層の各ニューロンに対応するんですね。
ステップ2:重み付き和の計算
各ニューロンで、以下の計算を行います。
z = (w1 × x1) + (w2 × x2) + ... + (wn × xn) + b
記号の意味:
- x:入力値
- w:重み
- b:バイアス
- z:重み付き和(活性化関数に渡す前の値)
複数の入力を1つの数値にまとめる処理です。
ステップ3:活性化関数の適用
計算した重み付き和に、活性化関数を適用します。
a = f(z)
活性化関数の役割:
非線形性を導入することで、複雑なパターンを学習できるようにします。
線形計算だけでは、単純な直線的な関係しか表現できませんからね。
ステップ4:次の層へ伝播
1つの層で計算された出力が、次の層の入力になります。
この処理を、出力層に到達するまで繰り返します。
最終的に得られる値が、ネットワークの予測結果ですよ。
主要な活性化関数

シグモイド関数(Sigmoid)
S字カーブを描く関数です。
特徴:
- 出力範囲:0〜1
- 確率を表現するのに適している
- 勾配消失問題が起こりやすい
式:
sigmoid(z) = 1 / (1 + e^(-z))
2値分類の出力層でよく使われます。
ReLU(Rectified Linear Unit)
最も人気のある活性化関数です。
特徴:
- 計算が簡単
- 勾配消失問題を軽減
- ディープラーニングで標準的
式:
ReLU(z) = max(0, z)
負の値は0に、正の値はそのまま出力しますね。
tanh(ハイパボリックタンジェント)
シグモイドに似ていますが、範囲が異なります。
特徴:
- 出力範囲:-1〜1
- 0を中心に対称
- シグモイドより勾配が大きい
隠れ層でよく使用されます。
Softmax
多クラス分類の出力層で使用されます。
特徴:
- すべての出力の合計が1になる
- 各クラスの確率として解釈可能
「この画像が猫である確率は80%、犬である確率は15%、鳥である確率は5%」のような出力が得られますよ。
具体例:単純なネットワークでの計算
シンプルな例で理解する
2つの入力、1つの隠れ層(2ニューロン)、1つの出力のネットワークを考えます。
入力データ:
- x1 = 2.0
- x2 = 3.0
重みとバイアス(仮の値):
隠れ層の1番目のニューロン:
- w11 = 0.5, w12 = 0.3, b1 = 0.1
隠れ層の2番目のニューロン:
- w21 = 0.4, w22 = 0.6, b2 = 0.2
隠れ層の計算
1番目のニューロン:
z1 = (0.5 × 2.0) + (0.3 × 3.0) + 0.1 = 2.0
a1 = ReLU(2.0) = 2.0
2番目のニューロン:
z2 = (0.4 × 2.0) + (0.6 × 3.0) + 0.2 = 2.8
a2 = ReLU(2.8) = 2.8
出力層の計算
隠れ層の出力(a1とa2)を入力として計算します。
出力 = (w_out1 × 2.0) + (w_out2 × 2.8) + b_out
この最終的な値が、ネットワークの予測結果になりますね。
ベクトル化と行列演算
効率的な計算方法
実際の実装では、行列演算を使って一度に計算します。
1つずつ計算する場合(遅い):
z1 = w1 * x1 + w2 * x2 + b
z2 = w3 * x1 + w4 * x2 + b
z3 = w5 * x1 + w6 * x2 + b
行列演算(高速):
Z = W @ X + B
@は行列の乗算を表します。
GPUを使えば、さらに高速化できるんです。
NumPyでの実装例
Pythonで順伝播を実装してみましょう。
import numpy as np
# 入力データ
X = np.array([[2.0], [3.0]])
# 重みとバイアス
W1 = np.array([[0.5, 0.3],
[0.4, 0.6]])
b1 = np.array([[0.1], [0.2]])
# 隠れ層の計算
Z1 = np.dot(W1, X) + b1
A1 = np.maximum(0, Z1) # ReLU
# 出力層の計算(省略)
行列演算を使うことで、コードが簡潔になりますね。
バッチ処理
複数データの同時処理
実際には、1つのデータではなく複数のデータを同時に処理します。
バッチとは:
一度に処理する複数のデータのまとまりです。
メリット:
- 計算効率が向上
- 学習が安定する
- GPUの性能を最大限活用
バッチサイズ:
一般的には32、64、128などの2の累乗が使われますよ。
バッチ処理の計算
入力データの形状が変わります。
1つのデータ:
- 形状:(特徴数, 1)
バッチ処理:
- 形状:(特徴数, バッチサイズ)
行列の次元が増えますが、計算方法は基本的に同じです。
分類問題での順伝播
2値分類(Binary Classification)
出力が0か1の2つのクラスを予測します。
出力層:
- ニューロン数:1個
- 活性化関数:Sigmoid
- 出力の解釈:クラス1である確率
例:スパムメール判定
出力が0.8なら「80%の確率でスパム」と判断できますね。
多クラス分類(Multi-class Classification)
3つ以上のクラスから1つを選択します。
出力層:
- ニューロン数:クラス数と同じ
- 活性化関数:Softmax
- 出力の解釈:各クラスの確率
例:手書き数字認識(0〜9の10クラス)
出力層には10個のニューロンがあり、それぞれが各数字の確率を出力します。
回帰問題での順伝播
連続値の予測
カテゴリではなく、具体的な数値を予測する問題です。
出力層:
- ニューロン数:予測する値の数
- 活性化関数:なし(線形)、またはReLU
- 出力の解釈:予測される数値
例:
- 住宅価格の予測
- 気温の予測
- 株価の予測
出力層で活性化関数を使わない場合、任意の実数値を出力できますよ。
順伝播と逆伝播の関係
学習サイクル
ニューラルネットワークの学習は、2つのプロセスで成り立っています。
順伝播(Forward Propagation):
入力から予測を計算します。
損失の計算:
予測と正解の差(誤差)を計算しますね。
逆伝播(Backpropagation):
誤差を使って、重みとバイアスを更新します。
繰り返し:
このサイクルを何千、何万回と繰り返すことで、ネットワークが学習するんです。
推論時の順伝播
学習が完了したモデルを使う時は、順伝播だけを実行します。
逆伝播は不要なので、処理が高速になりますよ。
計算グラフ
視覚的な理解
順伝播の流れを図で表現できます。
ノード: 変数や演算
エッジ: データの流れ
例:z = w × x + b
x → [×] → [+] → z
↑ ↑
w b
このグラフを辿ることで、計算の順序が明確になりますね。
中間値の保存
順伝播で計算した中間値は、逆伝播で使用されます。
そのため、各層の出力を保存しておく必要があるんです。
メモリ効率とのトレードオフを考慮する場合もあります。
実装上の注意点

数値の安定性
計算中に問題が起こらないようにする工夫が必要です。
オーバーフロー対策:
非常に大きな数値の計算を避けます。
Softmaxでは、最大値を引いてから計算する「数値安定版」が使われますね。
アンダーフロー対策:
非常に小さな数値がゼロになるのを防ぎます。
対数を使った計算で回避できますよ。
初期化
重みの初期値設定は重要です。
ゼロ初期化(NG):
すべての重みを0にすると、学習が進みません。
ランダム初期化(推奨):
小さなランダム値で初期化します。
Xavier初期化、He初期化:
活性化関数に応じた適切な初期化方法が提案されています。
PyTorchでの実装例
シンプルなネットワーク
実際のコードで順伝播を実装してみましょう。
import torch
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(784, 128) # 入力→隠れ層
self.fc2 = nn.Linear(128, 10) # 隠れ層→出力
def forward(self, x):
# これが順伝播の処理
x = torch.relu(self.fc1(x)) # 隠れ層
x = self.fc2(x) # 出力層
return x
# モデルの作成
model = SimpleNet()
# 順伝播の実行
input_data = torch.randn(1, 784) # ランダムな入力
output = model(input_data) # forward()が自動的に呼ばれる
forward()メソッドが、順伝播の処理を定義しています。
TensorFlow/Kerasでの実装
import tensorflow as tf
from tensorflow import keras
# モデルの定義
model = keras.Sequential([
keras.layers.Dense(128, activation='relu', input_shape=(784,)),
keras.layers.Dense(10, activation='softmax')
])
# 順伝播の実行
input_data = tf.random.normal([1, 784])
output = model(input_data) # 自動的に順伝播が実行される
Kerasでは、モデルを呼び出すだけで順伝播が実行されますよ。
パフォーマンス最適化
GPU活用
順伝播の計算は、GPUで大幅に高速化できます。
CPUとGPUの違い:
- CPU:複雑な処理が得意、コア数は少ない
- GPU:単純な計算を大量並列処理、コア数が多い
行列演算はGPUが得意な処理なんですね。
ミニバッチの活用
適切なバッチサイズで、効率が向上します。
小さすぎる(1〜8):
GPUを活用できない
大きすぎる(1024〜):
メモリ不足になる可能性がある
推奨:32〜256
環境に応じて調整しましょう。
混合精度計算
通常は32ビット浮動小数点(FP32)を使いますが、16ビット(FP16)を組み合わせることで高速化できます。
精度をほとんど犠牲にせずに、計算速度とメモリ使用量を改善できますよ。
デバッグとトラブルシューティング

よくある問題
順伝播の実装でつまずきやすいポイントです。
形状の不一致:
行列の次元が合わないエラーが頻繁に起こります。
各層の入出力サイズを確認しましょう。
NaNの発生:
計算中に「Not a Number」が発生することがあります。
学習率が高すぎる、初期化が不適切などが原因ですね。
勾配消失・爆発:
深いネットワークで、勾配が極端に小さく(または大きく)なる問題です。
適切な活性化関数や正規化手法で対策できます。
デバッグのコツ
中間層の出力確認:
各層の出力を表示して、異常な値がないか確認します。
小さなデータで検証:
最初は少量のデータで動作確認しましょう。
既存実装と比較:
PyTorchやTensorFlowの標準実装と結果を比較するのも有効ですよ。
まとめ:順伝播を理解してAIの基礎を固めよう
順伝播は、ニューラルネットワークが予測を行う核心的なプロセスです。
基本的な仕組みを理解することで、より高度なディープラーニングへの道が開けます。
この記事の重要ポイント:
- 順伝播は入力から出力への一方向の計算プロセス
- 各層で重み付き和を計算し、活性化関数を適用
- ReLUは隠れ層で最も一般的な活性化関数
- Softmaxは多クラス分類の出力層で使用
- 行列演算で効率的に計算できる
- バッチ処理で複数データを同時に処理
- 順伝播と逆伝播で学習サイクルを構成
- 推論時は順伝播のみを実行
- 数値安定性と適切な初期化が重要
- PyTorchやTensorFlowで簡単に実装可能
まずは小さなネットワークで、手計算で順伝播を追ってみましょう。
実際に計算することで、ニューラルネットワークの理解が深まっていきますよ。


コメント