注意力机制(Attention Mechanism)学习笔记

参考自:https://blog.csdn.net/qq_40027052/article/details/78421155 对内容进行抽取的少许补充。
还有 https://spaces.ac.cn/archives/4765/comment-page-3。在后面加入了此文的内容。

原理是一个encoder、decoder框架:输入句子Source,目标句子target。

source=<x1,x2…xm>,target=<y1,y2…yn>。

将输入句子通过非线性变换转化为中间语义表示C:C=F(x1,x2…,xm)(之前的),attention模型的不同之处在于:中间语义表示C会被替换成根据当前生成单词而不断变化的Ci。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。

y1=f(C1)
y2=f(C2,y1)
y3=f(C3,y1,y2)

每个Ci可能对应着不同的源语句子单词的注意力分配概率分布。

C i = j = 1 L x a i j h j C_i = \sum_{j=1}^{L_x} a_{ij}h_j

Lx是输入句子source的长度 Lx=||Source||,aij代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数(所以统计所有的输入单词,就知道对应第i个的输出概率(中间语义表示C的概率分布)。)而hj则是Source输入句子中第j个单词的语义编码,假设Ci下标i就是上面例子所说的“ 汤姆” ,那么Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2。(这里f函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f函数的结果往往是某个时刻输入xi后隐层节点的状态值)

如何知道注意力分配系数aij呢:
RNN作为具体模型的Encoder-Decoder框架:(感觉RNN就是,平常的DNN,同一层之间是没有连接的,只有前后层有连接,而RNN的同一层隐藏层之间有连接)
image

注意力分配概率分布值的通用计算过程:
image

函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。
这是一个RNN的decoder,要想知道目标单词yi,我们已知target之前的单词(i-1,i-2…,1),和所有的source单词,即通过函数F(hj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

Attention机制的本质思想

将Source中的构成元素想象成是由一系列的< Key,Value >数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。所以本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:

A t t e n t i o n ( Q u e r y , S o u r c e ) = j = 1 L x S i m i l a r i t y ( Q u e r y , K e y i ) V a l u e i Attention(Query,Source)=\sum_{j=1}^{L_x} Similarity(Query,Key_i)*Value_i

可以将其归纳为两个过程:第一个过程是根据Query和Key计算权重系数(根据Query和Key计算两者的相似性或者相关性;对得到的原始分值进行归一化处理),第二个过程根据权重系数对Value进行加权求和。

image

1. 计算两者的相似性或者相关性。

在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Keyi,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:

image

2. 归一化处理

第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:

image

3. 计算Attention数值(Ci)

第二阶段的计算结果ai即为Valuei对应的权重系数,然后进行加权求和即可得到Attention数值:
image


参考 https://spaces.ac.cn/archives/4765/comment-page-3

A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q k T d k ) V Attention(Q,K,V)=softmax(\frac{Qk^T}{\sqrt{dk}})V

和上面 C i = j = 1 L x a i j h j C_i = \sum_{j=1}^{L_x} a_{ij}h_j 类似,有

A t t e n t i o n ( q t , K , V ) = s = 1 m 1 Z e x p ( &lt; q t , k t &gt; Z ) v s Attention(q_t,K,V)=\sum_{s=1}^{m} \frac{1}{Z} exp(\frac{&lt;q_t,k_t&gt;}{Z})v_s

其中Z是归一化因子。事实上q,k,v分别是query,key,value的简写,K,V是一一对应的,它们就像是key-value的关系,那么上式的意思就是通过qt这个query,通过与各个ks内积的并softmax的方式,来得到qt与各个vs的相似度,然后加权求和,得到一个dv维的向量(qt是target中某个元素query,一个qt得到dv维(source的长度)的attention值,比如对于某个target单词汤姆,对应的source里的<tom,chase,jerry>的attention值为(0.6,0.2,0.2))。其中因子 d k \sqrt{dk} 起到调节作用,使得内积不至于太大(太大的话softmax后就非0即1了,不够“soft”了)。

Position Embedding

这样的模型并不能捕捉序列的顺序!换句话说,如果将K,V按行打乱顺序(相当于句子中的词序打乱),那么Attention的结果还是一样的。这就表明了,到目前为止,Attention模型顶多是一个非常精妙的“词袋模型”而已。(词袋模型:比如nature language processing,翻译时三个单词作为一个词去翻译,而不是三个单词去翻译)。
机器翻译时需要学习顺序信息,才能更好的改进翻译效果。

Position Embedding,也就是“位置向量”,将每个位置编号,然后每个编号对应一个向量,通过结合位置向量和词向量,就给每个词都引入了一定的位置信息,这样Attention就可以分辨出不同位置的词了。

构造Position Embedding的公式:

{ P E 2 i ( p ) = s i n ( p / 1000 0 2 i / d p o s ) P E 2 i + 1 ( p ) = c o s ( p / 1000 0 2 i / d p o s ) \begin{cases} PE_{2i}(p)= sin(p/10000^{2i/d_{pos}}) \\ PE_{2i+1}(p)= cos(p/10000^{2i/d_{pos}}) \end{cases}

有dpos维的位置向量,i=1,2,…,dpos,将id为p的位置映射为一个dpos维的位置向量,这个向量的第i个元素的数值就是 P E i ( p ) PE_i(p)

猜你喜欢

转载自blog.csdn.net/eqiang8848/article/details/84679396