在机器学习的多分类任务中,经常听到这么两个名词:Softmax 与交叉熵损失函数(Cross Entropy Loss),另外还有一个 Sigmoid 函数也经常出现,那么这几个东西究竟有什么联系呢?

Softmax

这里先顺便提一句 Sigmoid,它与 Softmax 也有一点关系。我最先听说 Sigmoid 函数是在逻辑斯蒂回归模型中,这是个二分类任务中常用的经典模型。Sigmoid 函数长这样:

σ(z)=11+ez

它将实数域 R 映射为 (0,1) 区间,特殊地将 0 映射为 0.5,那么我们在逻辑斯蒂回归中使用的决策方法就是计算一下 σ(ωTx+b) 的值,从而得到 x 属于正类的概率值,进而进行预测判断。

而 Softmax 则是下面这样一个多元向量值函数:

ai=ezij=1Nezj,i=1,2,,N

显然,一定有 i=1Nai=1。在 N 分类任务中,常使用这个函数作为神经网络最末层的激活函数(该层激活前的 N 个节点即分别为函数的自变量 z1,z2,,zN),以得到属于各个类别的概率值。

由于神经网络使用梯度下降进行训练,若用 Softmax 作为激活函数,则免不了对这个函数进行求导,下面先给出该函数的导数(由于这是个多元向量值函数,“导数” 准确而言应该是 Jacobian)。

一般地,我们对 i,j 计算 aizj

aizj=eziezkzj=ezizjezkezjezi(ezk)2={ezjezi(ezk)2=aiaj,ijeziezke2zi(ezk)2=ai(1ai),i=j

以上就是 Softmax 的定义与其微分性质,那么特殊地,二元情形下的 Softmax 有以下形式:

{a1=ez1ez1+ez2=11+e(z1z2)a2=ez2ez1+ez2=e(z1z2)1+e(z1z2)

咦,这不就是 Sigmoid 吗?其实 Sigmoid 可以说就是 Softmax 的二元退化形式。

Cross Entropy Loss

单个样本的交叉熵损失函数定义如下:

E=i=1Nyilog(ai)

其中 y1,y2,,yN 其实是该样本的标签,其为一个 one-hot 向量,而 ai,a2,,aN 是神经网络经过 Softmax 之后的输出值。定义这么个损失函数究竟有什么好处?一方面,优化交叉熵等价于优化数学里的另一个东西,被称为 K-L 散度,而后者可以衡量两个概率分布之间的距离,多分类问题本质上就是一个概率分布的优化问题,因此这样一个损失函数在多分类问题上有优良的表现效果,收敛速度更快,而还有一方面,其实就是因为该损失函数结合 Softmax 进行梯度运算,将非常的方便,如下:

接下来,我们结合链式法则来计算 Ez 的导数(梯度):

Ez=(az)TEa

其中 az 前面已经算过了,它是:

[a1(1a1)a1a2a1aNa2a1a2(1a2)a2aNaNa1aNa2aN(1aN)]

然后计算 Ea

Ea=[y1a1y2a2yNaN]

将上面两个矩阵相乘得到:

Ez=[y1+yia1y2+yia2yN+yiaN]

注意这里 y 是样本的标签,它是个 one-hot 向量,因此一定有 i=1Nyi=1

代入上面的梯度表达式,就有:

Ez=[a1y1a2y2aNyN]=ay

这就牛逼了呀,这个损失函数的选取将原本复杂的一批的求梯度运算转化为了一次减法运算,也正是这一关系,将 Softmax 与交叉熵损失函数结合起来,成为密不可分的一对。