基本公式:
Si=ezij=0Cezj S_i = \frac{e^{z_i}}{\sum_{j=0}^C{e^{z_j}}}
其中,输入zz为一个C维向量,输出SS也是一个C维向量,这里的C通常就是分类里面的类别数量。公式的分母对于每个输出SiS_i都是一样的,区别只在于分子ezie^{z_i},从这个角度看softmax就有点类似于归一化操作,实际效果也是把任意范围的输入变成[-1,1]的输出(维度不变)。图像如下:
关于Softmax
softmax交叉熵损失函数实际上就是通过softmax来计算各个类别的预测得分yj^\hat{y_j},然后根据得分计算Loss:
Lce=ylog(y^)=log(y^) L_{ce} = -ylog(\hat{y}) = -log(\hat{y}) \\
其中上式中yy为标签值,也就是1,y^\hat{y}是根据上面公式算出来的得分(分子为正确类别y对应的输入zyz_y):
y^=ezyj=0Cezj \hat{y} = \frac{e^{z_y}}{\sum_{j=0}^C{e^{z_j}}}
两式合并:
Lce=log(ezyj=0Cezj) L_{ce} = -log( \frac{e^{z_y}}{\sum_{j=0}^C{e^{z_j}}}) \\
参考从最优化的角度看待Softmax损失函数,这里对Softmax的更深层次的的含义进行一下探究。
在分类问题中,我们最朴素的目标就是输出一个C维向量,使目标类别(假设为第y类)zyz_y最大,形式化为(这里下标yyjj表示类别编号):
zy>zj(jy) z_y > z_j \quad (\forall{j \neq y})
在优化的过程中,最朴素的方式就是使zyz_y变大,而其他的zjyz_{j\neq y}变小,于是目标函数:
L=j!=yC(zjzy) L=\sum _{j!=y}^{C}(z_j - z_y)
为了避免zz无限制的下降,对其进行限制(类似于relu)
L=j!=yCmax(zjzy,0) L=\sum _{j!=y}^{C}max(z_j - z_y, 0)
这个函数的优化结果将使LL逐渐下降到0,此时分类边界zjy=zyz_{j \neq y} = z_y,但通常只有平时努力想考100分同学真正考试的时候才能拿到95分,目标是95分的同学只能考90分。于是我们人为的加入一个margin(这个margin得适中,太小了不起作用,太大了模型可能不收敛,一般类别数C较少时margin稍大,反之亦然),强迫不同的类别之间的分数拉大距离,使训练时候的难度更大,这样实际测试的时候泛化能力才更强,于是:
L=j!=yCmax(zjzy+m,0) L=\sum _{j!=y}^{C}max(z_j - z_y + m, 0)
这个目标函数中,LL是对所有的类别(j=0,1…C)都将会进行考虑,即计算梯度的时候会对所有的zjz_j进行计算,更新权重的时候梯度也会向所有类别的路径进行传播。这在二分类问题中一般没什么问题(二分类中的CE函数L=1mi=0m[yilogyi^+(1yi)log(1yi^)]L=-\frac{1}{m}\sum_{i=0}^{m}[y_ilog\hat{y_i} + (1-y_i)log(1-\hat{y_i})],既考虑目标类别,也考虑非目标类别),但在多分类中,特别是类别数特别多的情况下,如果所有类别都进行计算,将会有大量的非目标分数得到优化,这样每次优化时的梯度幅度不等且非常巨大,极易梯度爆炸。
所以多分类时一般只考虑目标类别,同时考虑“个别”非目标类别,达到平衡的目的,这个“个别”的非目标类别,我们应该怎么挑呢?
无疑,我们应该挑分数最大的那个(分数最大说明错的离谱,类似于hard example mining),于是我们的目标就是:
使目标分数比最大的非目标分数更大
形式化如下:
L=max(maxjy(zj)zy+m,0) L=max(max_{j \neq y}(z_j) - z_y + m, 0)
这里就没有了对所有类别的求和,而是改成了求所有类别里的最大分数值,这样目标类别和非目标类别都只求一个梯度,即优化参数时只有一个+1和一个-1梯度进入网络,达到平衡的目的。
为了均衡考虑各个非目标类别,可以对max函数做一个smooth:
maxjy(zj)log(j=0,jyCezj) max_{j \neq y}(z_j) \approx log(\sum_{j=0, j \neq y}^{C}{e^{z_j}})
上式把max smooth成LogSumExp,而其中LogSumExp的梯度刚好就是softmax:
log(j=0,jyCezj)zi=ezij=0,jyCezj \frac{\partial{ log(\sum_{j=0, j \neq y}^{C}{e^{z_j}})}}{\partial{z_i}} = \frac{e^{z_i}}{\sum_{j=0, j \neq y}^{C}{e^{z_j}}}
相当于通过softmx的分配方式,给其他非目标类别分一点梯度
于是目标函数变成:
L=max(log(j=0,jyCezj)zy,0) L=max( log(\sum_{j=0, j \neq y}^{C}{e^{z_j}}) - z_y, 0)
更进一步,还可以把max(x,0)max(x, 0)smooth成softplus,即max(x,0)log(1+ex)max(x, 0) \approx log(1+ e^x),于是:
L=log(1+elog(j=0,jyCezj)zy)=log(1+elog(j=0,jyCezj)ezy)=log(j=0,jyCezj+ezyezy)=log(j=0Cezjezy)=log(ezyj=0Cezj) L = log(1 + e^{ log(\sum_{j=0, j \neq y}^{C}{e^{z_j}}) - z_y}) \\ = log(1 + \frac{e^{ log(\sum_{j=0, j \neq y}^{C}{e^{z_j}})}} {e^{ z_y}}) \\ = log (\frac{\sum_{j=0, j \neq y}^{C}{e^{z_j}} + e^{z_y}} {e^{ z_y}}) \\ = log(\frac{{\sum_{j=0}^{C}{e^{z_j}}}}{e^{z_y}}) \\ = - log(\frac{e^{z_y}}{{\sum_{j=0}^{C}{e^{z_j}}}})
这个就是softmax交叉熵损失函数了。
从上述分析过程我们可以看到,softmax虽然看起来简单,但实际上从朴素目标函数出发,包含了平滑过程(使优化过程更加通畅)、非目标类别选择(使正负梯度得以平衡)、梯度分配(梯度按softmax方式分配给各个非目标类别)等过程。

相关文章:

  • 2022-12-23
  • 2021-06-09
  • 2021-07-06
  • 2021-12-24
  • 2021-11-21
  • 2021-04-11
猜你喜欢
  • 2021-06-24
  • 2021-11-08
  • 2021-08-17
  • 2022-01-06
  • 2021-07-22
  • 2022-12-23
相关资源
相似解决方案