从最优化的角度解析softmax函数

本文深入探讨了softmax作为多分类任务中常用损失函数的原因,从最优化角度解析了softmax交叉熵损失函数的形成过程。通过对比max函数和LogSumExp函数,解释了softmax如何通过平滑处理提高优化效率并增强模型泛化能力,同时介绍了softmax损失函数的优化策略,包括hinge损失和softplus函数的应用,展示了如何构建一个既能快速收敛又能保持良好泛化性能的损失函数。

softmax是目前最常用的分类损失函数,本文尝试从最优化的角度来解析softmax交叉熵损失函数
最优化的问题是构建一个目标函数,然后找到使目标函数取得最大或最小值的方法。而目标函数难以优化,所以有了各种smooth方法,例如L1范数取代L0范数、使用sigmoid取代阶跃函数。

多分类的目标函数

对于一个多分类的任务(假设为CCC类),最简单的方法莫过于直接输出一维的类别序号 0...C0...C0...C。这个方法有十分明显的错误,默认了相邻的类别更相似,假设第一类是猫,第二类是电冰箱,第十类是老虎。
为了解决上述问题,我们将各个类别的输出独立开来,将类别标签做成one_hot标签。
这样我们就得到了一个优化目标:

输出CCC个分数,使目标分数比非目标分数大

转换成数学描述,设z=f(x)∈RCz=f(x)\in \mathbb{R}^Cz=f(x)RC,yyy为真值标签的序号,那么优化目标为

∀j≠y,zy>zj{\forall}j\neq y,z_y>z_jj=y,zy>zj

目标函数的优化

损失函数的目的就是给zyz_yzy一个负的梯度,给zjz_jzj一个正的梯度,经过梯度下降法之后,zyz_yzy的升高而zjz_jzj下降。当然为了控制整个神经网络的训练时间,不能让zzz无限上升或者下降,所以利用max函数,让zyz_yzy刚刚超过zjz_jzj时就停止上升

L=∑i=1,i≠yCmax(zi−zy,0)\mathcal{L} = \sum_{i=1,i\neq y}^Cmax(z_i-z_y,0)L=i=1,i=yCmax(zizy,0)

这样做,模型的泛化能力会比较差。模型能够在训练集上刚刚达到zy>zjz_y>z_jzy>zj,但在测试集上就不会超过。在此借鉴svm中的间隔概念,添加一个参数,让zyz_yzyzjz_jzj大过一定数值才停止:

Lhinge=∑i=1,i≠yCmax(zi−zy+m,0)\mathcal{L_{hinge}}=\sum_{i=1,i\neq y}^Cmax(z_i-z_y+m,0)Lhinge=i=1,i=yCmax(zizy+m,0)

这样就得到了hinge loss.hinge loss 在以svm的二分类问题上大放异彩,但在多分类问题上,因为CCC十分大,会有大量的非目标分数得到优化,这样每次优化时的梯度幅度不等且非常巨大,容易造成梯度爆炸。
我们把优化目标换一种说法:

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

损失函数变为:

L=max(max(zi−zy),0),i≠y\mathcal{L}=max(max(z_i-z_y),0),i\neq yL=max(max(zizy),0),i=y

在优化损失函数时,每次最多只会有一个+1的梯度和一个-1的梯度,梯度幅度得到了限制。但是这样修改每次优化的幅度又太小了,会使得网络收敛十分慢,这时候就要采用smooth方法进行优化了。
softmax并不是max函数的smooth版,而是one_hot向量的smooth版。max函数的smooth版本是LogSumExp函数
LogSumExpLogSumExpLogSumExp函数:

Llse=max(log(∑i=1,i≠yCezi)−zy,0)\mathcal{L_{lse}}=max(log(\sum_{i=1,i \neq y}^Ce^{z_i})-z_y,0)Llse=max(log(i=1,i=yCezi)zy,0)

LogSumExpLogSumExpLogSumExp函数的导数恰好就是softmax函数:

log(∑i=1,i≠yCezi)zj=ezj∑i=1,i≠yezj\frac{\mathrm log(\sum_{i=1,i \neq y}^Ce^{z_i})}{\mathrm z_j}=\frac{e^{z_j}}{\sum_{i=1,i \neq y}e^{z_j}}zjlog(i=1,i=yCezi)=i=1,i=yezjezj

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

LogSumExp函数值是大于等于max函数值的,而且等于取到的条件也是非常苛刻的,所以使用LogSumExp函数相当于变相地加了一定的 mmm 。但这往往还是不够的,我们可以选择跟hinge loss一样添加一个 mmm ,那样效果应该也会不错,不过softmax交叉熵损失走的是另一条路:继续smooth。

ReLU函数max(x,0)max(x,0)max(x,0)也有一个smooth版本,即是softplus函数log(1+ex)log(1+e^x)log(1+ex)。使用softplus函数之后,即使zyz_yzy超过了LogSumExp函数,仍会得到一点点梯度让zyz_yzy继续上升,这样相当于变相又增加了一点mmm,使得泛化能力又得到了一些保障。

Lsoftmax=log(1+elog(∑i=1,i≠yCezi)−zy)=log(1+∑i=1,i≠yCeziezy)=log(∑i=1Ceziezy)=−logezy∑i=1Cezi\mathcal{L_{softmax}}=log(1+e^{log(\sum_{i=1,i \neq y}^Ce^{z_i})-z_y}) \\ =log(1+\frac{\sum_{i=1,i \neq y}^Ce^{z_i}}{e^{z_y}}) \\=log(\frac{\sum_{i=1}^Ce^{z_i}}{e^{z_y}}) \\ =-log\frac{e^{z_y}}{\sum_{i=1}^{C}e^{z_i}} Lsoftmax=log(1+elog(i=1,i=yCezi)zy)=log(1+ezyi=1,i=yCezi)=log(ezyi=1Cezi)=logi=1Ceziezy

上面就是大家熟悉的softmax交叉熵损失函数了,经过两步smooth之后,我们将一个难以收敛的函数改造成了一个可以泛化能力较强可以快速收敛,不会梯度爆炸的损失函数。从这个推导过程中我们可以看出smooth化不仅可以让优化更畅通,而且还变相地在类间引入了一定的间隔,从而提升了泛化性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值