transformer算法原理
一、背景
NLP作为AI的子领域,一直以来被认为比较难的学科。特征抽取一直以来都作为NLP的核心任务。概况来说在深度学习为基础的体系中,特征抽取经历了以下几个阶段:DNN->CNN->RNN->Transformer。自从2017年6月份《Attention is all you need》论文作为机器翻译算法提出后,transform已经逐步替代了以CNN和RNN为首的特征抽取,特别是2018年bert一战成名后,目前所有的主流方法几乎都是transformer系的变体。
1.论文:Google Brain2017年6月份《Attention is all you need》论文作为机器翻译算法提出。
2.论文地址:https://arxiv.org/abs/1706.03762
3.项目源码:
tensor2tensor: https://github.com/tensorflow/tensor2tensor
tensorflow版本: https://github.com/Kyubyong/transformer
二、架构
- 1.和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成。
- 2.我们可以将transformer看做黑盒,例如将 I love you ->黑盒->我爱你。
- 3.在张量层面的黑盒理解,比如batch为N,每句话word个数为L,每个word的的embedding长度为D,字典中单词个数为V。(N,L,D)->transformer-> (N1,L1,D1)。然后用$(N1,L1,D1)*(V,D)^T$得到(N1,L1,V),最后通过softmax((N1,L1,V))得到在最后一维度V中,概率最大的字。
三、架构的理解
transformer可以分为两个模块Encode模块和Decode模块。Encode模块可以分为两个子模块,Decode模块可以分为三个子模块,其中第二和第三个和Encode的两个子模块相同。
1.Encode模块 *N
每个模型前面要加上 Input Embedding + Postional Embedding
- (1)Multi-Head Attention:多头注意力机制
add & norm - (2)Feed Forward:前馈网络
add & norm
2.Decode模块 *N
每个模型前面要加上 Input Embedding + Postional Embedding
- (1) Masked Multi-Head Attention:遮蔽多头注意力机制
add & norm - (2)Multi-Head Attention:多头注意力机制
add & norm - (3)Feed Forward:前馈网络
add & norm
四、Encode层
1. Input Embedding
根据输入input ,初始化词典的每个字的Embedding,可以按照正态分布或者其他的方式
2. Postional Embedding
位置信息可以用两种方式来定义:
1.归纳偏置和一些经验得出的函数
2.向Bert一样学习得到
公式:
PE:为二维矩阵,大小跟输入embedding的维度一样;
pos:表示词语在句子中的位置;
dmodel:表示词向量的维度;
i:表示词向量的位置
pos + k 位置的encoding可以通过pos位置的encoding线性表示。它们的关系可以通过三角函数公式体现:
位置为 pos + k 的positional encoding 可以表示如下:
化简如下:
3. Multi-Head Attention
这是创新的重点:
我们对这个式子做直观上的解释:
1.首先,Q、K、V都是(N,L,D)的张量,对于第第一维N主要是做并行计算的,我们暂且去掉,那么Q、K、V都是(L,D)的矩阵了。
2.那么$QK^T=(L_q,L_k)$的矩阵了,这样每个字就能看到其他字的意思了,就能知道这个字所在的前后语境了。
3.其中因子$√d_k$起到调节作用,使得内积不至于太大(太大的话softmax后就非0即1了,不够“soft”了)
4.通过softmax做归一化,权重调节,让当前词语知道前后此所占的权重,然后乘V
4. add & norm
1.add:残差网络的作用:
背景:随着网络层数的加深,目标函数越来越容易陷入局部最优解,同时,随着层数增加,梯度消失问题更加严重,特别是激活函数为sigmoid/softmax/tanh等,使得原理输出层的网络参数得不到有效的学习。
(1)残差网络(Residual Network)是一种非常有效的缓解梯度消失问题网络,极大的提高了可以有效训练的网络的深度。
(2)解决网络退化问题
梯度弥散/爆炸问题导致模型训练难以收敛,但是这个问题很大程度上已经被标准初始化和中间层正规化方法有效控制了,这些方法使得深度神经网络可以收敛。深度神经网络面临的另一朵乌云是网络退化问题:
在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降[1]。
需要注意,网络退化问题不是过拟合导致的,即便在模型训练过程中,同样的训练轮次下,退化的网络也比稍浅层的网络的训练错误更高,如下图[1]所示。
2.layer Normalization
Layer Normalization 的作用是把神经网络中隐藏层归一为标准正态分布,也就是i,i,d 独立同分布,以起到加快训练速度,加速收敛的作用。
对特征做标准化:减去均值/标准差:每一个样本上计算均值和方差;用每一列的每一个元素减去这列的均值,再除以这列的标准差,对数据进行归一化处理(均值为0,标准差为1)
5.FFN(Feed-Forward Network):前馈神经网络
1.定义
FFN(Feed-Forward Network)块是Transformer模型中的一个重要组成部分,接受自注意力子层的输出作为输入,并通过一个带有 Relu 激活函数的两层全连接网络对输入进行更加复杂的非线性变换。
FFN(x) = max(0, x *w_1 + b_1)w_2 + b_2
这里,x是前一层的输出,W_1和W_2是权重矩阵,b_1和b_2是偏置项。第一个线性变换x*W_1 + b_1)将输入映射到一个较高维度的空间(通常称为“扩展”,原生是4倍 512->2048),接着应用ReLU激活函数,最后一个线性变换max(0, xW_1 + b_1)W_2 + b_2将数据映射回原始维度。这种“扩展”和“收缩”的设计目的是让网络能够捕捉更复杂的特征,并提高模型的表达能力。
2.作用
(1)、增强特征表达能力:FFN通过两个线性层和激活函数的组合,能够对输入进行复杂的非线性变换,从而增强了特征的表达能力。这有助于模型更好地捕捉输入中的特征和模式。
(2)、 提高位置间的独立性:Transformer模型中的自注意力机制(self-attention)可以捕捉输入序列中不同位置之间的依赖关系,但它可能无法完全消除位置间的依赖。FFN的引入可以进一步增加位置间的独立性,使得模型对每个位置的表示更加自主和独立,减少位置间的相互干扰。
3.公式
假设输入是一个向量 x xx,FFN块的计算过程如下:
(1)第一层全连接层(线性变换):z=xW1+b1其中W1是第一层全连接层的权重矩阵,b1 是偏置向量。
(2)激活函数:a=g(z)其中,g() 是激活函数,常用的激活函数有ReLU(Rectified Linear Unit)等。
(3)第二层全连接层(线性变换):y = aW2 + b2 其中,W2 是第二层全连接层的权重矩阵,b2 是偏置向量。
增大前馈子层隐状态的维度有利于提升最终翻译结果的质量,因此,前馈子层隐状态的维度一般比自注意力子层要大。
需要注意的是,上述公式中的 W1、b1、W2、b2 是FFN块的可学习参数,它们会通过训练过程进行学习和更新。
五、Decode层
和Encoder相同的模型不在讲解了,直讲解不同 的模块
1、Output Embedding
注意,output输入的内容,输入的内容包含了两层含义:
1.输入label
2.输入特征
这里要注意,输入的output前面会加入$<s>$标志位。标志位只占一个字符
输入label容易理解,输入特征不好理解。我们以英文翻译为中文为例。
则input 输入为: I love you.
output输入为:$<s>$ 我 爱 你
2、Masked Multi-Head Attention
为什么要加入标志位$<s>$呢?我们在做翻译任务的时候,都是一句话东第一个字开始翻译,逐渐到最后一个字。在翻译第一个字我的时候是根据标志位$<s>$的输入开始的。
注意:
我们在做翻译任务的时候,并不是完全根据英文直接翻译成中文的。
而是根据整个英文+已经翻译出来的中文来预测下一个要翻译的中文。
例如:
预测 “我”是根据: “I love you ” + "<s>" 预测 “我”
预测 “爱”是根据: “I love you ” + "<s>我" 预测 “爱”
预测 “你”是根据: “I love you ” + "<s>我爱" 预测 “你”
- 结论:所以说我们预测中文的输入output也会输入特征。
- 原理:
如何实现这种方式呢,就通过 Masked Multi-Head Attention。
其实原理和Multi-Head Attention一样,只不过把要预测的部分masked掉。
如何masked
这个子模块的输入依然是Q、K、V,计算到:那么$QK^T=(L_q,L_k)$的矩阵的时候如下:
行:Q
列:V
我们的目标是让当前的字,不能看到后面的字的意思,所有要把后面的字masked掉。
形成一个下三角矩阵。
这样在$QK^T=(L_q,L_k)$之后形成一个下三角矩阵,那么整个Attention就无法获取到后面的信息了。
六、 面试常见问题
1.Transformer为何使用多头注意力机制?(为什么不使用一个头)
论文中是这么说的:
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions.
翻译:多头注意使模型能够共同关注来自不同位置的不同表征子空间的信息。
直观上讲,多头的注意力有助于网络捕捉到更丰富的特征/信息。可以类比CNN中同时使用多个滤波器的作用。
举例:当你浏览网页的时候,你可能在颜色方面更加关注深色的文字,而在字体方面会去注意大的、粗体的文字。这里的颜色和字体就是两个不同的表示子空间。同时关注颜色和字体,可以有效定位到网页中强调的内容。使用多头注意力,也就是综合利用各方面的信息/特征。
2.对缩放因子的解释:
1.为什么要除以一个缩放因子?
(1)论文解释为:我们怀疑,对于很大的dk值,点积大幅度增长,将softmax函数推向具有极小梯度的区域。为了抵消这种影响,我们缩小点积。
(2)我们理解为:
因为softmax的本质是一个e为底的指数,会随着指数的变大变化率很明显,例如当点积为100,200,500,那么e的500次方会占绝对权重,从而影响结果不准确。
- 2.那么要除以一个多大的缩放因子呢?
(1)论文脚注解释为:
为了说明点积变大的原因,假设q和k的分量是独立随机的均值为0和方差为1的变量。然后他们的点积 均值为0,方差为dk
(2)我们理解为:
假设q和k的分量是独立随机的均值为0和方差为1的变量,也就是说qi和ki是均值为0和方差为1,那么qiki也是均值为0,方差为1。所以qk的均值为0,方差为dk。
3.Decoder阶段的多头自注意力和encoder的多头自注意力有什么区别?
答:Decoder有两层mha,encoder有一层mha,Decoder的第二层mha是为了转化输入与输出句长,Decoder的请求q与键k和数值v的倒数第二个维度可以不一样,但是encoder的qkv维度一样。
4.Transformer的并行化提现在哪个地方?
答:Transformer的并行化主要体现在self-attention模块,在Encoder端Transformer可以并行处理整个序列,并得到整个输入序列经过Encoder端的输出,但是rnn只能从前到后的执行
5.Decoder端可以做并行化吗?
训练的时候可以,但是交互的时候不可以
6.bert的mask为何不学习transformer在attention处进行屏蔽score的技巧?
答:BERT和transformer的目标不一致,bert是语言的预训练模型,需要充分考虑上下文的关系,而transformer主要考虑句子中第i个元素与前i-1个元素的关系。
写的不错