防止softmax函数上溢出(overflow)和下溢出(underflow)

《Deep Learning》(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(overflow)和下溢出(underflow)对数值计算的影响,并以softmax函数和log softmax函数为例进行了讲解。这里我再详细地把它总结一下。

『1』什么是下溢出(underflow)和上溢出(overflow)
实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这就是下溢出。此时如果对这个数再做某些运算(例如除以它)就会出问题。
反之,当数值过大的时候,情况就变成了上溢出。

『2』softmax函数是什么
softmax函数如下:
这里写图片描述
从公式上看含义不是特别清晰,所以借用知乎上的一幅图来说明(感谢原作者):
这里写图片描述
这幅图极其清晰地表明了softmax函数是什么,一图胜千言。

『2』计算softmax函数值的问题
通常情况下,计算softmax函数值不会出现什么问题,例如,当softmax函数表达式里的所有 xi 都是一个“一般大小”的数值 c 时——也就是上图中,z1=z2=z3=cz1=z2=z3=c
但是,当某些情况发生时,计算函数值就出问题了:

  • c 极其大,导致分子计算 ecec时上溢出。
  • c 为负数,且 |c|很大,此时分母是一个极小的正数,有可能四舍五入为0,导致下溢出。

『3』如何解决
所以怎样所以怎样规避这些问题呢?我们可以用同一个方法一口气解决俩:
令 M = max(xixi 保持一致。

举个实例:还是以前面的图为例,本来我们计算 f(z2)f(z2)

其中,
M=3是z1,z2,z3z1,z2,z3中的最大值。可见计算结果并未改变。
通过这样的变换,对任何一个 xi,减去M之后,e 的指数的最大值为0,所以不会发生上溢出;同时,分母中也至少会包含一个值为1的项,所以分母也不会下溢出(四舍五入为0)。
所以这个技巧没什么高级的技术含量。

『4』延伸问题
看似已经结案了,但仍然有一个问题:如果softmax函数中的分子发生下溢出,也就是前面所说的 c 为负数,且 |c|很大,此时分母是一个极小的正数,有可能四舍五入为0的情况,此时,如果我们把softmax函数的计算结果再拿去计算 log,即 log softmax,其实就相当于计算 log(0),所以会得到 −∞,但这实际上是错误的,因为它是由舍入误差造成的计算错误。所以,有没有一个方法,可以把这个问题也解决掉呢?答案还是采用和前面类似的策略来计算 log softmax 函数值:
这里写图片描述

大家看到,在最后的表达式中,会产生下溢出的因素已经被消除掉了——求和项中,至少有一项的值为1,这使得log后面的值不会下溢出,也就不会发生计算 log(0) 的悲剧。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: softmax函数和sigmoid函数都是常用的激活函数,用于神经网络中的非线性变换。 softmax函数是一种多元分类的激活函数,将多个输入值映射到一个概率分布上,使得每个输出值都在0到1之间,并且所有输出值的和为1。在神经网络中,softmax函数常用于输出层,用于将神经网络的输出转化为概率分布,以便进行分类任务。 sigmoid函数是一种常用的二元分类的激活函数,将输入值映射到0到1之间的一个值,表示输入值为正例的概率。在神经网络中,sigmoid函数常用于隐藏层和输出层,用于将神经元的输出转化为概率值,以便进行分类任务或回归任务。 总的来说,softmax函数和sigmoid函数都是常用的激活函数,用于神经网络中的非线性变换,但是它们的应用场景不同,softmax函数适用于多元分类任务,而sigmoid函数适用于二元分类任务。 ### 回答2: softmax函数和sigmoid函数都是常见的非线性函数,在机器学习和深度学习中被广泛应用。它们的作用在于将输入的实数映射到一个0到1之间的范围内,便于用于概率估计和分类。 sigmoid函数是最基本的非线性函数之一,它的形式为:$sigmoid(x) = \dfrac{1}{1+e^{-x}}$。在输入的实数x较大时,sigmoid函数的值趋近于1;在输入的实数x较小时,sigmoid函数的值趋近于0。sigmoid函数具有连续可导、单调递增、非线性的特点,通常用于二分类问题中,即输出结果为正样本的概率。 softmax函数是一个常用的多类别分类器,在输入的实数向量中,将每一个分量映射成对应类别的概率。它的形式为:$softmax(x_i) = \dfrac{e^{x_i}}{\sum_{j=1}^{K}e^{x_j}}$,其中$x_i$表示输入向量的第i个分量,K表示类别的数量。softmax函数将所有输入向量的分量归一化并映射到一个概率分布上。在实践中,softmax函数通常与交叉熵损失函数一起使用,用于多分类问题的训练。 虽然softmax函数和sigmoid函数在一些方面类似,但它们的应用场景不同。sigmoid函数通常用于二分类问题中,而softmax函数适合用于多类分类问题。此外,softmax函数对输入向量的大小比较敏感,较大的分量会对结果产生更大的影响,因此在使用softmax函数时需要注意输入向量的归一化问题。 ### 回答3: sigmoid函数softmax函数深度学习中常用的激活函数。 Sigmoid函数也称为逻辑函数,其公式为f(x) = 1 / (1 + exp(-x))。sigmoid函数将输入值映射为[0,1]之间的浮点数,因此它常用于二分类问题的输出层。对于其他类型的问题,则需要使用其他函数。 Sigmoid函数的主要优点是易于计算,并且有一个平滑的导数,这使得它成为反向传播算法中常用的激活函数。然而,它也有几个缺点。对于输入x>5或x<-5,sigmoid函数的梯度非常小,这意味着在进行反向传播时,梯度可能会消失。此外,sigmoid函数的输出非线性,并且在函数的两端,梯度变得非常小,这使得训练过程会变得缓慢。 softmax函数也是一个激活函数,它用于多分类问题的输出层。softmax函数将输出值映射到[0,1]之间,并且所有值的总和为1。其公式为f(x_i) = exp(x_i) / sum_j(exp(x_j)),其中i表示类别,j表示所有类别。其特点是保留输入的相对大小,因此softmax函数可以将原始输出解释为类别的概率。 softmax函数的优点是它可以将输出解释为类别的概率,因此它是处理分类问题的不错选择。它也是可微分的,并且有一个平滑的导数,使得它非常适合用于反向传播算法。然而,与sigmoid函数一样,当输入较大时,softmax函数会给出接近于1的输出,这可能导致梯度消失。此外,softmax函数在处理大型数据集时会变得非常缓慢。 综上所述,sigmoid函数适用于二分类问题,而softmax函数适用于多分类问题。它们都有其优点和缺点,应根据具体问题进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值