赞
踩
RNN不同的拓扑结构对应不同应用场景。
many to many也就是我们所说的seq2seq
中间RNN结构,
下面的输入相当于encoder编码
上面的输出相当于decoder解码
这种结构下面全都是要输入的,上面也都是要输出的,只是我们没有画出来,没有画出来的输出我们不会真正用到
举例:
比如我们在做机器翻译的时候,我们希望他会有重点的进行翻译。
基于Encoder-Decoder框架
1.两层RNN链,左边蓝色的是Encoder,右边黄色的是Decoder
两层隐层输出加上一个start标志位进行计算得到一个ht,这个ht包含了Encoder整体一句话的信息。,也包含了start标志位。
2.把得到的Encoder隐层每个时刻向上输出与Decoder隐层每个时刻向上输出计算相似度的值,例如第一时刻Encoder隐层向上的输出与Decoder第一时刻向上的输出计算相似度就是Decoder第一时刻应该有的输出和Encoder所有时刻输出的相似度。
计算相似度方法,这三种区别不大:
(1)z和h计算一个余弦距离(两个向量内积),两个向量夹角越小cos越大,说明越相似。
(2)学习一个神经网络。
(3)
那么计算出来的相似度是一个值,如果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”。
一堆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来自不同的序列。
训练多组Wq,Wk,Wv矩阵,每组得到一个b矩阵,再与一个W矩阵相乘得到最终的b矩阵。
(1)Encoder最下面的输入两个单词的词向量加上一个位置信息(这个位置信息是人为设定的向量)经过Self-Attention层得到b1,b2,再与没有经过Self-Attention的原词向量add加和。(b1+x1,b2+x2)也就是残差思想。
(2)将add加和后的结果进行layer Normalize(归一化)
例如b1+x1 结果是一个向量[c1,c2,c3,c4],那么归一化就是求出这四个值的均值和方差
用每个数减去均值/方差(也就是标准化)
(3)再往下去传递经过一个W矩阵,在加上一个残差思想(经过残差矩阵的数据和没经过残差矩阵的数据add相加再标准化)
由下往上先经过一个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的作用是用来将两个序列关联起来。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。