PyTorch torch.nn.LogSoftmax 関数
torch.nn.LogSoftmaxは PyTorch の Log Softmax 活性化関数です。
これは 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:", logits.tolist())
print("Log 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:", logits.tolist())
print("Log 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:", 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:", loss.item())
# 次と同等
loss2 = nn.CrossEntropyLoss()(logits, targets)
print("CrossEntropyLoss:", loss2.item())
例3:数値安定性
実例
import torch
import torch.nn as nn
# 大きい値の logits
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
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 と組み合わせる
- 数値安定: 大きい logit 値
ヒント:LogSoftmax + NLLLoss は CrossEntropyLoss と同等です。
その他の拡張