Skip to content

softmax 函数详解

参考知乎

1. sigmod 函数

提到二分类首先想到的可能就是逻辑回归算法。逻辑回归算法是在各个领域中应用比较广泛的机器学习算法。而 σ(x)\sigma(x) 刚好有这样的功能:

σ(x)=11ex\sigma(x) = \frac{1}{1-\mathrm{e}^{-x}}

(保留)函数的绘制代码:

py
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-10, 10, 0.1)
y = 1 / (1 +  np.exp(-x))

plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

2. 引入

对于一个二分类问题,可以选择预测 AA 事件发生的概率 P(Ax)P(A|x) ,也可以选择分别预测 P(Ax)P(A|x)P(Ax)P(\overline{A}|x) ,并满足约束条件 P(AX)+P(Ax)=1P(A|X) + P(\overline{A}|x) = 1

这个约束条件将输出节点的输出值变成一个概率分布,简单来说各个输出节点的输出值范围映射到 [0,1][0, 1] ,并且约束各个输出节点的输出值的和为 11

softmax 函数即满足将各个输出值的范围映射为 [0,1][0, 1] ,并且约束各个输出节点的输出值的和为 11

3. softmax

大多数我们求和都是 hardmax

py
a = np.array([1, 2, 3, 4, 5])
np.max(a)

softmax 的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性,函数定义如下:

softmax(zi)=ezic=1Cezc\mathrm{softmax}(z_i) = \frac{e^{z_i}} {\sum\limits _{c=1}^Ce^{z_c}}

经过使用指数形式的 softmax 函数能够将差距大的数值距离拉的更大。

根据函数的性质,可以减去一个最大值来确保不会溢出:

softmax(zi)=eziDc=1CezcD\mathrm{softmax}(z_i) = \frac{e^{z_i-D}} {\sum\limits _{c=1}^Ce^{z_c-D}}

4. 交叉熵损失

其交叉熵损失值如下:

loss=logezic=1Cezc=(zilogc=1Cezc)\mathrm{loss} = -\log \frac{e^{z_i}} {\sum\limits _{c=1}^Ce^{z_c}} = -(z_i - \log\sum_{c=1}^Ce^{z_c})

通常