传统机器学习中两大经典任务就是回归与分类。分类在深度学习中也很常见,令我印象最深的是图像分类。当然,在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就一定是在分类。本文主要对这个组合的梯度进行计算,证明其巧妙之处,以加深自己对分类问题及其方法的理解
若 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有以下特点:
给定两个概率分布 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代表的是预测分布。交叉熵越小,两个概率的分布越接近
在分类问题中,提出了交叉熵损失。形式如同:
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}} ∑kNezkezi。
另外,当类别数仅为 2 2 2时, C r o s s E n t r o p y L o s s \mathrm{CrossEntropy Loss} CrossEntropyLoss就变为:
C = − ∑ i = 0 1 y i l o g y i ^ = − [ y 0 l o g y 0 ^ + y 1 l o g y 1 ^ ] = − [ y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) ] \begin{aligned} C&=-\sum_{i=0}^1y_i\mathrm{log}\hat{y_i}\\ &=-[y_0\mathrm{log}\hat{y_0}+y_1\mathrm{log}\hat{y_1}]\\ &=-[y\mathrm{log}\hat{y}+(1-y)\mathrm{log}(1-\hat{y})] \end{aligned} C=−i=0∑1yilogyi^=−[y0logy0^+y1logy1^]=−[ylogy^+(1−y)log(1−y^)]
注:这里 y 1 = 1 − y 0 , y 1 ^ = 1 − y 0 ^ y_1=1-y_0,\hat{y_1}=1-\hat{y_0} y1=1−y0,y1^=1−y0^,且省略下标
我们设有一个 L L L层的神经网络。 S o f t m a x \mathrm{Softmax} Softmax函数只作用在最后一层,所以只需要考虑第 L L L层即可(注:本篇文章中直接省略表示层数的上标 L L L):
符号 | 含义 | 维度 |
---|---|---|
N N N | 第 L L L层(最后一层)神经元数量 | |
z \bm{z} z | 第 L L L层(最后一层)的带权输入 | ( N × 1 ) (N\times 1) (N×1) |
a \bm{a} a | 第 L L L层(最后一层)的输出 | ( N × 1 ) (N \times 1) (N×1) |
y \bm{y} y | 类别标签,是一个 o n e one one- h o t hot hot类型向量 | ( N × 1 ) (N\times 1) (N×1) |
使用交叉熵损失函数,有:
a = S o f t m a x ( z ) C = L o s s ( a , y ) = − ∑ i N y i ⋅ l o g a i \begin{aligned} \bm{a}&=\mathrm{Softmax}(\bm{z})\\ C&=Loss(\bm{a,y})=-\sum_i^Ny_i\cdot \mathrm{log}a_i \end{aligned} aC=Softmax(z)=Loss(a,y)=−i∑Nyi⋅logai
其中, a i = e z i ∑ k N e z k a_i=\frac{e^{z_i}}{\sum_k^N e^{z_k}} ai=∑kNezkezi。而 y \bm{y} y的形式如同: [ 0 0 . . . 1 . . . 0 ] T \begin{bmatrix}0&0&...&1&...&0\end{bmatrix}^\mathrm{T} [00...1...0]T,即 y i y_i yi仅在正确的类别处为1,其余位置处均为0。
要想反向传播梯度,首先需要先计算最后一层的误差 ∂ C ∂ z \frac{\partial C}{\partial \bm{z}} ∂z∂C。
遵循从单个到整体的求梯度原则,我们仍然只计算 ∂ C ∂ z i \frac{\partial C}{\partial z_i} ∂zi∂C。因为 z i z_i zi会作用到每一个 a j a_j aj当中,所以根据链式法则,有 ∂ C ∂ z i = ∑ j N ∂ C ∂ a j ⋅ ∂ a j ∂ z i \frac{\partial C}{\partial z_i}=\sum_j^N\frac{\partial C}{\partial a_j}\cdot\frac{\partial a_j}{\partial z_i} ∂zi∂C=j∑N∂aj∂C⋅∂zi∂aj
∂ a j ∂ z i = ∂ e z j ∑ k N e z k ∂ z i = ∂ e z j ∂ z i ⋅ ∑ k N e z k − ∂ ∑ k N e z k ∂ z i ⋅ e z j ( ∑ k N e z k ) 2 ( 1 ) \begin{aligned} \frac{\partial a_j}{\partial z_i}&=\frac{\partial \frac{e^{z_j}}{\sum_k^N e^{z_k}}}{\partial z_i}\\ &=\frac{\frac{\partial e^{z_j}}{\partial z_i}\cdot\sum_k^N e^{z_k}-\frac{\partial \sum_k^N e^{z_k}}{\partial z_i}\cdot e^{z_j}}{(\sum_k^N e^{z_k})^2}\ \qquad(1) \end{aligned} ∂zi∂aj=∂zi∂∑kNezkezj=(∑kNezk)2∂zi∂ezj⋅∑kNezk−∂zi∂∑kNezk⋅ezj (1)
1.当 i = j i=j i=j时,有:
( 1 ) 式 = e i ( j ) z ⋅ ∑ k N e z k − e i ( j ) z ⋅ e z j ( ∑ k N e z k ) 2 = a i ( j ) − a i ( j ) ⋅ a j ( S o f t m a x 定 义 ) \begin{aligned} (1)式&=\frac{e^z_{i(j)}\cdot\sum_k^N e^{z_k}-e^z_{i(j)}\cdot e^{z_j}}{(\sum_k^N e^{z_k})^2}\\ &=a_{i(j)}-a_{i(j)}\cdot a_j\quad(\mathrm{Softmax}定义) \end{aligned} (1)式=(∑kNezk)2ei(j)z⋅∑kNezk−ei(j)z⋅ezj=ai(j)−ai(j)⋅aj(Softmax定义)
注:这里的下标 i ( j ) i(j) i(j),意为在这时不论取 i i i或取 j j j都是一样的。下文同理
2.当 i ≠ j i\not ={}j i=j时,有:
( 1 ) 式 = 0 − e z i ⋅ e z j ( ∑ k N e z k ) 2 = − a i ⋅ a j \begin{aligned} (1)式&=\frac{0-e^{z_i}\cdot e^{z_j}}{(\sum_k^N e^{z_k})^2}\\ &=-a_i\cdot a_j \end{aligned} (1)式=(∑kNezk)20−ezi⋅ezj=−ai⋅aj
所以,
∂ a j ∂ z i = { a i − a i ⋅ a j ( i = j ) − a i ⋅ a j ( i ≠ j ) \frac{\partial a_j}{\partial z_i}=\left\{\begin{aligned} a_i-a_i\cdot a_j\qquad(i=j)\\ -a_i\cdot a_j\qquad(i\not ={j}) \end{aligned} \right. ∂zi∂aj={ai−ai⋅aj(i=j)−ai⋅aj(i=j)
因为 y \bm{y} y为 o n e one one- h o t hot hot向量,假设仅 y k = 1 y_k=1 yk=1,那么:
C = − ∑ i N y i l o g a i = − y k l o g a k ∂ C ∂ a j = { 0 ( j ≠ k ) − y j ( k ) a j ( k ) ( j = k ) = − y j a j \begin{aligned} C&=-\sum_i^N y_i\mathrm{log}a_i=-y_k\mathrm{log}a_k\\ \frac{\partial C}{\partial a_j}&=\left\{\begin{aligned} 0\qquad(j\not ={k})\\ -\frac{y_{j(k)}}{a_{j(k)}}\quad(j=k) \end{aligned} \right.\\ &=-\frac{y_j}{a_j} \end{aligned} C∂aj∂C=−i∑Nyilogai=−yklogak=⎩⎪⎨⎪⎧0(j=k)−aj(k)yj(k)(j=k)=−ajyj
注:因为当 j ≠ k j\not ={k} j=k时 y j = 0 y_j=0 yj=0,所以可以很直接的将两种情况合并
∂ C ∂ z i = ∑ j N ∂ C ∂ a j ⋅ ∂ a j ∂ z i = − ∑ j = 1 N y j a j ⋅ [ a i ⋅ 1 { i = j } − a i a j ] ( 1 ) = − y i ( j ) a i ( j ) ( a i − a i a i ( j ) ) + ∑ j = 1 , j ≠ i N y j a j ( a i a j ) ( 2 ) = − y i + y i a i + ∑ j = 1 , j ≠ i N y j a i = − y i + a i ( y i + ∑ j = 1 , j ≠ i N y j ) ( 3 ) = a i − y i \begin{aligned} \frac{\partial C}{\partial z_i}&=\sum_j^N\frac{\partial C}{\partial a_j}\cdot\frac{\partial a_j}{\partial z_i}\\ &=-\sum_{j=1}^N\frac{y_j}{a_j}\cdot[a_i\cdot1\{i=j\}-a_ia_j]\qquad(1)\\ &=-\frac{y_{i(j)}}{a_{i(j)}}(a_i-a_ia_{i(j)})+\sum_{j=1,j\not ={i}}^N\frac{y_j}{a_j}(a_ia_j)\qquad(2)\\ &=-y_i+y_ia_i+\sum_{j=1,j\not ={i}}^Ny_ja_i\\ &=-y_i+a_i(y_i+\sum_{j=1,j\not ={i}}^Ny_j)\qquad(3)\\ &=a_i-y_i \end{aligned} ∂zi∂C=j∑N∂aj∂C⋅∂zi∂aj=−j=1∑Najyj⋅[ai⋅1{i=j}−aiaj](1)=−ai(j)yi(j)(ai−aiai(j))+j=1,j=i∑Najyj(aiaj)(2)=−yi+yiai+j=1,j=i∑Nyjai=−yi+ai(yi+j=1,j=i∑Nyj)(3)=ai−yi
注:
因为 ∂ C ∂ z i \frac{\partial C}{\partial z_i} ∂zi∂C只与下标 i i i有关,所以可以扩展到向量形式,这里我再顺便加上层数 L L L:
∂ C ∂ z L = a L − y \frac{\partial C}{\partial \bm{z^L}}=\bm{a^L}-\bm{y} ∂zL∂C=aL−y
这个组合的梯度意味着,如果我的分类网络中采用 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就可以了!
再对比一下回归问题,若采用 M S E \mathrm{MSE} MSE作为损失函数,使用除 S o f t m a x \mathrm{Softmax} Softmax外的其他激活函数 σ L \sigma^L σL作为最后一层的激活函数的话,很容易得到 ∂ C ∂ z L = ( a L − y ) ⊙ σ ′ L ( z L ) \frac{\partial C}{\partial\bm{z^L}}=(\bm{a^L-y})\odot\sigma'^L(\bm{z^L}) ∂zL∂C=(aL−y)⊙σ′L(zL),惊讶的发现他们竟如此的一致!