在BERT的转换单元中,有称为Query,Key和Value或简称Q,K,V的模块。
基于BERT paper和code(尤其是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_tensor
和to_tensor
在BERT中是相同的;我认为这两个都是上一层的输出。
问题
答案 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 的分类器。