【发布时间】:2021-03-28 02:34:17
【问题描述】:
我现在正在 Pytorch 中实现 Multi-Head Self-Attention。我查看了几个实现,它们似乎有点错误,或者至少我不确定为什么要这样完成。他们通常只应用一次线性投影:
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)
根据此代码,每个负责人将工作处理一个投影查询。但是,最初的论文说,我们需要为编码器中的每个头设置不同的线性投影。
这个显示的实现是否正确?
【问题讨论】:
标签: neural-network nlp pytorch bert-language-model attention-model