3

BERT的转换器单元中,有称为 Query、Key 和 Value 的模块,或者简称为 Q、K、V。

基于 BERT论文代码(特别是在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. 为什么矩阵分别称为 Query、Key 和 Value?
  2. 我在算法的伪代码表示中犯了任何错误吗?
4

2 回答 2

3

对于您的第一个问题,BERT 是基于2017 Vaswani 等人的“Attention is all you need”论文中的变压器模型的编码器。查询、键和值的隐喻已经出现在那篇论文中(尽管我知道它不是这个想法的来源,因为上面的评论)。然而,这个比喻实际上最适用于转换器的另一部分,即解码器。这是因为正如您所说,编码器使用自我注意,在我看来,查询和键在 BERT 中起着对称的作用。因此,对于变压器的解码器而不是 BERT,也许更容易理解这个比喻。

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

于 2019-06-29T16:26:35.647 回答
0

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

于 2021-07-14T22:40:02.867 回答