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

Homemade deep learning library: numerical issue with relu activation

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

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

不幸的是,当我用 relus 替换它们时,我似乎遇到了问题。

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

前 ~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函数的非连续导数的结果吗?

是的,ReLU 很可能是罪魁祸首。大多数经典的 perceptron-based 模型,包括 ConvNet(经典的 MNIST 训练器),都依赖于正权重和负权重来保证训练的准确性。 ReLU 忽略了负面特征,从而削弱了模型的能力。

ReLU 是 better-suited 用于卷积层;这是一个过滤器,表示 "If the kernel isn't excited about this part of the input, I don't care how deep the boredom goes; just ignore it." MNIST 训练取决于 counter-correction,允许节点说 "No, this isn't good, run the other way!"