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

sol*_*les 5 python nlp deep-learning tensorflow bert-language-model

在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
Run Code Online (Sandbox Code Playgroud)

请注意,BERT 使用“自注意力”,因此from_tensorto_tensor在 BERT 中是相同的;我认为这两者都只是前一层的输出。

问题

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

小智 5

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

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