前言
本文主要总结了Transformer模型的要点,包含模型架构各部分组成和原理、常见问题汇总、模型具体实现和相关拓展学习。
一、模型架构
0.背景知识
seq2seq模型:
由Encoder和Decoder共同组成,之间由Attention机制来建立关联性。
可以分为3类:
CNN
- 权重共享(平移不变性、可并行计算)
- 滑动窗口(局部关联性建模)
- 对相对位置敏感、对绝对位置不敏感
RNN(依次有序递归建模)
- 对顺序敏感(当前的输入依赖于上一层的输出)
- 串行计算耗时
- 长程建模能力弱
- 单步计算复杂度不变,计算复杂度与序列长度呈线性关系
- 对相对位置和绝对位置都敏感
TRM
- 无局部假设(可并行计算,对相对位置不敏感)
- 无有序假设
需要增加位置编码来反映位置变化对特征的影响;
对绝对位置不敏感。
- 任意两字符均可建模
擅长长短程建模;
自注意力机制需要序列长度的平方级别复杂度。
1.整体架构
6个Encoder的结构相同,但不是完全相同,只是结构相同、参数不同,在训练时不是训练一个Encoder、再复制到6份,而是6个Encoder都独立训练,这与预训练模型ALBERT共享Transformer中的某些层的参数达到减少BERT参数量的目的是有所区别的;
6个Decoder的结构也相同,参数不同,与Encoder类似。
输入和输出的说明如下:
可以看到,有3个输入,解码端的真实标签,与解码端的输出计算损失,同时解码端是不能并行的,只能顺序执行,因为这一层解码器(当前时刻)的输入取决于(依赖于)上一层(上一时刻)的输出,因此真实标签与解码端的输入是错了一位的;
同时,在实际应用中,为了加快训练时的收敛速度,此时会使用到Teacher Forcing,即将真实标签与解码端原来的输入一起输入,为了不影响训练(即在训练当前单词时不看到后面的单词),此时就需要将当前单词后面的单词全部mask住,以达到更好的预测效果。
实际计算中是将多个句子作为一个Batch来处理的,可以使用矩阵来加快计算,但是句子的长度可能不一致,此时超过最大长度的就被舍弃,不够最大长度的就用Padding填充字符来填充,在注意力层中将其置为-∞,避免其对其他词产生影响:
2.Embedding和位置编码
Encoder包含3部分:
- 输入部分
- 注意力机制
- 前馈神经网络
输入部分包含Embedding和位置嵌入(位置编码)。
Embedding:
输入部分包含Embedding和位置嵌入(位置编码)。
Embedding:
使用随机初始化和word2vec都可以,具体可以根据实际使用到的情况选择;
Embedding由稀琉的one-hot进入一个不带bias的FFN得到一个稠密的连续向量,用来表征单词。
从RNN到位置编码:
RNN的结构天然与时序关系很符合,可以实现先处理某些数据、再处理另外的数据的效果。
(1)RNN的参数共享
RNN的U输入参数、W隐层参数和输出V是一套参数,对于所有的time step都共享一套参数,例如对于NLP任务来说,所有的单词都共用了这一套参数。
(2)RNN的梯度消失
不是因为连乘效应造成了梯度衰减,这里的梯度是梯度的和,其梯度消失不是指梯度逐渐趋近于0,而是总梯度被近距离梯度主导、被远距离梯度忽略不计。
在TRM中:
实现了并行化,可以一起处理多个单词、而不是逐个地处理,这样可以加快处理速度,但是会忽略掉单词之间的相对位置信息,这时候就需要位置编码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKGspfzc-1654266200425)(image/image_h8VM501H7C.png)]
之所以选择sin/cos来表征位置编码,是因为:
每个位置都是固定的
对于不同的句子,相同位置的距离一致
泛化能力较强,可以推广到更长的句子
通过使用sin/cos,可以使得pe(pos+k)可以写成pe(pos)和pe(k)的线性组合。
将位置编码和嵌入相加(维度相同):
绝对位置向量包含着相对位置信息:
同时,虽然在注意力机制中会消除相对位置信息,但是由于残差连接的存在,因此位置编码表征的位置信息可以向更高的层传递(流入深层),因此位置信息是一直存在的,不会消失。
这里之所以选择正弦和余弦函数,是因为正余弦函数可以拆解,从而将以后时刻的位置表示为前面位置的线性组合,因此可以增加泛化能力。
具体实现位置编码时,有2种方式:
(1)将得到的PE矩阵直接与Word Embedding相加
(2)将得到的PE来构造Embedding,并对词语序列进行Embedding编码,得到位置的Embedding,再与Word Embedding相加。