从Encoder-Decoder到Attention

参考
大白话浅谈注意力机制
64 注意力机制【动手学深度学习v2】
Attention机制详解(二)——Self-Attention与Transformer

Encoder-Decoder

从Encoder-Decoder到Attention_第1张图片

架构

  • 文本处理和语音识别的Encoder部分通常采用【RNN模型】

  • 图像处理的Encoder一般采用【CNN模型】

Example

  • 场景∶
    输入的是英文句子:Tom chase Jerry .
    翻译生成中文单词:“汤姆”,“追逐”,“杰瑞”。

  • 信息Tom chase Jerry

  • 有效信息

    • 每次生成一个目标单词

    • 每个目标单词的有效信息都不一样
      比如对于“杰瑞”,最重要的信息应该是“Jerry"

  • 分心模型

    • y 1 = f ( C ) y_{1}= f(C) y1=f(C) y 2 = f ( C , y 1 ) y_{2}= f(C, y_{1}) y2=f(C,y1) y 3 = f ( C , y 1 , y 2 ) y_{3} = f(C, y_{1},y_{2}) y3=f(C,y1,y2)
    • 在翻译“杰瑞”时,“Tom” " chase” " Jerry”三者贡献的注意力是一样的
  • 引入注意力机制

  • 从Encoder-Decoder到Attention_第2张图片

    • y 1 = f 1 ( C 1 ) y_{1}= f_{1}(C_{1}) y1=f1(C1) y 2 = f 1 ( C 2 , y 1 ) y_{2}= f_{1}(C_{2},y_{1}) y2=f1(C2,y1) y 3 = f 1 ( C 3 , y 1 , y 2 ) y_{3} = f_{1}(C_{3}, y_{1},y_{2}) y3=f1(C3,y1,y2)
  • 而每个C可能对应着不同的源语句了单每的注意力分配慨率分布,l如对于上面的英汉翻崔来说,其对应的信息可能如下:
    C 汤 姆 = g ( 0.6 ∗ f 2 ( " T o m " ) , 0.2 ∗ f 2 ( C h a s e ) , 0.2 ∗ f 2 ( " J e r r y " ) ) C_{汤姆}=g(0.6 * f2("Tom"),0.2 * f2(Chase),0.2 * f2("Jerry")) C=g(0.6f2("Tom"),0.2f2(Chase),0.2f2("Jerry"))
    C 追 逐 = g ( 0.2 ∗ f 2 ( " T o m " ) , 0.7 ∗ f 2 ( C h a s e ) , 0.1 + f 2 ( " J e r r y " ) ) C_{追逐}=g(0.2 * f2("Tom"),0.7 * f2(Chase),0.1 + f2("Jerry")) C=g(0.2f2("Tom"),0.7f2(Chase),0.1+f2("Jerry"))
    C 杰 瑞 = g ( 0.3 ∗ f 2 ( " T o m " ) , 0.2 ∗ f 2 ( C h a s e ) , 0.5 ∗ f 2 ( " J e r r y " ) ) C_{杰瑞}=g(0.3 * f2("Tom"),0.2 * f2(Chase),0.5 * f2("Jerry")) C=g(0.3f2("Tom"),0.2f2(Chase),0.5f2("Jerry"))
    一般的做法中,g函数就是对构成元素加权求和
    C i = Σ i = 1 L x a i j ⋅ h j C_{i}=\Sigma^{L_{x}}_{i=1}{a_{ij}·h_{j}}%,ay hj Ci=Σi=1Lxaijhj

Attention机制本质思想

  • 从概念上理解,把Attention仍然理解为【从大量信息中】【有选择地筛选出】【少量重要信息】并【聚焦到这些重要信息上】,【忽略大多不重要的信息】

  • 从相似度、相关性角度理解

    • 传统聚类︰将【样本】进行分类

    • Attention:将【特征】与目标进行相似度匹配

    从Encoder-Decoder到Attention_第3张图片

Attention机制的具体计算过程

步骤

  1. 根据Query和Key计算两者的相似性或者相关性

    可以引人不同的函数和计算机制, 根据Query和某个,计算两者的相似性或者相关性

    常见方法

    • 求两者的【向量点积】

      点积: S i m i l a r i t y ( Q u e r y , K e y i ) = Q u e r y ⋅ K e y i Similarity(Query,Key_{i}) = Query·Key_{i} Similarity(Query,Keyi)=QueryKeyi

    • 求两者的向量【cosine相似性】

      Cosine相似性: S i m i l a r i t y ( Q u e r y , K e y i ) = Q u e r y ⋅ K e y i ∣ ∣ Q u e r y ∣ ∣ ⋅ ∣ ∣ K e y i ∣ ∣ Similarity(Query,Key_{i}) = \frac{Query·Key_{i}}{ ||Query||·||Key_{i}|| } Similarity(Query,Keyi)=QueryKeyiQueryKeyi

    • 引入额外的神经网络来求值
      MLP网络:
      S i m i l a r i t y ( Q u e r y , K e y i ) = M L P ( Q u e r y , K e y i ) Similarity(Query,Key_{i}) = MLP(Query,Key_{i}) Similarity(Query,Keyi)=MLP(Query,Keyi)

  2. 对1的原始分数进行softmax归—化处理
    a i = S o f t m a x ( S i m i ) = e S i m i Σ j = 1 L x e S i m j a_{i}= Softmax(Sim_{i})=\frac{e^{Sim_{i}}}{\Sigma^{L_{x}}_{j=1}{e^{Sim_{j}}}} ai=Softmax(Simi)=Σj=1LxeSimjeSimi

  3. 根据权重系数对Value进行加权求和
    A t t e n t i o n ( Q u e r y , S o u r c e ) = Σ i = 1 L x a i ⋅ V a l u e i Attention(Query, Source)= \Sigma^{L_{x}}_{i=1}{a_{i}·Value_{i}} Attention(Query,Source)=Σi=1LxaiValuei

