我实现了Softmax函数,后来发现必须稳定才能使其数值稳定(duh)。现在,它再次不稳定,因为即使从我的向量中减去max(x),给定的向量值仍然太大而不能成为e的幂。这是我用来确定错误的代码的图片,矢量是向前传播的示例输出矢量:
我们可以清楚地看到值太大了,我得到的是这些很小的数字,而不是概率,这会导致很小的误差,从而导致梯度消失,最终使网络无法学习。
您完全正确,只是翻译softmax的数学定义可能会使它不稳定,这就是为什么您必须在进行任何计算之前减去x的最大值(顺便说一下,max(x)
只是示例中的0
)。
您的实现是正确的,并且消失/爆炸梯度是一个独立的问题,您可能会遇到该问题,这取决于您打算使用哪种神经网络。