详解softmax原理及与交叉熵loss的关系

3,091 阅读1分钟

1. softmax定义

softmax的中文名是指数归一化,常用于多分类模型。假设我们要分k类,模型输出为(a1, a2, ...ak)的向量,可以用softmax对向量进行归一化处理,处理后该向量的元素和为1,softmax的公式如下:

Pi=eaij=1keajP_i=\frac{e^{a_i}}{\sum_{j=1}^{k}{e^{a_j}}}

2. softmax的数值稳定

由于网络原始输出的数字范围是不可控的,在softmax公式中使用指数次方形式进行计算,那么很容易指数次方处理后的结果超过了计算机的数字表示范围,从而造成softmax的数值不稳定。为了解决这一问题,可以使用一些数学技巧来缩小指数归一化得到结果数字的范围:

Pi=ceaij=1kceaj=eai+logcj=1keaj+logcP_i=\frac{ce^{a_i}}{\sum_{j=1}^{k}{ce^{a_j}}}=\frac{e^{a_i+logc}}{\sum_{j=1}^{k}{e^{a_j+logc}}}

想要使指数尽可能地不越界,只需要让logc值非常小就可以了,通常我们取:

logc=max(ai)logc = -max(a_i)

3. softmax求导

我们对softmax对类别i的预测概率Pi进行求导,考虑两种情况:

当i==j时,

Laj=eaij=1keajeai2j=1keaj2=Pi(1Pi)\frac{\partial{L}}{\partial{a_j}}=\frac{e^{a_i\sum_{j=1}^{k}{e^{a_j}}}-{e^{a_i}}^2}{{\sum_{j=1}^{k}{e^{a_j}}}^2}=P_i(1-P_i)

当i!=j时,

Laj=eaieajj=1keaj2=PiPj\frac{\partial{L}}{\partial{a_j}}=\frac{-e^{a_i}e^{a_j}}{{\sum_{j=1}^{k}{e^{a_j}}}^2}=-P_iP_j

4. cross entropy loss与softmax的关系

cross entropy loss定义如下:

L=i=1kyilogPiL=-\sum_{i=1}^{k}{y_ilogP_i}

上式中yi,当样本真实类别为i时为1,反之为0。

计算cross entropy的导数(链式法则+分情况相加):

Laj=LPiPiaj=yiPiPi(1Pi)+ijyiPiPiPj=yj+yjPj+ijyjPj=yj+Pj\frac{\partial{L}}{\partial{a_j}}=\frac{\partial{L}}{\partial{P_i}}\frac{\partial{P_i}}{\partial{a_j}}=\frac{-yi}{P_i}P_i(1-P_i)+\sum_{i≠j}\frac{y_i}{P_i}PiPj=-y_j+y_jP_j+\sum_{i≠j}y_jP_j=-y_j+P_j

整个求导过程看似复杂,最终求出来的结果却非常简洁,也非常易于理解,就是softmax预测出来的j的概率PiP_i和真实标签yjy_j的偏差值。