为了梯度下降的目的,如何找到 softmax 函数的导数?

机器算法验证 神经网络 反向传播 衍生物 软最大
2022-03-06 00:24:45

我试图了解使用梯度下降的多类分类的反向传播算法。我正在使用https://www.cs.toronto.edu/~graves/phd.pdf输出层是一个softmax层,该层中的每个单元都有激活函数:

在此处输入图像描述

这里,a k是单元“k”的输入之和。

对上面的方程进行微分,作者就得到了这个结果。 在此处输入图像描述

我对 delta kk' 感到困惑,我从未见过类似的东西。

另一个问题是我们在求导时是否考虑求和,为什么或为什么不考虑?

https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function有点相关,但是微分的结果不一样。

4个回答

正如 whuber 指出的那样,$\delta_{ij}$ 是克罗内克三角洲https://en.wikipedia.org/wiki/Kronecker_delta

$$ \begin{align} \delta_{ij} = \begin{cases} 0\: \text{when } i \ne j \\ 1 \: \text{when } i = j \end{cases} \end {对齐} $$

...请记住,softmax 有多个输入,一个输入向量;并且还给出了一个向量输出,其中输入和输出向量的长度是相同的。

如果任何输入向量值发生变化,则输出向量中的每个值都会发生变化。所以输出向量值都是所有输入向量值的函数:

$$ y_{k'} = f_{k'}(a_1, a_2, a_3,\dots, a_K) $$

其中 $k'$ 是输出向量的索引,向量的长度为 $K$,$f_{k'}$ 是某个函数。因此,输入向量的长度为 $K$,输出向量的长度为 $K$,$k$ 和 $k'$ 都取值 $\in \{1,2,3,...,K\}美元。

