为什么BERT中的矩阵称为查询,键和值?

时间:2019-06-25 02:49:08

标签: python tensorflow deep-learning nlp bert-language-model

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

基于BERT papercode(尤其是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使用“自我注意”,因此from_tensorto_tensor在BERT中是相同的;我认为这两个都是上一层的输出。

问题

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

2 个答案:

答案 0 :(得分:2)

对于第一个问题,BERT基于2017 Vaswani et al "Attention is all you need"论文中变压器模型的编码器。查询,键和值的隐喻已经出现在该论文中(尽管我已经了解到,自从上面的评论以来,它并不是这个主意)。但是,隐喻实际上对变压器的其他部分(即解码器)最有效。这是因为正如您所说的,编码器使用了自我关注,在我看来,查询和键在BERT中扮演着对称角色。因此,或许比变压器的解码器更容易理解这个比喻。

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

答案 1 :(得分:0)

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