Встречайте «Нан» при обучении, но «Нан» исчезает при отладке/печати/регистрации, когда я хочу обучить глубокую модель
Когда я обучаю модель, оценка становится «Нан», например:
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
Я получу это, и няня просто исчезнет, и тренировка пойдет хорошо! Интересно, почему это происходит, потому что я просто добавляю несколько предложений для ведения журнала