全結合層が行列の積と和が基本であることを解説:数式から計算実装まで
こんにちは。ゆうせいです。
ニューラルネットワークの最も基本的な構造である「全結合層」(fully connected layer)を学ぶとき、「Y = XW + b という式を計算するだけだ」と説明されることがあります。しかし、この式の背後にある行列演算の構造を理解することは、ディープラーニングの実装とデバッグにおいて、極めて重要なスキルです。本記事では、提供いただいた計算例を使いながら、全結合層の計算がいかに「行列の積」と「ベクトルの和」に要約されるのかを、段階的に解説します。

全結合層の基本的な構造
全結合層とは、入力層のすべてのニューロンが、出力層のすべてのニューロンと接続されているレイヤーのことです。
全結合層の計算式は、以下の通りです。
ここで、X は入力ベクトル、W は重み行列、b はバイアスベクトル、Y は出力ベクトルです。
提供いただいた画像の例では、以下のようなシンプルな設定になっています。
入力ベクトル X は1行2列(X = [1, 2])。つまり、2つの値が入力される。
重み行列 W は2行2列(W = [[0.5, -1.0], [1.5, 0.8]])。入力の2個と出力の2個を結ぶ重みが格納されている。
バイアスベクトル b は1行2列(b = [0.2, -0.1])。各出力ニューロンに足される定数値。
出力ベクトル Y は1行2列(Y = [3.7, 0.5])。最終的な出力。
この計算式が「行列の積」と「ベクトルの和」に要約される理由を、段階的に見ていきましょう。
ステップ1:行列の積(行列積 XW の計算)
全結合層の計算の第一ステップは、入力ベクトル X と重み行列 W の行列積です。
行列の積の規則により、結果は1行2列の行列になります。
各出力要素は、「入力 × 重みの積」の和として計算されます。
出力1(y_1の線形出力)の計算:
1 × 0.5 + 2 × 1.5 = 0.5 + 3.0 = 3.5
出力2(y_2の線形出力)の計算:
1 × (-1.0) + 2 × 0.8 = -1.0 + 1.6 = 0.6
結果として、XW = [3.5, 0.6] が得られます。
ここで重要なのは、各出力値が「複数の入力値」と「複数の重み」の組み合わせから計算されている点です。出力1の3.5は、入力1 と入力2 の両方の情報を含んでいます。これが「全結合」の本質です。
ステップ2:バイアスの加算(ベクトルの和 XW + b)
第二ステップは、行列積の結果にバイアスベクトルを加算することです。
この加算は、要素ごと(element-wise)に行われます。
出力1:3.5 + 0.2 = 3.7
出力2:0.6 + (-0.1) = 0.5
結果として、XW + b = [3.7, 0.5] が得られます。
バイアスの役割は、ニューラルネットワークに「オフセット」を加えることです。同じ入力に対して、異なる重みとバイアスの組み合わせを持つニューロンは、異なる出力を生成します。バイアスがなければ、すべてのニューロンが原点を通る直線の制約を受けてしまい、表現力が大きく低下します。
ステップ3:活性化関数の適用(ReLUなど)
第三ステップは、線形変換の結果に対して、活性化関数を適用することです。提供いただいた画像では、ReLU(Rectified Linear Unit)関数が例として示されています。
ReLU関数の定義:
つまり、0より小さい値は0に、0以上の値はそのままの値になります。
この例の場合、XW + b = [3.7, 0.5] に対して、ReLUを適用すると、
出力1:max(0, 3.7) = 3.7(3.7は正なので変わらない)
出力2:max(0, 0.5) = 0.5(0.5も正なので変わらない)
結果として、ReLU(XW + b) = [3.7, 0.5] が得られます。
この例では両方の値が正だったため、ReLU適用後も値が変わりませんでしたが、もし値が負の場合は0に置き換わります。例えば、-0.3 が出力だったら、ReLU後は0になるのです。
ステップ4:最終出力 Y
全結合層の計算は完了し、最終的な出力ベクトル Y = [3.7, 0.5] が得られました。
この Y が、次のレイヤーへの入力になります。もし複数の全結合層が積み重ねられた場合、このステップの出力が、次の層の入力 X として使用されます。
なぜこの構造が「基本」なのか
全結合層が「行列の積と和が基本」と言われる理由は、この層の計算がそれ以上に単純化できないからです。
入力から出力への変換は、本質的には線形変換(XW + b)と非線形変換(活性化関数)の組み合わせです。
この二つの要素は互いに独立していて、どちらか一方を削除すれば表現力が大きく失われます。
XW + b の部分は、純粋に「入力と重みの積」「バイアスの和」という二つの基本的な演算に要約されます。これ以上に単純な形式はありません。
実装上の重要性
この構造を理解することは、実装とデバッグの際に極めて重要です。
形状の検証
全結合層を実装する際、入力ベクトル X の形状が (1, n)、重み行列 W の形状が (n, m) である必要があります。そうしなければ行列積が定義されません。
提供いただいた例では、X が (1, 2)、W が (2, 2) なので、XW の結果は (1, 2) になります。
同様に、バイアスベクトル b も (1, m) の形状である必要があります。
形状が一致していなければ、実装時にエラーが発生します。
勾配計算
誤差逆伝播でも、この構造が重要です。
損失関数の勾配を逆方向に伝播させる際、以下の計算が必要になります。
W に対する勾配:
b に対する勾配:
X に対する勾配:
これらはすべて、「行列の積と和」という基本的な演算のみで構成されています。
計算効率
行列演算は、GPUで高速に計算できるようにハードウェアが最適化されています。
全結合層が行列積と和の組み合わせであるという特性を利用することで、GPU上で並列計算を効率的に実行できます。
提供いただいた例のような小規模な計算でも、大規模なニューラルネットワークでも、同じ行列演算ロジックが使用されます。
バッチ処理への拡張
実務では、単一の入力ではなく、複数の入力を同時に処理(バッチ処理)することが標準的です。
もし5個の入力サンプルを同時に処理する場合、X の形状は (5, 2) になります。重み行列 W は (2, 2) のままです。
結果の XW は (5, 2) になり、5個のサンプルそれぞれについて、2個の出力値が計算されます。
行列演算の性質により、複数サンプルの計算も、本質的には同じ「行列の積と和」という基本構造です。
まとめ
全結合層の計算は、 という式に要約されます。
この式は、「行列の積」(XW)と「ベクトルの和」(+ b)、そして「活性化関数の適用」という三つのステップで構成されています。
提供いただいた例では、入力 X = [1, 2] から、最終出力 Y = [3.7, 0.5] を得るまでの計算過程が詳細に示されており、各ステップで何が計算されているかが明確になっています。
この単純な構造こそが、全結合層の強力さであり、それがニューラルネットワークの基本的な構成単位として機能する理由なのです。
次のステップとして、NumPyやPyTorchを使って、この例の計算を実装してみたり、異なる入力値やパラメータを使って計算結果がどのように変わるかを体験したり、逆伝播で重みの勾配がどのように計算されるかを追跡してみたりすることをお勧めします。その実践を通じて、行列演算という一見単純な操作が、ニューラルネットワークの学習を支えている本質であることが、より深く理解できるようになるでしょう。

投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。

