为什么BERT中的矩阵叫Query、Key、Value?

Why are the matrices in BERT called Query, Key, and Value?

BERT 的转换器单元中,有称为查询、键和值的模块,或简称为 Q、K、V。

基于 BERT paper and code (particularly in modeling.py),我对具有单个注意力头的注意力模块(使用 Q、K、V)的前向传递的伪代码理解如下:

q_param = a matrix of learned parameters
k_param = a matrix of learned parameters
v_param = a matrix of learned parameters
d = one of the matrix dimensions (scalar value)

def attention(to_tensor, from_tensor, attention_mask):
    q = from_tensor * q_param
    k = to_tensor * k_param
    v = to_tensor * v_param

    attention_scores = q * transpose(k) / sqrt(d)
    attention_scores += some_function(attention_mask) #attention_mask is usually just ones
    attention_probs = dropout(softmax(attention_scores))
    context = attention_probs * v

    return context

注意BERT使用"self-attention,"所以from_tensorto_tensor在BERT中是一样的;我认为这两个都只是上一层的输出。

问题

  1. 为什么矩阵称为查询、键和值?
  2. 我在算法的伪代码表示中是否犯了任何错误?

对于你的第一个问题,BERT 基于 2017 Vaswani et al "Attention is all you need" 论文中的 transformer 模型的编码器。查询、键和值隐喻已经在那篇论文中出现了(尽管自从上面的评论以来我了解到它不是这个想法的来源)。然而,这个比喻实际上最适用于转换器的另一部分,即解码器;这是因为正如您所说,编码器使用自注意力,在我看来,查询和密钥在 BERT 中扮演着对称的角色。因此,对于 transformer 的解码器而不是 BERT,也许更容易理解这个比喻。

据我了解,在 Vaswani 等人的转换器模型中,查询和键允许解码器层 j-1 的所有位置通过注意力关注编码器层 j 的所有位置分数。然后通过查询和键选择值:注意力层的结果是由注意力分数加权的值的总和。查询和键的投影决定了每个位置的注意力所在的位置。例如,一个极端的情况可能是查询由身份函数投影,键被投影到一个排列,将位置 i 移动到位置 i+1。键和查询的点积将允许解码器层 j-1 的每个位置关注编码器层 j 中它之前的位置。因此,当解码器层 j-1 与键一起决定解码器层 j-1 中的每个位置(同样,但不称为值)将贡献多少时,解码器层 j-1 被称为查询。

我相信每个标记都会为每个其他标记分配一个注意力分数;所以有令牌,另一个令牌和分数。我认为key是第一个token,query是第二个token,value是score。之后,为了进行推理,这些注意力头层会为下一个最有可能的标记给出分数。这只是我的猜测。大多数学术论文都含糊不清是有原因的。虽然学术界需要同行评议,但学术界也想保守秘密。变形金刚的真正诀窍是掩蔽。蒙面令牌成为标签。然后就想到监督学习。如果你明白这一点,你就会理解变形金刚中的注意力头。这是一个吐出logits的分类器。