模型内部 · MLP

MLP

前馈网络 · 第 1 块

图中数值
玩具规模
词元
5
dmodel
8 GPT-2 768
dff
32 GPT-2 3,072
参数
552 GPT-2 4.7M

全部步骤

  1. 升维投影

    注意力在词元之间搬运信息;MLP 则单独处理每个词元,一般认为模型学到的知识很大一部分存在这里。X(经过 ln2 之后)乘以 Wfc 再加 bfc,把每个词元从 8 个数扩展到 32 个(GPT-2 中是 768 → 3,072):每一列是一个神经元。

    GPT-2 [N×768]·[768×3072] · 每词元 4.7 MFLOPs

  2. GELU

    GELU 逐格独立地弯折:大的正输入几乎原样通过,小的被削弱,负的被挤向 0(永远不低于 −0.17)。没有这个弯折,Wfc 接 Wproj 就会合并成一个 768 × 768 的矩阵。

    逐元素 · 5 × 32 格

  3. 降维投影

    32 个激活值被投影回 8 维(3,072 → 768),再加上偏置 bproj。Wproj 画成转置的形式,所以每个输出维度是一行,正好位于它所乘的那些激活值上方。

    GPT-2 [N×3072]·[3072×768] · 每词元 4.7 MFLOPs

  4. 残差相加

    MLP 的输出被加到残差流上。在这个子层中,各位置之间从不交换信息;每个词元都是单独处理的。接下来是第 2 块。

    h″ = h′ + MLP(ln2(h′))

代码

def forward(self, x):          # x = ln_2(h): (B, T, 768)
    x = self.c_fc(x)           # (B, T, 3072)
    x = self.gelu(x)           # GPT-2 used the tanh approximation
    x = self.c_proj(x)         # (B, T, 768)
    x = self.dropout(x)
    return x
# in the block: x = x + self.mlp(self.ln_2(x))

延伸阅读