在学 RNN 之前补一下之前出现的忽视的一些东西,Softmax函数和交叉熵函数。
Softmax#
Softmax 可以被拆分为两个部分,Soft 和 Max。
Max(Hardmax)1方法很简单,一种是从一组数据中挑选出数值最大的那个,另一种是假设数值a、b,如果a>b,则max为a,反之为b。
以现在的思考方法来看,Hardmax的特点就是挑选数据中最大的值作为输出,虽然方法简单且具有合理性,但这种非黑即白的方法,很显然不适用于复杂输出。所以就引入了 Soft 的概念,Softmax 的目标就是不再通过唯一的标准确定最大值,而是为每个输出结果赋予一个概率值,来表示该输出在不同类别的可能性。2

假设有1组输出z,n表示这组输出的元素个数,zi表示该组输出的第i个元素,yi表示该组输出第i个元素在 Softmax 后的输出,即:
yi=∑j=1nezjezi
以上图为例:
步骤1:以自然常数e为底数,输出为指数,求输出的分子

指数函数曲线呈现递增趋势,斜率逐渐增大,在x轴上一个很小的变化,可以导致y轴上很大的变化,这种函数曲线能够将输出的数值拉开距离。但使用指数函数也有一些缺点:梯度消失 和 数据溢出。
ez1=e3≃20ez2=e1≃2.7ez3=e−3≃0.05
步骤2:将输出的分子累加,计算输出的分母
j=1∑3ezj=20+2.7+0.05=22.75
步骤3:通过输出的分子和分母,计算最总输出
y1=∑j=13ezje1=22.7520≃0.88y2=∑j=13ezje2=22.752.7≃0.12y3=∑j=13ezje3=22.750.05≃0
通过 Softmax 就可以将原始的输出值都转换为范围在[0, 1],且和为1的概率分布。
交叉熵#
交叉熵(Cross Entropy)是Shannon信息论中一个重要概念,主要用于度量两个概率分布间的差异性信息。3
对数损失,也被称为 对数似然损失、Logistic损失、交叉熵损失。4
E=−∑i=1nyiln(y^i)
n 表示类别个数,yi 表示这组第 i 个类别的值,yi^ 表示预测为第 i 个类别的概率。
底数并不重要,一般取 10 或 e,只影响学习率。
由于一般的理想输出都是经过 One-Hot 编码,所有实际的交叉熵计算方法如下:
E=−yiln(yi^)
yi表示目标在第i个分类的实际值。
Softmax 和 交叉熵 的反向传播#
∂zi∂E=∑j=1n(∂aj∂Ej∂zi∂aj)
其中 zi 是输出层第 i 个节点的净输入,aj 是输出层经过激活后的输出(也是预测值 y^j),由于Softmax累加的特性,所有输出层所有节点的计算都包含了 zi,在求导时需要将区分当 i=j 和 i=j 两种不同的情况。5
根据链式求导法则,首先计算 交叉熵损失对预测值的偏导数 ,即预测值和实际值之间的损失:
∂aj∂Ej=∂aj∂(−yjln(aj))=−yiai1
然后分 i=j 和 i=j 两种情况,求Softmax激活输出对净输入的偏导数:
(一)如果 i=j :
∂zi∂aj=∂zi∂∑kezkezi=(∑kezk)2ezi∑kezk−(ezi)2=∑kezkezi(1−∑kezkezi)=aj(1−aj)
(二)如果 i=j :
∂zi∂aj=∂zi∂∑kezkezj=ezj(∑kezk)2−ezi=−ajai
将三者进行合并:
∂zi∂E=j=1∑n(∂aj∂Ej∂zi∂aj)=j=i∑(∂aj∂Ej∂zi∂aj)+j=i∑(∂aj∂Ej∂zi∂aj)=(−yiai1)(ai(1−ai))+j=i∑((−yjaj1)(−ajai))=−yi(1−ai)+j=i∑yjai=−yi+aiyi+j=i∑aiyj=−yi+j=1∑naiyj
由于分类的实际值是通过 One-Hot 进行编码的,所以只有当 j=i 时,yj 才为1,其余都为0,得到最终的结果:
∂zi∂E=ai−yi
如果忽略中间的一些计算步骤,Softmax+交叉熵,在反向传播梯度计算时,等效于 L2Loss。