Pytorch 注意力加权聚合

Pytorch 注意力加权聚合,pytorch,tensor,torch,Pytorch,Tensor,Torch,让下面所示的张量表示由3个单词(最大长度=3)组成的两个句子(批次大小=2),每个单词由作为神经网络输出的维数等于5(隐藏大小=5)的向量表示: 净输出 #张量([[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.0

让下面所示的张量表示由3个单词(最大长度=3)组成的两个句子(批次大小=2),每个单词由作为神经网络输出的维数等于5(隐藏大小=5)的向量表示:

净输出 #张量([[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_分数
#张量([[0.2425,0.5279,0.2295],
#         [0.2461, 0.4789, 0.2751]])
哪种有效的方法可以获得净输出中向量的聚合,通过加权的att得分(2,5)得到向量的形状(2,5)?

这应该是可行的:

weighted=(净输出*att评分[…,无]).sum(轴=1)

使用广播(elementwise)将注意力权重乘以每个向量,并将所有向量(通过求和)聚集在一起。

效果不错。你能告诉我什么是
att_分数[…,无]
吗?这是另一种重塑的方法吗?
None
只是给张量增加了一个新的维度。它使形状(2,3,1)的
att_分数
,从而与形状(2,3,5)的输出张量兼容。太好了,谢谢。这就像是
att_分数。unsqueze(-1)
。你也可以在numpy newaxis上查找答案以获得更多解释。是的,与unsqueze操作完全相同!