softmax函数解释的导数
Derivative of a softmax function explanation
我正在尝试计算 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
的导数,我们从:
开始
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
这是我们的答案。
关于它的价值,这是我基于 SirGuy 回答的推导:(如果您发现任何错误,请随时指出)。
我正在尝试计算 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
的导数,我们从:
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
这是我们的答案。
关于它的价值,这是我基于 SirGuy 回答的推导:(如果您发现任何错误,请随时指出)。