为了学习深度学习神经网络的更精细细节,我已经用自己的一切(优化器,图层,激活,成本函数)编写了我自己的库。
在对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的数值稳定性。我尝试了不同的学习速率和许多参数初始化器,以获得相同的结果。 Tanh
和sigmoid
正常运作。这是一个已知的问题?它是relu
函数的非连续导数的结果吗?
答案 0 :(得分:1)
是的,ReLU的责任很可能是罪魁祸首。大多数经典的基于感知器的模型,包括ConvNet(经典的MNIST训练器),都取决于正负权重的训练精度。 ReLU忽略了负面特征,从而降低了模型的能力。
ReLU更适合卷积层;它是一个过滤器,表示,"如果内核对这部分输入没有兴趣,我就不在乎无聊的深度;只是忽略它。" MNIST培训依赖于反纠正,允许节点说'#34;不,这不好,运行其他方式!"