Neural network 多头注意:Q,K,V的线性变换的正确实现
我现在正在Pytorch中实施多头自我关注。我看了几个实现,它们似乎有点错误,或者至少我不知道为什么会这样做。他们通常只应用一次线性投影: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)
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
转换更快
可以将第一个公式中的矩阵连接起来,以获得第二个公式中的矩阵