前言

传统机器学习中两大经典任务就是回归分类。分类在深度学习中也很常见,令我印象最深的是图像分类。当然,在NLP中,分类也无处不在。从RNN与其变体,到Transformer、Bert等预训练模型,只要涉及到在词表挑选单词,就可以使用分类任务的思路来解决。在深度学习模型中,区分回归还是分类,往往只需要看最后一层的激活函数以及损失函数。这里有一个定式:凡是采用Softmax+CrossEntropyLoss\mathrm{Softmax+CrossEntropy Loss}Softmax+CrossEntropyLoss就一定是在分类。本文主要对这个组合的梯度进行计算,证明其巧妙之处,以加深自己对分类问题及其方法的理解

1 关于Softmax

1.1 Softmax的形式

若x=[x1...xi...xn],那么Softmax(x)=[ex1∑kexk...exi∑kexk...exn∑kexk]若\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)=⎣⎢⎢⎢⎢⎢⎡​∑k​exk​ex1​​...∑k​exk​exi​​...∑k​exk​exn​​​⎦⎥⎥⎥⎥⎥⎤​

若y=Softmax(x)\bm{y}=\mathrm{Softmax}(\bm{x})y=Softmax(x),那么对于任意yiy_iyi​有以下特点:

  1. yi∈(0,1)y_i\in(0,1)yi​∈(0,1),且∑iyi=1\sum_iy_i=1∑i​yi​=1,所以可以yiy_iyi​当成属于类iii的概率
  2. 在计算任意一个yiy_iyi​时,都会用到所有xix_ixi​
  3. 在计算任意一个yiy_iyi​时,都会以eee为底数,我们知道exe^xex会随着xxx的增大而急剧增大,这就会产生一种“大的更大,小的更小”的马太效应

1.2 一些其他细节

  1. 为什么叫这个名字?
    其实Softmax\mathrm{Softmax}Softmax就是soft\mathrm{soft}soft版本的max\mathrm{max}max。我们平时所说的max\mathrm{max}max,就是从多个值中选出一个最大的,这其实是Hardmax\mathrm{Hardmax}Hardmax。而Softmax\mathrm{Softmax}Softmax是分别给这些值一个相应的概率,另外由于其有马太效应,数值相差越大,概率相差也越大。如果给其前面加一个log\mathrm{log}log,那么就是max\mathrm{max}max的一个可微的近似
  2. 关于Softmax\mathrm{Softmax}Softmax其实还有很多细节,比如数值稳定性问题,本文就不一一展开讲了,可以参考Softmax vs. Softmax-Loss: Numerical Stability 这篇文章,是一篇不错的延伸

2 关于CrossEntropy Loss

2.1 CrossEntropy

给定两个概率分布p,qp,qp,q,其交叉熵为:

H(p,q)=−∑xp(x)logq(x)H(p,q)=-\sum_xp(x)\mathrm{log}q(x)H(p,q)=−x∑​p(x)logq(x)

它刻画了两个概率分布之间的距离。其中ppp代表正确分布,qqq代表的是预测分布。交叉熵越小,两个概率的分布越接近

2.2 CrossEntropy Loss

在分类问题中,提出了交叉熵损失。形式如同:

C=−∑iyilogyi^C=-\sum_iy_i\mathrm{log}\hat{y_i}C=−i∑​yi​logyi​^​

其中,yiy_iyi​为真实标签,yi^\hat{y_i}yi​^​为预测结果中对应的分布。在本篇文章中,yi^\hat{y_i}yi​^​就对应了网络最后一层第iii个位置的输出aia_iai​,也就是ezi∑kNezk\frac{e^{z_i}}{\sum_k^N e^{z_k}}∑kN​ezk​ezi​​。

另外,当类别数仅为222时,CrossEntropyLoss\mathrm{CrossEntropy Loss}CrossEntropyLoss就变为:

