1062 字
5 分钟
Softmax与交叉熵

前言#

在学 RNN 之前补一下之前出现的忽视的一些东西,Softmax函数和交叉熵函数。

Softmax#

Softmax 可以被拆分为两个部分,Soft 和 Max。

Max(Hardmax)1方法很简单,一种是从一组数据中挑选出数值最大的那个,另一种是假设数值a、b,如果a>b,则max为a,反之为b。

以现在的思考方法来看,Hardmax的特点就是挑选数据中最大的值作为输出,虽然方法简单且具有合理性,但这种非黑即白的方法,很显然不适用于复杂输出。所以就引入了 Soft 的概念,Softmax 的目标就是不再通过唯一的标准确定最大值,而是为每个输出结果赋予一个概率值,来表示该输出在不同类别的可能性。2

假设有1组输出zznn表示这组输出的元素个数,ziz_i表示该组输出的第ii个元素,yiy_i表示该组输出第ii个元素在 Softmax 后的输出,即:

yi=ezij=1nezjy_i = \frac{e^{z_i}}{\sum^{n}_{j=1} e^{z_j}}

以上图为例:

步骤1:以自然常数ee为底数,输出为指数,求输出的分子

指数函数曲线呈现递增趋势,斜率逐渐增大,在x轴上一个很小的变化,可以导致y轴上很大的变化,这种函数曲线能够将输出的数值拉开距离。但使用指数函数也有一些缺点:梯度消失数据溢出

ez1=e320ez2=e12.7ez3=e30.05\begin{aligned} & e^{z_1} = e^{3} \simeq 20 \\\\ & e^{z_2} = e^{1} \simeq 2.7 \\\\ & e^{z_3} = e^{-3} \simeq 0.05 \\\\ \end{aligned}

步骤2:将输出的分子累加,计算输出的分母

j=13ezj=20+2.7+0.05=22.75\begin{aligned} \sum^{3}_{j=1} e^{z_j} = 20 + 2.7 + 0.05 = 22.75 \end{aligned}

步骤3:通过输出的分子和分母,计算最总输出

y1=e1j=13ezj=2022.750.88y2=e2j=13ezj=2.722.750.12y3=e3j=13ezj=0.0522.750\begin{aligned}&y_1=\frac{e^1}{\sum^3_{j=1}e^{z_j}}=\frac{20}{22.75}\simeq0.88\\\\&y_2=\frac{e^2}{\sum^3_{j=1}e^{z_j}}=\frac{2.7}{22.75}\simeq0.12\\\\&y_3=\frac{e^3}{\sum^3_{j=1}e^{z_j}}=\frac{0.05}{22.75}\simeq0\end{aligned}

通过 Softmax 就可以将原始的输出值都转换为范围在[0, 1],且和为1的概率分布。

交叉熵#

交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。3

对数损失,也被称为 对数似然损失Logistic损失交叉熵损失4

E=i=1nyiln(y^i)E=-\sum^n_{i=1}y_iln(\hat y_i)

nn 表示类别个数,yiy_i 表示这组第 ii 个类别的值,yi^\hat{y_i} 表示预测为第 ii 个类别的概率。

底数并不重要,一般取 1010ee,只影响学习率。

由于一般的理想输出都是经过 One-Hot 编码,所有实际的交叉熵计算方法如下:

E=yiln(yi^)E=-y_iln(\hat{y_i})

yiy_i表示目标在第ii个分类的实际值。

Softmax 和 交叉熵 的反向传播#

Ezi=j=1n(Ejajajzi)\frac{\partial E}{\partial z_i} = \sum^n_{j=1}(\frac{\partial E_j}{\partial a_j}\frac{\partial a_j}{\partial z_i})

其中 ziz_i 是输出层第 ii 个节点的净输入,aja_j 是输出层经过激活后的输出(也是预测值 y^j\hat y_j),由于Softmax累加的特性,所有输出层所有节点的计算都包含了 ziz_i,在求导时需要将区分当 i=ji = jiji \neq j 两种不同的情况。5

根据链式求导法则,首先计算 交叉熵损失对预测值的偏导数 ,即预测值和实际值之间的损失:

Ejaj=(yjln(aj))aj=yi1ai\frac{\partial E_j}{\partial a_j} = \frac{\partial (-y_jln(a_j))}{\partial a_j} = -y_i\frac{1}{a_i}

然后分 i=ji = jiji \neq j 两种情况,求Softmax激活输出对净输入的偏导数

(一)如果 i=ji = j

ajzi=ezikezkzi=ezikezk(ezi)2(kezk)2=ezikezk(1ezikezk)=aj(1aj)\begin{aligned} \frac{\partial a_j}{\partial z_i} & = \frac{\partial \frac{e^{z_i}}{\sum_ke^{z_k}}}{\partial z_i} \\\\ & = \frac{e^{z_i}\sum_ke^{z_k}-(e^{z_i})^2}{(\sum_ke^{z_k})^2} \\\\ & = \frac{e^{z_i}}{\sum_ke^{z_k}} (1 - \frac{e^{z_i}}{\sum_ke^{z_k}}) \\\\ & = a_j(1-a_j) \end{aligned}

(二)如果 iji \neq j

ajzi=ezjkezkzi=ezjezi(kezk)2=ajai\begin{aligned} \frac{\partial a_j}{\partial z_i} & = \frac{\partial \frac{e^{z_j}}{\sum_ke^{z_k}}}{\partial z_i} \\\\ & = e^{z_j} \frac{-e^{z_i}}{(\sum_ke^{z_k})^2} \\\\ & = - a_j a_i \end{aligned}

将三者进行合并:

Ezi=j=1n(Ejajajzi)=j=i(Ejajajzi)+ji(Ejajajzi)=(yi1ai)(ai(1ai))+ji((yj1aj)(ajai))=yi(1ai)+jiyjai=yi+aiyi+jiaiyj=yi+j=1naiyj\begin{aligned} \frac{\partial E}{\partial z_i} & = \sum^n_{j=1}(\frac{\partial E_j}{\partial a_j}\frac{\partial a_j}{\partial z_i}) \\\\ & = \sum_{j=i}(\frac{\partial E_j}{\partial a_j}\frac{\partial a_j}{\partial z_i}) + \sum_{j \neq i}(\frac{\partial E_j}{\partial a_j}\frac{\partial a_j}{\partial z_i}) \\\\ & = (-y_i\frac{1}{a_i})(a_i(1-a_i)) + \sum_{j \neq i}((-y_j\frac{1}{a_j})(-a_ja_i)) \\\\ & = - y_i(1-a_i) + \sum_{j \neq i}y_ja_i \\\\ & = - y_i + a_iy_i + \sum_{j \neq i}a_iy_j \\\\ & = - y_i + \sum^n_{j=1}a_iy_j \end{aligned}

由于分类的实际值是通过 One-Hot 进行编码的,所以只有当 j=ij=i 时,yjy_j 才为1,其余都为0,得到最终的结果:

Ezi=aiyi\frac{\partial E}{\partial z_i} = a_i - y_i

如果忽略中间的一些计算步骤,Softmax+交叉熵,在反向传播梯度计算时,等效于 L2Loss

Footnotes#

  1. softmax和交叉熵

  2. 一文详解Softmax函数

  3. 交叉熵-百度百科

  4. 对数损失函数

  5. 简单易懂的softmax交叉熵损失函数求导

Softmax与交叉熵
https://fuwari.vercel.app/posts/人工智能/神经网络/softmax与交叉熵/
作者
Asuwee
发布于
2022-07-05
许可协议
CC BY-NC-SA 4.0