|
|
@@ -382,11 +382,11 @@ class MultiHeadAttention(nn.Module):
|
|
|
|
|
|
**3.1.2.3 前馈神经网络**
|
|
|
|
|
|
-在每个 Encoder 和 Decoder 层中,多头注意力子层之后都跟着一个**逐位置前馈网络 (Position-wise Feed-Forward Network, FFN)**。如果说注意力层的作用是从整个序列中“动态地聚合”相关信息,那么前馈网络的作用从这些聚合后的信息中提取更高阶的特征。
|
|
|
+在每个 Encoder 和 Decoder 层中,多头注意力子层之后都跟着一个**逐位置前馈网络(Position-wise Feed-Forward Network, FFN)**。如果说注意力层的作用是从整个序列中“动态地聚合”相关信息,那么前馈网络的作用从这些聚合后的信息中提取更高阶的特征。
|
|
|
|
|
|
这个名字的关键在于“逐位置”。它意味着这个前馈网络会独立地作用于序列中的每一个词元向量。换句话说,对于一个长度为 `seq_len` 的序列,这个 FFN 实际上会被调用 `seq_len` 次,每次处理一个词元。重要的是,所有位置共享的是同一组网络权重。这种设计既保持了对每个位置进行独立加工的能力,又大大减少了模型的参数量。这个网络的结构非常简单,由两个线性变换和一个 ReLU 激活函数组成:
|
|
|
|
|
|
-$$\operatorname{FFN}(x)=\max\left(0, xW_{1}+b_{1}\right) W_{2}+b_{2}$$
|
|
|
+$$\mathrm{FFN}(x)=\max\left(0, xW_{1}+b_{1}\right) W_{2}+b_{2}$$
|
|
|
|
|
|
其中,$x$是注意力子层的输出。 $W_1,b_1,W_2,b_2$是可学习的参数。通常,第一个线性层的输出维度 `d_ff` 会远大于输入的维度 `d_model`(例如 `d_ff = 4 * d_model`),经过 ReLU 激活后再通过第二个线性层映射回 `d_model` 维度。这种“先扩大再缩小”的模式,也被称为瓶颈结构,被认为有助于模型学习更丰富的特征表示。
|
|
|
|
|
|
@@ -433,7 +433,7 @@ $$PE_{(pos,2i)}=\sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right),$$
|
|
|
|
|
|
$$PE_{(pos,2i+1)}=\cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)$$
|
|
|
|
|
|
-,其中:
|
|
|
+其中:
|
|
|
|
|
|
- $pos$ 是词元在序列中的位置(例如,$0$,$1$,$2$,...)
|
|
|
- $i$ 是位置向量中的维度索引(从 $0$ 到 $d_{\text{model}}/2$)
|