neural-network - softmax 函数解释的导数

标签 neural-network derivative calculus 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我们开始:
    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 = 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

这是我们的答案。

关于neural-network - softmax 函数解释的导数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37790990/

相关文章:

python - 在pytorch中获取矢量化函数的梯度

python - 将结果添加到列表并设置 for 循环

machine-learning - 如何在 torch 中获取/设置模型的重量(增量)?

c++ - 神经网络的softmax激活函数的实现

python - Keras 带有每次迭代更新的 Activity_regularizer

math - 黎曼和比高阶多项式近似收敛得更快

r - R 中的被积函数语法

tensorflow - 这对于我的神经网络来说是足够的拓扑吗?

ruby - 在 Ruby 中计算导数 ([i] - [i - 1])

matlab - 如何获得关于时间的符号偏导数