ニューラルネットワークの順伝播とは?|入力から出力までの計算を理解する

AI

はじめに

これまでの記事では、人工ニューロンが重み・バイアス・活性化関数を使って出力を計算する仕組みと、ニューラルネットワークに非線形性が必要な理由を説明しました。

では、複数のニューロンをつなぎ合わせたニューラルネットワークでは、入力された値がどのように計算され、最終的な出力になるのでしょうか。たとえば、2つの数値を入力し、中間層にある2つのニューロンを通して、最後に1つの値を出力するネットワークを考えます。

この場合、それぞれのニューロンが計算した結果を、次の層へ順番に渡していきます。このように、入力から出力へ向かって計算を進める処理を順伝播(forward propagation)と呼びます。

順伝播とは、入力層から出力層へ向かって、重み付き和・バイアス・活性化関数による計算を順番に進める処理です。ニューラルネットワークが予測値を求めるための基本となります。

この記事では、小さなニューラルネットワークを使い、入力から出力までの計算を具体的な数値で確認していきます。

この記事でわかること

この記事では、次の内容の理解を目指します。

  • 順伝播とは何をする処理なのか
  • 入力層・中間層・出力層の役割
  • 複数のニューロンがどのようにつながっているのか
  • 中間層の出力を具体的に計算する方法
  • 中間層の結果から最終的な出力を求める方法
  • 順伝播と学習の違い

1.順伝播とは何か?

順伝播は、ニューラルネットワークに入力されたデータを、入力側から出力側へ順番に伝えながら計算する処理です。前回までの記事では、人工ニューロン1個の計算を、次の式で表しました。

$$
y=f(\boldsymbol{w}\cdot\boldsymbol{x}+b)
$$

ここで、\(\boldsymbol{x}\) は入力、\(\boldsymbol{w}\) は重み、\(b\) はバイアス、\(f\) は活性化関数です。ニューラルネットワークでは、この計算を複数のニューロンで行い、ある層の出力を次の層の入力として使います。

つまり、順伝播は「入力 → 中間層で計算 → 次の層へ結果を渡す → 出力層で計算 → 最終的な出力」という流れです。

ここで重要なのは、単に数値を次の層へ渡すだけではないことです。各ニューロンでは、受け取った値に重みを掛け、バイアスを加え、必要に応じて活性化関数を適用します。

2.今回計算するニューラルネットワーク

実際に計算する前に、今回使用するニューラルネットワークの構造を確認しましょう。今回は、次の3つの層からなるネットワークを考えます。

  • 入力層:2つの入力 \(x_1,\ x_2\) を受け取る
  • 中間層:2つのニューロンで計算する
  • 出力層:中間層の結果から1つの値を計算する

入力層はデータを受け取る部分で、今回の例では重み付き和や活性化関数の計算を行いません。実際の計算は、中間層と出力層で行います。

また、今回のネットワークでは、中間層と出力層の活性化関数にReLU関数を使用します。

$$
f(z)=\max(0,\ z)
$$

ReLU関数は、入力が正であればその値をそのまま出力し、\(0\) 以下であれば \(0\) を出力する関数です。ここで、今回のネットワーク全体の構造を図で確認します。

2入力・中間層2ニューロン・出力層1ニューロンの構造図

入力層の2つの値は、中間層にある両方のニューロンへ渡されます。そして、中間層の2つの出力が、出力層のニューロンへ渡されます。

今回のネットワークでは、2つの入力から中間層の2つの値を計算し、その結果を使って最終的な1つの出力を求めます。

3.中間層では何を計算するのか?

まず、中間層の計算を考えます。今回は、2つの入力を \(x_1=2,\ x_2=3\) とします。

中間層には2つのニューロンがあるため、それぞれについて重みとバイアスを設定します。

3.1.中間層の1つ目のニューロン