目前绝大多数具体的注意力机制计算方法
都符合上述的三阶段抽象计算过程

补充

注意力分数

从Encoder-Decoder到Attention_第4张图片

  • α(x,xi):注意力权重(权重一般是一组大于等于零,相加和为 1 的数)

  • 注意力分数:高斯核的指数部分(相当于是注意力权重归一化之前的版本)

  • 上图所展示的是:假设已知一些 key-value 对和一个 query,首先将 query 和每一个 key 通过注意力分数函数 a 和 softmax 运算得到注意力权重(与 key 对应的值的概率分布),将这些注意力权重再与已知的 value 进行加权求和,最终就得到了输出

如何将 key 和 value 拓展到更高的维度

从Encoder-Decoder到Attention_第5张图片

  • 假设 query 是一个长为 q 的向量,ki 是长为 k 的向量,vi 是长为 v 的向量(这里 key 和 value 的长度可以不同)

  • 其中 query 和 ki 的注意力权重(标量)是通过注意力评分函数 a 将两个向量映射成标量,再经过 softmax 运算得到的

掩蔽 softmax 操作(masked softmax operation)

softmax 操作用于输出一个概率分布作为注意力权重,但是在某些情况下,并非所有的值都应该被纳入到注意力汇聚中

  • 在处理文本数据集的时候,为了提高计算效率,可能会采用填充的方式使每个文本序列具有相同的长度,便于以相同形状的小批量进行加载,因此可能会存在一些文本序列被填充了没有意义的特殊词源(比如“”词元)

  • 因此,为了仅仅将有意义的词元作为值来获取注意力汇聚,可以指定一个有效序列长度(即词元的个数),任何超出有效长度的位置都被掩蔽并置于 0,便于在计算 softmax 的时候过滤掉超出指定范围的位置,这也就是掩蔽 softmax 操作

注意力分数函数 α 的设计

1、加性注意力(Additive attention)

  • 当 query 和 key 是不同长度的矢量时,可以使用加性注意力作为注意力分数

  • 可学参数( 3 个):
    从Encoder-Decoder到Attention_第6张图片

  • h:超参数

  • Wk:key 从 k map 到 h(将 key 向量的长度从 k 转化为 h)

  • Wq:query 从q map 到 h(将 query 向量的长度从 q 转化为 h)

  • Wk、Wq 都是矩阵,v 是向量

  • tanh:激活函数

  • 上式中,k 是长为 k 的向量,q 是长为 q 的向量

  • 等价于将 query 和 key 合并起来变成一个长度为 k+q 的向量,然后将其输入到一个隐藏层大小为 h ( h 是一个超参数),输出大小为 1 的但隐藏层的 MLP(没有偏置项),最终得到输出

  • 优点是 key、value 向量可以是任意的长度,可以不同

2、缩放点积注意力(Scaled Dot-Product Attention)

  • 使用点积可以得到计算效率更高i的评分函数,但是点积操作要求 query 和 key 具有相同的长度

针对 key 和 query 长度相同的情况

从Encoder-Decoder到Attention_第7张图片

  • 假设 query 和 key 的所有元素都是独立的随机变量,并且都满足零均值和单位方差,那么两个向量的点积的均值为 0 ,方差为 d

  • 这里不需要学习任何东西,直接利用 将 q 和 ki 做内积然后除以根号 d (除以根号 d 的目的是为了降低对 ki 的长度的敏感度,使得无论向量的长度如何,点积的方差在不考虑向量长度的情况下仍然是 1 )

总结

  • 注意力分数是 query 和 key 的相似度(没有经过 normalize ),注意力权重是注意力分数的 softmax 结果( 0 到 1 之间的数)

  • 两种常见的注意力分数的计算

    • 有参数的版本:将 query 和 key 合并起来进入一个单隐藏层单输出的 MLP(在 query 和 key 向量长度不同的情况下)

    • 无参数的版本:直接将 query 和 key 做内积(在 query 和 key 向量长度一定的情况下),效率更高

你可能感兴趣的:(DL,深度学习,机器学习,人工智能)