attention与self-attention

因为seq2seq模型容易遗忘掉部分信息,引入attention模型,它可以大幅度提高seq2eq模型

下图横轴是输入得句子长度,纵轴是模型评价值,BLEU越高说明翻译越准确,可以看到,当字数很长时,翻译得准确率就会降低

attention与self-attention_第1张图片

self-attention 

优点:

在attention的机制下,decoder每次更新状态时都会看一眼encoder的所有状态向量避免遗忘,attention还会告诉decoder应该关注哪一个状态(这也是名字的由来)

缺电:
计算量非常大

attention原理:

在encoder输入完最后一个状态向量hm时,decoder与attention会同时开始工作,计算s0与每一个状态h1h2....hm的相关性,用公式(下图给出)计算,结果记为ai 

有m个状态向量,计算出m个ai ,每一个ai在0-1之间,a1+a2+.....ai = 1

attention与self-attention_第2张图片

【插播一下】计算ai 过程:

第一种:

将hi 与s0做内积,得到更高维向量与矩阵W相乘,结果是一个向量,将该向量送入tanh函数,得到新向量每一个值在[-1 ,1],再将结果乘向量V,(W和V都是参数),最后a1...am送入softmax函数得到的向量中每个值>0,所有和仍为1

attention与self-attention_第3张图片

第二种(Transformer):

用Wk 和 Wq对两个输入向量hi,s0做线性变换(Wk和Wq是函数中的参数)

k向量有m个,ai也有m个

attention与self-attention_第4张图片

每个Ki 向量都是矩阵的列,最后得到的【a1,a2....am】就是下图的向量,向量中的每个元素都在0-1之间且相加和为1

attention与self-attention_第5张图片  attention与self-attention_第6张图片

 

 

上述两种任选一种计算出a1a2....am共m个权重值,然后利用公式(下图)得到context vector,

每一个c0c1....都对应一个s0s1.....,

 attention与self-attention_第7张图片

 decoder读入向量x1' ,再将状态更新为s1,更新用下图公式

attention与self-attention_第8张图片

 因为c0=a1h1+a2h2+....amhm,所以c0知道x1,x2....xm的所有信息,所以decoder的s1依赖于c0,

PS:每一轮算出来了的a1a2....am是不一样的,不能被重复使用

下一轮的s2由 s1c1决定,如下图公式

attention与self-attention_第9张图片

 s2算出来后需要计算c2 ,首先需要s2与encoder中h1h2...hm相关性(用上面提到的公式),计算出新的权重a1,a2....am,然后根据公式c2=a1h1+a2h2+...amhm得到c2

attention与self-attention_第10张图片

下图中的线用来表示相关性,越粗越相关,a值越大

attention与self-attention_第11张图片

attention: 两个RNN网络

self-attention:  一个RNN网络

                     ( self-attention并不局限于seq2seq,它可以用在所有的RNN上)

self-attention原理

初始h0=c0=0,新状态h1依赖于c0和x1,由于h0=0, 所以c1=h1

attention与self-attention_第12张图片

attention与self-attention_第13张图片

 计算h2

 attention与self-attention_第14张图片

下一步计算a2, 根据这个公式可算出a1和a2

开始计算c2(见下图公式),由于h0=0,之后的计算中我们自动忽略它

attention与self-attention_第15张图片

然后一直重复上述步骤:计算hi---->计算ai---->计算ci

attention与self-attention_第16张图片

 

 attention与self-attention_第17张图片

直到全部计算完

attention与self-attention_第18张图片


 

你可能感兴趣的:(NLP,深度学习,自然语言处理,神经网络)