知行编程网知行编程网  2022-05-18 20:00 知行编程网 隐藏边栏 |   抢沙发  7 
文章评分 0 次,平均分 0.0

从最优化的角度看待Softmax损失函数

来自 | 知乎   作者 | 王峰
链接丨https://zhuanlan.zhihu.com/p/45014864
编辑 | 深度学习这件小事
仅作学术交流,如有侵权,请联系删除
从最优化的角度看待Softmax损失函数

   导读


作者按:最近博士毕业论文写完了,这段时间比较闲,准备把我博士毕业论文里比较有意思的一些章节拿出来写成博客,有空就写点,不定期更新。


Softmax交叉熵损失函数应该是目前最常用的分类损失函数了,在大部分文章中,Softmax交叉熵损失函数都是从概率角度来解释的(请读者自行搜索),本文将尝试从最优化的角度来推导出Softmax交叉熵损失函数,希望能够启发出更多的研究思路。


   从最优化的角度看Softmax损失函数


一般而言,最优化的问题通常需要构造一个目标函数,然后寻找能够使目标函数取得最大/最小值的方法。目标函数往往难以优化,所以有了各种relax、smooth的方法,例如使用L1范数取代L0范数、使用sigmoid取代阶跃函数等等。


那么我们就要思考一个问题:使用神经网络进行多分类(假设为  类)时的目标函数是什么?神经网络的作用是学习一个非线性函数  ,将输入转换成我们希望的输出。这里我们不考虑网络结构,只考虑分类器(也就是损失函数)的话,最简单的方法莫过于直接输出一维的类别序号  。而这个方法的缺点显而易见:我们事先并不知道这些类别之间的关系,而这样做默认了相近的整数的类是相似的,为什么第2类的左右分别是第1类和第3类,也许第2类跟第5类更为接近呢?


为了解决这个问题,可以将各个类别的输出独立开来,不再只输出1个数而是输出  个分数(某些文章中叫作logit[1],但我感觉这个词用得没什么道理,参见评论),每个类别占据一个维度,这样就没有谁与谁更近的问题了。那么如果让一个样本的真值标签(ground-truth label)所对应的分数比其他分数更大,就可以通过比较  个分数的大小来判断样本的类别了。这里沿用我的论文[2]使用的名词,称真值标签对应的类别分数为目标分数(target score),其他的叫非目标分数(non-target score)。


这样我们就得到了一个优化目标:


输出C个分数,使目标分数比非目标分数更大。


换成数学描述,设  、 为真值标签的序号,那优化目标即为:


 。


得到了目标函数之后,就要考虑优化问题了。我们可以给  一个负的梯度,给其他所有 一个正的梯度,经过梯度下降法,即可使  升高而  下降。为了控制整个神经网络的幅度,不可以让  无限地上升或下降,所以我们利用max函数,让在  刚刚超过  时就停止上升:


 。


然而这样做往往会使模型的泛化性能比较差,我们在训练集上才刚刚让 超过 ,那测试集很可能就不会超过。借鉴svm里间隔的概念,我们添加一个参数,让  比  大过一定的数值才停止:


 。


这样我们就推导出了hinge loss...唔,好像跑题了,我们本来不是要说Softmax的么...不过既然跑题了就多说点,为什么hinge loss在SVM时代大放异彩,但在神经网络时代就不好用了呢?主要就是因为svm时代我们用的是二分类,通过使用一些小技巧比如1 vs 1、1 vs n等方式来做多分类问题。而如论文[3]这样直接把hinge loss应用在多分类上的话,当类别数  特别大时,会有大量的非目标分数得到优化,这样每次优化时的梯度幅度不等且非常巨大,极易梯度爆炸。


其实要解决这个梯度爆炸的问题也不难,我们把优化目标换一种说法:


输出C个分数,使目标分数比最大的非目标分数更大。


跟之前相比,多了一个限制词“最大的”,但其实我们的目标并没有改变,“目标分数比最大的非目标分数更大”实际上等价于“目标分数比所有非目标分数更大”。这样我们的损失函数就变成了:


 。


在优化这个损失函数时,每次最多只会有一个+1的梯度和一个-1的梯度进入网络,梯度幅度得到了限制。但这样修改每次优化的分数过少,会使得网络收敛极其缓慢,这时就又要祭出smooth大法了。那么max函数的smooth版是什么?有同学会脱口而出:softmax!恭喜你答错了...


这里出现了一个经典的歧义,softmax实际上并不是max函数的smooth版,而是one-hot向量(最大值为1,其他为0)的smooth版。其实从输出上来看也很明显,softmax的输出是个向量,而max函数的输出是一个数值,不可能直接用softmax来取代max。max函数真正的smooth版本是LogSumExp函数。


