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

时间:2018-03-19 21:22:56

标签: python numpy machine-learning numerical-stability

为了学习深度学习神经网络的更精细细节,我已经用自己的一切(优化器,图层,激活,成本函数)编写了我自己的库。

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

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

这就是我在500个训练数据集中50个时期的学习曲线:〜

enter image description here

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

1 个答案:

答案 0 :(得分:1)

是的,ReLU的责任很可能是罪魁祸首。大多数经典的基于感知器的模型,包括ConvNet(经典的MNIST训练器),都取决于正负权重的训练精度。 ReLU忽略了负面特征,从而降低了模型的能力。

ReLU更适合卷积层;它是一个过滤器,表示,"如果内核对这部分输入没有兴趣,我就不在乎无聊的深度;只是忽略它。" MNIST培训依赖于反纠正,允许节点说'#34;不,这不好,运行其他方式!"