softmax函数解释的导数

Ros*_*ini 9 calculus derivative neural-network softmax

我试图计算softmax的激活函数的导数.我发现了这个:https: //math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function似乎没有给出正确的推导,我们将如何得到i = j和i的答案!= j .有人可以解释一下!当涉及求和时,我与衍生物混淆,如softmax激活函数的分母.

Sir*_*Guy 15

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

    d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx
Run Code Online (Sandbox Code Playgroud)

为了得出p_j关于o_i我们的衍生物,我们从:

    d_i(p_j) = d_i(exp(o_j) / Sum_k(exp(o_k)))
Run Code Online (Sandbox Code Playgroud)

我决定使用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)))
Run Code Online (Sandbox Code Playgroud)

看第一个术语,导数将是0if i != j,这可以用delta函数表示,我将其称为D_ij.这给出了(第一学期):

    = D_ij * exp(o_j) / Sum_k(exp(o_k))
Run Code Online (Sandbox Code Playgroud)

这只是我们原来的功能乘以 D_ij

    = D_ij * p_j
Run Code Online (Sandbox Code Playgroud)

对于第二项,当我们单独得出和的每个元素时,唯一的非零项将是何时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
Run Code Online (Sandbox Code Playgroud)

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

    D_ij * p_j - p_j * p_i
Run Code Online (Sandbox Code Playgroud)

如果你真的想要我们可以分成它i = ji != 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
Run Code Online (Sandbox Code Playgroud)

这是我们的答案.


Ben*_*ier 7

对于它的价值,这里是基于SirGuy回答的推导:(如果你发现任何错误,请随意指出错误).

在此输入图像描述

  • @duhaime好问题。逐一考虑该总和的所有条款,看看每个条款会发生什么。您会看到有两种情况:当i = k时,项为d / do_i e ^ o_i,即e ^ o_i。当i!= k时,得到一堆零。 (2认同)