赞
踩
小白第一次学习transformer,特意做个笔记,以便后续复习
首先在学习transformer之前,我先简单学习了RNN和LSTM网络(参考链接https://zhuanlan.zhihu.com/p/123211148),然后学习了Attention机制(参考连接https://blog.csdn.net/Tink1995/article/details/105012972)最后学习了Transformer(参考连接https://blog.csdn.net/Tink1995/article/details/105080033?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-10.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-10.essearch_pc_relevant)
RNN的特点:RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。
RNN结构和特点:
其中X是输入层,U是输入层到隐藏层的权重矩阵,S是隐藏层,V是隐藏层到输出层的权重矩阵,O是输出层,W是每个时间点之间的权重矩阵。我们注意到,RNN之所以可以解决序列问题,是因为它可以记住每一时刻的信息,每一时刻的隐藏层不仅由该时刻的输入层决定,还由上一时刻的隐藏层决定。公式如下,其中 代表t时刻的输出, 代表t时刻的隐藏层的值:
LSTM特点:LSTM四个单词的缩写,Long short-term memory,翻译过来就是长短期记忆。相比于RNN,LSTM使用频率更高。LSTM不仅可以有效地处理序列数据,而且可以对输入的信息选择性的记录和遗忘,因为它具有强大的门控系统(记忆门、遗忘门、输出门),关于门的理解参考博文https://zhuanlan.zhihu.com/p/28749444。
LSTM一个时间点的内部结构:
在解释上图之前,先解释一下这个符号:。该符号代表一个激活函数,LSTM里常用的激活函数有两个,一个是tanh,一个是sigmoid。
其中,为通过该时刻的输入, 和上一时刻隐藏层信息 向量拼接,再与权重参数向量 点积,得到的值经过激活函数tanh最终会得到一个数值,也就是 ,注意只有 的激活函数是tanh,因为 是真正作为输入的,其他三个都是门控装置。是输入门的门控装置, 同样也是通过该时刻的输入 和上一时刻隐藏信息 向量拼接,在与权重参数向量 点积(注意每个门的权重向量都不一样,这里的下标i代表input的意思,也就是输入门)。得到的值经过激活函数sigmoid的最终会得到一个0-1之间的一个数值,用来作为输入门的控制信号。以此类推可以得到输出门和遗忘门的原理。具体可以参考该篇文章http://colah.github.io/posts/2015-08-Understanding-LSTMs/ 疑问:到底拼接的是隐藏层的状态还是输出层???
Attention机制的原理:利用Query和Key用来计算对应Value的权重系数,对Source中元素的Value值进行加权求和即可。
将其本质思想改写为如下公式:
第一步:计算和的相似性,如下:
其中MLP多层感知机用的相对较少。
第二步:计算出相似性后,可用SoftMax对相似性得分进行数值转换。一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。计算公式如下:
第三步: 即为 对应的权重系数,然后进行加权求和即可得到数值。
最后对上述计算Attention值地三个阶段做一个总结:
Attention优缺点:
注意力机制可以获取局部重要信息,能够抓住重点,效果好;此外,在训练过程中的解码环节可以实现并行训练、加快训练速度;缺点是编码环节依旧采用的是RNN,LSTM这些顺序编码的模型,无法实现并行运算,不够完美,而且对于中长距离之间,两个词相互之间的关系没有办法很好的获取。
self-attention概念:Self Attention顾名思义不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。其具体计算过程是一样的,只是计算对象发生了变化而已,相当于是Query=Key=Value。
self-attention优势:Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。但是Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增加计算的并行性也有直接帮助作用。正好弥补了attention机制的两个缺点,这就是为何Self Attention逐渐被广泛使用的主要原因。
Transformer结构:
1.输入:
Transforme的Encoderr输入是一个序列数据。如,将"Tom chase Jerry" 翻译成中文"汤姆追逐杰瑞"为例:Encoder 的 inputs就是"Tom chase Jerry" 分词后的词向量。可以是任意形式的词向量,如word2vec,GloVe,one-hot编码。
假设上图中每一个词向量都是一个512维的词向量。
我们注意到,输入inputs embedding后需要给每个word的词向量添加位置编码positional encoding这个positional encoding怎么获取呢?参考博文史上最小白之Transformer详解。
Transformer 的 Decoder的输入与Encoder的输出处理方法步骤是一样地,一个接受source数据,一个接受target数据,对应到上面例子里面就是:Encoder接受英文"Tom chase Jerry",Decoder接受中文"汤姆追逐杰瑞"。只是在有target数据时也就是在进行有监督训练时才会接受Outputs Embedding,进行预测时则不会接收。
2.Encoder block:
Encoder block是由6个encoder堆叠而成,Nx=6。图中的灰框部分就是一个encoder的内部结构,从图中我们可以看出一个encoder由Multi-Head Attention 和 全连接神经网络Feed Forward Network构成。
首先回顾一下self-attention,假如输入序列是"Thinking Machines",x1,x2就是对应地"Thinking"和"Machines"添加过位置编码之后的词向量,然后词向量通过三个权值矩阵 转变成为计算Attention值所需的Query,Keys,Values向量。
在实际使用中,每一个样本,也就是每一条序列数据都是以矩阵的形式输入地,故可以看到上图中,X矩阵是由"Tinking"和"Machines"词向量组成的矩阵,然后经过变换得到Q,K,V。假设词向量是512维,X矩阵的维度是(2,512),均是(512,64)维,那么得到的Query,Keys,Values就都是(2,64)维。接下来就是计算Attention值了,整体的计算图如下:
Multi-Head Attention就是在self-attention的基础上,对于输入的embedding矩阵,使用多组,得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接,Transformer里面是使用了8组不同的。
经过Multi-Head Attention得到矩阵Z之后,并没有直接传入全连接神经网络FNN,而是经过了一步:Add&Normalize。Add,就是在Z的基础上加了一个残差块X,加入残差块X的目的是为了防止在深度神经网络训练中发生退化问题。(关于添加残差块为什么能够防止退化问题,参考博文史上最小白之Transformer详解)。Layer Normalization(LN)是在同一个样本中不同神经元之间进行归一化
Feed-Forward Networks是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。
然后经过Add&Normalize,输入下一个encoder中,经过6个encoder后输入到decoder中,至此Transformer的Encoder部分就全部介绍完。
3.Decoder block:
Decoder block也是由6个decoder堆叠而成,Nx=6。上图3中的灰框部分就是一个decoder的内部结构,从图中我们可以看出一个decoder由Masked Multi-Head Attention,Multi-Head Attention 和 全连接神经网络FNN构成,比Encoder多了一个Masked Multi-Head Attention,其他的结构与encoder相同。
Decoder的输入分为两类:训练时的输入就是已经对准备好对应的target数据。例如翻译任务,Encoder输入"Tom chase Jerry",Decoder输入"汤姆追逐杰瑞"。预测时的输入,一开始输入的是起始符,然后每次输入是上一时刻Transformer的输出。例如,输入"",输出"汤姆",输入"汤姆",输出"汤姆追逐",输入"汤姆追逐",输出"汤姆追逐杰瑞",输入"汤姆追逐杰瑞",输出"汤姆追逐杰瑞"结束。
Masked Multi-Head Attention与Encoder的Multi-Head Attention计算原理一样,只是多加了一个mask码。mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及两种 mask,分别是 padding mask 和 sequence mask。其中sequence mask 是为了使得 decoder 不能看见未来的信息。对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。这在训练的时候有效,因为训练的时候每次我们是将target数据完整输入进decoder中地,预测时不需要,预测的时候我们只能得到前一时刻预测出的输出。
那么具体怎么做呢?也很简单:产生一个下三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的。
Add&Normalize也与Encoder中一样,接下来就到了Decoder中第二个Multi-Head Attention,这个Multi-Head Attention又与Encoder中有一点点不一样。Encoder中的Multi-Head Attention是基于Self-Attention地,Decoder中的第二个Multi-Head Attention就只是基于Attention,它的输入Quer来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。
思考:为啥Decoder中要搞两个Multi-Head Attention呢?第一个Masked Multi-Head Attention是为了得到之前已经预测输出的信息,相当于记录当前时刻的输入之间的信息的意思。第二个Multi-Head Attention是为了通过当前输入的信息得到下一时刻的信息,也就是输出的信息,是为了表示当前的输入与经过encoder提取过的特征向量之间的关系来预测输出。(参考博文史上最小白之Transformer详解)
经过了第二个Multi-Head Attention之后的Feed Forward Network与Encoder中一样,然后就是输出进入下一个decoder,如此经过6层decoder之后到达最后的输出层。
4.transformer输出
Output如图中所示,首先经过一次线性变换,然后Softmax得到输出的概率分布,然后通过词典,输出概率最大的对应的单词作为我们的预测输出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。