【问题标题】:How to ignore specific columns for calculating softmax attention?如何忽略计算softmax注意力的特定列?
【发布时间】:2018-06-30 00:51:45
【问题描述】:

我正在实现一个基于 MemoryNetworks 的模型。我有(context, query, answer) 的三胞胎数据。我想计算注意力。注意力指示应该关注上下文中的哪些句子。

为了制定小批量,我使用零填充来创建 context 数据。所以下面是注意力数据。 0 值表示零填充上下文的嵌入结果。 在这样的数据中,我想将 softmax 应用于索引0, 1, 2, 3, last。所以模型应该忽略零填充列。

那么我如何实现这一点?当我们使用零填充和注意力机制时,我想知道这样的技术。虽然我更喜欢 pytorch,但任何工具或只是描述答案也将不胜感激。

Before softmax.  torch.bmm(contex, q)
 109.8601
  77.6376
  68.3927
 199.1673
   0.0000
   0.0000
   0.0000
   0.0000
   0.0000
   0.0000
   0.0000
   0.0000
   0.0000
   0.0000
 348.0155
[torch.cuda.FloatTensor of size 15 (GPU 0)]

After softmax. F.softmax( torch.bmm(contex, q) )
 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
[torch.cuda.FloatTensor of size 15 (GPU 0)]

【问题讨论】:

    标签: python neural-network nlp deep-learning pytorch


    【解决方案1】:

    您可以在 pytorch 中用另一个张量为您的张量下标。

    如果我有:

    T = torch.from_numpy(np.arange(10))
    

    0 1 2 3 4 5 6 7 8 9 [torch.LongTensor 大小为 10]

    然后

    T[torch.from_numpy(np.array([0, 3, 7]))]
    

    0 3 7 [torch.LongTensor 大小为 3]

    所以在你的情况下,如果你有 logits 的形状 MBxD,你可以这样做

    idx = torch.from_numpy(np.array([0, 1, 2, 3, logits.size()[1]-1]))
    softmax = F.softmax(logits[:, idx])
    

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多