Transformer最早提出是作为一种序列到序列模型并应用于机器翻译的,其在许多人工智能领域,如自然语言处理、计算机视觉、语音处理都取得了巨大的成功。
1. Transformer 整体结构
下图为“我 是 一只 猫”的中译英的Transformer模型的模拟过程:
可以看到上述Transformer的结构为”6+6“的形式,分为Encoder和Decoder。其中”6“为实验经验所得,可以根据实际需求进行调整;
1.1 Transformer工作流程
第一步:获取输入句子的每个单词的表示向量X,X由单词Embedding和单词位置Embedding相加得到;
第二步:将单词表示向量矩阵X经过六层Encoder编码,得到输出的编码信息矩阵。同时输出维度与输入维度保持一致;
第三步:将Encoder输出的编码信息矩阵经过六层Decoder,并且Decoder会对单词序列中任何位置的单词进行预测,即预测第i+1个单词时,利用第1~i个单词的信息,例如[”<begin>”, ”i”, “have”] >> [”a”],类似下图;
Tip1:在使用过程中,翻译第i+1个单词是需要遮盖住第i+1之后的单词,操作称为Mask(掩盖)
Tip2:预测任何位置单词的好处:增加了各个位置对应序列的训练数据,增加了模型的泛化能力;
最终输出:如下图可见,第一行只包含第一个单词的信息,最后一行将包含所有单词的信息
1.2 Transformer的输入
Transformer中单词的输入表示X由单词Embedding和位置Embedding(Positional Encoding)相加得到;
1.2.1 单词Embedding
单词Eembedding可以通过Word2Vec、Glove等算法预训练所得,也可以在Transformer中训练得到;
1.2.2 位置Embedding
因为Transformer不采用RNN的结构,使用的是全局信息,即不能利用单词的顺序信息,而这部分信息对于NLP(序列)来说又非常重要,所以使用Embedding保存单词在序列中的相对或绝对位置。
位置Embedding用PE来表示,维度与单词Embedding相同,同时可以使用公式或训练所得。Transformer采用公式所得,计算公式如下:
2i表示Embedding偶数维度,2i+1表示Embedding奇数维度,且两者都小于d
为什么使用上述公式? 理想情况下的PE设计需要遵循以下几个条件: 1. 为每个时间步(单词在句子中的位置)输出唯一编码; 2. 即使句子长度不一样,句子中两个时间步之间的距离应该是“恒定”的; 3. 模型可以轻易的泛化到更长的句子上(比原训练集中句子更长); 4. PE必须是确定的; 为什么这么设计 ? 1. 公式中“10000”意味着编码长度最长为10000,可以根据实验结果进行调整“1000”、”100“等; 2. 可以适应比训练集更长的句子,例如训练集中最长句子为20个单词,也可以计算第21、100的单词的Embedding; 3. 二进制表示数字(01010)在浮点空间非常浪费空间,所以可以使用对应的浮点函数-正弦函数。同时相邻时间步的位置编码的距离(点积)是对称的,并且会随时间很好地衰减; 4. 正弦曲线的位置编码可以轻松获得相对位置信息:例如PE(pos+k)可以通过PE(pos)计算所得,因为公式转换如下: Tip:具体可见参考2
2. Encoder & Decoder 组合结构
上图中为论文中Transformer的内部结构图,左侧为Encoder block,右侧为Decoder block;
结构分解
Multi-Head Attention:是由多个Self-Attention组成的。其中Encoder block包含一个Multi-Head Attention,Decoder block包含两个Multi-Head Attention(其中第一个用到了Masked)
Add & Norm层:Add表示残差连接用于防止网络退化;Norm表示Layer Normalization,用于每一层的激活值进行归一化;
Feed Forward层:两层的全连接层,第一层激活函数为Relu,第二层不使用激活函数;
softmax 层:因为Mask的存在,使用单词0的输出Z0只包含单词0的信息;使用单词0,1,2,3,4可以得到最终的输出Z;
3. Encoder & Decoder 结构分解
3.1 Multi-Head Attention
从上图中可以看到Multi-Head Attention包含多个Self-Attention层。其中h表示多少个Self-Attention组成,将V、K、Q线性划分后分别输入并经过Scaled Dot-Product Attention层可以得到Z1~Zh,再将Z1~Zh进行concat,最后在通过Linear层可到最终输出Z;
例如原embedding维度为512,h为8,经过线性划分为64维*8。论文中描述这一操作可以可以提高模型效果,同时对复杂度影响不大。Multi-Head Attention可以共享来自不同位置的不同表示的子空间信息。
3.2 Add & Norm
Add & Norm层由Add和Norm两部分组成,其计算公式如下:
;
;
3.3 Feed Forward
Feed Forward层是一个两层的全连接层,第一层的激活函数为Relu,第二层不使用激活函数,对应公式为:
Self-Attention 结构分解
Q、K、V的计算:输入矩阵 经过线性变换矩阵 计算得到 Q,K,V。
上述图示的计算公式: ,其中为向量维度;
Scale操作:为了降低嵌入向量的维度对模型训练的影响,提高模型的训练效率和稳定性,通常需要对嵌入向量进行缩放;例如除以嵌入向量维度**0.5;