/pytorch/aten/src/TH/generic/THTensorRandom.cpp:325 处的多项分布无效(遇到概率条目 < 0)

Mar*_*ari 3 python pytorch tensor

我有一个PyTorch叫做的张量out_probs,它是这样产生的:

out_probs=F.softmax(out_dec[:,0],dim=0)
Run Code Online (Sandbox Code Playgroud)

另外,形状out_probs[128,20004]

out_probs是 softmax 操作的结果,它不应该包含任何负值,所以结果自然out_probs[out_probs<0是一个空张量(实际上我检查过它是空的)但是当我运行时

torch.multinomial(out_probs, 1)
Run Code Online (Sandbox Code Playgroud)

我越来越 :

RuntimeError: invalid argument 2: invalid multinomial distribution (encountering probability entry < 0) at /pytorch/aten/src/TH/generic/THTensorRandom.cpp:325
Run Code Online (Sandbox Code Playgroud)

这意味着我的张量有一个负值,我不知道为什么会这样?

jod*_*dag 7

我相信您在错误报告中发现了一个错误torch.multinomial

例如

x = torch.ones(128, 1)
x[0] *= 1e100
out_probs = F.softmax(x, dim=0)
print('Negative values:', torch.sum(out_probs < 0).item())
y = torch.multinomial(out_probs, 1)
Run Code Online (Sandbox Code Playgroud)

导致以下输出

Negative values: 0
RuntimeError: invalid argument 2: invalid multinomial distribution (encountering probability entry < 0) at /pytorch/aten/src/TH/generic/THTensorRandom.cpp:298
Run Code Online (Sandbox Code Playgroud)

事实证明这是因为out_probs包含nan条目而被触发。

print('nan values:', torch.sum(torch.isnan(out_probs)).item())
Run Code Online (Sandbox Code Playgroud)

nan values: 128
Run Code Online (Sandbox Code Playgroud)

这是由 softmax 中的数学不稳定性引起的。

奇怪的是,当 中的值out_probs是无穷大时,您会收到正确的错误消息

RuntimeError: invalid argument 2: invalid multinomial distribution (encountering probability entry = infinity or NaN) at /pytorch/aten/src/TH/generic/THTensorRandom.cpp:302
Run Code Online (Sandbox Code Playgroud)

如果在最新版本中尚未修复此错误,则可能应该在https://github.com/pytorch/pytorch/issues上报告该错误。

顺便说一下,我正在使用 PyTorch 1.0.1.post2