当我们对 $y_{k'}$ 进行微分时,我们对每个输入向量值进行部分微分。所以我们会有:

  • $\frac{\partial y_{k'}}{\partial a_1}$
  • $\frac{\partial y_{k'}}{\partial a_2}$
  • ETC ...

我们不会为每个 $a_1$、$a_2$ 等单独计算,而是使用 $k$ 来表示 1、2、3 等,即我们将计算:

$$ \frac{\partial y_{k'}}{\partial a_k} $$

...在哪里:

  • $k \in \{1,2,3,\dots,K\}$ 和
  • $k' \in \{1,2,3\dots K\}$

当我们进行这种区分时,例如参见https://eli.thegreenplace.net/2016/the-softmax-function-and-its-derivative/,导数将是:

$$ \frac{\partial y_{k'}}{\partial a_k} = \begin{cases} y_k(1 - y_{k'}) &\text{当 }k = k'\\ - y_k y_{ k'} &\text{当 }k \ne k' \end{cases} $$

然后我们可以使用 Kronecker delta 来编写它,这只是为了符号方便,以避免每次都写出“cases”语句。

作者的公式违反了爱因斯坦约定,因为重复的索引意味着求和。

写结果的更好方法是 $$ \frac{\partial y}{\partial a} = {\rm Diag}(y) - yy^T $$ 其中 Diag 函数通过将向量 $ 创建一个对角矩阵y$ 沿主对角线,其他地方为零。


如果您希望使用求和约定,则需要定义一个三阶张量 $T_{ijk}$,其元素在 $i=j=k,\,$ 时等于 1,否则为零。

有了这个张量,你可以写出 $$ \frac{\partial y_i}{\partial a_j} = T_{ijk}\,y_k - y_i\,y_j $$ 其中重复索引 $k$ 相加。

这是 softmax 函数 $y_{k'}$ 关于其激活 $a_k$ 的偏导数。这个网站上的某个人已经写了一个很好的答案,解释了这个导数的完整评估,只是符号略有不同:

Softmax 关于权重的导数

我对 delta kk' 感到困惑,我从未见过类似的东西。

正如其他人所提到的,当索引匹配(即 $k=k'$)并且在其他地方为 $0$ 时,Kronecker delta 函数 $\delta_{kk'}=1$。在像神经网络这样的多重连接路径上执行导数时,这是一种仅“选择”多变量输入的一部分的便捷方法。

把它想象成一个特定链接的 if-else 语句。此外,这不是您可以用数学方式表示这一点的唯一方法 - 有些文本使用像 $I[k=k']$ 这样的指标函数来表示相同的逻辑。

在我们的例子中,特定激活 $y_{k'}$(由 $k'$ 索引)的偏导数不仅针对任何激活,而且针对由 $k$ 索引的特定激活 $a_k$。这就是为什么偏导数中的许多项在 $k \ne k'$ 时使用 Kronecker delta 设置为 $0$。

另一个问题是我们在求导时是否考虑求和,为什么或为什么不考虑?

如果我正确理解您的问题 - 我们确实考虑了分母中的总和 $\sum_{k'=1}^K e^{a_k{k'}}$。我上面链接的推导显示了这是如何完成的。

https://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function 有点相关,但是微分的结果不一样。

它确实是相关的,但侧重于不同的偏导数。如果您有一个损失函数 $L$,它是您的 softmax 输出 $y_{k'}$ 的函数,那么您可以更进一步并使用链式规则对其进行评估

$$\frac{\partial L}{\partial a_k} = \frac{\partial L}{\partial y_{k'}} \frac{\partial y_{k'}}{\partial a_k}$$

上面的最后一个术语 $\frac{\partial y_{k'}}{\partial a_k}$ 是您在问题中关注的内容,而您链接到的问题是试图评估 $\frac{ \partial L}{\partial a_k}$。所以它们是相关的,但专注于不同的术语。

首先要记住的是,当你区分一个 ( $n,1$ ) 向量$y$和一个 ( $n,1$ ) 向量$a$时,你会得到一个 ( $n,n$ ) 矩阵,谁是第一列是差异 wrt $a_1$,第二列是$a_2$ ... 等等。一直到$a_n$

\begin{pmatrix} \frac{\partial y_1}{\partial a_1} & \frac{\partial y_1}{\partial a_2} & \frac{\partial y_1}{\partial a_3} & \cdots & \frac{ \partial y_1}{\partial a_n} \\ \frac{\partial y_2}{\partial a_1} & \frac{\partial y_2}{\partial a_2} &\frac{\partial y_2}{\partial a_3} & \cdots & \frac{\partial y_2}{\partial a_n} \\ \vdots & \vdots& \vdots & \ddots & \vdots \\ \frac{\partial y_n}{\partial a_1} & \frac{\partial y_n}{\partial a_2} & \frac{\partial y_n}{\partial a_3} & \cdots & \frac{\partial y_n}{\partial a_n} \end{pmatrix}

现在,由于$y_i = \frac{e^{a_i}}{\sum_je^{a_j}}$,让我们看看它的导数的一般形式: $$\frac{\partial y_i}{\partial a_i} = \ frac{e^{a_i} \sum_je^{a_j} - e^{a_i}e^{a_i}}{(\sum_je^{a_j})^2} = \frac{e^{a_i}}{\sum_je ^{a_j}} \frac{\sum_je^{a_j} - e^{a_i}}{\sum_je^{a_j}} = y_i(1-y_i) = y_i - y_i y_i\\ \frac{\partial y_i} {\partial a_k} = \frac{- e^{a_i}e^{a_k}}{(\sum_je^{a_j})^2} = -\frac{e^{a_i}}{\sum_je^{a_j }}\frac{e^{a_k}}{\sum_je^{a_j}} = -y_i y_k $$

因此,您可以将矩阵分成 2 个矩阵: $$ \left ( \begin{matrix} y_1 & 0 & 0 & \cdots & 0 \\ 0 & y_2 & 0 & \cdots & 0 \\ \vdots & \vdots& \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & y_n \end{matrix} \right) - \left ( \begin{matrix} y_1 y_1 & y_1 y_2 & y_1 y_3 & \cdots & y_1 y_n \\ y_2 y_1 & y_2 y_2 & y_2 y_3 & \cdots & y_2 y_n \\ \vdots & \vdots& \vdots & \ddots & \vdots \\ y_n y_1 & y_n y_2 & y_n y_3 & \cdots & y_n y_n \end {矩阵} \right) $$

您可以看到第一个矩阵对应于方程$y_k \delta_{k k'}$中的第一项,而结束矩阵对应于第二项$y_k y_{k'}$

您可以查看此博客文章以获取更多信息,包括图表和代码。