transformer 是当前最新使用模型的基类之一。今天主要介绍transformer的构成,以及在实现这个模型时自己遇到的一些问题。
1 encoder的构成
01 embeding层
可以根据情况,选择是否进行训练。如果在数据预处理阶段,已经训练过词向量矩阵,此时可以选择不训练直接使用。输出生成的维度是(batch,input_seq_len,d_model)
02 position位置
由于transformer的输入没有时序性的关系,所以引入了位置信息。位置信息可以表示一定程度上的时序信息。但是position对于输入向量特征低维度的位置信息,表示能力较强。对于高维度特征信息,作用不明显。
03 self-attention
根据输入信息,分别根据y=W*x 得到3个矩阵。q、k、v矩阵。通过q与k相乘得到attention得分矩阵,表示k上每一个维度信息的得分,可以表示token之间关系的强弱关联性。然后将attention矩阵作用于v矩阵,得到每一个token对应v每一个序列对应特征维度的加和信息。self-attention可以表示token与token之间的关强弱关系,对于长文本也适用。(q和k相乘后需要除以k的开根号维度,因为q和k相乘,往往数字会变化比较大,不能服从原始的分布,为了分布不发生变化,除以根号k的维度)
04 mask
注意,由于输入的batch个序列不一定都是相等的,所以当限制输入的最大长度后,为了计算,有些序列的长度不够最大长度进行了补0操作。但是这些补0的序列,在计算attention的对应索引位置是没有得分的。为了实现这个操作,需要将mask后的矩阵乘以一个负无穷小的数与attention进行加和操作,是的padding部分的得分为0。
06 多头注意力
多头注意力,是把最后一维度的特征数量,分割成为若干份。然后每一份都去算self-attention,然后将分割后的self-attention在合并到原始的维度。这样做的好处是,通过多种不同的注意力方式可以学到token之间的更多的信息。
05 残差层和layernorm层
残差层可以避免梯度消失。layernorm可以将每一层的样本信息都符合独立同分布,而使得效果更理想。分别在self-attion之后和ffn之后各添加残差层和layernorm层
06 ffn层
ffn层的作用是,可以表示更多特征之间的非线性关系。
2 decoder的构成
01 输入
区别于encoder输入的部分是,每次只能输入一个时间步的token序列,来预测下一时间步的token。
02 mask
这里有2处mask。第一处为对输入的mask,保证当前时间步后面的序列信息被掩盖掉,在计算双向注意力机制,保证当前时间步之后的序列得分都为0。第二处时间注意力机制为encoder部分的最后一层的输出,保证输出padding部分的注意力得分为0。
03 注意力机制
这里也是计算2处的注意力,第一处为decoder输入部分的自注意力机制,和输入的注意力区别就在于mask部分,保证。当前时间步后面的序列部分都mask掉。
第二处为encoder部分的输出,传入decoder部分,来计算注意力部分的k和v。与decoder第一层注意力输出的部分q。来计算encoder部分和decoder部分的注意力。
04 残差和layernorm
残差层可以避免梯度消失。layernorm可以将每一层的样本信息都符合独立同分布,而使得效果更理想。分别在self-attion之后和ffn之后各添加残差层和layernorm层。
05 ffn层
ffn层的作用是,可以表示更多特征之间的非线性关系。