首页 > 解决方案 > 为什么前馈神经网络不能泛化?

问题描述

我从 Sin(x) 做了一个简单的 NN 预测 x。它失败了。NN 成功地从 x 预测 sin(x),但不能从 Sin(x) 预测 x。在这两种情况下(sin(x) 和 arcsin(x)),我们都有一个非线性映射,并且 NN 应该在此处输入图像描述能够拟合任何函数。所以,我的问题是为什么NN失败了?这是欠拟合的情况吗?我可以弄清楚在训练过程中的哪一点发生了分歧?

set.seed(1234567890)
Var3 <- runif(500, 0, 20)
mydata3 <- data.frame(Sin=sin(Var3),Var=Var3)
set.seed(1234567890)
winit <- runif(5500, -1, 1)
#hidUnit <- c(9,1)
set.seed(1234567890)
nn3 <-neuralnet(formula = Var~Sin,data = mydata3,
                hidden =c(4,2,1),startweights =winit,
              learningrate = 0.01,act.fct = "tanh")

plot(mydata3, cex=2,main='Predicting x from Sin(x)',
     pch = 21,bg="darkgrey",
     ylab="X",xlab="Sin(X)")
points(mydata3[,1],predict(nn3,mydata3), col="darkred", 
       cex=1,pch=21,bg="red")

legend("bottomleft", legend=c("true","predicted"), pch=c(21,21),
       col = c("darkgrey","red"),cex = 0.65,bty = "n")

标签: rneural-network

解决方案


您正试图从一个 sin(x) 值预测无限多个 x 值。想一想,这不是您要预测的功能。一个函数将每个 x 值映射到一个 y 值。在您的情况下,理论上,对于您输入函数的每个 sin(x),x 可以采用无限多的值。

arcsin(x) 的域仅从 -1 到 1,范围从 -pi/2 到 pi/2 弧度(不是从 0 到 20)。

也许将您的 x 值限制为 -pi/2 到 pi/2 会起作用。


推荐阅读