梳理caffe代码softmaxWithLoss(二十三)

继续梳理caffe中的loss的softmaxWithLoss函数。

caffe中的softmaxWithLoss其实是: 

softmaxWithLoss = Multinomial Logistic Loss Layer (这个好多博客都翻译为交叉熵,这个应该准确点为多项损失函数)+ Softmax Layer

梳理caffe代码softmaxWithLoss(二十三)_第1张图片梳理caffe代码softmaxWithLoss(二十三)_第2张图片

梳理caffe代码softmaxWithLoss(二十三)_第3张图片

梳理caffe代码softmaxWithLoss(二十三)_第4张图片

梳理caffe代码softmaxWithLoss(二十三)_第5张图片

关于softmax和softmaxwithloss的透彻分析,好好阅读一下chiyuanzhang大神的Softmax vs. Softmax-Loss: Numerical Stability。

毕竟工程和理论还是有差距的,文中最后给出julia对于出现 NAN(Not a Number)的处理数值方法:

"softmax 函数第一行有一行被注释掉的代码,就是在求 exponential 之前将  的每一个元素减去  的最大值。这样求 exponential 的时候会碰到的最大的数就是 0 了,不会发生 overflow 的问题,但是如果其他数原本是正常范围,现在全部被减去了一个非常大的数,于是都变成了绝对值非常大的负数,所以全部都会发生 underflow,但是 underflow 的时候得到的是 0,这其实是非常 meaningful 的近似值,而且后续的计算也不会出现奇怪的 NaN当然,总不能在计算的时候平白无故地减去一个什么数,但是在这个情况里是可以这么做的,因为最后的结果要做 normalization,很容易可以证明,这里对  的所有元素同时减去一个任意数都是不会改变最终结果的——当然这只是形式上,或者说“数学上”,但是数值上我们已经看到了,会有很大的差别。"

 梳理以下softmax_loss_layer中的实现:





你可能感兴趣的:(梳理caffe代码softmaxWithLoss(二十三))