在计算attention时主要分为三步:
第一步是 ,常用的相似度函数有点积,拼接,感知机等;
第二步一般是;
最后将。
目前在NLP研究中,key和value常常都是同一个,即key=value。

示例
首先是计算得分即Q与K之间的点乘,则第一个得分将是q1和k1的点积。第二个分数是q1和k2的点积。然后为了防止其结果过大,会除以一个尺度标度(query或者key的维度平方根)。再利用Softmax操作将其结果归一化为概率分布, 该softmax分数确定每个单词在该位置表达的程度。很明显,这个位置上的单词将具有最高的softmax分数,但有时候注意与当前单词相关的另一个单词是有用的。然后再乘以向量V就得到权重求和的表示,即:目标字的增强语义向量表示。

最后,我们可以在一个公式中浓缩以上步骤来计算自我关注层的输出。 矩阵形式的自我关注计算如下图:

def scaled_dot_product_attention(q, k, v, mask):
qk = tf.matmul(q, k, transpose_b=True)
dk = tf.cast(tf.shape(k)[-1], tf.float32)
scaled_attention = qk / tf.math.sqrt(dk)
if mask is not None:
scaled_attention += 1
weights = tf.nn.softmax(scaled_attention, axis=-1)
output = tf.matmul(weights, v)
return output, weights
来源
https://blog.csdn.net/qq_41058526/article/details/80783925
https://blog.csdn.net/weixin_40746796/article/details/88131967
网友评论