我已经实现了一个神经网络,其具有3层输入到隐藏层,具有30个神经元(Relu激活)到Softmax输出层。我正在使用交叉熵成本函数。没有使用外部库。这正在研究NMIST数据集,因此有784个输入神经元和10个输出神经元。 作为我的隐藏层激活,我使用双曲正切获得了大约96%的准确度。 当我尝试切换到relu激活时,我的激活变得非常快,这导致我的体重增长无限,直到它爆炸!
这是使用relu激活时常见的问题吗?
我尝试过L2正规化,但收效甚微。与tanh激活相比,我最终必须将学习率设置为低十倍,并且我已经尝试相应地调整重量衰减率,并且我获得的最佳准确度仍然是大约90%。最终通过更新网络中导致爆炸的某些重量,重量衰减率仍然超过了。 似乎每个人都只是用relu替换他们的激活函数,他们会遇到更好的结果,所以我一直在寻找错误并验证我的实现。 使用relu作为激活函数还有更多吗?也许我的实施有问题,有人可以用相同的神经网络结构来验证准确性吗?
答案 0 :(得分:0)
正如您所看到的,Relu函数在正值上是无界的,从而创建了增长的权重
实际上,这就是为什么在这些情况下使用双曲正切和相似函数,将输出值限制在某个范围之间(在大多数情况下为-1到1或0到1)
还有另一种处理这种现象的方法,称为权重衰减 最基本的动机是获得一个更通用的模型(避免过度拟合)并确保权重不会爆炸你在更新它们时根据重量本身使用一个调节值 意味着更大的权重得到更大的惩罚
你可以进一步阅读它here