Softmax与交叉熵求导

首先声明变量符号. 以下所有表示都是针对单个样本, 多样本(batch)只需将向量表示扩展为矩阵表示即可.

对于多分类问题, 假设有mm个分类, 则真实的标签向量是一个One-Hot向量yRm\mathbf{y}\in \mathbb{R}^m, 其中jj是真实类别对应的索引, 则对于i=1,2,,mi=1,2,\cdots,m有:

yi={1,i=j0,ijy_i = \left\{ \begin{array}{ll} 1, & i = j \\ 0, & i \ne j \end{array} \right.

另外, 将softmax函数的入参记为zRm\mathbf{z} \in \mathbb{R}^m, 表示经过前面结构转换后的输出值, softmax函数的作用就是将这个值归一化后输出, 因此每个类别的对应的这个输出值, 可以作为预测概率, 所有类别的输出之和为1. 将softmax函数的输出向量记为aRm\mathbf{a} \in \mathbb{R}^m:

a=softmax(z)\mathbf{a}=softmax(\mathbf{z})

对于其中的每个元素ai,i=1,2,,ma_i, i=1,2,\cdots,m, 就是最后的输出值, 有:

ai=ezik=1mezk\begin{aligned} a_i = \frac{e^{z_i}}{\sum\limits_{k=1}^{m}e^{z_k}} \end{aligned}

其中连加符号的索引记号用kk只是因为ii被占用了, 在这里特指第ii个元素.

对于单个样本, 其交叉熵以向量的形式表示为:

l=ylna=iyilnai=lnajl=-\mathbf{y}\ln \mathbf{a}=-\sum\limits_{i} y_i\ln a_i=-\ln a_j

其中只有yj=1y_j=1, 其余的yi=0y_i=0. softmax和交叉熵经常一起出现, 因此这种组合的导数在后向传播中经常被使用的, 需要理解深刻.

这里说的导数, 即偏导数lz\frac{\partial l}{\partial \mathbf{z}}, 它本身也是一个长度为mm的向量, 每个元素是最后的损失对于对应ziz_i的导数. 将ll对每个元素ziz_i求导, 需要分为两种情况.

情况一, i=ji=j

这一项比较特殊, 因为它对应的是真实类别jj, 推导如下:

lzi=zilnaj=zilnai=zilnezik=1mezk=1ezik=1mezkezik=1mezke2zi(k=1mezk)2=k=1mezkezik=1mezk=(1ezik=1mezk)=ai1=aiyi\begin{aligned} \frac{\partial l}{\partial z_i} &= -\frac{\partial}{\partial z_i}\ln a_j = -\frac{\partial}{\partial z_i}\ln a_i = -\frac{\partial}{\partial z_i}\ln \frac{e^{z_i}}{\sum\limits_{k=1}^{m}e^{z_k}} \\ &= -\frac{1}{\frac{e^{z_i}}{\sum\limits_{k=1}^{m}e^{z_k}}}\frac{e^{z_i} \cdot \sum\limits_{k=1}^{m}e^{z_k} - e^{2z_i}}{(\sum\limits_{k=1}^{m}e^{z_k})^2} \\ &= -\frac{\sum\limits_{k=1}^{m}e^{z_k} - e^{z_i}}{\sum\limits_{k=1}^{m}e^{z_k}} \\ &= -(1 - \frac{e^{z_i}}{\sum\limits_{k=1}^{m}e^{z_k}}) \\ &= a_i - 1 \\ &= a_i - y_i \end{aligned}

情况二, iji \ne j

lzi=zilnaj=zilnezjk=1mezk=1ezjk=1mezkeziezj(k=1mezk)2=ezik=1mezk=ai=aiyi\begin{aligned} \frac{\partial l}{\partial z_i} &= -\frac{\partial}{\partial z_i}\ln a_j = -\frac{\partial}{\partial z_i}\ln \frac{e^{z_j}}{\sum\limits_{k=1}^{m}e^{z_k}} \\ &= -\frac{1}{\frac{e^{z_j}}{\sum\limits_{k=1}^{m}e^{z_k}}} \frac{-e^{z_i}e^{z_j}}{(\sum\limits_{k=1}^{m}e^{z_k})^2} \\ &= \frac{e^{z_i}}{\sum\limits_{k=1}^{m}e^{z_k}} \\ &= a_i \\ &= a_i - y_i \end{aligned}

此时的yi=0y_i=0.

因此综上推导过程, softmax函数结合交叉熵损失:

lzi=aiyi\begin{aligned} \frac{\partial l}{\partial z_i} = a_i - y_i \end{aligned}

用向量表示为:

lz=ay\begin{aligned} \frac{\partial l}{\partial \mathbf{z}} = \mathbf{a} - \mathbf{y} \end{aligned}

最后更新于