softmax函数的导数解释

11

1
我投票关闭此问题,因为它与编程无关。 - desertnaut
是的,神经网络中有一个叫做softmax函数的东西,虽然可以使用库,但了解底层数学是一种优势。@desertnaut - mLstudent33
@mLstudent33,我们有不少于3个专门的SE网站用于回答这些非编程的机器学习问题,这些问题在这里是不相关的。请参阅https://stackoverflow.com/tags/machine-learning/info中的介绍和注意事项。 - desertnaut
2
我投票关闭此问题,因为它与[帮助中]定义的编程无关,而是涉及ML理论和/或方法 - 请参见https://stackoverflow.com/tags/neural-network/info中的说明。 - desertnaut
@mLstudent33,非常感谢你关于softmax和库的迷你讲座,但我认为我已经掌握了。https://dev59.com/vlsW5IYBdhLWcg3wbm4O#38250088 - desertnaut
2个回答

17

求和的导数等于各项导数之和,即:

    d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx
为了求解 p_jo_i 的导数,我们从以下式子开始:

∂p_j / ∂o_i = ∂k=1np_jk∂o_k / ∂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)))

观察第一项,如果i != j则导数为0,可以用一个称为D_ijKronecker delta 函数来表示。这给出了(对于第一项):

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

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

    = D_ij * p_j

对于第二项,当我们单独求和式中的每个元素时,唯一非零的项是当 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 = 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

这是我们的答案。


@SirGuy,你的第三个表达式不应该是 d_i(exp(o_j)) / Sum_k(exp(o_k)) + exp(o_j) * d_i(1/Sum_k(exp(o_k))) 吗?最后一个 o_k 前面缺少了 exp - Benjamin Crouzier
@BenjaminCrouzier 谢谢,已修复 - SirGuy
1
@harveyslash 首先,在你的问题中,你错误地表示将雅可比矩阵的元素相加以得到“最终”的导数。这是不正确的,请考虑将雅可比矩阵视为导数而不是导致导数的中间步骤。 - SirGuy
1
@harveyslash 在我的解决方案中,ij 指的是雅可比矩阵的元素。你似乎认为趋近于 0 的是导数,但它只是偏导数的一部分。你手动写出了每个导数(对于 4 个输入),而我处理了一般情况。 - SirGuy
1
@harveyslash 0的部分是子表达式d_i(exp(o_j)),它是子表达式d_i(exp(o_j)) / Sum_k(exp(o_k))的一部分。仔细看括号,你会发现这是exp(o_j)相对于o_i的导数除以Sum over k of exp(o_k)Sum_k(exp(o_k))相对于o_i的导数在乘积法则展开的第二部分中已经处理了。这有助于澄清问题吗? - SirGuy
显示剩余6条评论

8
就算价值不大,这是基于SirGuy答案的推导过程:(如有错误请指出)。 enter image description here

非常感谢您!我只有一个疑问:为什么在第4步到第5步时,Σ_k ((de^{o_k})/do_i)的值会计算为e^{o_i}?如果您能提供任何关于这个问题的见解,我将不胜感激。 - duhaime
2
@duhaime 很好的问题。逐一考虑该总和的所有术语,并查看每个术语会发生什么。您会发现有两种情况:当i = k时,该项为d/do_i e^o_i,即为e^o_i。当i != k时,您会得到一堆零。 - Benjamin Crouzier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接