大模型原理:因果注意力(掩码注意力)-用dropout避免过拟合

介绍

dropout 是深度学习中的一种技术,在 训练过程 中 随机忽略一些隐藏层单元。
有助于减少模型对特定隐藏层单元的依赖,从而 避免过拟合。

提示:dropout仅在 训练期间使用,训练结束后会被取消。

使用的位置

在Transformer架构中,包括GPT在内的模型,通常会在以下两个位置使用dropout:

  • 计算注意力权重之后
  • 将这些权重应用于值向量之后

例子

使用 50% 的dropout率,这意味着掩码一半的注意力权重。
注意力权重的维度是 6x6,为了便于操作,首先将PyTorch的dropout实现应用于一个由1组成的6×6 张量

# 使用Dropout
print("\n\n使用Dropout--------")
# 为了复现数据,设置随机种子
torch.manual_seed(123)
# 使用 50% 的dropout率
dropout = torch.nn.Dropout(0.5)
# 创建 6x6 的全1矩阵
example = torch.ones(6, 6)
# 对矩阵使用dropout
print(dropout(example))

执行结果,大约有一半的值被置 0 了:

使用Dropout--------
tensor([[2., 2., 0., 2., 2., 0.],
        [0., 0., 0., 2., 0., 2.],
        [2., 2., 2., 2., 0., 2.],
        [0., 2., 2., 0., 0., 2.],
        [0., 2., 0., 2., 0., 2.],
        [0., 2., 2., 2., 2., 0.]])

为什么其余值是2

应用 50% 的dropout率时,矩阵中有一半的元素会随机被置为0。

为了 补偿减少的活跃元素,矩阵中 剩余元素的值会按 1/0.5=2 的比例进行放大。

这种放大对于维持注意力权重的整体平衡非常重要,可以确保在训练和推理过程中,注意力机制的平均影响保持一致。

对注意力权重矩阵进行dropout操作

对 大模型原理:因果注意力(掩码注意力) 进行优化

使用的位置

如图,在计算注意力权重之后应用dropout掩码,因为这是实践中更常见的做法。
利用因果注意力掩码(左上),应用一个额外的dropout掩码(右上)来将额外的注意力权重置0,以减少训练期间的过拟合

代码实现

# 对注意力权重矩阵进行dropout操作
print("\n\n对注意力权重矩阵进行dropout操作---------")
# 为了复现数据,设置随机种子
torch.manual_seed(123)
print(dropout(attn_weights))

执行结果:

对注意力权重矩阵进行dropout操作---------
tensor([[2.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000],
        [0.7599, 0.6194, 0.6206, 0.0000, 0.0000, 0.0000],
        [0.0000, 0.4921, 0.4925, 0.0000, 0.0000, 0.0000],
        [0.0000, 0.3966, 0.0000, 0.3775, 0.0000, 0.0000],
        [0.0000, 0.3327, 0.3331, 0.3084, 0.3331, 0.0000]],
       grad_fn=<MulBackward0>)

提示:由于操作系统的差异,最终的 dropout输出可能会有所不同

然后可以利用修改后的注意力权重通过 context_vec = attn_weights @values 计算上下文向量了


原文出处:/show_1GW2d04RucdI.html