--- created: 2025-08-03 21:19:11 tags: - "Research" - "基础" - "Transformer" - "前馈神经网络" - "FFN" --- 在Transformer模型中,前馈神经网络(Feed-Forward Neural Network,FFN)是每个编码器(Encoder)和解码器(Decoder)层中的关键组件之一。以下是FFN的作用、计算过程、计算前后数据的特征,以及实现方式的详细说明: ### 作用 1. **特征提取**:FFN能够对自注意力层的输出进行进一步的特征提取,捕捉序列中更深层次的信息。 2. **非线性变换**:FFN引入非线性变换,允许模型学习更复杂的函数,增强模型的表达能力。 3. **信息整合**:FFN可以整合来自自注意力层的信息,为模型提供更丰富的上下文表示。 ~~这作用是不是很像CNN中的[[CNN-卷积层, 池化层 与 全连接层|全连接层]]~~ ### 计算 FFN通常由两个线性变换组成,中间夹着一个激活函数。具体计算步骤如下: 1. **第一个线性变换**: $Z = XW_1 + b_1$ 其中,\( $X$ \) 是输入向量,\( $W_1$ \) 是第一个变换的权重矩阵,\( $b_1$ \) 是偏置项。 2. **激活函数**: $A = \text{Activation}(Z)$ 常用的激活函数包括ReLU(Rectified Linear Unit)或GELU(Gaussian Error Linear Unit)。 3. **第二个线性变换**: $Y = A W_2 + b_2$ 其中,\( $W_2$ \) 是第二个变换的权重矩阵,\( $b_2$ \) 是偏置项,\( $Y$ \) 是FFN的输出。 ### 计算前后数据的特征 1. **计算前**: - 输入数据通常是自注意力层的输出,包含了丰富的上下文信息和位置编码信息。 - 数据的形状为 \($[batch\_size, seq\_length, hidden\_size]$\)。 2. **计算后**: - 输出数据经过了非线性变换和两次线性变换,捕捉了更深层次的特征。 - 输出数据的形状保持不变,仍然是 \($[batch\_size, seq\_length, hidden\_size]$\)。 ### 实现 在深度学习框架中,如PyTorch,FFN的实现可以如下所示: ```python import torch import torch.nn as nn import torch.nn.functional as F class FeedForwardNetwork(nn.Module): def __init__(self, hidden_size, ff_size, dropout_rate=0.1): super(FeedForwardNetwork, self).__init__() self.linear1 = nn.Linear(hidden_size, ff_size) self.dropout = nn.Dropout(dropout_rate) self.linear2 = nn.Linear(ff_size, hidden_size) def forward(self, x): x = self.linear1(x) x = F.relu(x) # 或者使用其他激活函数,如F.gelu(x) x = self.dropout(x) x = self.linear2(x) return x ``` 在这个实现中,`hidden_size` 是输入和输出的维度,`ff_size` 是第一个线性变换后中间层的维度,通常大于 `hidden_size` 以增加模型的容量。`dropout_rate` 是用于正则化的Dropout层的丢弃率。 总结来说,FFN在Transformer中起到了特征提取和非线性变换的作用,通过两次线性变换和激活函数处理输入数据,输出具有更丰富特征的表示,增强了模型的表达能力。