softmax数值溢出 与 softmax-loss问题

1.在阅读tensorflow源码的softmax实现过程中,可以看到它的实现有两个特殊地方:

①计算e指数的时候,所有logits都减去了每行的最大值

②其softmax_op_functor.h中,可以看到根据传入的log参数不同分别有两种不同计算方法。log为true时,计算LogSoftmax,log为false时,计算Softmax

其中这两个特殊的地方一个是为了解决数值上溢的问题,一个是解决数值下溢的问题。

具体参考:https://www.codelast.com/%E5%8E%9F%E5%88%9B-%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2softmax%E5%87%BD%E6%95%B0%E4%B8%8A%E6%BA%A2%E5%87%BAoverflow%E5%92%8C%E4%B8%8B%E6%BA%A2%E5%87%BAunderflow/文章描述的很详细,就不重复写了,直接引用。

注:很多传统的数学算法都不能用在实践中,因为数学推导是一种理想情况,而实际的编程要考虑数值稳定性的问题,即不能上溢也不能下溢。

2.在tensorflow中,计算交叉熵损失的函数是tf.nn.softmax_cross_entropy_with_logits,除了用这个你还可以先计算出softmax的输出,然后利用reduce_sum自己定义损失,很多tensorflow教程也是这样的。但是tf更建议使用softmax_cross_entropy_with_logits,按理来说有了softmax的输出,自己定义交叉熵损失也是可行的,为什么还要搞一个softmax_cross_entropy_with_logits。原因就在于softmax_cross_entropy_with_logits函数可以减少计算量。在tf源码的xent_op.h(一开始找了半天cross_entropy的文件,发现没有,没想到它给缩写成了xent,x应该代表cross,ent就是entropy)中可以看到其注释,说的就是虽然代码和softmax_op的代码有重复,但是这样可以减少计算量。具体如何减少的参考:http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/.

  将这两篇文章理解透,那么softmax也就差不多都理解了。

原文地址:https://www.cnblogs.com/deepllz/p/9046157.html

时间: 2024-08-07 03:27:57

softmax数值溢出 与 softmax-loss问题的相关文章

leecode 278 数值溢出感想

278是一道很简单的题,二分查找而已. 不过它却提醒了我一个很重要的事情,数值溢出问题. int begin, end; 乍一看 (begin + end) / 2 与 begin + (end - begin) /2 没什么区别. 可是 前者可能溢出,后者却不会溢出. 所以尽量用begin + (end - begin) /2. 由此推想, 所有的加法,减法,乘法都可能造成溢出. 有精巧的设计固然重要,可最重要的是在做数值运算时清楚数值的范围.

数值溢出与精度损失

数值溢出与精度损失 整数上溢出 进位超过最高位(无符号)或改变了符号位(有符号) 运算溢出.赋值溢出.无符号数小数减大数 浮点数的上溢出和下溢出 舍入 int=float float=double float=long 浮点数使用阶码储存 float 23位尾数 6~7位 double 52位尾数 16位 二进制小数与十进制小数并不是一一对应的 两个数量级相差很大的浮点数加减运算时,数值小的会被忽略 个人网站:DiffidentAres's Blog 原文地址:https://www.cnblo

17.3.10--->关于数值溢出问题

取值范围: short.int.long 占用的字节数不同,所能表示的数值范围也不同.以32位平台为例,下面是它们的取值范围: 数据类型                             所占字节数          取值范围short                                       2               -32768~32767,即 -215~(215-1)unsigned short                         2      

dotnet core 中数值溢出

.net core中使用C#的int类型,存在数值上下限范围,如下: int max = int.MaxValue; int min = int.MinValue; Console.WriteLine($"The range of integers is {min} to {max}"); 运行得到结果 The range of integers is -2147483648 to 2147483647 此时如果执行以下代码 int what = max + 3; Console.Wr

C:数值溢出问题

当超过一个数据类型能够存放最大的范围时,数值会溢出. 有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失. #include <stdio.h> int main() { char ch; //符号位溢出会导致数的正负发生改变 ch = 0x7f + 2; //127+2 printf("%d\n", ch); // 0111 1111 //+2后 1000 0001,这是负数补码,其原码为 1111 1111,结果为-127 //最

有效防止softmax计算时上溢出(overflow)和下溢出(underflow)的方法

<Deep Learning>(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(overflow)和下溢出(underflow)对数值计算的影响,并以softmax函数和log softmax函数为例进行了讲解.这里我再详细地把它总结一下. 『1』什么是下溢出(underflow)和上溢出(overflow) 实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这

卷积神经网络系列之softmax,softmax loss和cross entropy的讲解

我们知道卷积神经网络(CNN)在图像领域的应用已经非常广泛了,一般一个CNN网络主要包含卷积层,池化层(pooling),全连接层,损失层等.虽然现在已经开源了很多深度学习框架(比如MxNet,Caffe等),训练一个模型变得非常简单,但是你对这些层具体是怎么实现的了解吗?你对softmax,softmax loss,cross entropy了解吗?相信很多人不一定清楚.虽然网上的资料很多,但是质量参差不齐,常常看得眼花缭乱.为了让大家少走弯路,特地整理了下这些知识点的来龙去脉,希望不仅帮助自

【机器学习基础】对 softmax 和 cross-entropy 求导

目录 符号定义 对 softmax 求导 对 cross-entropy 求导 对 softmax 和 cross-entropy 一起求导 References 在论文中看到对 softmax 和 cross-entropy 的求导,一脸懵逼,故来整理整理. 以 softmax regression 为例来展示求导过程,softmax regression 可以看成一个不含隐含层的多分类神经网络,如 Fig. 1 所示. Fig. 1 Softmax Regression. softmax r

softmax和分类模型

softmax和分类模型 softmax的基本概念 分类问题 一个简单的图像分类问题,输入图像的高和宽均为2像素,色彩为灰度. 图像中的4像素分别记为 \(x_1, x_2, x_3, x_4\) 假设真实标签为狗.猫或者鸡,这些标签对应的离散值为 \(y_1, y_2, y_3\) . 我们通常使用离散的数值来表示类别,例如\(y_1=1, y_2=2, y_3=3\). 权重矢量 \[ \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{21} + x_3