Функция PyTorch torch.nn.LogSoftmax
Справочное руководство PyTorch torch.nn
torch.nn.LogSoftmaxЭто функция активации Log Softmax в PyTorch.
Это логарифмическая форма Softmax, которая численно более устойчива и часто используется вместе с NLLLoss.
Определение функции
torch.nn.LogSoftmax(dim=None)
Формула
LogSoftmax(x_i) = log(exp(x_i) / sum(exp(x_j)))
Примеры использования
Пример 1: Базовое использование
Пример
import torch
import torch.nn as nn
log_softmax = nn.LogSoftmax(dim=1)
logits = torch.tensor([[2.0, 1.0, 0.1]])
log_probs = log_softmax(logits)
print("Логиты:", logits.tolist())
print("Логарифмический Softmax:", log_probs.tolist())
print("После exp:", log_probs.exp().tolist())
import torch.nn as nn
log_softmax = nn.LogSoftmax(dim=1)
logits = torch.tensor([[2.0, 1.0, 0.1]])
log_probs = log_softmax(logits)
print("Логиты:", logits.tolist())
print("Логарифмический Softmax:", log_probs.tolist())
print("После exp:", log_probs.exp().tolist())
Пример 2: С NLLLoss
Пример
import torch
import torch.nn as nn
# Задача классификации
logits = torch.randn(4, 10)
targets = torch.tensor([2, 5, 1, 7])
# LogSoftmax + NLLLoss = CrossEntropyLoss
loss = nn.NLLLoss()(nn.LogSoftmax(dim=1)(logits), targets)
print("Потеря NLL:", loss.item())
# Эквивалентно
loss2 = nn.CrossEntropyLoss()(logits, targets)
print("CrossEntropyLoss:", loss2.item())
import torch.nn as nn
# Задача классификации
logits = torch.randn(4, 10)
targets = torch.tensor([2, 5, 1, 7])
# LogSoftmax + NLLLoss = CrossEntropyLoss
loss = nn.NLLLoss()(nn.LogSoftmax(dim=1)(logits), targets)
print("Потеря NLL:", loss.item())
# Эквивалентно
loss2 = nn.CrossEntropyLoss()(logits, targets)
print("CrossEntropyLoss:", loss2.item())
Пример 3: Численная устойчивость
Пример
import torch
import torch.nn as nn
# Большие логиты
logits = torch.tensor([[1000, 1001, 1002]])
# Softmax может переполниться
try:
sm = nn.Softmax(dim=1)(logits)
print("Softmax:", sm)
except:
print("Переполнение Softmax")
# LogSoftmax численно устойчив
lsm = nn.LogSoftmax(dim=1)(logits)
print("LogSoftmax:", lsm)
import torch.nn as nn
# Большие логиты
logits = torch.tensor([[1000, 1001, 1002]])
# Softmax может переполниться
try:
sm = nn.Softmax(dim=1)(logits)
print("Softmax:", sm)
except:
print("Переполнение Softmax")
# LogSoftmax численно устойчив
lsm = nn.LogSoftmax(dim=1)(logits)
print("LogSoftmax:", lsm)
Сценарии использования
- Задачи классификации: С NLLLoss
- Численная устойчивость: Большие значения логитов
Совет: LogSoftmax + NLLLoss эквивалентно CrossEntropyLoss.
Другие расширения