前言
传统机器学习中两大经典任务就是回归与分类。分类在深度学习中也很常见,令我印象最深的是图像分类。当然,在NLP中,分类也无处不在。从RNN与其变体,到Transformer、Bert等预训练模型,只要涉及到在词表中挑选单词,就可以使用分类任务的思路来解决。在深度学习模型中,区分回归还是分类,往往只需要看最后一层的激活函数以及损失函数。这里有一个定式:凡是采用 S o f t m a x + C r o s s E n t r o p y L o s s \mathrm{Softmax+CrossEntropy Loss} Softmax+CrossEntropyLoss就一定是在分类。本文主要对这个组合的梯度进行计算,证明其巧妙之处,以加深自己对分类问题及其方法的理解
1 关于Softmax
1.1 Softmax的形式
若 x = [ x 1 . . . x i . . . x n ] , 那 么 S o f t m a x ( x ) = [ e x 1 ∑ k e x k . . . e x i ∑ k e x k . . . e x n ∑ k e x k ] 若\bm{x}=\begin{bmatrix} x_1\\ ...\\ x_i\\ ...\\ x_n\\ \end{bmatrix},那么\mathrm{Softmax}(\bm{x})=\begin{bmatrix} \frac{e^{x_1}}{\sum_ke^{x_k}}\\ ...\\ \frac{e^{x_i}}{\sum_ke^{x_k}}\\ ...\\ \frac{e^{x_n}}{\sum_ke^{x_k}}\\ \end{bmatrix} 若x=⎣⎢⎢⎢⎢⎡x1...xi...xn⎦⎥⎥⎥⎥⎤,那么Softmax(x)=⎣⎢⎢⎢⎢⎢⎡∑kexkex1...∑kexkexi...∑kexkexn⎦⎥⎥⎥⎥⎥⎤
若 y = S o f t m a x ( x ) \bm{y}=\mathrm{Softmax}(\bm{x}) y=Softmax(x),那么对于任意 y i y_i yi有以下特点:
- y i ∈ ( 0 , 1 ) y_i\in(0,1) yi∈(0,1),且 ∑ i y i = 1 \sum_iy_i=1 ∑iyi=1,所以可以 y i y_i yi当成属于类 i i i的概率
- 在计算任意一个 y i y_i yi时,都会用到所有 x i x_i xi
- 在计算任意一个 y i y_i yi时,都会以 e e e为底数,我们知道 e x e^x ex会随着 x x x的增大而急剧增大,这就会产生一种“大的更大,小的更小”的马太效应
1.2 一些其他细节
- 为什么叫这个名字?
其实 S o f t m a x \mathrm{Softmax} Softmax就是 s o f t \mathrm{soft} soft版本的 m a x \mathrm{max} max。我们平时所说的 m a x \mathrm{max} max,就是从多个值中选出一个最大的,这其实是 H a r d m a x \mathrm{Hardmax} Hardmax。而 S o f t m a x \mathrm{Softmax} Softmax是分别给这些值一个相应的概率,另外由于其有马太效应,数值相差越大,概率相差也越大。如果给其前面加一个 l o g \mathrm{log} log,那么就是 m a x \mathrm{max} max的一个可微的近似 - 关于 S o f t m a x \mathrm{Softmax} Softmax其实还有很多细节,比如数值稳定性问题,本文就不一一展开讲了,可以参考Softmax vs. Softmax-Loss: Numerical Stability 这篇文章,是一篇不错的延伸
2 关于CrossEntropy Loss
2.1 CrossEntropy
给定两个概率分布 p , q p,q p,q,其交叉熵为:
H ( p , q ) = − ∑ x p ( x ) l o g q ( x ) H(p,q)=-\sum_xp(x)\mathrm{log}q(x) H(p,q)=−x∑p(x)logq(x)
它刻画了两个概率分布之间的距离。其中 p p p代表正确分布, q q q代表的是预测分布。交叉熵越小,两个概率的分布越接近
2.2 CrossEntropy Loss
在分类问题中,提出了交叉熵损失。形式如同:
C = − ∑ i y i l o g y i ^ C=-\sum_iy_i\mathrm{log}\hat{y_i} C=−i∑yilogyi^
其中, y i y_i yi为真实标签, y i ^ \hat{y_i} yi^为预测结果中对应的分布。在本篇文章中, y i ^ \hat{y_i} yi^就对应了网络最后一层第 i i i个位置的输出 a i a_i ai,也就是 e z i ∑ k N e z k \frac{e^{z_i}}{\sum_k^N e^{z_k}} ∑