python - 为什么BERT中的矩阵叫Query、Key、Value?

标签 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 使用“self-attention”,因此 from_tensorto_tensor 在 BERT 中是相同的;我认为这两者都只是上一层的输出。

问题

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

最佳答案

对于您的第一个问题,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/

相关文章:

python - 您可以将 `appsettings.json` 部署到 python(v2 编程模型)中的 azure 函数吗?

python - 带有 Mobilenets 的 Tensorflow 对象检测 API 过拟合自定义多类数据集

python - Tensorflow 中的 Dice/Jaccard 系数优化

python - Pytorch BCELoss 对相同输入使用不同的输出

python - 类型错误 : multiple bases have instance lay-out conflict

python - 两个列表的组合(不是按元素的)

python - 格林莱特VS。线程

python - Tensorflow TypeError : 'Series' objects are mutable, 因此它们不能被散列

tensorflow - 如何从 ImageDataGenerator 获取 x_train 和 y_train?

python - ValueError : Layer expects 2 input(s), 但它在训练 CNN 时收到 1 个输入张量