Softmax vs. SoftmaxWithLoss 推导过程

  • Softmax vs. SoftmaxWithLoss
    • Softmax function:
    • Softmax Loss function(cross-entropy):
  • SoftmaxWithLoss的推导
  • 一些理解
  • 可供学习的资料:

Softmax vs. SoftmaxWithLoss

Softmax function:

pj=ezjkezk p j = e z j ∑ k e z k

其中, zj=ωTjx+bj z j = ω j T x + b j 是一个向量,表示第 j j 个样本的线性预测。

Softmax Loss function(cross-entropy):

L=jyjlogpj L = − ∑ j y j log ⁡ p j

SoftmaxWithLoss的推导

  1. 首先求 pj p j zi z i 的导数:
    i=j i = j 时:

    pjzi=zi(ezjkezk)=ezjjezkezjezi[kezk]2=pj(1pj),i=j ∂ p j ∂ z i = ∂ ∂ z i ( e z j ∑ k e z k ) = e z j ∑ j e z k − e z j e z i [ ∑ k e z k ] 2 = p j ( 1 − p j ) , i = j

    ij i ≠ j 时:

    pjzi=zi(ezjkezk)=0×jezkezjezi[kezk]2=pipj,ij. ∂ p j ∂ z i = ∂ ∂ z i ( e z j ∑ k e z k ) = 0 × ∑ j e z k − e z j e z i [ ∑ k e z k ] 2 = − p i p j , i ≠ j .

  2. 接下来求 L L pj p j 的导数:

    Lpj=jyj1pj ∂ L ∂ p j = − ∑ j y j 1 p j

  3. 最后根据链式法则求L对 zi z i 的偏导数:

    Lzi=Lpjpjzi=jyj1pjpjzi=yi(1pi)kiyk1pk(pkpi)=yi(1pi)+kiyk(pi)=yi+yipi+kiyk(pi)=pi(kyk)yi=piyi ∂ L ∂ z i = ∂ L ∂ p j ∂ p j ∂ z i = − ∑ j y j 1 p j ∂ p j ∂ z i = − y i ( 1 − p i ) − ∑ k ≠ i y k 1 p k ( − p k p i ) = − y i ( 1 − p i ) + ∑ k ≠ i y k ( p i ) = − y i + y i p i + ∑ k ≠ i y k ( p i ) = p i ( ∑ k y k ) − y i = p i − y i

    其中, kyk=1 ∑ k y k = 1


一些理解

整个推导过程,大概只是能理解,但是很多细节是有问题而且不规范,比如标量对向量求导等等。目前也没有找到规范的写法,暂时放出来这些供理解参考。
对softmax的理解: zi z i 是第 i i 个样本的线性预测,是一个向量,通过softmax function将 zi z i 中的值归一化到 [0,1] [ 0 , 1 ] 区间内。 pi p i 也是一个向量,假设一个可能的预测结果是[0.01, 0.06, 0.05, 0, 0.9],表示模型认为这个样本有 0.9 0.9 的可能性属于第5个类别。
同时假设第 i i 个样本在每一个类别上的标签为[0, 0, 0, 1],说明该样本属于第5类。
**对softmax loss的理解:**softmaxloss 就是 softmax 加上一个交叉熵的目标。就是将预测结果取对数,然后乘上groundtruth。

CAFFE中的Softmax vs. SoftmaxWithLoss:简单理解就是CAFFE中有Softmax和SoftmaxWithLoss,原因就是单独使用Softmax得到样本的预测结果(可以理解为在testing过程中?);而SoftmaxWithLoss层会计算loss并且反向传播(可以理解为在training过程中?)。

因为 Deep Learning 的模型都是一层一层叠起来的结构,一个计算库的主要工作是提供各种各样的 layer,然后让用户可以选择通过不同的方式来对各种 layer 组合得到一个网络层级结构就可以了。比如用户可能最终目的就是得到各个类别的概率似然值,这个时候就只需要一个 Softmax Layer,而不一定要进行 Multinomial Logistic Loss 操作;或者是用户有通过其他什么方式已经得到了某种概率似然值,然后要做最大似然估计,此时则只需要后面的 Multinomial Logistic Loss 而不需要前面的 Softmax 操作。因此提供两个不同的 Layer 结构比只提供一个合在一起的 Softmax-Loss Layer 要灵活许多。

这里涉及到一个数值稳定性(numerical stability)的问题:大概就是说在计算指数的时候如果数值过大会造成溢出。
例如:
Softmax vs. SoftmaxWithLoss 推导过程_第1张图片
那么如何解决溢出问题呢?可以在求 exponential 之前将 x x 的每一个元素减去 xi x i 的最大值。
Softmax vs. SoftmaxWithLoss 推导过程_第2张图片
这样求 exponential 的时候会碰到的最大的数就是 0 了,不会发生overflow 的问题,但是如果其他数原本是正常范围,现在全部被减去了一个非常大的数,于是都变成了绝对值非常大的负数,所以全部都会发生underflow,但是underflow 的时候得到的是 0,这其实是非常 meaningful 的近似值,而且后续的计算也不会出现奇怪的 NaN。

当然,总不能在计算的时候平白无故地减去一个什么数,但是在这个情况里是可以这么做的,因为最后的结果要做 normalization,很容易可以证明,这里对x 的所有元素同时减去一个任意数都是不会改变最终结果的——当然这只是形式上,或者说“数学上”,但是数值上我们已经看到了,会有很大的差别。

可供学习的资料:

Softmax vs. Softmax-Loss: Numerical Stability 讲了Softmax和SoftmaxWithLoss 并且对数值稳定性做出了分析。
其他资料待补充……

你可能感兴趣的:(Deep,Learning)