在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 使用“self-attention”,因此 from_tensor
和 to_tensor
在 BERT 中是相同的;我认为这两者都只是上一层的输出。
问题
- 为什么矩阵称为查询、键和值?
- 我在算法的伪代码表示中是否犯了任何错误?
最佳答案
对于您的第一个问题,BERT 基于来自 2017 Vaswani et al "Attention is all you need" 的 transformer 模型的编码器。纸。查询、键和值隐喻已经在那篇论文中出现了(尽管自从上面的评论以来我了解到它不是这个想法的来源)。然而,这个比喻实际上最适用于转换器的另一部分,即解码器;这是因为正如您所说,编码器使用自注意力,在我看来,查询和 key 在 BERT 中扮演着对称的角色。因此,对于 transformer 的解码器而不是 BERT,也许更容易理解这个比喻。
据我了解,在 Vaswani 等人的转换器模型中,查询和键允许解码器层 j-1
的所有位置参与编码器层 j< 的所有位置
通过注意力分数。然后通过查询和键选择值:注意力层的结果是由注意力分数加权的值的总和。查询和键的投影决定了每个位置的注意力所在的位置。例如,一个极端的情况可能是查询由身份函数投影,键被投影到一个排列,将位置 i
移动到位置 i+1
。键和查询的点积将允许解码器层 j-1
的每个位置关注编码器层 j
中它之前的位置。因此,解码器层 j-1
与键一起被称为查询,它决定解码器层 j-1
中的每个位置有多少(同样,但是不称为值)将有所贡献。
关于python - 为什么BERT中的矩阵叫Query、Key、Value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56746191/