【问题标题】:Using the full PyTorch Transformer Module使用完整的 PyTorch 变压器模块
【发布时间】:2020-03-03 03:33:05
【问题描述】:

我尝试在 PyTorch 论坛上提出这个问题,但没有得到任何回应,所以我希望这里有人可以帮助我。此外,如果有人有使用变压器模块的好例子,请分享它,因为文档仅显示使用简单的线性解码器。对于变压器,我知道我们通常会输入实际的目标序列。因此,我的第一个问题是,在转换器之前,我有一个标准线性层来转换我的时间序列序列以及位置编码。根据文档,transformer 模块代码的 src 和 trg 序列需要是相同的维度。

    from torch.nn.modules.transformer import Transformer
    class TransformerTimeSeries(torch.nn.Module):
       def __init__(self, n_time_series, d_model=128):
          super()._init__()
          self.dense_shape = torch.nn.Linear(n_time_series, d_model)
          self.pe = SimplePositionalEncoding(d_model)
          self.transformer = Transformer(d_model, nhead=8)

所以我想知道我是否可以简单地做这样的事情,或者这会以某种方式泄露有关目标的信息?我仍然不确定 loss.backward() 是如何工作的,所以我不确定这是否会导致问题。

    def forward(self, x, t):
       x = self.dense_shape(x)
       x = self.pe(x)
       t = self.dense_shape(t)
       t = self.pe(t)
       x = self.transformer(x, t)

其次,目标序列是否需要任何形式的偏移?例如,如果我有时间序列[0,1,2,3,4,5,6,7] 并且我想输入[0,1,2,3] 来预测[4,5,6,7] (tgt)?我会像那样简单地喂它还是更复杂?通常 BERT 和那些模型有 [CLS] 和 [SEP] 标记来表示句子的开头和结尾,但是对于时间序列,我假设我不需要分隔时间步。

【问题讨论】:

    标签: python deep-learning pytorch


    【解决方案1】:

    loss.backward() 遍历模型的梯度图,更新途中各分量的梯度。您可以使用名为 PytorchViz 的辅助库查看该图。以下是您可以使用此库进行可视化的示例:

    无论您是否使用它,看起来您都在为目标和输入使用相同的密集层。由于密集层会跟踪梯度,它会计算目标的梯度除了输入梯度,这确实会导致模型基于目标序列进行学习。

    关于你的第二个问题。我认为输入模型[0,1,2,3] 以预测[4,5,6,7] 将根据您使用的数据正常工作。如果您使用的是周期性信号(即心电图时间序列、sinx 等),我认为它会做得很好,无需进一步复杂化。

    但是,如果您想预测某些事件,例如句子结束或价格预测(例如交易日结束),那么您将需要添加代币来创建一个稳健的模型(并不是说没有它们它会失败,但它绝对可以帮助预测准确性)。

    【讨论】:

    • 在预测新数据时,您应该向解码器提供哪些目标?零?带位置编码的零点?
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2020-08-06
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多