您的位置:

Sigmoid和Softmax函数详解

一、Sigmoid和Softmax函数的区别

Sigmoid和Softmax函数都是常用于神经网络的激活函数,可以将线性变换后的结果映射到0到1之间,但是它们之间有一个很显著的区别。

对于只有两个输出类别的情况,我们通常使用Sigmoid函数来处理。而对于多个输出类别的情况,我们使用Softmax函数。其实,Softmax函数可以看做是Sigmoid函数的多维拓展。

二、Sigmoid和ReLU函数的比较

Sigmoid函数是一种S型变换函数,它可以将输入值映射到0到1的范围内。它的公式如下:


def sigmoid(x):
    return 1 / (1 + np.exp(-x))

ReLU函数则是当前非常流行的一种激活函数。它的公式如下:


def relu(x):
    return max(0, x)

与Sigmoid函数相比,ReLU函数可以更好地解决梯度消失的问题,而且计算速度更快。但是,如果x小于0,ReLU函数的输出为0,这可能导致神经元失活,进而影响模型的性能。

三、 Softmax函数的图像

Softmax函数可以将多维输入值映射到概率分布上,其输出值的范围在0到1之间,且所有输出值的总和为1。Softmax函数的公式如下:


def softmax(x):
    exp_x = np.exp(x)
    return exp_x / np.sum(exp_x, axis=0)

下面是一个二维情况下的Softmax函数图像示例:

四、 Softmax函数的公式

Softmax函数的公式已经在上面提到了,我们这里再来解释一下其中的每个部分:

  • exp_x表示输入向量x各个元素的指数函数
  • np.sum(exp_x, axis=0)表示将exp_x的所有元素按照列求和,得到一个值c
  • exp_x / c 就是Softmax函数的输出结果

五、 Softmax是什么

Softmax函数常常应用于多分类问题中。它将输出的每个分数转换为相应类别的概率。在网络训练的时候,我们通常使用softmax输出层,此时交叉熵误差可以作为优化目标进行反向传播。

六、 PyTorch中的Sigmoid函数

在PyTorch中,可以使用torch.nn.functional模块中的sigmoid函数:


import torch.nn.functional as F

x = torch.Tensor([1.0, 2.0, 3.0])
y = F.sigmoid(x)
print(y)

七、 Sigmoid函数的选取

Sigmoid函数在大多数情况下都表现得很好,但也存在一些问题,比如:容易出现梯度消失的问题;另外,Sigmoid函数不是以0为中心的函数,在中心附近的梯度非常小。

针对这些问题,有时候可以尝试使用其他函数,比如ReLU、LeakyReLU、PReLU等。