-1

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

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

4

1 回答 1

1

是的,ReLU 很可能是罪魁祸首。大多数经典的基于感知器的模型,包括 ConvNet(经典的 MNIST 训练器),都依赖于正负权重来实现训练准确性。ReLU 忽略了负面特征,从而降低了模型的能力。

ReLU 更适合卷积层;它是一个过滤器,上面写着:“如果内核对这部分输入不感兴趣,我不在乎无聊程度有多深;忽略它。” MNIST 训练依赖于反向校正,允许节点说“不,这不好,换个方式运行

于 2018-03-19T21:30:37.363 回答