Neural network 多头注意:Q,K,V的线性变换的正确实现

Neural network 多头注意:Q,K,V的线性变换的正确实现,neural-network,nlp,pytorch,bert-language-model,attention-model,Neural Network,Nlp,Pytorch,Bert Language Model,Attention Model,我现在正在Pytorch中实施多头自我关注。我看了几个实现,它们似乎有点错误,或者至少我不知道为什么会这样做。他们通常只应用一次线性投影: self.query_projection = nn.Linear(input_dim, output_dim) self.key_projection = nn.Linear(input_dim, output_dim) self.value_projection = nn.Linear(input_dim, output_dim)

我现在正在Pytorch中实施多头自我关注。我看了几个实现,它们似乎有点错误,或者至少我不知道为什么会这样做。他们通常只应用一次线性投影:

    self.query_projection = nn.Linear(input_dim, output_dim)
    self.key_projection = nn.Linear(input_dim, output_dim)
    self.value_projection = nn.Linear(input_dim, output_dim)
然后他们通常会根据需要重塑投影

    query_heads = query_projected.view(batch_size, query_lenght, head_count, head_dimension).transpose(1,2)
    key_heads = key_projected.view(batch_size, key_len, head_count, head_dimension).transpose(1, 2)  # (batch_size, heads_count, key_len, d_head)
    value_heads = value_projected.view(batch_size, value_len, head_count, head_dimension).transpose(1, 2)  # (batch_size, heads_count, value_len, d_head)

    attention_weights = scaled_dot_product(query_heads, key_heads) 
根据这段代码,每个头部将处理一个投影查询的一部分。然而,最初的论文说,我们需要为编码器中的每个头部提供不同的线性投影

此显示的实现是否正确?

它们是等效的

理论上(在论文写作中),更容易把它们看作单独的线性投影。假设你有8个头部,每个头部有一个

M->N
投影,那么其中一个将有
8
N乘以M
矩阵

但是在实现中,通过使用
8nbym
矩阵进行
M->8N
转换更快

可以将第一个公式中的矩阵连接起来,以获得第二个公式中的矩阵。

它们是等价的

理论上(在论文写作中),更容易把它们看作单独的线性投影。假设你有8个头部,每个头部有一个

M->N
投影,那么其中一个将有
8
N乘以M
矩阵

但是在实现中,通过使用
8nbym
矩阵进行
M->8N
转换更快

可以将第一个公式中的矩阵连接起来,以获得第二个公式中的矩阵