神经网络适用于分类问题的最后一层-Softmax和交叉熵损失介绍及梯度推导
前言
传统机器学习中两大经典任务就是回归与分类。分类在深度学习中也很常见,令我印象最深的是图像分类。当然,在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)=⎣⎢⎢⎢⎢⎢⎡∑kexkex1...∑kexkexi...∑kexkexn⎦⎥⎥⎥⎥⎥⎤
若y=Softmax(x)\bm{y}=\mathrm{Softmax}(\bm{x})y=Softmax(x),那么对于任意yiy_iyi有以下特点:
- yi∈(0,1)y_i\in(0,1)yi∈(0,1),且∑iyi=1\sum_iy_i=1∑iyi=1,所以可以yiy_iyi当成属于类iii的概率
- 在计算任意一个yiy_iyi时,都会用到所有xix_ixi
- 在计算任意一个yiy_iyi时,都会以eee为底数,我们知道exe^xex会随着xxx的增大而急剧增大,这就会产生一种“大的更大,小的更小”的马太效应
1.2 一些其他细节
- 为什么叫这个名字?
其实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的一个可微的近似 - 关于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∑yilogyi^
其中,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}}∑kNezkezi。
另外,当类别数仅为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∑1yilogyi^=−[y0logy0^+y1logy1^]=−[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∑Nyi⋅logai
其中,ai=ezi∑kNezka_i=\frac{e^{z_i}}{\sum_k^N e^{z_k}}ai=∑kNezkezi。而y\bm{y}y的形式如同:[00...1...0]T\begin{bmatrix}0&0&...&1&...&0\end{bmatrix}^\mathrm{T}[00...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∂∑kNezkezj=(∑kNezk)2∂zi∂ezj⋅∑kNezk−∂zi∂∑kNezk⋅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)式=(∑kNezk)2ei(j)z⋅∑kNezk−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)式=(∑kNezk)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∑Nyilogai=−yklogak=⎩⎪⎨⎪⎧0(j=k)−aj(k)yj(k)(j=k)=−ajyj
注:因为当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∑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
注:
- 在公式(1)(1)(1)中,1{⋅}1\{\cdot\}1{⋅}为示性函数,大括号内表达式为真时函数值为111,否则为000
- 在公式(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)中,括号中的表达式恒等于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 参考资料
- 你 真的 懂 Softmax 吗?
- softmax激活+crossEntropy损失求导公式推导
- 深度学习之反向传播算法(2)——全连接神经网络的BP算法推导
神经网络适用于分类问题的最后一层-Softmax和交叉熵损失介绍及梯度推导相关推荐
- softmax与交叉熵损失
softmax基本形式 softmax是一个将实数域上取值的N维向量转化为[0,1]范围内的函数,常用用于分类问题中,接在神经网络最后一层,将输出值映射到概率区间上,其基本形式如下所示 pi=eai∑ ...
- pytoch人工神经网络基础:最简单的分类(softmax回归+交叉熵分类)
softmax回归分类原理 对于回归问题,可以用模型预测值与真实值比较,用均方误差这样的损失函数表示误差,迭代使误差最小训练模型. 那么分类问题是否可以用线性回归模型预测呢.最简单的方法就是用soft ...
- 神经网络学习中的SoftMax与交叉熵
简 介: 对于在深度学习中的两个常见的函数SoftMax,交叉熵进行的探讨.在利用paddle平台中的反向求微分进行验证的过程中,发现结果 与数学定义有差别.具体原因还需要之后进行查找. 关键词: 交 ...
- 度量学习(Metric learning)—— 基于分类损失函数(softmax、交叉熵、cosface、arcface)
概述 首先,我们把loss归为两类:一类是本篇讲述的基于softmax的,一类是基于pair对的(如对比损失.三元损失等). 基于pair对的,参考我的另一篇博客: https://blog.csdn ...
- 图像分类_03分类器及损失:线性分类+ SVM损失+Softmax 分类+交叉熵损失
2.3.1 线性分类 2.3.1.1 线性分类解释 上图图中的权重计算结果结果并不好,权重会给我们的猫图像分配⼀个⾮常低的猫分数.得出的结果偏向于狗. 如果可视化分类,我们为了⽅便,将⼀个图⽚理解成⼀ ...
- 人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】
一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等. 全连接层:等号左边部分就是全连接层做的事, W W W 是全连接层的参数,我们也称为权值, X X X 是全连接层的输 ...
- CNN基础知识 || softmax与交叉熵
一.函数 1 sigmoid 将一个数值通过函数映射到0-1之间. sigmoid函数表达式如下 ...
- 【机器学习基础】Softmax与交叉熵的数学意义(信息论与概率论视角)
经过我长时间的观察,发现很多人对人工智能/机器学习的理解只停留在"这是个经典/最新棒槌,我拿这个棒槌敲钉子贼6--"这个level.当然,如果真的敲得很6,那也是一个很厉害的大佬了 ...
- 【机器学习】 二次损失函数的不足及交叉熵损失softmax详解
二次代价函数的不足: 以sigmoid激活函数为例,由于初始化是随机的,假设目标值为0,第一次随机初始化使得输入为0.82,那么还可以,多次迭代之后可以收敛到0.09,但如果第一次随机初始化到0.98 ...
最新文章
- EMC首席数据治理官:“受托人”是数据湖问责的关键
- EelemntUI中e-form表单校验的使用以及表单校验的规则
- foreach 实现 MyBatis 遍历集合与批量操作数据
- 将Java程序作成exe文件的几种方法【转载】
- go语言在windows编译在linux上运行的可执行程序
- laravel 分词搜索匹配度_搜索引擎工作原理
- 生日快乐!中国航天员“天团”
- 49 -算法 -LeetCode 107 107. 二叉树的层序遍历 II 栈队列vector
- 不懂函数式?用mobx来写react应用吧
- 开发范式大转移,云原生开发者如何把握技术脉络?
- HTML5基本知识小测验
- python网络爬虫笔记(九)
- 视频能力如何应对5G时代的流量爆炸
- 程序员2009精华本 有哪些精彩值得期待
- 基于安卓/android/微信小程序的个人健康打卡系统APP-#计算机毕业设计
- 【天意使用教程系列】破解系统登录密码
- [IDE工具篇]推荐一款私密性较好的电子日记本
- 一体机怎么修复音频服务器,多媒体教学一体机没有声音是怎么办?
- 用计算机打出5201 314文字,怎么识别书上或照片中的文字并保存为电子版?
- 从转行到入行(27岁跨行+跨专业+培训机构)
热门文章
- Elasticsearch6.5+Kibana6.5+Logstash6.5 下载|部署|使用
- php java python c语言_两分钟速览Java、PHP、C语言、Python四大编程
- x=1u c语言,c语言中1u是什么意思
- 微信分享第三方连接(H5页面)自定义缩略图、标题、描述(显示分享框,而不是链接)(微信JS-SDK)
- 【虚幻引擎UE】UE4/UE5 通用插件推荐及使用介绍
- 老杨刷完了23个跨年演讲,这6场最适合网工
- HDU4262 Juggler
- Reaction Paper
- 筑牢企业数字化转型的“底盘”,浪潮云ERP呈现出怎样的全景图?
- Kubernetes生产实践系列之二十三:Service Mesh之在Kubernetes部署Istio进行service mesh