自制深度学习库:relu 激活的数值问题

数据挖掘 机器学习 深度学习 反向传播 激活函数 数值
2022-03-02 22:44:45

为了学习深度学习神经网络的更精细细节,我用自制的所有东西(优化器、层、激活、成本函数)编写了自己的库。

在 MNIST 数据集上进行基准测试并仅使用 sigmoid 激活函数时,它似乎工作正常。

不幸的是,在用relus替换这些时我似乎遇到了问题

这是我在约 500 个示例的训练数据集上 50 个 epoch 的学习曲线:

在此处输入图像描述

前 8 个时期一切都很好,然后我在虚拟分类器的分数上完全崩溃(~0.1 准确度)。我检查了relu的代码,看起来还不错。这是我的向前和向后传球:

def fprop(self, inputs):
    return np.maximum( inputs, 0.)

def bprop(self, inputs, outputs, grads_wrt_outputs):
    derivative = (outputs > 0).astype( float)
    return derivative * grads_wrt_outputs

罪魁祸首似乎在于 relu 的数值稳定性。我为相同的结果尝试了不同的学习率和许多参数初始化器。Tanhsigmoid正常工作。这是一个已知的问题?relu它是函数非连续导数的结果吗?

2个回答

我不知道究竟是什么问题,但也许你可以尝试检查你的梯度值,看看它们在第 8 个时期是否发生了很大变化。

一个原因可能是“爆炸梯度”。尽管您的损失函数似乎输出了相当稳定的值,但可能与研究您的梯度并查看它们如何变化有关。

也许这篇博文可以帮助你:machinelearningmastery