Logsoftmax 稳定性

Abh*_*tia 5 numerical underflow numerical-stability softmax

我知道如何通过添加到元素 -max _i x_i 来使 softmax 稳定。这避免了上溢和下溢。现在,记录此日志可能会导致下溢。log softmax(x) 可以计算为零,导致 -infinity。

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

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

e_s*_*ush 9

为了稳定Logsoftmax,大多数实现,如TensorflowTheao,使用一个技巧,取出最大的组件max(x_i)。这个技巧常用于稳定计算softmax。对于logsoftmax,我们开始:

公式

在提取出exp(b)并使用 的事实之后log(exp(x)) = x,我们有:

公式

如果我们设置 b = 最大值(x_i),这个新方程同时具有上溢和下溢稳定条件。


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

def log_softmax(x):
    x_off = x - np.max(x)
    return x_off - np.log(np.sum(np.exp(x_off)))
Run Code Online (Sandbox Code Playgroud)

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


小智 1

logsoftmax = logits - log(reduce_sum(exp(logits), dim))
Run Code Online (Sandbox Code Playgroud)

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