理解 Softmax
在不同维度上的应用,关键在于明确 Softmax
的作用以及 dim
参数的意义。Softmax
的目标是将输入张量的某些元素转换为概率分布,使得这些元素的和为1。dim
参数决定了沿着哪个维度进行归一化操作。
1. Softmax 的基本原理
Softmax
函数的公式为:
Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=∑jexjexi
其中, x i x_i xi 是输入张量中的某个元素,分母是对所有相关元素的指数和进行归一化。
2. 不同维度上的应用
一维张量
对于一维张量,Softmax
的作用是将所有元素转换为概率分布,使得这些元素的和为1。例如:
import torch
x = torch.tensor([0.2370, 1.7276])
softmax = torch.nn.Softmax(dim=0)
output = softmax(x)
print(output)
输出:
tensor([0.1690, 0.8310])
这里,dim=0
表示对一维张量的所有元素进行归一化。因为一维张量只有一个维度,所以只能沿着这个维度操作。
二维张量
对于二维张量,Softmax
的行为取决于 dim
参数:
dim=0
:沿着列方向(垂直方向)进行归一化。每一列的元素会被转换为概率分布,使得每一列的和为1。dim=1
:沿着行方向(水平方向)进行归一化。每一行的元素会被转换为概率分布,使得每一行的和为1。
例如:
x = torch.tensor([[72.1361, -120.3565]])
softmax_dim0 = torch.nn.Softmax(dim=0)
softmax_dim1 = torch.nn.Softmax(dim=1)output_dim0 = softmax_dim0(x)
output_dim1 = softmax_dim1(x)print("Softmax(dim=0):", output_dim0)
print("Softmax(dim=1):", output_dim1)
输出:
Softmax(dim=0): tensor([[1., 0.]])
Softmax(dim=1): tensor([[1.0000e+00, 0.0000e+00]])
Softmax(dim=0)
:因为输入张量只有一行,所以沿着列方向归一化时,每一列只有一个元素,归一化后仍然是1和0。Softmax(dim=1)
:沿着行方向归一化,将这一行的元素转换为概率分布,使得这一行的和为1。
再看一个更复杂的例子:
x = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
softmax_dim0 = torch.nn.Softmax(dim=0)
softmax_dim1 = torch.nn.Softmax(dim=1)output_dim0 = softmax_dim0(x)
output_dim1 = softmax_dim1(x)print("Softmax(dim=0):", output_dim0)
print("Softmax(dim=1):", output_dim1)
输出:
Softmax(dim=0): tensor([[0.0025, 0.0025, 0.0025],[0.9975, 0.9975, 0.9975]])
Softmax(dim=1): tensor([[0.0900, 0.2447, 0.6652],[0.0900, 0.2447, 0.6652]])
Softmax(dim=0)
:沿着列方向归一化,每一列的元素被转换为概率分布,使得每一列的和为1。Softmax(dim=1)
:沿着行方向归一化,每一行的元素被转换为概率分布,使得每一行的和为1。
3. 总结
dim=0
:沿着列方向归一化,适用于将每一列的元素转换为概率分布。dim=1
:沿着行方向归一化,适用于将每一行的元素转换为概率分布。
在实际应用中处理多分类问题时,通常对每一行(样本)进行归一化,因此使用 Softmax(dim=1)
。