【百问百答系列】-全面了解Transformer
引言
初次接触 Transformer 时,那些复杂的概念和精妙的架构设计,着实让我困惑不已。但随着一个一个问题的深入探究,从它的基本概念、原理架构,到如何训练、模型优化,再到其广泛的应用领域以及充满潜力的未来发展,我对它的理解也越来越深刻。
希望借由这个百问百答系列,把在学习 Transformer 过程中的思考、疑问与收获分享出来。
训练细节
46. Transformer 的训练过程是怎样的?
Transformer的训练过程可以用以下方式“说人话”解释:
准备数据
- 首先,要把我们的文本数据等进行处理。比如有一堆英文句子和对应的中文句子,要把这些句子变成模型能理解的样子,给每个单词等都标上一个数字编号,变成一个个的向量。而且还要把这些句子按照一定的长度进行分组,方便模型处理。
编码器处理
- 把准备好的输入序列送入编码器。编码器会先给每个输入位置加上位置编码,因为Transformer本身没有像循环神经网络那样能记住顺序的能力,位置编码就是告诉模型每个词在句子里的位置。
- 然后这些带着位置编码的输入会经过多个堆叠的编码器层。在每个编码器层里,先是通过多头注意力机制,让每个位置的词都能和其他位置的词“交流”,看看它们之间有什么关系,找到每个词在整个句子里的重要程度。
- 接着,经过多头注意力处理后的结果会进入前馈神经网络子层,这个子层会对这些信息进行进一步加工,让模型能学到更复杂的特征。
- 最后,每个编码器层还会有残差连接和层归一化,让训练更稳定,能更好地把信息传递下去。
解码器处理
- 解码器这边,一开始会把已经生成的输出部分(最开始是一个表示开始的特殊符号)加上位置编码,然后也经过多个解码器层。
- 解码器层里也有多头注意力机制,但这里有两种注意力,一种是掩码多头注意力,它会防止模型在生成当前位置的时候看到未来的信息,保证生成是按顺序来的;另一种是和编码器输出做交互的多头注意力,让解码器能结合编码器的信息来生成。
- 同样,解码器层也有前馈神经网络子层、残差连接和层归一化,对信息进行处理和稳定训练。
计算损失
- 解码器生成的结果会经过一个线性层和Softmax函数,变成一个概率分布,表示每个可能的输出的概率。
- 把这个概率分布和真实的标签(就是正确的输出结果)进行对比,用一些方法,比如交叉熵损失函数,来计算模型预测的结果和真实结果之间的差距,这个差距就是损失。
优化更新
- 用优化器,比如Adam等,根据计算出来的损失来调整模型里的参数,让损失越来越小。这个过程就是通过反向传播算法,从损失开始,把误差沿着网络一层一层地传回去,告诉每个参数应该怎么调整才能让损失变小。
- 不断地重复上面的步骤,让模型在大量的数据上进行训练,慢慢地模型就会学到输入和输出之间的关系,能越来越准确地进行预测和生成。
Transformer训练过程较为复杂,可参考Transformer图解,该网页以图片形式对Transformer架构及其训练过程进行了清晰展示。
47. 训练 Transformer 需要准备什么样的数据?
训练Transformer需要的数据得根据具体任务来看,大概有下面这些情况:
做文本方面的任务
<