softmax、softmax2d和logsoftmax
softmax、softmax2d和logsoftmax
在深度学习中,softmax、softmax2d 和 logsoftmax 是常用的归一化操作,但它们有不同的应用场景和计算方式。下面我们分别实现它们的计算逻辑,并解释它们的用途和区别。
1. Softmax
作用:将输入张量的值转换为概率分布(所有值在 [0,1] 之间,且和为 1)。
公式:
[
softmax(xi)=exi∑jexj \text{softmax}(x_i) = \frac{e^{x_i}}{\sum_j e^{x_j}} softmax(xi)=∑jexjexi
]
实现:
import torch
def softmax(x: torch.Tensor, dim: int = -1) -> torch.Tensor:
# 防止数值溢出,减去最大值
x_max = x.max(dim=dim, keepdim=True).values
x_exp = torch.exp(x - x_max)
return x_exp / x_exp.sum(dim=dim, keepdim=True)
说明:
dim指定在哪个维度计算softmax(默认-1表示最后一个维度)。- 先减去最大值(
x_max)防止数值溢出(exp可能导致inf)。 - 适用于 NLP(Transformer 注意力)、分类任务等。
2. Softmax2D
作用:对 2D 空间(如图像)的每个位置进行 softmax,常用于语义分割(如 FCN、UNet)。
公式:
[
softmax2d(xh,w,c)=exh,w,c∑c′exh,w,c′ \text{softmax2d}(x_{h,w,c}) = \frac{e^{x_{h,w,c}}}{\sum_{c'} e^{x_{h,w,c'}}} softmax2d(xh,w,c)=∑c′exh,w,c′exh,w,c
]
实现:
def softmax2d(x: torch.Tensor) -> torch.Tensor:
# 输入形状: (B, C, H, W)
# 对每个像素点 (H,W) 在通道维度 C 上做 softmax
x_max = x.max(dim=1, keepdim=True).values # (B, 1, H, W)
x_exp = torch.exp(x - x_max)
return x_exp / x_exp.sum(dim=1, keepdim=True)
说明:
- 输入通常是
(B, C, H, W)(B=batch,C=channels,H=height,W=width)。 - 对每个像素点
(H, W)在通道维度C上做softmax,得到每个像素的分类概率。 - 主要用于 语义分割(如 UNet、DeepLab),输出每个像素的类别概率。
3. LogSoftmax
作用:计算 log(softmax(x)),用于 数值稳定性 和 交叉熵损失(NLLLoss)。
公式:
[
logsoftmax(xi)=log(exi∑jexj)=xi−log(∑jexj) \text{logsoftmax}(x_i) = \log\left(\frac{e^{x_i}}{\sum_j e^{x_j}}\right) = x_i - \log\left(\sum_j e^{x_j}\right) logsoftmax(xi)=log(∑jexjexi)=xi−log(j∑exj)
]
实现:
def logsoftmax(x: torch.Tensor, dim: int = -1) -> torch.Tensor:
# 防止数值溢出,减去最大值
x_max = x.max(dim=dim, keepdim=True).values
log_sum_exp = torch.log(torch.exp(x - x_max).sum(dim=dim, keepdim=True))
return (x - x_max) - log_sum_exp
说明:
- 相比
softmax,logsoftmax直接计算对数,避免log(softmax(x))的数值不稳定问题。 - 主要用于 交叉熵损失(CrossEntropyLoss = NLLLoss + LogSoftmax),因为:
logsoftmax+NLLLoss比softmax+CrossEntropy更稳定(避免log(0)导致-inf)。- PyTorch 的
CrossEntropyLoss内部就是LogSoftmax + NLLLoss。
为什么需要 softmax2d 和 logsoftmax?
| 方法 | 用途 | 适用场景 |
|---|---|---|
softmax |
归一化概率分布 | Transformer 注意力、分类任务 |
softmax2d |
2D 空间归一化 | 语义分割(UNet、DeepLab) |
logsoftmax |
数值稳定 + 交叉熵损失 | 分类任务(避免 log(0) 问题) |
softmax2d:用于 图像分割,对每个像素点做softmax,得到每个像素的类别概率。logsoftmax:用于 分类任务,避免log(softmax(x))的数值不稳定问题,提高训练稳定性。
总结
softmax:通用归一化,适用于 NLP 和分类任务。softmax2d:适用于 2D 空间(如语义分割)。logsoftmax:适用于 交叉熵损失,提高数值稳定性。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)