【问题标题】:Attention weighted aggregation注意力加权聚合
【发布时间】:2021-07-27 01:17:50
【问题描述】:

让下面显示的张量表示由 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) 的向量?

【问题讨论】:

    标签: pytorch tensor torch


    【解决方案1】:

    这应该可行:

    weighted = (net_output * att_scores[..., None]).sum(axis = 1)
    

    使用广播(按元素)将注意力权重乘以每个向量,并聚合(通过求和)批次中的所有向量。

    【讨论】:

    • 成功了。您能给我一些关于att_scores[..., None]) 含义的指示吗?是另一种重塑方式吗?
    • None 只是为张量添加了一个新维度。它使形状为 (2, 3, 1) 的att_scores 与形状为 (2, 3, 5) 的输出张量的broadcasting 兼容。
    • 太好了,谢谢。就像att_scores.unsqueeze(-1)
    • 您也可以查找this 答案以获取有关 numpy newaxis 的更多说明。
    • 是的,就像 unsqueeze 操作一样!
    猜你喜欢
    • 2019-05-20
    • 2019-12-03
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多