Я пытаюсь обучить встраиванию слов с помощью кодировщика-преобразователя, маскируя само слово диагональной 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, вероятно, был бы намного проще, если бы он работал. Но где я ошибаюсь?
Изменить:
Я использую последовательность индексов слов в качестве входных данных. Выходные данные имеют ту же последовательность, что и входные.