Встречайте «Нан» при обучении, но «Нан» исчезает при отладке/печати/регистрации, когда я хочу обучить глубокую модель

Когда я обучаю модель, оценка становится «Нан», например:

             def forward(self, input):     
        alias_inputs, A, items, mask, targets = input
        hidden = self.embedding(items)
        seq_output = self.seq_modeling(alias_inputs, A, hidden, mask).unsqueeze(1)  #[batch,1, dim]
        target_output =self.embedding(targets)  #[batch,2, dim]
        score = (seq_output * target_output).sum(-1)
        output = score.view(-1,2)
        batch_loss = -torch.mean(1e-8+torch.log(torch.sigmoid(torch.matmul(output, self.weight))))
        if torch.isnan(batch_loss):
            from logging import getLogger
            import sys
            import random
            logger = getLogger()
            logger.info(score)
            logger.info(seq_output.dtype)
            logger.info(target_output.dtype)
            logger.info(output)    

Отпечаток, который я получил, и seq_output, и оценка станут «Nan» (target_output не является nan)

Однако, когда я пытаюсь отладить код, мне кажется странным, что если я напечатаю результат заранее, я не получу «Нан». Кроме того, если я отлаживаю код, когда я вхожу в функцию «self.seq_modeling()» построчно, я не получаю «Nan», и он хорошо обучается; когда я просто выйду, я обнаружу, что «seq_output» становится nan после функции «self.seq_modeling()», и я очень смущен этим.

Например, когда я добавляю логи в код:

          def seq_modeling(self, alias_inputs, A, hidden, mask):
        hidden = self.gnn(A, hidden)
        logger.info(torch.isnan(hidden).any())  #add log here
        
        get = lambda i: hidden[i][alias_inputs[i]]
        seq_hidden = torch.stack([get(i) for i in torch.arange(len(alias_inputs)).long()])
        ht = seq_hidden[torch.arange(mask.shape[0]).long(), torch.sum(mask, 1) - 1]  
        q1 = self.linear_one(ht).view(ht.shape[0], 1, ht.shape[1])  # batch_size x 1 x latent_size
        q2 = self.linear_two(seq_hidden)  # batch_size x seq_length x latent_size
        alpha = self.linear_three(torch.sigmoid(q1 + q2))
        a = torch.sum(alpha * seq_hidden * mask.view(mask.shape[0], -1, 1).float(), 1)    
        a = self.linear_transform(torch.cat([a, ht], 1))
        
        logger.info(torch.isnan(a).any())   #add log here
        return a
    
    def forward(self, input):

        alias_inputs, A, items, mask, targets = input
        hidden = self.embedding(items)
        seq_output = self.seq_modeling(alias_inputs, A, hidden, mask).unsqueeze(1)  #[batch,1, dim]
        logger.info(seq_output)  #add log here
        logger.info(seq_output.dtype)  #add log here
        target_output =self.embedding(targets)  #[batch,2, dim]
        score = (seq_output * target_output).sum(-1)
        logger.info(score)  #add log here  -> not "Nan" 
        output = score.view(-1,2)
        batch_loss = -torch.mean(1e-8+torch.log(torch.sigmoid(torch.matmul(output, self.weight))))

        
        return batch_loss

Я получу это, и няня просто исчезнет, ​​и тренировка пойдет хорошо! Интересно, почему это происходит, потому что я просто добавляю несколько предложений для ведения журнала

0 ответов

Другие вопросы по тегам