C=−∑i=01yilogyi^=−[y0logy0^+y1logy1^]=−[ylogy^+(1−y)log(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∑1​yi​logyi​^​=−[y0​logy0​^​+y1​logy1​^​]=−[ylogy^​+(1−y)log(1−y^​)]​

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

3 分类问题的梯度计算

3.1 变量定义

我们设有一个LLL层的神经网络。Softmax\mathrm{Softmax}Softmax函数只作用在最后一层,所以只需要考虑第LLL层即可(注:本篇文章中直接省略表示层数的上标LLL):

符号 含义 维度
NNN 第LLL层(最后一层)神经元数量
z\bm{z}z 第LLL层(最后一层)的带权输入 (N×1)(N\times 1)(N×1)
a\bm{a}a 第LLL层(最后一层)的输出 (N×1)(N \times 1)(N×1)
y\bm{y}y 类别标签,是一个oneoneone-hothothot类型向量 (N×1)(N\times 1)(N×1)

3.2 各变量之间的关系

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

a=Softmax(z)C=Loss(a,y)=−∑iNyi⋅logai\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∑N​yi​⋅logai​​

其中,ai=ezi∑kNezka_i=\frac{e^{z_i}}{\sum_k^N e^{z_k}}ai​=∑kN​ezk​ezi​​。而y\bm{y}y的形式如同:[00...1...0]T\begin{bmatrix}0&0&...&1&...&0\end{bmatrix}^\mathrm{T}[0​0​...​1​...​0​]T,即yiy_iyi​仅在正确的类别处为1,其余位置处均为0。

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

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

遵循从单个到整体的求梯度原则,我们仍然只计算∂C∂zi\frac{\partial C}{\partial z_i}∂zi​∂C​。因为ziz_izi​会作用到每一个aja_jaj​当中,所以根据链式法则,有∂C∂zi=∑jN∂C∂aj⋅∂aj∂zi\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​​

3.3.1 计算∂aj∂zi\frac{\partial a_j}{\partial z_i}∂zi​∂aj​​

∂aj∂zi=∂ezj∑kNezk∂zi=∂ezj∂zi⋅∑kNezk−∂∑kNezk∂zi⋅ezj(∑kNezk)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​∂∑kN​ezk​ezj​​​=(∑kN​ezk​)2∂zi​∂ezj​​⋅∑kN​ezk​−∂zi​∂∑kN​ezk​​⋅ezj​​ (1)​

1.当i=ji=ji=j时,有:

(1)式=ei(j)z⋅∑kNezk−ei(j)z⋅ezj(∑kNezk)2=ai(j)−ai(j)⋅aj(Softmax定义)\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)式​=(∑kN​ezk​)2ei(j)z​⋅∑kN​ezk​−ei(j)z​⋅ezj​​=ai(j)​−ai(j)​⋅aj​(Softmax定义)​

注:这里的下标i(j)i(j)i(j),意为在这时不论取iii或取jjj都是一样的。下文同理

2.当i≠ji\not ={}ji​=j时,有:

(1)式=0−ezi⋅ezj(∑kNezk)2=−ai⋅aj\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)式​=(∑kN​ezk​)20−ezi​⋅ezj​​=−ai​⋅aj​​

所以,

