前言
本文是笔者在学习Transformer过程中记录的笔记,可能有一些错误。望指正。
填充(padding)和掩码(masking)机制
在解码器(decoder)中使用掩码(mask)的目的是确保当前位置的输出仅仅依赖于其之前的位置,而不是未来的位置。
掩码(mask)的作用
1. 因果关系(Causality)
在序列生成中,每个输出仅仅应当依赖于之前的输出。例如,生成句子的第四个单词时,我们只能考虑前三个单词,而不能考虑第五个单词。加入掩码确保模型在训练时保持这种因果关系。
2. 训练与推理的一致性
在推理(即实际使用)时,我们通常采用自回归方式生成序列:一次生成一个标记,然后将其作为新输入传递回模型。使用掩码确保模型在训练和推理时的行为是一致的。
3. 避免信息泄露
如果不使用掩码,模型可能会在训练期间“窥视”未来的标记,并过度依赖这些信息。这会导致在推理时性能下降,因为在实际应用中这些未来的标记是不可用的。
在实际操作中,掩码通常是一个上三角形状的矩阵,其中上三角(包括对角线)的部分设为0,其余部分设为负无穷(或非常大的负数)。在应用 softmax 函数计算注意力权重之前,这个掩码会被加到注意力分数上,这样上三角部分的分数在 softmax 后基本上就会变成0,从而实现了掩蔽效果。
举例
- “我喜欢猫猫”
- “我喜欢打羽毛球”
步骤 1:Tokenization 我们将每个句子分词,得到以下token序列:
1. “我” “喜” “欢” “猫” “猫”
2. “我” “喜” “欢” “打” “羽” “毛” “球”
AI 代码解读
步骤 2:Padding 由于训练集中最长的句子长度为10个tokens,我们需要对这两个句子进行填充,使它们的长度都达到10个tokens。通常使用一个特殊的填充token(例如"")来实现这一点:
1. “我” “喜” “欢” “猫” “猫” “” “” “” “” “”
2. “我” “喜” “欢” “打” “羽” “毛” “球” “” “” “”
AI 代码解读
步骤 3:Masking 现在,模型需要知道哪些是真正的token,哪些是填充的token。这是通过创建一个掩码矩阵来实现的,掩码矩阵与输入序列的长度相同。在这个掩码矩阵中,真实token的位置用0表示,填充token的位置用1表示:
1. 掩码:[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
2. 掩码:[0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
AI 代码解读
步骤 4:应用掩码 在模型的注意力机制中,特别是在计算softmax之前,我们会将这些掩码应用到模型中。具体来说,我们会在掩码为1的位置上加上一个非常大的负数(例如负无穷),这样在经过softmax操作后,这些位置的值将接近0,从而不会对全局概率预测产生影响。
通过这种方式,模型在计算注意力权重时,会忽略填充token,确保只关注实际的内容token。这样,模型就能够正确地学习序列数据,而不会被填充token所干扰。
Mask-Multi-Head-Attention
Mask 的目的是防止 Decoder “seeing the future”,就像防止考生偷看考试答案一样。
Linear 和 Softmax 来生成输出概率
在解码器的最终阶段,其输出将通过一个线性层进行转换,该层的作用是将解码器的输出映射到与词汇表大小相匹配的维度。随后,应用softmax函数将这些数值转换成概率分布,其中每个词汇对应一个概率值。在这一过程中,概率最高的词汇被选为预测的下一个词。
训练过程
模型没有收敛得很好时,Decoder预测产生的词很可能不是我们想要的。这个时候如果再把错误的数据再输给Decoder,就会越跑越偏。这个时候怎么办?
(1)在训练过程中可以使用 “teacher forcing”。因为我们知道应该预测的word是什么,那么可以给Decoder喂一个正确的结果作为输入。
(2)除了选择最高概率的词 (greedy search),还可以选择是比如 “Beam Search”,保留top-K个预测的word。 Beam Search 方法不再是只得到一个输出放到下一步去训练了,我们可以设定一个值,拿多个值放到下一步去训练,这条路径的概率等于每一步输出的概率的乘积。
训练和损失函数
在训练过程中,我们使用损失函数(例如交叉熵损失)将生成的输出概率分布与目标序列进行比较。概率分布给出了每个单词出现在该位置的概率。
模型的训练与评估
训练Transformer模型涉及优化其参数以最小化损失函数,通常使用梯度下降和反向传播。一旦训练完成,就会使用各种指标评估模型的性能,以评估其解决目标任务的有效性。
梯度下降 (Gradient Descent)是一种迭代优化算法,用于最小化损失函数。 它通过沿着负梯度方向逐步更新参数,寻找最优解。
反向传播 (Backpropagation)利用 链式法则,将梯度从输出层反向传播到输入层,计算出所有参数的梯度。
训练神经网络的完整流程
随机初始化参数 --> 前向传播 --> 反向传播 --> 参数更新 --> 重复步骤 2-4,直到模型收敛或达到预设的训练轮数
(1) 梯度下降和反向传播:
- 在训练期间,将输入序列输入模型,并生成输出序列。
- 将模型的预测与地面真相进行比较,涉及使用损失函数(例如交叉熵损失)来衡量预测值与实际值之间的差异。
- 梯度下降用于更新模型的参数,使损失最小化的方向。
- 优化器根据这些梯度调整参数,迭代更新它们以提高模型性能。
(2) 学习率调度:
- 可以应用学习率调度技术来动态调整训练期间的学习率。
- 常见策略包括热身计划,其中学习率从低开始逐渐增加,以及衰减计划,其中学习率随时间降低。
模型的评估指标
- BLEU(Bilingual Evaluation Understudy):适用于机器翻译和文本生成任务,衡量生成文本与参考文本的相似度。
- ROUGE(Recall-Oriented Understudy for Gisting Evaluation):常用于文本摘要,评估生成摘要与参考摘要的重叠部分。
- METEOR(Metric for Evaluation of Translation with Explicit ORdering of Renderings):结合精确率和召回率,用于评估翻译质量。
- Perplexity 困惑度:用于语言模型,衡量模型预测测试数据的能力,数值越低越好。