注意力加权聚合
Attention weighted aggregation
让下面显示的张量表示由 3 个单词 (max_lenght = 3) 组成的两个句子 (batch_size = 2),每个单词由维度等于 5 的向量表示(hidden_size = 5) 作为神经网络的输出获得:
net_output
# tensor([[[0.7718, 0.3856, 0.2545, 0.7502, 0.5844],
# [0.4400, 0.3753, 0.4840, 0.2483, 0.4751],
# [0.4927, 0.7380, 0.1502, 0.5222, 0.0093]],
# [[0.5859, 0.0010, 0.2261, 0.6318, 0.5636],
# [0.0996, 0.2178, 0.9003, 0.4708, 0.7501],
# [0.4244, 0.7947, 0.5711, 0.0720, 0.1106]]])
还要考虑以下注意力分数:
att_scores
# tensor([[0.2425, 0.5279, 0.2295],
# [0.2461, 0.4789, 0.2751]])
哪种有效方法允许获得 net_output
中由 att_scores
加权的向量的聚合,从而得到形状为 (2, 5) 的向量?
这应该有效:
weighted = (net_output * att_scores[..., None]).sum(axis = 1)
使用广播(按元素)将注意力权重乘以每个向量并聚合(通过求和)一批中的所有向量。
让下面显示的张量表示由 3 个单词 (max_lenght = 3) 组成的两个句子 (batch_size = 2),每个单词由维度等于 5 的向量表示(hidden_size = 5) 作为神经网络的输出获得:
net_output
# tensor([[[0.7718, 0.3856, 0.2545, 0.7502, 0.5844],
# [0.4400, 0.3753, 0.4840, 0.2483, 0.4751],
# [0.4927, 0.7380, 0.1502, 0.5222, 0.0093]],
# [[0.5859, 0.0010, 0.2261, 0.6318, 0.5636],
# [0.0996, 0.2178, 0.9003, 0.4708, 0.7501],
# [0.4244, 0.7947, 0.5711, 0.0720, 0.1106]]])
还要考虑以下注意力分数:
att_scores
# tensor([[0.2425, 0.5279, 0.2295],
# [0.2461, 0.4789, 0.2751]])
哪种有效方法允许获得 net_output
中由 att_scores
加权的向量的聚合,从而得到形状为 (2, 5) 的向量?
这应该有效:
weighted = (net_output * att_scores[..., None]).sum(axis = 1)
使用广播(按元素)将注意力权重乘以每个向量并聚合(通过求和)一批中的所有向量。