【问题标题】:Implementation of the Dense Synthesizer密集合成器的实现
【发布时间】:2020-12-24 00:44:49
【问题描述】:

我正在尝试理解 Synthesizer 论文 (https://arxiv.org/pdf/2005.00743.pdf1),其中描述了密集合成器机制,它应该取代 Transformer 架构中描述的传统注意力模型。

密集合成器是这样描述的:

所以我尝试实现层,它看起来像这样,但我不确定我是否正确:

class DenseSynthesizer(nn.Module):
    def __init__(self, l, d):
        super(DenseSynthesizer, self).__init__()
        self.linear1 = nn.Linear(d, l)
        self.linear2 = nn.Linear(l, l)

    def forward(self, x, v):
        # Equation (1) and (2)
        # Shape: l x l
        b = self.linear2(F.relu(self.linear1(x)))   
        # Equation (3)
        # [l x l] x [l x d] -> [l x d]
        return torch.matmul(F.softmax(b), v) 

用法:

l, d = 4, 5

x, v =  torch.rand(l, d), torch.rand(l, d)

synthesis = DenseSynthesizer(l, d)
synthesis(x, v) 

例子:

x 和 v 是张量:

x = tensor([[0.0844, 0.2683, 0.4299, 0.1827, 0.1188],
         [0.2793, 0.0389, 0.3834, 0.9897, 0.4197],
         [0.1420, 0.8051, 0.1601, 0.3299, 0.3340],
         [0.8908, 0.1066, 0.1140, 0.7145, 0.3619]])

v = tensor([[0.3806, 0.1775, 0.5457, 0.6746, 0.4505],
         [0.6309, 0.2790, 0.7215, 0.4283, 0.5853],
         [0.7548, 0.6887, 0.0426, 0.1057, 0.7895],
         [0.1881, 0.5334, 0.6834, 0.4845, 0.1960]])

并通过密集合成的前向传播,它返回:

>>> synthesis = DenseSynthesizer(l, d)
>>> synthesis(x, v) 

tensor([[0.5371, 0.4528, 0.4560, 0.3735, 0.5492],
        [0.5426, 0.4434, 0.4625, 0.3770, 0.5536],
        [0.5362, 0.4477, 0.4658, 0.3769, 0.5468],
        [0.5430, 0.4461, 0.4559, 0.3755, 0.5551]], grad_fn=<MmBackward>)

密集合成器的实现和理解是否正确?

理论上,这与接收两个不同输入并在前向传播的不同点使用它的多层感知器有何不同?

【问题讨论】:

  • 看起来正确。是的,它只是一个 MLP。不确定这是否是您期望的答案?
  • 问题出在 eq 中的符号中。 2.至少对我来说,不清楚他们是如何进行线性变换的。它可以是(d, l)(l, l),就像在你的实现中一样,或者(d, d)(d, l)。我认为后者可能会更好。
  • 另外,(d, d)(d, l) 更符合 QK^t 的注意。
  • @MohammadArvan 我认为你在 (d,d)->(d,l) 上是对的,这与表 1 中密集变体的参数数量相匹配

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


【解决方案1】:

密集合成器的实现和理解是否正确?

不完全是,linear1 = nn.Linear(d,d) 根据论文而不是(d,l)。 当然如果X.shape = (l,d)按照矩阵乘法规则这行不通。

这是因为:

所以F 应用于 X 中的每个 Xi for i in [1,l]

然后将得到的矩阵B 传递给softmax 函数并乘以G(x)。 所以你必须修改你的代码来顺序处理输入,然后使用返回的矩阵来计算Y

这与接收两个不同输入并在前向传播的不同点使用它的多层感知器有何不同?

要理解,我们需要把事情放到上下文中,引入注意力机制的想法首先在Encoder - Decoder的上下文中描述:https://arxiv.org/pdf/1409.0473.pdf

核心思想是让模型能够控制如何使用神经网络从编码器中检索上下文向量,而不是仅仅依赖于最后的编码状态:

查看post了解更多详情。

Transformers 引入了使用“多头注意力”(见下图)来减少计算负担并仅关注注意力机制本身的想法。 post

https://arxiv.org/pdf/1706.03762.pdf

那么 Dense 合成器在哪里适合所有这些?

它只是用F(.) 替换了点积(如您帖子中的第一张图片所示)。如果将softmax 中的内容替换为F,您将得到Y 的等式

结论

这是一个 MLP,但在序列处理的上下文中逐步应用于输入。

谢谢

【讨论】:

  • 我认为密集合成器注意机制不会逐步应用于输入。它同时应用于转换器架构的编码器/解码器块中输入中的所有状态,而不是显式地跨编码器到解码器。你能解释一下逐步解释吗?
  • @alvas,它在Fitself 的定义中:“F(.),一个参数化函数,用于将输入Xid 维度投影到l 维度”。 F(.) 应用于XF(Xi) = Bi 中的每个令牌。否则矩阵形状不适合乘法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 2018-08-14
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多