torch.softmax 和 torch.sigmoid 在二进制情况下不等价

Cut*_*son 4 python math softmax sigmoid pytorch

鉴于:

x_batch = torch.tensor([[-0.3, -0.7], [0.3, 0.7], [1.1, -0.7], [-1.1, 0.7]])
Run Code Online (Sandbox Code Playgroud)

然后申请torch.sigmoid(x_batch)

tensor([[0.4256, 0.3318],
        [0.5744, 0.6682],
        [0.7503, 0.3318],
        [0.2497, 0.6682]])
Run Code Online (Sandbox Code Playgroud)

给出完全不同的结果torch.softmax(x_batch,dim=1)

tensor([[0.5987, 0.4013],
        [0.4013, 0.5987],
        [0.8581, 0.1419],
        [0.1419, 0.8581]])
Run Code Online (Sandbox Code Playgroud)

根据我的理解,softmax 是不是与二进制情况下的 sigmoid 完全相同?

jod*_*dag 6

你被误导了。Sigmoid 和 softmax 不相等,即使对于 2 元素情况也是如此。

考虑x = [x1, x2]

sigmoid(x1) = 1 / (1 + exp(-x1))
Run Code Online (Sandbox Code Playgroud)

softmax(x1) = exp(x1) / (exp(x1) + exp(x2))
            = 1 / (1 + exp(-x1)/exp(-x2))
            = 1 / (1 + exp(-(x1 - x2))
            = sigmoid(x1 - x2)
Run Code Online (Sandbox Code Playgroud)

从代数我们可以看到一个等价的关系是

softmax(x, dim=1) = sigmoid(x - fliplr(x))
Run Code Online (Sandbox Code Playgroud)

或在pytorch

x_softmax = torch.sigmoid(x_batch - torch.flip(x_batch, dims=(1,))
Run Code Online (Sandbox Code Playgroud)

  • 我在这个答案中表明,softmax 在某种意义上相当于 sigmoid。它相当于logits之差的sigmoid,但不是logits的sigmoid。 (2认同)