用語:全結合層(FC層)
分類:AIの基礎・学習・モデル
ひとことで:全結合層(FC層)は、入力ベクトルの各要素から出力ベクトルの各要素へ学習可能な重みを通じて情報を混ぜる、典型的には「行列積+バイアス」で表されるニューラルネットワーク層です。
全結合層(Fully Connected layer、FC層)は、ニューラルネットワークの中で、入力側の各要素が出力側の各要素に影響できるように学習可能な重みを持つ層です。実装では Dense や Linear と呼ばれることも多く、典型的な計算は「入力ベクトルに重み行列を掛け、バイアスを足す」という形で表せます。
「全結合」という名前から、ネットワーク全体のあらゆるニューロンが相互に結ばれているように想像しがちですが、通常はそうではありません。ある層の入力表現と次の出力表現の間で、入力の各成分が出力の各成分へ寄与できる、という意味です。
目次
何が「全結合」なのか
入力が3個、出力が2個あるとします。全結合層では、3個の入力それぞれが2個の出力それぞれへ重みを通じてつながります。したがって重みは3×2、あるいは実装上の向きによって2×3の行列として保持されます。
PyTorchの説明では、linear / fully connected layer は「すべての入力が、重みで定められた程度にすべての出力へ影響する層」とされています。入力がm個、出力がn個なら、必要な重みはm×n個です。ここに通常は出力ごとのバイアスも加わります。
数式で書けば、代表的には次の形です。
y = Wx + b
ここで x は入力、W は学習される重み行列、b はバイアス、y は出力です。PyTorchのLinearはこの種のアフィン変換を実装します。
「線形層」と呼ばれても、厳密にはバイアス込みならアフィン変換
実装上 Linear と呼ばれるため、「完全に線形な変換」と考えたくなります。しかしバイアス b を含む Wx+b は数学的にはアフィン変換です。機械学習の実務では、慣用的にLinear layerと呼ばれています。
また、全結合層の後にReLUやGELUのような活性化関数を置けば、ブロック全体としては非線形な変換になります。ニューラルネットワークが複雑な関数を表現できるのは、単なる行列積を何段も重ねるだけではなく、こうした非線形性を間に入れるからです。
DenseとLinearはほぼ同じ意味で使われるが、APIの範囲は違う
Kerasの Dense は代表的な全結合層です。Kerasの定義では、Denseは activation(dot(input, kernel) + bias) を計算します。つまり設定次第では、重み付き和とバイアスだけでなく、活性化関数まで同じレイヤー指定の中に含められます。
一方、PyTorchの torch.nn.Linear は基本的にアフィン変換を担当し、ReLUやsoftmaxなどは別のモジュールや関数として組み合わせることが一般的です。
この違いは、論文やモデル図を読むときよりも、コードを読むときに効いてきます。「Dense 128」と「Linear 128」が似た役割を示していても、その1行に活性化まで含まれているかは実装を確認する必要があります。
CNNでは、特徴抽出のあとに全結合層を置く構成が古典的
画像分類のCNNでは、畳み込み層で画像の局所的な特徴を抽出し、その特徴をまとめて分類へつなぐ部分に全結合層を置く構成がよく使われてきました。
たとえば畳み込み処理の結果を1024次元のベクトルにし、最後に10クラスを分類するなら、1024 → 10 の全結合層を使えます。この層は1024個の特徴を材料に、10個の出力スコアを作ります。
ここで大切なのは、「FC層が10個の確率を直接出す」とは限らないことです。多クラス分類では、FC層が10個のロジットを出し、その後にsoftmaxを適用して確率として解釈する場合があります。損失関数の実装によってはsoftmaxを明示的に書かないこともあります。
Transformerにも全結合型の計算は大量にある
全結合層という言葉はCNNの分類ヘッドの印象が強いかもしれませんが、Transformerでも線形射影は重要です。Attentionで使うQuery、Key、Valueの射影や、Attention後の出力射影、各ブロック内のフィードフォワードネットワークなどに、行列を使った全結合型の変換が現れます。
したがって、「最近のモデルはAttentionを使うからFC層は古い」という理解は正しくありません。むしろ大規模モデルでは、線形変換は計算量・パラメータ数の大きな部分を占めることがあります。
パラメータ数はどう読むか
入力次元が1024、出力次元が128なら、重みだけで 1024 × 128 = 131,072 個あります。さらに各出力にバイアスを1個ずつ持つなら128個追加され、合計は131,200個です。
このため入力・出力の次元が大きい全結合層は、パラメータ数を急激に増やしやすいという特徴があります。古典的CNNで、畳み込み部分より最後の巨大なFC層のほうが多くのパラメータを持つこともありました。
モデル概要に Linear(4096, 4096) のような表記があれば、それだけで重みが約1,678万個ある、と概算できます。モデルサイズや計算資源を読むうえで、これはかなり実用的な見方です。
MLPと全結合層は同じではない
MLP(Multi-Layer Perceptron、多層パーセプトロン)は、一般には複数の全結合型の層と活性化関数などを組み合わせたネットワーク、またはそのようなブロックを指します。
そのため「MLP層」と書かれているとき、実際には Linear → 活性化 → Linear のような複数段をまとめて呼んでいる場合があります。単一の全結合層とMLPを同一視すると、パラメータ数や処理内容を読み違えることがあります。
元の文脈へ戻ったときの読み方
全結合層という言葉を見たら、まず次の4点を確認すると意味をつかみやすくなります。
- 入力次元と出力次元はいくつか。
- 活性化関数は同じ層の指定に含まれるか、後段に別記されているか。
- その層は特徴変換、分類ヘッド、Attentionの射影、MLPの一部のどれか。
- 出力は確率なのか、まだロジットや特徴ベクトルなのか。
「FC層がある」という事実だけでは、モデルが単純か複雑か、古いか新しいか、性能が高いか低いかは判断できません。重要なのは、どの次元をどの次元へ変換し、モデル全体のどの役割を担っているかです。
まとめ
全結合層(FC層)は、入力の各要素から出力の各要素へ学習可能な重みを通じて情報を混ぜる基本的なニューラルネットワーク層です。代表的な計算は Wx+b で、KerasではDense、PyTorchではLinearとしてよく登場します。
ただし、FC層そのものと活性化関数、softmax、MLPは別概念です。モデル図やコードを読むときは「入力・出力の次元」「活性化を含むか」「何のための射影か」を確認すると、全結合層の役割を正確に読み取れます。
関連するAI用語
- パラメータ
- Transformer
- CNN
注・出典
- PyTorch Tutorials「Building Models with PyTorch」: linear/fully connected layer は every input influences every output、重みは m×n 行列。 — https://docs.pytorch.org/tutorials/beginner/introyt/modelsyt_tutorial.html
- PyTorch C++ API「Linear Layers」: linear layer は y = xW^T + b のアフィン変換。 — https://docs.pytorch.org/cppdocs/api/nn/linear.html
- Keras「Dense layer」: output = activation(dot(input, kernel) + bias)。activation 未指定時は線形活性化。 — https://keras.io/api/layers/core_layers/dense/
AI協働制作について
本記事は、著者が独自に設計した指示、参照資料、出典確認規則、著作権確認および監査工程を組み込んだChatGPT等の生成AIを、情報収集の補助、資料整理、構成検討、草稿作成、文章校正および監査補助に使用して制作しました。記事の対象範囲、情報源の採否、構成、解釈および最終表現は著者が判断し、最終稿を承認しています。著者は、本記事の正確性、独自性、引用、著作権処理および公開内容について責任を負います。制作工程の詳細は「AI協働制作方針」をご覧ください。
