ニューラルネットワークの信号の伝達と順伝播(行列計算)について



1. ニューラルネットワークとは?
ニューラルネットワーク(NN)は、人間の脳の神経細胞(ニューロン)の構造にヒントを得たアルゴリズムです。ニューラルネットワークは、複数の層で構成され、それぞれの層にニューロンと呼ばれるものが存在します。各ニューロンは入力信号を受け取り、それを処理して次の層に信号を伝達します。
2. 順伝播(フォワードプロパゲーション)
順伝播(forward propagation)とは、ニューラルネットワークにおいて入力データが各層を通過し、最終的に出力が得られるまでのプロセスです。このプロセスでは、入力層から始まり、中間層(隠れ層)を通って出力層に至るまで、信号がネットワーク内を進みます。順伝播では、行列計算が重要な役割を果たします。
2.1. 順伝播の基本的な流れ
- 入力信号の受け取り: 入力層の各ノードにデータが入力されます。
- 重みとバイアスの適用: 入力データは重み行列と掛け合わされ、バイアス項が加えられます。これにより、各ニューロンが次の層に送る信号が計算されます。
- 活性化関数の適用: 各ニューロンで活性化関数が適用され、非線形性を導入します。この非線形性により、ニューラルネットワークは複雑なパターンを学習できるようになります。
- 出力信号の計算: 最後に出力層に達した信号が、ネットワーク全体の出力となります。


2.2. 重みとは
ニューラルネットワークの「重み」とは、ネットワーク内の各ノード(ニューロン)同士が持つ「つながりの強さ」を表す値のことです。ニューラルネットワークの学習では、この重みが少しずつ調整され、ネットワークがより正確に判断できるようにしていきます。
3. 順伝播における行列計算
順伝播の中心的な計算は、行列の掛け算です。各層のニューロンは、前の層の出力を基に計算を行います。


3.1. 順伝播
入力データとして、$x_1, x_2, \cdots, x_n$ という値が与えられたとき、それがどのように計算され、出力$y_1$になるかを考えてみましょう。
まず、出力$y_1$は次の式で表されます。
\[ y_1 = \sum_{i=1}^m w_{1i}x_i + b_1 \]
この式は、入力の各$x_i$に対して、それぞれの重み$w_{1i}$を掛けた後、すべてを合計し、さらにバイアス項$b_1$を足したものです。同様に、他の出力$y_j$も以下のように計算されます。
\[ y_j = \sum_{i=1}^m w_{ji}x_i + b_j \]
これは、出力ごとに異なる重み$w_{ji}$とバイアス$b_j$を使用する点が特徴です。$y_1$と同様に、各出力$y_j$は対応する重み付けされた入力の合計にバイアスが加えられたものです。
これを行列を使ってまとめて表すと、次のようになります。
\[ \mathbf{X} = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix},\mathbf{b} = \begin{bmatrix} b_1 \\ b_2 \\ \vdots \\ b_n \end{bmatrix},W = \begin{bmatrix} w_{11} & w_{12} & \cdots & w_{1n} \\ w_{21} & w_{22} & \cdots & w_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{m1} & w_{m2} & \cdots & w_{mn} \end{bmatrix} \]
順伝播を行列で計算すると、
\[ Y = \mathbf{X}W + \mathbf{b} \]
ここで、$Y$は各出力$y_j$の値が並んだベクトルです。さらに、この出力に活性化関数$f$を適用すると、最終的な結果$Z$が得られます。
\[ Z = f(Y) = f(\mathbf{X}W + \mathbf{b}) \]
4. 3層ニューラルネットワークの順伝播
仮に、あるニューラルネットワークが次のような構造を持つとします。
- 入力層:3つのノード
- 隠れ層:2層構成で、最初の隠れ層には4つのノード、2番目の隠れ層には3つのノード
- 出力層:1つのノード

