一文搞懂全连接层(FC)、多层感知机(MLP)与前馈网络(FFN)
全连接层 (Fully Connected Layer, FC)、多层感知机 (Multi-Layer Perceptron, MLP) 和 前馈网络 (Feed-Forward Network, FFN)是现代神经网络,例如Transformer模型中的常用术语。这三个概念关系紧密,有时会给初学者带来一些困惑,本文旨在厘清这三者的定义、功能与相互关系。
文章目录
- 一文搞懂全连接层(FC)、多层感知机(MLP)与前馈网络(FFN)
-
- 1 全连接层 (FC):神经网络的原子操作
- 2 多层感知机 (MLP):最简单的深度网络
- 3 前馈网络 (FFN):一个更广泛的家族
- 4 三者的关系总结
- 5 PyTorch代码示例
1 全连接层 (FC):神经网络的原子操作
全连接层 (Fully Connected Layer),有时也直接称为密集层 (Dense Layer),是神经网络中最基本、最核心的构建单元。顾名思义,“全连接”指的是其输入层中的每一个神经元都与输出层中的每一个神经元相连接。

一个全连接层执行的是一个线性的仿射变换,然后通常会跟上一个非线性激活函数。其数学表达式可以概括为:
output
=
σ
(
W
⋅
input
+
b
)
\\text{output} = \\sigma(W \\cdot \\text{input} + b)
output=σ(W⋅input+b)
其中:
- input:输入向量。
- W (Weights):权重矩阵,这是层需要学习的核心参数。W的维度决定了输入和输出特征的映射关系。
- b (bias):偏置向量,也是需要学习的参数。
- σ (sigma):非线性激活函数,例如 ReLU、Sigmoid 或 Tanh。激活函数的引入是至关重要的,它赋予了网络学习非线性模式的能力。
FC层能够将前一层学习到的特征进行整合和重新组合,映射到一个新的特征空间。且FC层可以通过调整权重矩阵W的形状较为容易地改变数据的维度,例如在分类任务的最后,将高维特征映射到类别数量的维度。
2 多层感知机 (MLP):最简单的深度网络
多层感知机 (Multi-Layer Perceptron, MLP) 也叫人工神经网络(ANN,Artificial Neural Network),由多个层堆叠而成,其基本结构包括:

MLP中的每一个隐藏层都是一个全连接层 (FC Layer)。当我们说“我用了一个MLP”时,指的是构建了一个由输入层、若干FC隐藏层和输出层组成的网络模型。
3 前馈网络 (FFN):一个更广泛的家族
前馈网络 (Feed-Forward Network) 是一类神经网络的总称,其特点是:前馈网络中的信息流动是单向的——从输入层开始,逐层向前传播,直到输出层。数据流动的路径中不存在任何环路或反馈(这与循环神经网络RNN等形成对比)。
多层感知机(MLP)是一种典型的前馈神经网络。除了MLP,其他一些著名的网络结构,如卷积神经网络 (Convolutional Neural Networks, CNN),也属于前馈网络。在CNN中,数据同样是从输入图像单向流经卷积层、池化层和全连接层,最终到达输出。
在Transformer模型中,“FFN”通常特指其内部一个子结构:位置前馈网络 (Position-wise Feed-Forward Network)。这个FFN子层通常由两个线性层(也就是FC层)和一个ReLU(或其变种如GELU)激活函数组成。其计算公式为:
FFN
(
x
)
=
Linear
2
(
ReLU
(
Linear
1
(
x
)
)
)
\\text{FFN}(x) = \\text{Linear}_2(\\text{ReLU}(\\text{Linear}_1(x)))
FFN(x)=Linear2(ReLU(Linear1(x)))
或者写成包含权重和偏置的形式:
FFN
(
x
)
=
(
x
W
1
+
b
1
)
W
2
+
b
2
\\text{FFN}(x) = (x W_1 + b_1) W_2 + b_2
FFN(x)=(xW1+b1)W2+b2
这个结构被独立地应用到输入序列的每一个位置(Token)上。它的作用是在自注意力机制(Self-Attention)整合了全局信息之后,对每个位置的表示进行一次非线性的特征变换,增加模型的表达能力。
“FFN”这个术语在当前很常见、也很容易引起混淆。当你在阅读关于Transformer、BERT或GPT的论文时,文中的FFN一般是指这个特定的双层FC结构。
4 三者的关系总结
| FC | 全连接层 | 组件/层 (Layer) | 神经网络的基本构建模块。 |
| MLP | 多层感知机 | 模型/架构 (Architecture) | 由多个FC层堆叠而成的特定类型的前馈网络。 |
| FFN | 前馈网络 | 类别/家族 (Category) | 数据单向流动的一大类网络。MLP和CNN都属于FFN。 |
简单来说,它们的关系可以理解为:
FFN (类别) > MLP (架构) > FC (组件)
而在Transformer的语境下,FFN特指一个由两个FC层构成的特定模块。
5 PyTorch代码示例
通过代码可以直观地理解它们的区别。
import torch
import torch.nn as nn
# — 1. 全连接层 (FC) / Dense Layer —
# 这是一个单一的层,一个“组件”。
# 输入维度为10,输出维度为20
fc_layer = nn.Linear(in_features=10, out_features=20)
# — 2. 多层感知机 (MLP) —
# 这是一个完整的模型“架构”,由多个组件(包括FC层)构成。
class MLP(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(MLP, self).__init__()
self.layers = nn.Sequential(
nn.Linear(input_size, hidden_size), # 第一个FC层
nn.ReLU(), # 激活函数
nn.Linear(hidden_size, output_size) # 第二个FC层
)
def forward(self, x):
return self.layers(x)
# 实例化一个MLP模型
mlp_model = MLP(input_size=784, hidden_size=256, output_size=10)
# mlp_model 是一个FFN的实例
# — 3. Transformer中的FFN —
# 这也是一个模块,但特指那种"FC -> ReLU -> FC"的结构
class PositionWiseFFN(nn.Module):
def __init__(self, d_model, d_ff):
super(PositionWiseFFN, self).__init__()
self.fc1 = nn.Linear(d_model, d_ff)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(d_ff, d_model)
def forward(self, x):
return self.fc2(self.relu(self.fc1(x)))
# 在Transformer中,d_model通常是512,d_ff(中间层维度)通常是2048
transformer_ffn = PositionWiseFFN(d_model=512, d_ff=2048)
# 打印模型结构,加深理解
print("— 单个全连接层 (nn.Linear) —")
print(fc_layer)
print("\\n— MLP模型 (一个简单的FFN) —")
print(mlp_model)
print("\\n— Transformer中的FFN模块 —")
print(transformer_ffn)
希望通过本文的梳理,你下次再遇到这三个术语时,能够清晰地知道它们在当前上下文中的确切含义。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!你的支持是我创作的最大动力!



