神经网络中的 Softmax 层

机器算法验证 神经网络
2022-02-08 13:04:26

我正在尝试向使用反向传播训练的神经网络添加一个 softmax 层,因此我正在尝试计算它的梯度。

softmax 输出为其中是输出神经元数。hj=ezjezij

如果我推导出它,那么我得到

hjzj=hj(1hj)

类似于逻辑回归。然而这是错误的,因为我的数值梯度检查失败。

我究竟做错了什么?我有一个想法,我也需要计算交叉导数(即)但我不知道如何做到这一点并保持梯度的维度相同,因此它将适合反向传播过程。hjzk

3个回答

我对为此提供自己的答案感到有点不好,因为它被变形虫和 juampa 很好地捕捉到了,除了关于如何将雅可比矩阵 还原为向量的最终直觉。

您正确导出了雅可比矩阵的对角线的梯度,也就是说

hizj=hi(1hj):i=j

正如变形虫所说,你还必须推导出雅可比行列式的非对角线条目,这会产生

hizj=hihj:ij

这两个概念定义可以方便地使用称为Kronecker Delta的构造组合在一起,因此梯度的定义变为

hizj=hi(δijhj)

所以雅可比是一个方阵[J]ij=hi(δijhj)

amoeba 和 juampa 已经涵盖了到目前为止的所有信息。问题当然是,我们需要从已经计算的输出错误中获取输入错误。由于输出误差的梯度取决于所有输入,因此输入的梯度为hixi

[x]k=i=1hi,k

给定上面定义的雅可比矩阵,这可以简单地实现为矩阵和输出误差向量的乘积:

σl=Jσl+1

如果 softmax 层是您的输出层,那么将其与交叉熵成本模型相结合可以将计算简化为

σl=ht

其中是标签的向量,并且th是 softmax 函数的输出。简化形式不仅方便,而且从数值稳定性的角度来看也非常有用。

导数是错误的。它应该是,

hjzk=hjδkjhjhk

再次检查您的计算。此外,变形虫给出的交叉熵表达式并不完全正确。对于一组从中抽取的数据样本C不同的类,它读取,

nk=1Ctknlnyk(xn)

其中超索引在样本集上运行,是第 n 个样本的目标的第 k 个分量的值。这里假设您使用的是 1-of-C 编码方案,即在这种情况下,所有 t 都为零,除了表示其对应类的组件,即 1。tkntkn

请注意,t 是恒定的。因此,最小化这个函数相当于最小化,

nk=1Ctknlnyk(xn)+nk=1Ctknlntkn=nk=1Ctknlnyk(xn)tkn

它的优点是雅可比采用一种非常方便的形式,即

Ezj=hjtj

我建议您获取 Bishop 的用于模式识别的神经网络的副本。恕我直言,仍然是关于神经网络的最佳书籍。

softmax的每个输出都依赖于所有的输入,所以梯度确实是一个完整的雅可比矩阵。您正确计算 ,但如果,您还需要我想如果你能推导出第一个表达式,你也应该很容易推导出第二个。jhj=hjzj=hj(1hj)khj=hjhkjk

我不确定反向传播会遇到什么问题:在 softmax 层中,您有个输出和个输入,因此每个输出的错误应该传播到每个输入,这正是您需要整个雅可比行列式的原因。另一方面,通常你会有一个与 softmax 输出相关的成本函数,例如其中是你想要的输出(当你进行分类时,通常其中一个等于 1 , 其他为 0)。那么事实上你对,它可以用链式法则计算得到一个简洁的表达式,并且确实是一个向量(不是矩阵)。jj

C=jtjloghj,
tjCzj