Attention注意力机制&Transform架构

RNN不同的拓扑结构对应不同应用场景。

many to many也就是我们所说的seq2seq

中间RNN结构,

下面的输入相当于encoder编码

上面的输出相当于decoder解码

这种结构下面全都是要输入的,上面也都是要输出的,只是我们没有画出来,没有画出来的输出我们不会真正用到

Attention注意力机制

举例:

比如我们在做机器翻译的时候,我们希望他会有重点的进行翻译。

基于Encoder-Decoder框架

1.两层RNN链,左边蓝色的是Encoder,右边黄色的是Decoder

两层隐层输出加上一个start标志位进行计算得到一个ht,这个ht包含了Encoder整体一句话的信息。,也包含了start标志位。

2.把得到的Encoder隐层每个时刻向上输出与Decoder隐层每个时刻向上输出计算相似度的值,例如第一时刻Encoder隐层向上的输出与Decoder第一时刻向上的输出计算相似度就是Decoder第一时刻应该有的输出和Encoder所有时刻输出的相似度。

计算相似度方法,这三种区别不大:

(1)z和h计算一个余弦距离(两个向量内积),两个向量夹角越小cos越大,说明越相似。

(2)学习一个神经网络。

(3)a = h^{T}Wz

那么计算出来的相似度是一个值,如果Encoder是4个时刻,那么计算出来的是4个值,这四个值需要做一下softmax进行归一(得到Attention weights,在图中分别是0.5,0.3,0.1,0.1),经过softmax变换后的Attention weights再与h1,h2,h3,h4输出的向量进行相乘相加。得到context vector。

3.得到上下文向量context vector后再传给Decoder,这个Decoder拿到context vecoter和从下往上的输入(包括一个start标志位)后进行拼接后再乘一个W矩阵,在经过tanh变换,得到attention vector。拼接后再向上传递到输出层得到“我”这个结果。(attention layer)

这样输出加上一个上下文向量context vector后得到的“我”就更专注于第一个输入的词“I”。

Transform

一堆Encoder和Decoder的堆叠。

 其中每一个Encoder-Decoder结构

 RNN&LSTM很难并行运算,后一个结果输出需要加上前面传过来的结果。所以模型不管是训练的时候还是使用的时候都会比较慢。

如果是双向的RNN或者LSTM,每一个bi输出都依赖于全局的输入。

如果是单向的RNN或者LSTM,每一个bi输出都依赖于前面的输入。

self-Attention可以进行并行计算,将原来的BiLSTM层替换成self-Attention层。

有了self-Attention就可以不用RNN或者BiLSTM了。

self-Attention就是在一个句子里面一个单词与另一个单词进行匹配。

 Self-Attention刨析:

(1)x输入经过词嵌入转换成a1词嵌入向量,在经过Wq,Wk,Wv矩阵相乘,得到结果q1,k1,v1(向量).

(2)每个q(q1,q2,q3,q4)与每个k(k1,k2,k3,k4)进行匹配(计算词与词之间匹配的分数),这里就相当于Attention结构里面Encoder所有值与Decoder的值计算相似度。(这里直接用的内积余弦相似度,再做了一下归一,这里除以一个d)

 (3)得到分数后再做softmax

 (4)将第一时刻a11,a12,a13,a14求出来的分值分别于对应v(v1,v2,v3,v4)相乘再加和得到b1。

b2,b3,b4(向量)也用同样的方式计算得到。

这里得到的b1会考虑到整个句子的信息。

最终得到的b不会考虑句子中单词的顺序, 这样的计算方式使得整个句子每个单词都不会有依赖,所以每个b(b1,b2,b3,b4)可以进行并行运算。(矩阵运算,矩阵运算可以用GPU进行并行加速运算!)

 Self-Attention计算的是一句话中词与词之间的关联度,可以起到一句话里单词之间指代消歧的作用。

Encoder-Decoder计算的是两句话里词与词之间的关联度。

self-Attention里面的q,k,v来自同一个序列

Encoder-Decoder-Attention里面的q,k来自不同的序列。

 Multi head Self-Attention

训练多组Wq,Wk,Wv矩阵,每组得到一个b矩阵,再与一个W矩阵相乘得到最终的b矩阵。

 

再回到Transform的结构

Transform的Encoder部分

(1)Encoder最下面的输入两个单词的词向量加上一个位置信息(这个位置信息是人为设定的向量)经过Self-Attention层得到b1,b2,再与没有经过Self-Attention的原词向量add加和。(b1+x1,b2+x2)也就是残差思想。

(2)将add加和后的结果进行layer Normalize(归一化)

例如b1+x1 结果是一个向量[c1,c2,c3,c4],那么归一化就是求出这四个值的均值和方差

用每个数减去均值/方差(也就是标准化\frac{ci-mean}{\sigma }

(3)再往下去传递经过一个W矩阵,在加上一个残差思想(经过残差矩阵的数据和没经过残差矩阵的数据add相加再标准化)

 

Transform的Dncoder部分

由下往上先经过一个Self-Attention

再经过Encoder-Decoder-Attention

Decoder不像Encoder一下子将所有时刻的输入都输入进去,一下得到所有输出。

Encoder是每一时刻有一个输入

那么计算Self-Attention第一时刻就计算一个词的Self-Attention

第二时刻就计算前两个词的Self-Attention

第三时刻就计算前三个词的Self-Attention

以此类推。

计算Self-Attention结果经过Wq矩阵相乘得到Q,Encoder结果乘上Wk和Wv矩阵得到K和V

那么中间的Seq2Seq Attention层就拿到W和Q和V从而再往上计算。

Seq2Seq Attention,是要算两个序列之间的Attention。通过这个把两个序列关联起来,所以K和V肯定是要从Encoder获取,而Q就是从Decoder中获取。

那么我的理解是transform中的self-attention是句子中每个词之间指代消歧。

而中间Seq2Seq Attention的作用是用来将两个序列关联起来。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值