Sigmoid
Sigmoid与Softmax是分类任务中的常用激活函数,用于将模型的输出值转换到(0,1)之间的概率。通常情况下,Sigmoid用于二分类任务中,Softmax用于多分类任务中。
$$\delta (t) = \frac{1}{1+e^(-t)}$$
Softmax
很多场景中需要我们找出数组所有元素中值最大的元素,实质上都是求的hardmax。hardmax最大的特点就是只选出其中一个最大的值,即非黑即白。但是往往在实际中这种方式是不合情理的,比如对于文本分类来说,一篇文章或多或少包含着各种主题信息,我们更期望得到文章对于每个可能的文本类别的概率值(置信度),可以简单理解成属于对应类别的可信度。所以此时用到了soft的概念,Softmax的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。
优点
Softmax的计算过程中引入了指数函数,目的是为了将输出的数值拉开距离,其效果如以下所示。
$$\delta (t) = \frac{e^t}{\sum^n_1 e^(n)}$$
1 | import torch |
可以发现,经过使用指数形式的Softmax函数能够将差距大的数值距离拉的更大。在深度学习中通常使用反向传播求解梯度进而使用梯度下降进行参数更新的过程,而指数函数在求导的时候比较方便。
此外,将每个类别的输出转化为概率,可以使得每个类别都有一定的概率被预测到,从而解决类别不平衡问题。(猜测:有一些样本较少的类别,可以通过softmax“快速”提高自身被识别出的概率,即使样本数量较少,也能有一个比较好的拟合效果)
缺点
当使用Softmax函数作为输出节点的激活函数的时候,一般使用交叉熵作为损失函数。由于Softmax函数的数值计算过程中,很容易因为输出节点的输出值比较大而发生数值溢出的现象,在计算交叉熵的时候也可能会出现数值溢出的问题。
在PyTorch中,可以使用torch.max函数来获取每个输入值的最大值,然后将其减去每个输入值,以避免softmax的数值溢出。