这篇文章是Softmax理解系列之三,没看过前两篇的这里有传送门:
王峰:从最优化的角度看待Softmax损失函数
王峰:Softmax理解之二分类与多分类
这一篇主要是第一篇内容的延续,使用了我的文章里的一些结论:
L2 Hypersphere Embedding for Face Verification
英文和数学比较好的可以先看看我这篇论文。
在第一篇文章中我们利用最优化里常见的 smooth 操作,将一个难以优化的分类目标函数经过两步 smooth 化后转变为常见的 Softmax交叉熵损失函数。文章发出来以后, @苏剑林 跟我说优化目标可以改得更简洁一些:
通过网络输出个分数,使得目标分数最大。
换成数学语言,就是要让:

这样,其对应的损失函数形式就非常简单了:

这个损失函数起到的作用是:当




经过这样的修改我们将所有的

结合第一篇文章和本文所描述的 smooth 方法,我们知道 Softmax 交叉熵损失可以理解为在使用 LogSumExp 函数对 max 函数进行替代,那么这样替代除了使得优化更容易进行下去有什么副作用呢?本文将从 smooth 程度控制的角度来讲一下 Softmax 交叉熵损失的缺点。
为了让读者更容易看明白,这里再把 Softmax 和 LogSumExp 两个函数的定义写一下:
有了这两个公式,我们来看一组例子:
x = [1 2 3 4]
softmax(x) = [0.0321 0.0871 0.2369 0.6439]
LSE(x) = 4.4402
从这个例子来看,本来1和4只差4倍,通过指数函数的放大作用,Softmax后的结果相差大约20倍。这样看,Softmax起到了近似 one-hot max 的作用,但 0.6439 其实也不算靠近1,近似效果不佳。
下面我们将 x 放大10倍:
x = [10 20 30 40]
softmax(x) = [9.36e-14 2.06e-9 4.54e-5 1.00]
LSE(x) = 40.00
可以看到,放大10倍之后,不管是 Softmax 还是 LogSumExp 都起到了理想的作用。
那缩小10倍呢?
x = [0.1 0.2 0.3 0.4]
softmax(x) = [0.2138 0.2363 0.2612 0.2887]
LSE(x) = 1.6425
可以看到在这种情况下,Softmax 和 LogSumExp 都不再能够很好地近似了,Softmax 的最大值和最小值差距不到一倍,而 LogSumExp 竟然比 max(x) 大了4倍多。
也就是说 Softmax 交叉熵损失在输入的分数较小的情况下,并不能很好地近似我们的目标函数。在使用






总结一下,

那么如何去控制



温度项控制着 Softmax 的 smooth 程度,



其实没那么容易,注意到这个




为了解决这一问题也有好几种方案,首先最好想到的就是根据当前分数


但这样做太麻烦了,去年有一篇文章提出了一种叫 Feature Incay 的方法,加一个约束项让特征的幅度拉大,这样就可以缓解小幅度的


Feature Incay 的缺点在于:一是提升特征幅度跟提升

另一种方案是将特征和权重全部归一化,这样






这里的




下期预告:这篇文章中提到了稍大的