1つ目のニューロンでは、次の重みとバイアスを使います。

  • 入力 \(x_1\) に対する重み:\(w_{11}^{(1)}=1\)
  • 入力 \(x_2\) に対する重み:\(w_{12}^{(1)}=-1\)
  • バイアス:\(b_1^{(1)}=2\)

ここで、上付きの \((1)\) は中間層を表し、重みの下付き添字は「ニューロン番号、入力番号」の順番で表しています。

まず、重み付き和にバイアスを加えます。

$$
\begin{aligned}
z_1^{(1)}
&=w_{11}^{(1)}x_1+w_{12}^{(1)}x_2+b_1^{(1)}\\
&=1\times2+(-1)\times3+2\\
&=1
\end{aligned}
$$

次に、ReLU関数を適用します。

$$
h_1=f(z_1^{(1)})=\max(0,\ 1)=1
$$

したがって、1つ目のニューロンの出力は \(h_1=1\) です。

3.2.中間層の2つ目のニューロン

2つ目のニューロンでは、次の重みとバイアスを使います。

  • 入力 \(x_1\) に対する重み:\(w_{21}^{(1)}=-1\)
  • 入力 \(x_2\) に対する重み:\(w_{22}^{(1)}=1\)
  • バイアス:\(b_2^{(1)}=-2\)

同じように、重み付き和にバイアスを加えます。

$$
\begin{aligned}
z_2^{(1)}
&=w_{21}^{(1)}x_1+w_{22}^{(1)}x_2+b_2^{(1)}\\
&=(-1)\times2+1\times3-2\\
&=-1
\end{aligned}
$$

次に、ReLU関数を適用します。

$$
h_2=f(z_2^{(1)})=\max(0,\ -1)=0
$$

今回は、重み付き和にバイアスを加えた結果が \(-1\) になりました。しかし、ReLU関数は負の値を \(0\) に変換するため、2つ目のニューロンの出力は \(h_2=0\) になります。

このように、活性化関数によって、次の層へ渡される値が変わることがわかります。

3.3.中間層の計算結果をまとめる

ここまでの計算結果をまとめると、次のようになります。

ニューロン 重み付き和+バイアス ReLU適用後
1つ目 \(z_1^{(1)}=1\) \(h_1=1\)
2つ目 \(z_2^{(1)}=-1\) \(h_2=0\)

中間層では、2つのニューロンがそれぞれ計算を行い、\(h_1=1,\ h_2=0\) という2つの出力が得られました。

1つ目のニューロンではReLU関数を適用しても値が変わりませんでしたが、2つ目では負の値が \(0\) に変換されました。これらの値が、次の出力層への入力になります。

4.出力層では何を計算するのか?

続いて、出力層の計算を考えます。出力層には1つのニューロンがあり、中間層の出力 \(h_1,\ h_2\) を受け取ります。

今回は、次の重みとバイアスを使います。

  • \(h_1\) に対する重み:\(w_{11}^{(2)}=2\)
  • \(h_2\) に対する重み:\(w_{12}^{(2)}=-1\)
  • バイアス:\(b_1^{(2)}=1\)

上付きの \((2)\) は、2番目の計算層である出力層を表しています。

4.1.中間層の出力から重み付き和を計算する

まず、中間層の出力を使って、重み付き和にバイアスを加えます。

$$
\begin{aligned}
z_1^{(2)}
&=w_{11}^{(2)}h_1+w_{12}^{(2)}h_2+b_1^{(2)}\\
&=2\times1+(-1)\times0+1\\
&=3
\end{aligned}
$$

4.2.活性化関数で最終的な出力を求める

最後に、ReLU関数を適用します。

$$
y=f(z_1^{(2)})=\max(0,\ 3)=3
$$

したがって、今回のニューラルネットワークの最終的な出力は、\(y=3\) です。

出力層では、中間層で求めた値を新しい入力として受け取り、重み・バイアス・活性化関数を使って最終的な出力を計算します。

5.入力から出力までの計算を振り返る

ここまで、入力層から中間層、出力層へと順番に計算してきました。計算全体を整理すると、次のようになります。

