Почему pytorch transformer src_mask не блокирует посещение позиций? - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь обучить встраиванию слов с помощью кодировщика-преобразователя, маскируя само слово диагональной src_mask:

def _generate_square_subsequent_mask(self, sz):
    mask = torch.diag(torch.full((sz,),float('-inf')))
    return mask

def forward(self, src):

    if self.src_mask is None or self.src_mask.size(0) != len(src):
        device = src.device
        mask = self._generate_square_subsequent_mask(len(src)).to(device)
        self.src_mask = mask
    
    src = self.embedding(src) * math.sqrt(self.ninp)
    src = self.dropout(src)
    src = self.pos_encoder(src)
    src = self.transformer_encoder(src, self.src_mask)
    output = self.decoder(src) # Linear layer
    return output

После обучения модель предсказывает точно такое же предложение из входных данных. Если я изменяю какое-либо слово во вводе - он предсказывает новое слово. Таким образом, модель не блокируется в соответствии с маской.

Почему?

Я понимаю, что в моем logi c есть ошибка, потому что BERT, вероятно, был бы намного проще, если бы он работал. Но где я ошибаюсь?

Изменить:

Я использую последовательность индексов слов в качестве входных данных. Выходные данные имеют ту же последовательность, что и входные.

1 Ответ

0 голосов
/ 21 июня 2020

Насколько я понимаю - модель не мешает каждому слову косвенно «видеть себя» в многослойном контексте. Пробовала использовать один слой - похоже, модель работает. Но обучение идет слишком медленно.

...