слой встраивания выводит nan

Я пытаюсь изучить модель seq2seq. Слой внедрения находится в кодировщике и иногда после некоторых итераций выводит значение nan. Я не могу определить причину. Как я могу это решить ?? Проблема заключается в первом emb_layer в функции forward в приведенном ниже коде.


class TransformerEncoder(nn.Module):
    def __init__(self, vocab_size, hidden_size=1024, num_layers=6, dropout=0.2, input_pad=1, batch_first=False, embedder=None, init_weight=0.1):
        super(TransformerEncoder, self).__init__()
        self.input_pad = input_pad
        self.vocab_size = vocab_size
        self.num_layers = num_layers
        self.embedder = embedder

        if embedder is not None:
            self.emb_layer = embedder
        else:
            self.emb_layer = nn.Embedding(vocab_size, hidden_size, padding_idx=1)

        self.positional_encoder = PositionalEncoder()
        self.transformer_layers = nn.ModuleList()
        for _ in range(num_layers):
            self.transformer_layers.append(
                    TransformerEncoderBlock(num_heads=8, embedding_dim=1024, dropout=dropout))

    def set_mask(self, inputs):
        self.input_mask = (inputs == self.input_pad).unsqueeze(1)

    def forward(self, inputs):
        x = self.emb_layer(inputs)
        x = self.positional_encoder(x)

person kintsuba    schedule 18.09.2019    source источник
comment
Начните с определения соответствующего входного тензора, для которого вы получаете значения NaN. Не зная больше о своих данных, решить проблему, просто взглянув на код, практически невозможно.   -  person dennlinger    schedule 18.09.2019
comment
Понятно. Спасибо за совет. Я сначала буду следить за тем, что вы сказали.   -  person kintsuba    schedule 20.09.2019


Ответы (2)


Похоже, что некоторые веса стали нан. Одна из возможных причин заключается в том, что на какой-то итерации вывод слоя равен + -inf. Если он выводит + -inf в прямом направлении, в обратном направлении он будет иметь + -inf и, поскольку inf - inf = none, веса станут равными нулю, и на всех последующих итерациях ничего не будет.

Вы можете проверить это, просто отслеживая вывод inf в emb_layer.

Если это причина, просто старайтесь избегать функций, которые могут возвращать значения inf.

person antoleb    schedule 19.09.2019
comment
Большое спасибо. Я попробую это и сообщу о результате. - person kintsuba; 20.09.2019

Моя база данных была настолько маленькой по сравнению с размерами учебника, которому я следовал, и мои вложения были слишком большими для моих доступных данных, поэтому в конечном итоге NaN распространяется по сети. Уменьшение размера моих встраиваемых сетей (меньшее количество факторов / столбцов в матрице) решило для меня проблему NaN.

person Joseph Aguilar    schedule 17.11.2020