段階 計算内容 結果
入力層 入力値を受け取る \(x_1=2,\ x_2=3\)
中間層① \(1\times2-1\times3+2=1\) \(h_1=1\)
中間層② \(-1\times2+1\times3-2=-1\) \(h_2=0\)
出力層 \(2\times1-1\times0+1=3\) \(y=3\)

今回は、中間層の1つ目のニューロンではReLU関数を適用しても値が変わらず、2つ目のニューロンでは \(-1\) が \(0\) に変換されました。このように、活性化関数によって各ニューロンの出力が変わり、その結果が次の層の計算に使われます。

計算の順序と、それぞれのニューロンが出力した値を図で確認してみましょう。

順伝播の計算例。入力2と3から中間層の出力1と0を求め、最終出力3を計算する

図を見ると、入力層の \(2,\ 3\) から中間層の \(1,\ 0\) が計算され、最後に \(3\) が出力される流れがわかります。

順伝播では、前の層の出力を次の層の入力として使い、計算を順番に繰り返すことで、ネットワーク全体の出力を求めます。

6.順伝播と学習は何が違うのか?

ここまでの計算では、重みとバイアスの値をあらかじめ決めていました。そして、その値を使って入力から出力までを計算しました。

これが順伝播です。順伝播は、現在の重みとバイアスを使って、ネットワークがどのような出力を返すかを求める処理です。

一方、ニューラルネットワークの学習では、予測結果と正解の違いを小さくするように、重みとバイアスを調整します。一般的な教師あり学習では、次のような流れになります。

  1. 順伝播で予測値を求める
  2. 損失関数で予測値と正解の違いを数値化する
  3. 誤差逆伝播法などを使って、重みやバイアスに関する勾配を求める
  4. 勾配降下法などの方法で、重みとバイアスを更新する

つまり、順伝播そのものは重みやバイアスを更新する処理ではありません。学習の中で予測値を求めるためにも、学習済みのネットワークで新しいデータを処理するためにも使われます。

順伝播は現在の重みとバイアスを使って出力を計算する処理です。一方、学習では、順伝播で得られた予測値などをもとに損失や勾配を計算し、重みとバイアスを更新します。

学習の詳しい仕組みについては、後の「ニューラルネットワークの学習」のシリーズで説明します。

7.ニューロンが増えたらどうなるのか?

今回は、中間層に2つのニューロンしかない小さなネットワークを扱いました。しかし、実際のニューラルネットワークでは、1つの層に多数のニューロンがあることも珍しくありません。

その場合も、基本となる計算は同じです。それぞれのニューロンで、入力に重みを掛け、バイアスを加え、活性化関数を適用します。

ただし、ニューロンが増えると、すべての計算を1つずつ書き出すのは大変になります。たとえば、ある層に100個のニューロンがあれば、それぞれについて重み付き和と活性化関数の計算が必要です。

そこで役立つのが、行列です。複数のニューロンの重みを行列にまとめ、入力をベクトルとして扱えば、1つの層の計算をまとめて表せます。

ニューロンが増えても、順伝播の基本は変わりません。多数のニューロンの計算をまとめて表すために、行列とベクトルが役立ちます。

次回は、今回の計算を行列でどのように表せるのかを見ていきます。

まとめ

今回、見てきたことをまとめます。

  • 順伝播とは、入力から出力へ向かって計算を順番に進める処理である
  • 入力層はデータを受け取り、中間層と出力層でニューロンの計算を行う
  • 各ニューロンでは、重み付き和・バイアス・活性化関数を使って出力を求める
  • 中間層の出力が、次の出力層への入力になる
  • 今回の具体例では、中間層で \(h_1=1,\ h_2=0\) を求め、最終的に \(y=3\) が得られた
  • 順伝播は出力を計算する処理であり、重みやバイアスの更新とは異なる
  • 多数のニューロンの計算は、行列を使ってまとめて表せる

