使用 ReLu 的机器学习返回 NaN

Rap*_*ael 0 machine-learning neural-network

我想弄清楚整个机器学习的事情,所以我做了一些测试。我想让它学习正弦函数(带有弧度角)。神经网络是:

1 个输入(弧度角)/2 个隐藏层/1 个输出(正弦预测)

对于挤压激活,我使用的是:RELU,值得注意的是,当我使用 Logistic 函数而不是 RELU 时,脚本正在运行。

为此,我创建了一个从 0 开始到 180 结束的循环,它将以弧度转换数字(弧度 = Loop_index*Math.PI/180),然后它基本上会执行该弧度的正弦运算角度并存储弧度和正弦结果。

所以我的表看起来像这样的条目:{输入:[RADIAN ANGLE],输出:[sin(radian)]}

for(var i = 0; i <= 180; i++) {
    radian = (i*(Math.PI / 180));
    train_table.push({input:[radian],output:[Math.sin(radian)]})
}
Run Code Online (Sandbox Code Playgroud)

我使用此表使用交叉熵和 0.3 的学习率以及 20000 次迭代来训练我的神经网络。

问题是它失败了,当我尝试预测任何内容时它返回“NaN”

我正在使用 Synaptic 框架(https://github.com/cazala/synaptic),这是我的代码的 JSfiddle: https: //jsfiddle.net/my7xe9ks/2/

Mat*_*gro 5

学习率必须仔细调整,这个参数很重要,特别是当梯度爆炸并且你得到一个 nan 时。发生这种情况时,您必须降低学习率,通常降低 10 倍。

在您的具体情况下,学习率太高,如果您使用 0.05 或 0.01,网络现在可以正常训练和工作。

另一个重要的细节是,您使用交叉熵作为损失,该损失用于分类,并且您有一个回归问题。您应该更喜欢均方误差损失。