∂aj∂zi={ai−ai⋅aj(i=j)−ai⋅aj(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)​

3.3.2 计算∂C∂aj\frac{\partial C}{\partial a_j}∂aj​∂C​

因为y\bm{y}y为oneoneone-hothothot向量,假设仅yk=1y_k=1yk​=1,那么:

C=−∑iNyilogai=−yklogak∂C∂aj={0(j≠k)−yj(k)aj(k)(j=k)=−yjaj\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∑N​yi​logai​=−yk​logak​=⎩⎪⎨⎪⎧​0(j​=k)−aj(k)​yj(k)​​(j=k)​=−aj​yj​​​

注:因为当j≠kj\not ={k}j​=k时yj=0y_j=0yj​=0,所以可以很直接的将两种情况合并

3.3.3 将∂aj∂zi\frac{\partial a_j}{\partial z_i}∂zi​∂aj​​和∂C∂aj\frac{\partial C}{\partial a_j}∂aj​∂C​带入∂C∂zi\frac{\partial C}{\partial z_i}∂zi​∂C​

∂C∂zi=∑jN∂C∂aj⋅∂aj∂zi=−∑j=1Nyjaj⋅[ai⋅1{i=j}−aiaj](1)=−yi(j)ai(j)(ai−aiai(j))+∑j=1,j≠iNyjaj(aiaj)(2)=−yi+yiai+∑j=1,j≠iNyjai=−yi+ai(yi+∑j=1,j≠iNyj)(3)=ai−yi\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∑N​aj​yj​​⋅[ai​⋅1{i=j}−ai​aj​](1)=−ai(j)​yi(j)​​(ai​−ai​ai(j)​)+j=1,j​=i∑N​aj​yj​​(ai​aj​)(2)=−yi​+yi​ai​+j=1,j​=i∑N​yj​ai​=−yi​+ai​(yi​+j=1,j​=i∑N​yj​)(3)=ai​−yi​​

注:

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

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

∂C∂zL=aL−y\frac{\partial C}{\partial \bm{z^L}}=\bm{a^L}-\bm{y}∂zL∂C​=aL−y

3.4 分析与对比

这个组合的梯度意味着,如果我的分类网络中采用Softmax+CrossEntropyLoss\mathrm{Softmax+CrossEntropy Loss}Softmax+CrossEntropyLoss,在计算最后一层误差的时候,我只需要记录最后一层的输出,然后再在正确的类别的那个位置减去1就可以了!

再对比一下回归问题,若采用MSE\mathrm{MSE}MSE作为损失函数,使用除Softmax\mathrm{Softmax}Softmax外的其他激活函数σL\sigma^LσL作为最后一层的激活函数的话,很容易得到∂C∂zL=(aL−y)⊙σ′L(zL)\frac{\partial C}{\partial\bm{z^L}}=(\bm{a^L-y})\odot\sigma'^L(\bm{z^L})∂zL∂C​=(aL−y)⊙σ′L(zL),惊讶的发现他们竟如此的一致!

4 参考资料

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

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

  1. softmax与交叉熵损失

    softmax基本形式 softmax是一个将实数域上取值的N维向量转化为[0,1]范围内的函数,常用用于分类问题中,接在神经网络最后一层,将输出值映射到概率区间上,其基本形式如下所示 pi=eai∑ ...

  2. pytoch人工神经网络基础:最简单的分类(softmax回归+交叉熵分类)

    softmax回归分类原理 对于回归问题,可以用模型预测值与真实值比较,用均方误差这样的损失函数表示误差,迭代使误差最小训练模型. 那么分类问题是否可以用线性回归模型预测呢.最简单的方法就是用soft ...

  3. 神经网络学习中的SoftMax与交叉熵

    简 介: 对于在深度学习中的两个常见的函数SoftMax,交叉熵进行的探讨.在利用paddle平台中的反向求微分进行验证的过程中,发现结果 与数学定义有差别.具体原因还需要之后进行查找. 关键词: 交 ...

  4. 度量学习(Metric learning)—— 基于分类损失函数(softmax、交叉熵、cosface、arcface)

    概述 首先,我们把loss归为两类:一类是本篇讲述的基于softmax的,一类是基于pair对的(如对比损失.三元损失等). 基于pair对的,参考我的另一篇博客: https://blog.csdn ...

  5. 图像分类_03分类器及损失:线性分类+ SVM损失+Softmax 分类+交叉熵损失

    2.3.1 线性分类 2.3.1.1 线性分类解释 上图图中的权重计算结果结果并不好,权重会给我们的猫图像分配⼀个⾮常低的猫分数.得出的结果偏向于狗. 如果可视化分类,我们为了⽅便,将⼀个图⽚理解成⼀ ...

  6. 人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】

    一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等. 全连接层:等号左边部分就是全连接层做的事, W W W 是全连接层的参数,我们也称为权值, X X X 是全连接层的输 ...

  7. CNN基础知识 || softmax与交叉熵

    一.函数 1 sigmoid 将一个数值通过函数映射到0-1之间. sigmoid函数表达式如下                                                     ...

  8. 【机器学习基础】Softmax与交叉熵的数学意义(信息论与概率论视角)

    经过我长时间的观察,发现很多人对人工智能/机器学习的理解只停留在"这是个经典/最新棒槌,我拿这个棒槌敲钉子贼6--"这个level.当然,如果真的敲得很6,那也是一个很厉害的大佬了 ...

  9. 【机器学习】 二次损失函数的不足及交叉熵损失softmax详解

    二次代价函数的不足: 以sigmoid激活函数为例,由于初始化是随机的,假设目标值为0,第一次随机初始化使得输入为0.82,那么还可以,多次迭代之后可以收敛到0.09,但如果第一次随机初始化到0.98 ...

最新文章

  1. EMC首席数据治理官:“受托人”是数据湖问责的关键
  2. EelemntUI中e-form表单校验的使用以及表单校验的规则
  3. foreach 实现 MyBatis 遍历集合与批量操作数据
  4. 将Java程序作成exe文件的几种方法【转载】
  5. go语言在windows编译在linux上运行的可执行程序
  6. laravel 分词搜索匹配度_搜索引擎工作原理
  7. 生日快乐!中国航天员“天团”
  8. 49 -算法 -LeetCode 107 107. 二叉树的层序遍历 II 栈队列vector
  9. 不懂函数式?用mobx来写react应用吧
  10. 开发范式大转移,云原生开发者如何把握技术脉络?
  11. HTML5基本知识小测验
  12. python网络爬虫笔记(九)
  13. 视频能力如何应对5G时代的流量爆炸
  14. 程序员2009精华本 有哪些精彩值得期待
  15. 基于安卓/android/微信小程序的个人健康打卡系统APP-#计算机毕业设计
  16. 【天意使用教程系列】破解系统登录密码
  17. [IDE工具篇]推荐一款私密性较好的电子日记本
  18. 一体机怎么修复音频服务器,多媒体教学一体机没有声音是怎么办?
  19. 用计算机打出5201 314文字,怎么识别书上或照片中的文字并保存为电子版?
  20. 从转行到入行(27岁跨行+跨专业+培训机构)

热门文章

  1. Elasticsearch6.5+Kibana6.5+Logstash6.5 下载|部署|使用
  2. php java python c语言_两分钟速览Java、PHP、C语言、Python四大编程
  3. x=1u c语言,c语言中1u是什么意思
  4. 微信分享第三方连接(H5页面)自定义缩略图、标题、描述(显示分享框,而不是链接)(微信JS-SDK)
  5. 【虚幻引擎UE】UE4/UE5 通用插件推荐及使用介绍
  6. 老杨刷完了23个跨年演讲,这6场最适合网工
  7. HDU4262 Juggler
  8. Reaction Paper
  9. 筑牢企业数字化转型的“底盘”,浪潮云ERP呈现出怎样的全景图?
  10. Kubernetes生产实践系列之二十三:Service Mesh之在Kubernetes部署Istio进行service mesh