我正在尝试计算softmax的激活函数的导数。我发现了这个:https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function似乎没有人给出我们如何得到i = j和i!= j的答案的正确推导。有人可以解释一下!当涉及求和时,我与衍生物混淆,如softmax激活函数的分母。
答案 0 :(得分:13)
和的导数是导数的总和,即:
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)))
查看第一个术语,如果0
,导数将为i != j
,这可以用delta function来表示,我将其称为D_ij。这给出了(第一学期):
= 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
我们的答案是什么。
答案 1 :(得分:6)