为了学习深度学习神经网络的更精细细节,我用自制的所有东西(优化器、层、激活、成本函数)编写了自己的库。
在 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 的数值稳定性。我为相同的结果尝试了不同的学习率和许多参数初始化器。Tanh
并sigmoid
正常工作。这是一个已知的问题?relu
它是函数非连续导数的结果吗?