我在这里测试示例:https://fluxml.ai/Flux.jl/stable/models/overview/
\nusing Flux\nactual(x) = 4x + 2\nx_train, x_test= hcat(0:5...), hcat(6:10...)\ny_train, y_test = actual.(x_train), actual.(x_test)\n\npredict = Dense(1 => 1)\npredict(x_train)\n\nloss(x,y) = Flux.Losses.mse(predict(x),y)\nloss(x_train,y_train)\n\nusing Flux:train!\nopt = Descent(0.1)\ndata = [(x_train, y_train)]\n\nparameters = Flux.params(predict)\npredict.weight in parameters, predict.bias in parameters\n\ntrain!(loss, parameters, data, opt)\n\nloss(x_train, y_train)\n\nfor epoch in 1:1000\n train!(loss, parameters, data, opt)\nend\n\nloss(x_train, y_train)\n\npredict(x_test)\ny_test\nRun Code Online (Sandbox Code Playgroud)\n正如您所看到的,这只是一个非常简单的模型actual(x) = 4x + 2。如果您运行这些代码,您将获得几乎完美的预测结果。
\n\n\n1\xc3\x975 矩阵{Float32}:\n26.0001 30.0001 34.0001 38.0001 42.0001
\n
\n\n1\xc3\x975 矩阵{Int64}:\n26 30 34 38 42
\n
但是,如果我在向模型提供更多数据方面进行微小的更改,如下所示:
\nx_train, x_test= hcat(0:6...), hcat(6:10...)\nRun Code Online (Sandbox Code Playgroud)\n所以我除了第3行之外没有改变任何东西。我只是将5改为6。\n然后预测结果将变得无穷大。
\n\n\n1\xc3\x975 矩阵{Float32}:\nNaN NaN NaN NaN NaN
\n
\n\n1\xc3\x975 矩阵{Int64}:\n26 30 34 38 42
\n
但为什么?
\n小智 6
我认为这只是高学习率出了问题的一个例子。我可以用 重现相同的NaN行为Descent(0.1)。我尝试将其打印出来,损失首先出现Inf在之前NaN- 这是由于高学习率而出现分歧的典型迹象。所以我尝试了 0.01 的学习率,效果很好 - 它给出了预期的答案。x_train何时可能会出现分歧hcat(0:6...)。较小的学习率允许网络采取较小的步骤,并设法找到预期的最小值。