#python #pytorch #softmax
#python #pytorch #softmax
Вопрос:
Я использую softmax в конце моей модели.
Однако после некоторого обучения softmax выдает отрицательную вероятность.В некоторых ситуациях я также сталкивался с nan как с вероятностью.
одно из решений, которое я нашел при поиске, — использовать нормализованный softmax … однако я не могу найти для этого никакого применения pytorch.
Может кто-нибудь, пожалуйста, помочь сообщить, доступен ли нормализованный softmax или как этого добиться, чтобы прямое и обратное распространение было плавным.
Пожалуйста, обратите внимание, что я уже использую torch.nn.utils.clip_grad_norm_(model.parameters(), 40), чтобы избежать взрывных градиентов
Я использую pytorch 1.6.0
Комментарии:
1. Вы случайно не используете log_softmax? «Нормализованный softmax» не имеет особого смысла, поскольку SoftMax сам по себе уже обеспечивает форму нормализации. Если вы получаете значения NaN, это, вероятно, вызвано на более ранней стадии в вашей сети, в этом случае может помочь использование отладчика в IDE.
2. Привет, да, я использую log_softmax, а также softmax .. Я внедряю A3C… Сейчас я пытаюсь использовать sigmoid перед использованием softmax и увижу результаты
3. @user2783767 какую реализацию
softmax
вы используете? вы используете реализацию pytorch или свою собственную?4. Привет. Я использую реализацию pytorch
Ответ №1:
Softmax всегда будет возвращать положительные результаты, но он будет отслеживать другие результаты:
m = nn.Softmax(dim=1)
input = torch.randn(2, 3)
print(input)
output = m(input)
output
Выход:
tensor([[ 0.0983, 0.4150, -1.1342],
[ 0.3411, 0.5553, 0.0182]])
tensor([[0.3754, 0.5152, 0.1094],
[0.3375, 0.4181, 0.2444]])
Вы отслеживаете строки.
Обратите внимание, как для
0.0983, 0.4150, -1.1342
Вы получите 0.3411, 0.5553, 0.0182
Говоря, что 0.4150
это самое большое значение.
Жесткий max (как мы знаем, это max()) просто вернет максимальное значение.
Итак, если у вас есть отрицательные результаты для softmax, это невозможно, возможно, вы столкнулись с каким-то сбоем реализации.