使用LogSumExp函数取代max函数:


 ,


LogSumExp函数的导数恰好为softmax函数:


 。


经过这一变换,给予非目标分数的1的梯度将会通过LogSumExp函数传播给所有的非目标分数,各个非目标分数得到的梯度是通过softmax函数进行分配的,较大的非目标分数会得到更大的梯度使其更快地下降。这些非目标分数的梯度总和为1,目标分数得到的梯度为-1,总和为0,绝对值和为2,这样我们就有效地限制住了梯度的总幅度。


LogSumExp函数值是大于等于max函数值的,而且等于取到的条件也是非常苛刻的(具体情况还是得看我的博士论文,这里公式已经很多了,再写就没法看了),所以使用LogSumExp函数相当于变相地加了一定的  。但这往往还是不够的,我们可以选择跟hinge loss一样添加一个  ,那样效果应该也会不错,不过softmax交叉熵损失走的是另一条路:继续smooth。


注意到ReLU函数  也有一个smooth版,即softplus函数  。使用softplus函数之后,即使  超过了LogSumExp函数,仍会得到一点点梯度让  继续上升,这样其实也是变相地又增加了一点  ,使得泛化性能有了一定的保障。替换之后就可以得到:



这个就是大家所熟知的softmax交叉熵损失函数了。在经过两步smooth化之后,我们将一个难以收敛的函数逐步改造成了softmax交叉熵损失函数,解决了原始的目标函数难以优化的问题。从这个推导过程中我们可以看出smooth化不仅可以让优化更畅通,而且还变相地在类间引入了一定的间隔,从而提升了泛化性能。


至于如何利用这个推导来对损失函数进行修改和一些进一步的分析,未完待续...


参考链接:

[1] Pereyra G, Tucker G, Chorowski J, et al. Regularizing neural networks by penalizing confident output distributions[J]. arXiv preprint arXiv:1701.06548, 2017.

[2] Wang F, Cheng J, Liu W, et al. Additive margin softmax for face verification[J]. IEEE Signal Processing Letters, 2018, 25(7): 926-930.

[3] Tang Y. Deep learning using linear support vector machines[J]. arXiv preprint arXiv:1306.0239, 2013.


<pre style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><p style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;line-height: 1.75em;margin-left: 0px;margin-right: 0px;padding-left: 0em;padding-right: 0em;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;box-sizing: border-box !important;overflow-wrap: break-word !important;">—</span></strong>完<strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;font-size: 16px;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;letter-spacing: 0.5px;box-sizing: border-box !important;overflow-wrap: break-word !important;">—</span></strong></span></strong></span></strong></p><section style="max-width: 100%;letter-spacing: 0.544px;white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;box-sizing: border-box !important;overflow-wrap: break-word !important;padding-left: 0em;padding-right: 0em;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-top: 15px;margin-bottom: 25px;max-width: 100%;opacity: 0.8;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;letter-spacing: 0.544px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section powered-by="xiumi.us" style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="margin-top: 15px;margin-bottom: 25px;max-width: 100%;opacity: 0.8;box-sizing: border-box !important;overflow-wrap: break-word !important;"><section style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><p style="margin-bottom: 15px;padding-right: 0em;padding-left: 0em;max-width: 100%;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;margin-left: 0px;margin-right: 0px;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(0, 0, 0);box-sizing: border-box !important;overflow-wrap: break-word !important;"><strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;font-size: 16px;font-family: 微软雅黑;caret-color: red;box-sizing: border-box !important;overflow-wrap: break-word !important;">为您推荐</span></strong></span></p><p style="margin: 5px 0px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(87, 107, 149);font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">人工智能领域最具影响力的十大女科学家</span><br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"  /></p><p style="margin: 5px 0px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(87, 107, 149);font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">MIT最新深度学习入门课,安排起来!</span></p><p style="margin: 5px 0px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(87, 107, 149);font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">有了这个神器,轻松用 Python 写个 App</span></p><p style="margin: 5px 0px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;"><span style="max-width: 100%;color: rgb(87, 107, 149);font-size: 14px;box-sizing: border-box !important;overflow-wrap: break-word !important;">「最全」实至名归,NumPy 官方早有中文教程</span><br style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;"  /></p><p style="margin: 5px 0px;padding-right: 0em;padding-left: 0em;max-width: 100%;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;box-sizing: border-box !important;overflow-wrap: break-word !important;">漫画版 Linux 内核的世界<br  /></p></section></section></section></section></section></section></section></section>
从最优化的角度看待Softmax损失函数

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享