介绍
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 计算上下文向量了
