Attention 机制
人类视觉系统会对被观察对象的不同地方,分配不同的注意力,而 Attention 机制正是基于这种现象,从中得到启发所研发的
Attention 机制实现了类似的功能。例如在机器翻译中,A 语言被翻译为 B 语言时,在被翻译为 B 语言中的某个单词时,对 A 语言中的不同单词是需要分配不同的注意力的。
Attention 机制可以通过下述公式来简单地描述。
y = ,其中的 就是权重,是个常量,常被叫做注意力得分; 是个向量,表示第 i 个输出; 也是个向量,表示加权后的第 i 个输出。
Attention 机制可以更加地抽象为 Q、K、V ,其中的 Q 和 K 用来计算 ,V 则是 ,且 Q 和 V 可以相同。
而 Q、K、V 又可以由输入 (此时的 是批量输入的,故是个二维矩阵,相对应的计算得到的 Q、K、V 也是矩阵形式,跟上面提到的 Q、K、V 是不一样的,特别是在维度上)经过线性转换得到,如:
Q =
K =
V =
由 Q 和 K 计算得到 的过程叫做分配注意力,而分配注意力的方法则有很多种,下面列出常用的几种:
①点积
S(Q, ) = Q
②cosine 相似性
S(Q, ) =
③MLP 网络
④加性模型
S(Q, ) =
⑤缩放点积
S(Q, ) = ,d 为 K 的维度
⑥双线性模型
S(Q, ) = ,相比加性模型的好处是,双线性模型的 和 Q 的维度可以不同
而最终的 Attention 层的输出为:
A(Q, K, V) =
self-Attention 机制
self-Attention 机制指的是 Q、K、V 来自同一个分布
多头 self-Attention 机制
图 1所谓的多头 self-Attention 就是指使用多个不同的 来获得多个不同的 Q、K、V ,再将计算得到的不同的结果 y 进行叠加。图示如下:
图 2的注意力机制的代码实现
编程语言及版本: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 模型相关疑问以及解答
网友评论