ここでは、このニューラルネットワークの「順伝播」と呼ばれる処理の流れを説明していきます。順伝播は、データが入力層から隠れ層を経由して出力層に伝わり、最終的な結果を得る過程を指します。
4.1. 入力データとバイアスの準備
まず、ニューラルネットワークに入力するデータとバイアスを用意します。
入力データ \( X \) は、3つの値 \( x_1, x_2, x_3 \) を含み、それぞれの値が1つの入力ノードに対応しています。また、バイアス項 \(\mathbf{b_1}\) も準備し、4つの値 \( b_1^{(1)}, b_2^{(1)}, b_3^{(1)},b_4^{(1)} \) を持ちます。
\[ X = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \end{bmatrix} , \quad \mathbf{b_1} = \begin{bmatrix} b_1^{(1)} \\ b_2 ^{(1)} \\ b_3^{(1)} \\ b_4^{(1)} \end{bmatrix} \]
4.2. 隠れ層1の計算
入力層から最初の隠れ層へ情報を伝達するために、重み行列 \( W_1 \) を用います。この行列は、入力層の3つのノードと隠れ層1の4つのノードの間の重みを表しています。具体的には次のようになります。
\[ W_1 = \begin{bmatrix} w_{11}^{(1)} & w_{12}^{(1)} & w_{13}^{(1)} \\ w_{21}^{(1)} & w_{22}^{(1)} & w_{23}^{(1)} \\ w_{31}^{(1)} & w_{32}^{(1)} & w_{33}^{(1)} \\ w_{41}^{(1)} & w_{42}^{(1)} & w_{43}^{(1)} \end{bmatrix} \]
次に、この重み行列 \( W_1 \) と入力データ \( X \) を掛け合わせ、バイアス項 \(\mathbf{b}\) を加えます。この計算によって、隠れ層1に送られる信号 \( Z_1 \) が得られます。
\[ Z_1 = W_1 X + \mathbf{b_1} \]
この \( Z_1 \) は、隠れ層1の各ノードに伝わる値の集合です。このままでは生の信号のままなので、次に「活性化関数」を適用します。活性化関数は、信号を変換するための関数です。例えば、ReLU(ゼロ以上の値だけを残す)やシグモイド(値を0から1の範囲に収める)などがあります。ここでは、活性化関数を \( f \) とします。
隠れ層1の信号 \( Z_1 \) に対して活性化関数 \( f \) を適用し、隠れ層1の出力 \( A_1 \) を計算します。
\[ A_1 = f(Z_1) \]
4.3. 隠れ層2の計算
次に、隠れ層1から隠れ層2への信号を計算します。重みの行列$W_2$とバイアス項$\mathbf b_2$は次のようになります。
\[ W_2 = \begin{bmatrix} w_{11}^{(2)} & w_{12}^{(2)} & w_{13}^{(2)} & w_{14}^{(2)} \\ w_{21}^{(2)} & w_{22}^{(2)} & w_{23}^{(2)} & w_{24}^{(2)} \\ w_{31}^{(2)} & w_{32}^{(2)} & w_{33}^{(2)} & w_{34}^{(2)} \end{bmatrix}, \, \mathbf{b_2} = \begin{bmatrix} b_1^{(2)} \\ b_2 ^{(2)} \\ b_3^{(2)} \end{bmatrix} \]
隠れ層2では、隠れ層1の出力 \( A_1 \) と、隠れ層2に対応する重み行列 \( W_2 \) を掛け合わせ、バイアス項$\mathbf b_2$を足し合わせて新たな信号 \( Z_2 \) を計算します。
\[ Z_2 = W_2 A_1+\mathbf b_2 \]
そして、この信号 \( Z_2 \) にも活性化関数 \( f \) を適用し、隠れ層2の出力 \( A_2 \) を求めます。
\[ A_2 = f(Z_2) \]
4.4. 出力層の計算
最後に、隠れ層2の出力 \( A_2 \) から出力層のノードへの信号を計算します。この計算には、出力層に対応する重み行列 \( W_3 \) を使います。ここで、重みの行列 \( W_3 \) とバイアス項$ \mathbf b_3$は次のようになります。
\[ W_3 = \begin{bmatrix} w_{11}^{(3)} & w_{12}^{(3)} & w_{13}^{(3)} \end{bmatrix} , \, \mathbf{b_3} = \begin{bmatrix} b_1^{(3)} \end{bmatrix} \]
この \( W_3 \) と \( A_2 \) を掛け合わせ、バイアス項$\mathbf b_3$を足すことで、出力層への信号 \( Z_3 \) を得ます。
\[ Z_3 = W_3 A_2 +\mathbf b_3\]
そして、この \( Z_3 \) に活性化関数 \( f \) を適用し、最終的な出力 \( Y \) が得られます。
\[ Y = f(Z_3) \]
4.5. 活性化関数の役割
活性化関数は、非線形であるからニューラルネットワークの中で非常に重要な役割を果たします。代表的な活性化関数には以下のようなものがあります。