Attention:
- 本质:从全部关注→重点关注,将有限的注意力集中在重点信息上,从而节省资源,快速获得最有效的信息。
- 1)Soft Attention:是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但计算量较大。
2)Hard Attention:直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。
3)Local Attention:这种方式是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到一个与当前目标单词对齐的位置,以这个位置为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。
4)self-Attention:
- 假如输入序列是"Thinking Machines",X矩阵就是由"Thinking"和"Machines"添加过位置编码后的词向量组成的矩阵。然后词向量矩阵通过点乘三个权值矩阵WQ,WK,WV, 转变成为计算Attention值所需的Query,Keys,Values向量。
- 得到Q,K,V后,然后计算Attention值:
步骤1: 计算每个单词之间的相关性score。使用点积法:用Q中每一个向量与K中每一个向量计算点积,具体到矩阵的形式:score=Q⋅KT
步骤2: 对Score进行归一化,目的是为了训练时梯度能够稳定。score= score/
dk^1/2
步骤3: 通过softmax函数,将每个单词之间的Score转换成[0,1]之间的α概率分布矩阵。
步骤4:根据每个单词之间的概率分布,然后乘上对应的Values值,α与V进行点积。
- 1)Encoder部分
Encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码。
如下图,获取语义向量最简单的方式就是直接将最后一个输出的隐状态作为语义向量c。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。
下图c代表生成的语义向量,q函数代表相应的变换
2)Decoder部分
Decoder部分就是根据Encoder部分输出的语义向量c来做解码工作。以翻译为例,就是生成相应的译文。
由于生成的序列是不定长的。而且上一时刻的输出通常要作为下一时刻的输入,如下图所示,预测y2时y1要作为输入。
得到语义向量c后,通常的做法是将c当做初始状态h0输入到Decoder中。
- 标准的Seq2Seq模型,Decoder基于当前状态产生下一个状态,这样产生的新状态可能已经忘了Encoder的部分输入,因此难以翻译长句子。如果使用Attention,Decoder在产生下一个状态之前,会先看一遍Encoder的所有状态,因此Decoder知道Encoder的完整信息,不会有遗忘。
- Attention原理:
①在Encoder结束工作后,Attention和Decoder同时开始工作。
如图,Decoder的初始状态S0是Encoder的最后一个状态hm,此时Encoder的每一个hi状态都需保留。
- 计算S0与每一个hi的相关性(即权重)记为αi,公式如下:
共有m个状态,因此可以计算得到m个α
s0和hi做concatenation,与W向量点乘得到一个向量,把双曲正切函数应用在向量的每一个元素上(此时的元素都在0-1之间),最后将V与原来的向量内积,得到关联分数socre,在做softmax变换,得到权重。
(c0是对Encoder的m个状态进行加权平均)
每一个context vector c对应一个Decoder s,c0对应s0
- Decoder读入向量x1’,A’是参数矩阵,计算得到Decoder新状态si
(c0包含Encoder中h1…hm的完整信息,因此Attention不会遗忘)
- 根据Decoder当前状态s1和Encoder的m个状态对齐,再得到对于Decoder当前状态的一轮权重,计算context vector,再计算Decoder的下一状态。
- 计算context vector c1,依次重复步骤③④⑤
Transformer:
- Transformer是一个基于Encoder-Decoder框架的模型。包含输入、Encoder、Decoder、输出四个部分。
- 第一部分,Input输入:
- 以"Tom chase Jerry" 翻译成中文"汤姆追逐杰瑞"为例:
Encoder 的 inputs就是"Tom chase Jerry" 分词后的词向量(假设每个都是一个512维的词向量)
- 输入inputs embedding后需要给每个词向量添加位置编码positional encoding
- 原因:一句话中同一个词,如果词语出现位置不同,意思可能很大变化,比如:我欠他100w 和 他欠我100w。因此获取词语出现在句子中的位置信息是一件很重要的事情。但是Transformer 是完全基于self-Attention的,而self-attention是不能获取词语位置信息的,所以在输入的时候需要给每一个词向量添加位置编码。
- positional encoding获取方法:
pos表示单词在句子中的绝对位置,pos=0,1,2…,例如:Jerry在"Tom chase Jerry"中的pos=2;dmodel表示词向量的维度,在这里dmodel=512;2i和2i+1表示奇偶性,i表示词向量中的第几维。
- positional encoding与词向量相加,作为Encoder的输入
- 第二部分,Transformer的Encoder:
- Encoder block由6个encoder堆叠而成,Nx=6。下图就是一个encoder的内部结构,可以看出一个encoder由Multi-Head Attention 和 全连接神经网络Feed Forward Network构成。
- Multi-Head Attention :
Multi-Head Attention 就是在self-attention的基础上,对于输入的embedding矩阵,self-attention只使用了一组权值矩阵WQ,WK,WV进行变换得到一组Query,Keys,Values。而Multi-Head Attention使用多组权值矩阵,得到多组Query,Keys,Values,然后每组分别计算得到一个Z矩阵,最后将得到的多个Z矩阵进行拼接。其中Transformer里面是使用了8组不同的WQ,WK,WV。
- Add&Normalize:
Add是在Z的基础上加了一个残差块X(即Multi-Head Attention的输入X矩阵),对应上图中的LayerNorm过程,目的是为了防止在深度神经网络训练中发生退化问题。
Normalize:在神经网络进行训练之前,需要对输入数据进行Normalize归一化,目的:1. 能够加快训练的速度。2. 提高训练的稳定性。
- Feed-Forward Networks:
全连接层是一个两层的神经网络,先线性变换,然后ReLU非线性,再线性变换。
- 然后经过Add&Normalize,输入下一个encoder中,经过6个encoder后输入到decoder中
- 第三部分,Transformer的Decoder:
- Transformer 的 Decoder的输入与Encoder的输入处理方法步骤一样,一个接受source数据,一个接受target数据,对应到上面例子里面就是:Encoder接受英文"Tom chase Jerry",Decoder接受中文"汤姆追逐杰瑞"。只是在有target数据时(即在进行有监督训练时)才会接受Outputs Embedding,进行预测时则不会接收。
- Decoder比Encoder多了一个Masked Multi-Head Attention,其他的结构相同。
Masked Multi-Head Attention:和Multi-Head Attention计算原理一样,只是多加了一个mask码。mask 表示掩码,它对某些值进行掩盖,使其在参数更新时不产生效果。Transformer 模型里面涉及padding mask和sequence mask两种 mask。
- padding mask对长度不同的输入序列进行对齐。因为每个批次输入序列的长度不同,在较短的序列后面填充 0;对较长的序列 截取左边的内容,把多余的直接舍弃。因为这些填充的位置是没什么意义的,attention机制不应该把注意力放在这些位置上,所以需要进行一些处理。
具体的做法是,把这些位置的值加上一个非常大的负数(负无穷),在经过 softmax后,这些位置的概率就会接近0
- sequence mask 是为了使得 decoder 不能看见未来的信息。在训练时我们将target数据完整输入进decoder中,而对于一个序列,在 time_step 为 t 的时刻Decoder输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要sequence mask,把 t 之后的信息给隐藏起来。
- Decoder的Multi-Head Attention:
- Encoder中的Multi-Head Attention是基于Self-Attention的,Decoder中的第二个Multi-Head Attention就只是基于Attention,它的输入Query来自于Masked Multi-Head Attention的输出,Keys和Values来自于Encoder中最后一层的输出。
- 为什么Decoder用两个Multi-Head Attention:第一个Masked Multi-Head Attention是为了得到之前已经预测输出的信息,相当于记录当前时刻的输入之间的信息。第二个Multi-Head Attention是为了表示当前的输入与经过encoder提取过的特征向量之间的关系来预测输出下一时刻的信息,也就是输出的信息。
- 经过了第二个Multi-Head Attention之后的Feed Forward Network与Encoder中一样,然后就是输出进入下一个decoder,如此经过6层decoder之后到达最后的输出层。
- Transformer的输出:
首先经过一次线性变换,然后Softmax得到输出的概率分布,通过词典,输出概率最大的对应的单词作为预测输出。