我正在尝试计算softmax激活函数的导数。我找到了这个链接:https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function,但是似乎没有人给出正确的推导方式来得到当i = j和i≠j时的答案。请问有人可以解释一下吗?我对涉及求和的导数感到困惑,例如softmax激活函数的分母。
我正在尝试计算softmax激活函数的导数。我找到了这个链接:https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function,但是似乎没有人给出正确的推导方式来得到当i = j和i≠j时的答案。请问有人可以解释一下吗?我对涉及求和的导数感到困惑,例如softmax激活函数的分母。
求和的导数等于各项导数之和,即:
d(f1 + f2 + f3 + f4)/dx = df1/dx + df2/dx + df3/dx + df4/dx
为了求解 p_j
对 o_i
的导数,我们从以下式子开始:
∂p_j / ∂o_i = ∂
k=1np_j
k∂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_ij的Kronecker 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 = 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
这是我们的答案。
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 Crouzieri
和 j
指的是雅可比矩阵的元素。你似乎认为趋近于 0 的是导数,但它只是偏导数的一部分。你手动写出了每个导数(对于 4 个输入),而我处理了一般情况。 - SirGuyd_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