順伝播の本質は、各層で「重み付き和+バイアス→活性化関数」という計算を行い、その出力を次の層へ渡すことです。この処理を繰り返すことで、ニューラルネットワークは入力から最終的な出力を求めます。

今回は、2つの入力と2つの中間ニューロンを使い、順伝播の計算を具体的に確認しました。

では、ニューロンの数が増えたとき、こうした計算をどのように効率よく表せばよいのでしょうか。次回は、「ニューラルネットワークはなぜ行列で計算できるのか?」というテーマで、順伝播と線形代数のつながりを見ていきます。

関連記事

▶ 前回:活性化関数はなぜ必要なのか?|ニューラルネットワークに非線形性が必要な理由
活性化関数はなぜ必要なのか?|ニューラルネットワークに非線形性が必要な理由
活性化関数はなぜニューラルネットワークに必要なのか?線形と非線形の違いから、活性化関数がないと何層重ねても1つのアフィン変換にまとめられる理由、非線形性によって複雑な関係を表現できる仕組みまで、図を使ってわかりやすく解説します。
▶ 関連:ニューロンは何を計算しているのか?|重み・バイアス・活性化関数の役割
ニューロンは何を計算しているのか?|重み・バイアス・活性化関数の役割
ニューラルネットワークのニューロンは何を計算しているのでしょうか?重み・バイアス・活性化関数の役割を、具体的な計算例と図を使ってわかりやすく解説。人工ニューロンの仕組みから、学習によって重みとバイアスを調整する基本的な考え方まで理解できます。
▶ 次回:ニューラルネットワークはなぜ行列で計算できるのか?|線形代数とのつながり
ニューラルネットワークはなぜ行列で計算できるのか?|線形代数とのつながり
ニューラルネットワークはなぜ行列で計算できるのでしょうか?入力・重み・バイアスをベクトルと行列で表し、複数のニューロンの重み付き和をまとめて計算する仕組みを解説。具体的な順伝播の計算例を通して、線形代数とディープラーニングのつながりを理解します。

シリーズ全体を理解する

▶ ディープラーニングの基礎からCNNまでを体系的に学びたい

(準備中)

Phase 1|ニューラルネットワークの基礎をまとめて理解する

▶ ニューラルネットワークの仕組みを基礎から理解したい
ニューラルネットワークの仕組みを基礎から理解する|ニューロン・活性化関数・順伝播
ニューラルネットワークの仕組みを初心者向けに図解。ニューロンの重み・バイアス、活性化関数の役割、順伝播の計算、行列による表現まで、ディープラーニングの基礎を具体例とともにわかりやすく解説します。

関連書籍

ニューラルネットワークの計算や、順伝播の仕組みをさらに詳しく学びたい方には、次の書籍がおすすめです。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 | 斎藤 康毅 |本 | 通販 | Amazon
Amazonで斎藤 康毅のゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装。アマゾンならポイント還元本が多数。斎藤 康毅作品ほか、お急ぎ便対象商品は当日お届けも可能。またゼロから作るDeep Lea...
Pythonによるディープラーニング (Compass Booksシリーズ) | François Chollet, 巣籠悠輔, 株式会社クイープ |本 | 通販 | Amazon
AmazonでFrançois Chollet, 巣籠悠輔, 株式会社クイープのPythonによるディープラーニング (Compass Booksシリーズ)。アマゾンならポイント還元本が多数。François Chollet, 巣籠悠輔, ...
物体・画像認識と時系列データ処理入門 [TensorFlow2/PyTorch対応第2版] NumPy/TensorFlow2(Keras)/PyTorchによる実装ディープラーニング | チーム・カルポ |本 | 通販 | Amazon
Amazonでチーム・カルポの物体・画像認識と時系列データ処理入門 NumPy/TensorFlow2(Keras)/PyTorchによる実装ディープラーニング。アマゾンならポイント還元本が多数。チーム・カルポ作品ほか、お急ぎ便対象商品は当...

コメント

タイトルとURLをコピーしました