神经网络适用于分类问题的最后一层-Softmax和交叉熵损失介绍及梯度推导

前言

传统机器学习中两大经典任务就是回归分类。分类在深度学习中也很常见,令我印象最深的是图像分类。当然,在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有以下特点:

  1. 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的概率
  2. 在计算任意一个 y i y_i yi时,都会用到所有 x i x_i xi
  3. 在计算任意一个 y i y_i yi时,都会以 e e e为底数,我们知道 e x e^x ex会随着 x x x的增大而急剧增大,这就会产生一种“大的更大,小的更小”的马太效应

1.2 一些其他细节

  1. 为什么叫这个名字?
    其实 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的一个可微的近似
  2. 关于 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)=xp(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=iyilogyi^

其中, 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=01yilogyi^=[y0logy0^+y1logy1^]=[ylogy^+(1y)log(1y^)]

注:这里 y 1 = 1 − y 0 , y 1 ^ = 1 − y 0 ^ y_1=1-y_0,\hat{y_1}=1-\hat{y_0} y1=1y0,y1^=1y0^,且省略下标

3 分类问题的梯度计算

3.1 变量定义

我们设有一个 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)

3.2 各变量之间的关系

使用交叉熵损失函数,有:

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)=iNyilogai

其中, 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。

3.3 求 ∂ C ∂ z \frac{\partial C}{\partial \bm{z}} zC

要想反向传播梯度,首先需要先计算最后一层的误差 ∂ C ∂ z \frac{\partial C}{\partial \bm{z}} zC

遵循从单个到整体的求梯度原则,我们仍然只计算 ∂ C ∂ z i \frac{\partial C}{\partial z_i} ziC。因为 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} ziC=jNajCziaj

3.3.1 计算 ∂ a j ∂ z i \frac{\partial a_j}{\partial z_i} ziaj

∂ 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} ziaj=zikNezkezj=(kNezk)2ziezjkNezkzikNezkezj (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)zkNezkei(j)zezj=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)20eziezj=aiaj

所以,

∂ 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. ziaj={aiaiaj(i=j)aiaj(i=j)

3.3.2 计算 ∂ C ∂ a j \frac{\partial C}{\partial a_j} ajC

因为 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} CajC=iNyilogai=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,所以可以很直接的将两种情况合并

3.3.3 将 ∂ a j ∂ z i \frac{\partial a_j}{\partial z_i} ziaj ∂ C ∂ a j \frac{\partial C}{\partial a_j} ajC带入 ∂ C ∂ z i \frac{\partial C}{\partial z_i} ziC

∂ 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} ziC=jNajCziaj=j=1Najyj[ai1{i=j}aiaj](1)=ai(j)yi(j)(aiaiai(j))+j=1,j=iNajyj(aiaj)(2)=yi+yiai+j=1,j=iNyjai=yi+ai(yi+j=1,j=iNyj)(3)=aiyi

注:

  1. 在公式 ( 1 ) (1) (1)中, 1 { ⋅ } 1\{\cdot\} 1{}示性函数,大括号内表达式为真时函数值为 1 1 1,否则为 0 0 0
  2. 在公式 ( 2 ) (2) (2)中,其实是把公式 ( 1 ) (1) (1)的求和项分成了两个部分,左半部分是 i = j i=j i=j时的情况,所以这里加上了下标 i ( j ) i(j) i(j),代表可以任意替换,而右半部分是 i ≠ j i\not ={j} i=j的情况,就必须严格遵守原始下标
  3. 在公式 ( 3 ) (3) (3)中,括号中的表达式恒等于 1 1 1(因为 y \bm{y} y o n e one one- h o t hot hot向量)

因为 ∂ C ∂ z i \frac{\partial C}{\partial z_i} ziC只与下标 i i i有关,所以可以扩展到向量形式,这里我再顺便加上层数 L L L:

∂ C ∂ z L = a L − y \frac{\partial C}{\partial \bm{z^L}}=\bm{a^L}-\bm{y} zLC=aLy

3.4 分析与对比

这个组合的梯度意味着,如果我的分类网络中采用 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}) zLC=(aLy)σL(zL),惊讶的发现他们竟如此的一致!

4 参考资料

  1. 你 真的 懂 Softmax 吗?
  2. softmax激活+crossEntropy损失求导公式推导
  3. 深度学习之反向传播算法(2)——全连接神经网络的BP算法推导

你可能感兴趣的:(深度学习,自然语言处理,深度学习,神经网络,机器学习)