Использование полного модуля трансформатора PyTorch - PullRequest
0 голосов
/ 06 ноября 2019

Я пытался задать этот вопрос на форумах PyTorch, но не получил никакого ответа, поэтому я надеюсь, что кто-то здесь может мне помочь. Кроме того, если у кого-то есть хороший пример использования модуля трансформатора, поделитесь им, поскольку в документации показано только использование простого линейного декодера. Что касается трансформатора, я знаю, что мы обычно подаем действительную целевую последовательность. Поэтому мой первый вопрос заключается в том, что перед преобразователем у меня есть стандартный линейный слой для преобразования моей последовательности временных рядов наряду с позиционным кодированием. Согласно документации, код модуля трансформатора, последовательности 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] (тгт)? Буду ли я просто так кормить или это будет сложнее? Обычно BERT и эти модели имеют токены [CLS] и [SEP] для обозначения начала и конца предложений, однако, для временных рядов я предполагаю, что мне не нужен шаг времени для разделителя.

...