zoukankan      html  css  js  c++  java
  • Attention的计算过程

    本文参考以及图片来源Transformer详解

    首先假设我们有序列 x1、x2、x3 和 x4 这四个序列,首先我们进行一次权重的乘法 ({a^i} = W{x^i}) ,得到新的序列 a1、a2、a3 和 a4。示意图如下所示:

    然后我们将输入 a 分别乘以三个不同的权重矩阵 W 分别得到 q、k、 v 三个向量,公式分别是({q^i} = {W^q}{a^i})、${k^i} = {W^k} {v^i} (、)v^i = {Wv}{ai}$,这里面 q 表示的是 query,是需要 match 其他的向量的;k 表示的是 key,是需要被 q 来match的,v 表示 value,表示需要被抽取出来的信息。示意图如下所示:

    transformer

    接下来我们需要做的就是将每一个query q 对每一个key k 做 attention 操作,那么 attention 操作是如何做呢,目的是输入两个向量,输出一个数,那么我们可以将这两个向量做内积:q1 和 k1 做attention 得到(alpha_{1,1}) ,q1 和 k2 做attention 得到 (alpha_{1,2}),q1 和 k3 做attention 得到 (alpha_{1,3}),q1 和 k4 做attention 得到(alpha_{1,4})。其中,attention 的操作可以用很多方法来做,这里我们可以用到一种叫做 scaled 点积,公式是({alpha _{1,i}} = q1 cdot ki/sqrt d),这里的 d 表示 q 和 v 的维度。做 attention 的流程如下图所示:

    transformer

    最后我们将(alpha _{1,1})(alpha _{1,2},)(alpha _{1,3})(alpha _{1,4}),这四个值进行一个 softmax 操作,得到({hat alpha _{1,1}})({hat alpha _{1,2}})({hat alpha _{1,3}})({hat alpha _{1,4}}),如图所示:

    transformer

    有了 softmax 的输出之后,我们再通过公式(sumlimits_i {{{hat alpha }_{1,i}} cdot vi}) ,将({{{hat alpha }_{1,i}}}) 分别和(v_i)进行点乘之后再求和可以得到 (b_1)。整个流程如图所示:

    img

    由上图可以知道,我们求得 b1 的时候,已经看到了a2、a3 和 a4 的输入。所以这个时候的输出,有机会浏览到整个序列。但是每一个输出的序列都有自己重点关注的地方,这个就是 attention 机制的精髓所在,我们可以通过控制({hat alpha _{1,1}})({hat alpha _{1,2}})({hat alpha _{1,3}})({hat alpha _{1,4}}) 来控制我们当前输出所关注的序列权重,如果某一块序列需要被关注,那么就赋予对应(alpha) 值的高权重,反之则相反。这是用 q1 做attention 可以求得 整个的输出 b1,同理我们可以用 q2、q3 和 q4 分别做 attention 求得 b2、b3 和 b4。而且b1、b2、b3 和 b4 是平行被计算出来的,互相是没有先后顺序的影响的。所以整个中间的计算过程可以看做是一个 self-attention layer,输入 x1、x2、x3 和 x4,输出是 b1、b2、b3 和 b4。示意图如图所示:

    transformer

  • 相关阅读:
    asp.net运行网页时出现目录清单
    c#变量命名规范
    asp.net的优点
    为什么使用javascript脚本语言以及javascript的特点组成
    ASP.NET控件
    sql2000的常见操作
    最常用的sql语句
    sql提升
    c语言学习(二) 程序的灵魂
    c语言学习(三) 数据类型
  • 原文地址:https://www.cnblogs.com/wzl19981116/p/15393870.html
Copyright © 2011-2022 走看看