[NLP/Attention]关于attention机制在nlp中的应用总结
原文链接: https://blog.csdn.net/qq_41058526/article/details/80578932
attention 总结
参考:注意力机制(Attention Mechanism)在自然语言处理中的应用
Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射
,如下图。
在计算attention时主要分为三步:
- 第一步是将
query和每个key进行相似度计算得到权重
,常用的相似度函数有点积,拼接,感知机等; - 第二步一般是
使用一个softmax函数对这些权重进行归一化
; - 最后将
权重和相应的键值value进行加权求和得到最后的attention
。 - 目前在NLP研究中,key和value常常都是同一个,即key=value。
Attention在NLP中其实我觉得可以看成是一种自动加权,它可以把两个你想要联系起来的不同模块,通过加权的形式进行联系。目前
主流的计算公式
有以下几种:
通过设计一个函数将目标模块mt和源模块ms联系起来,然后通过一个soft函数将其归一化得到概率分布。目前Attention在NLP中已经有广泛的应用。它有一个很大的优点就是可以可视化attention矩阵来告诉大家神经网络在进行任务时关注了哪些部分。不过在NLP中的attention机制和人类的attention机制还是有所区别,它基本还是需要
计算所有要处理的对象
,并额外用一个矩阵去存储其权重,其实增加了开销。而不是像人类一样可以忽略不想关注的部分,只去处理关注的部分。
一、传统encoder-decoder模型
encoder-decoder模型
也就是编码-解码模型。所谓编码,就是将输入序列转化成一个固定长度的向量;解码,就是将之前生成的固定向量再转化成输出序列。
具体实现的时候,编码器和解码器都不是固定的,可选的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由组合。比如说,你在编码时使用BiRNN,解码时使用RNN,或者在编码时使用RNN,解码时使用LSTM等等。
1.1 encoder
- 对于输入序列x=(x1,...,xTx)x=(x1,...,xTx),其会将输入序列如图所示编码成一个context vector c ,encoder一般使用RNN,在RNN中,当前时间的隐藏状态是由上一时间的状态和当前时间输入决定的,也就是
ht=f(xt,ht−1)ht=f(xt,ht−1) - 获得了各个时间段的隐藏层以后,再将隐藏层的信息汇总,生成最后的语义向量 c,相当于把整个句子的信息都包含了,可以看成整个句子的一个语义表示。
c=q(ht,...,hTx)c=q(ht,...,hTx)
其中的f和q是非线性的函数
例如,在论文中有使用
q(ht,...,hTx)=hTxq(ht,...,hTx)=hTx
来简化计算
1.2 decoder
一般其作用为在给定context vector c和所有已预测的词{
y1,...,yt−1}{y1,...,yt−1}去预测ytyt,故t时刻翻译的结果y为以下的联合概率分布
在RNN中(如上图所示),t时刻隐藏状态stst为:
st=f(st−1,yt−1,c)st=f(st−1,yt−1,c) 而联合条件分布为:
p(y)=∏t=1