11

我正在尝试计算 softmax 激活函数的导数。我发现了这个:https : //math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function 似乎没有人给出正确的推导,我们将如何获得 i=j 和 i!= j 的答案. 有人可以解释一下吗!当在 softmax 激活函数的分母中涉及求和时,我对导数感到困惑。

4

2 回答 2

17

和的导数是导数之和,即:

    d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx

为了推导 的导数,p_j我们o_i从以下开始:

    d_i(p_j) = d_i(exp(o_j) / Sum_k(exp(o_k)))

我决定使用d_i导数o_i来使这更容易阅读。使用乘积规则我们得到:

     d_i(exp(o_j)) / Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k)))

看第一项,导数是0if i != j,这可以用我称之为 D_ij的delta 函数来表示。这给出(对于第一个任期):

    = D_ij * exp(o_j) / Sum_k(exp(o_k))

这只是我们原来的函数乘以D_ij

    = D_ij * p_j

对于第二项,当我们单独导出和的每个元素时,唯一的非零项将是 when i = k,这给了我们(不要忘记幂规则,因为和在分母中)

    = -exp(o_j) * Sum_k(d_i(exp(o_k)) / Sum_k(exp(o_k))^2
    = -exp(o_j) * exp(o_i) / Sum_k(exp(o_k))^2
    = -(exp(o_j) / Sum_k(exp(o_k))) * (exp(o_j) / Sum_k(exp(o_k)))
    = -p_j * p_i

将两者放在一起,我们得到了一个非常简单的公式:

    D_ij * p_j - p_j * p_i

如果您真的需要,我们可以将其分为以下i = j几种i != j情况:

    i = j: D_ii * p_i - p_i * p_i = p_i - p_i * p_i = p_i * (1 - p_i)

    i != j: D_ij * p_i - p_i * p_j = -p_i * p_j

这是我们的答案。

于 2016-06-13T13:55:26.367 回答
8

对于它的价值,这是我基于 SirGuy 答案的推导:(如果您发现任何错误,请随时指出错误)。

在此处输入图像描述

于 2017-10-31T14:48:36.737 回答