在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
请注意,BERT 使用“self-attention”,所以from_tensor
和to_tensor
在 BERT 中是一样的;我认为这两个都只是上一层的输出。
问题
- 为什么矩阵分别称为 Query、Key 和 Value?
- 我在算法的伪代码表示中犯了任何错误吗?