Attention 机制

作者: LCG22 | 来源:发表于2019-12-11 18:00 被阅读0次

    Attention 机制

    人类视觉系统会对被观察对象的不同地方,分配不同的注意力,而 Attention 机制正是基于这种现象,从中得到启发所研发的

    Attention 机制实现了类似的功能。例如在机器翻译中,A 语言被翻译为 B 语言时,在被翻译为 B 语言中的某个单词时,对 A 语言中的不同单词是需要分配不同的注意力的。

    Attention 机制可以通过下述公式来简单地描述。

    y = \sum_{i}^n\alpha _{i}  x_{i} ,其中的 \alpha _{i}  就是权重,是个常量,常被叫做注意力得分;x_{i} 是个向量,表示第 i 个输出;y 也是个向量,表示加权后的第 i 个输出。

    Attention 机制可以更加地抽象为 Q、K、V ,其中的 Q 和 K 用来计算 \alpha _{i} ,V 则是 x,且 Q 和 V 可以相同。

    而 Q、K、V 又可以由输入 X (此时的 X 是批量输入的,故是个二维矩阵,相对应的计算得到的 Q、K、V 也是矩阵形式,跟上面提到的 Q、K、V  是不一样的,特别是在维度上)经过线性转换得到,如:

    Q = X\cdot W_{q}

    K = X\cdot W_{k}

    V = X\cdot W_{v}

    由 Q 和 K 计算得到 \alpha _{i}  的过程叫做分配注意力,而分配注意力的方法则有很多种,下面列出常用的几种:

    ①点积

    S(Q, K_{i} ) = Q\cdot K_{i}

    ②cosine 相似性

    S(Q, K_{i} ) = \frac{Q\cdot K_{i} }{||Q||||K_{i} ||}

    ③MLP 网络

    S(Q, K_{i})  = MLP(Q, K_{i})

    ④加性模型

    S(Q, K_{i} ) = V^T tanh(WK_{i} + UQ)

    ⑤缩放点积

    S(Q, K_{i} ) = \frac{K_{i}^T\cdot Q}{\sqrt{d_{k}} } ,d 为 K 的维度

    ⑥双线性模型

    S(Q, K_{i}) = K_{i}^TWQ,相比加性模型的好处是,双线性模型的 K_{i}  和 Q 的维度可以不同

    而最终的 Attention 层的输出为:

    A(Q, K, V) = \sum_{i}^nS(Q, K_{i})V _{i}

    self-Attention 机制

    self-Attention 机制指的是 Q、K、V 来自同一个分布

    多头 self-Attention 机制

    图 1

    所谓的多头 self-Attention 就是指使用多个不同的 W_{q}、W_{k}、W_{v}  来获得多个不同的 Q、K、V ,再将计算得到的不同的结果 y 进行叠加。图示如下:

    图 2

    y = \sum_{i}^n\alpha _{i}  x _{i} 的注意力机制的代码实现

    编程语言及版本:python3.6.4

    Tensorflow 版本:1.13.1

    # att: [hidden_size, 1]

    att = tf.Variable(initial_value=tf.random_normal(shape=[hidden_sizes[-1], 1]), dtype=tf.float32,

                      name="attention")

    # att_score: [batch_size, step_size, 1]

    att_score = tf.tensordot(a=output, b=att, axes=1)

    # att_score: [batch_size, step_size]

    att_score = tf.squeeze(input=att_score)

    # att_score: [batch_size, step_size]

    att_score = tf.nn.softmax(logits=att_score)

    # tmp_output: [batch_size, hidden_size, step_size]

    tmp_output = tf.transpose(a=output, perm=[0, 2, 1])

    # tmp_att_output: [batch_size, step_size, 1]

    tmp_att_score = tf.reshape(tensor=att_score, shape=[batch_size, x_step_size, 1])

    # att_score: [batch_size, hidden_size, 1]

    att_output = tf.matmul(a=tmp_output, b=tmp_att_score)

    # att_score: [batch_size, hidden_size]

    att_output = tf.squeeze(input=att_output)

    output = att_output

    维度变化:

    参见文章 Transformer 模型相关疑问以及解答

    相关文章

      网友评论

        本文标题:Attention 机制

        本文链接:https://www.haomeiwen.com/subject/xevggctx.html