首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Logsoftmax稳定性

Logsoftmax稳定性
EN

Stack Overflow用户
提问于 2017-05-20 09:27:27
回答 4查看 4.5K关注 0票数 5

我知道如何通过添加element -max _i x_i来使softmax稳定。这可以避免溢出和下溢。现在,记录下这可能会导致下溢。log softmax(x)可以计算为零,从而导致-infinity。

我不知道该怎么解决它。我知道这是一个常见的问题。我在上面读了几个答案,我都不明白。但是我仍然对如何解决这个问题感到困惑。

PS:如果你能提供一个简单的例子,那就太棒了。

EN

回答 4

Stack Overflow用户

发布于 2018-09-02 04:42:35

为了稳定Logsoftmax,大多数实现,如TensorflowThenao,都会使用一个技巧,去掉最大的组件max(x_i)。这种技巧通常用于稳定地计算softmax。对于logsoftmax,我们从以下内容开始:

在提取出exp(b)并使用log(exp(x)) = x这一事实之后,我们得到了:

如果我们设置

![](https://chart.googleapis.com/chart?cht=tx&chl=b=max(x_i%29)

,这个新方程同时具有溢流和底流稳定性条件。

在代码方面,如果x是一个向量:

代码语言:javascript
复制
def log_softmax(x):
    x_off = x - np.max(x)
    return x_off - np.log(np.sum(np.exp(x_off)))

另请参阅:https://timvieira.github.io/blog/post/2014/02/11/exp-normalize-trick/

票数 10
EN

Stack Overflow用户

发布于 2017-12-12 16:41:28

代码语言:javascript
复制
logsoftmax = logits - log(reduce_sum(exp(logits), dim))

参考:https://www.tensorflow.org/api_docs/python/tf/nn/log_softmax

票数 1
EN

Stack Overflow用户

发布于 2021-05-22 16:45:57

只要用这个就行了照顾好Nan

代码语言:javascript
复制
tf.nn.softmax_cross_entropy_with_logits(
    labels, logits, axis=-1, name=None
)
代码语言:javascript
复制
logits = tf.constant([[4, 5, 1000]], dtype = tf.float32)
labels = tf.constant([[1,0,1]], dtype = tf.float32)

# Case-1 
output = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)
print(output) 
>>> tf.Tensor([996.], shape=(1,), dtype=float32)

#Case-2
a = tf.nn.softmax(logits)
output = tf.reduce_sum(-(labels * tf.math.log(a)))
print(output) 
>>> tf.Tensor(nan, shape=(), dtype=float32)


# this happens because value of softmax truncates to zero

print(a) 
>>> <tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[0., 0., 1.]], dtype=float32)>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44081007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档