使用R和包neuralnet
,我尝试建模如下所示的数据:
这些是几天内以10分钟为间隔的温度读数(以上是2天切除)。使用下面的代码,我将神经网络拟合到数据中。可能有更简单的方法来模拟这些确切的数据,但将来数据可能看起来很不一样。使用具有2个神经元的单个隐藏层给出了令人满意的结果:
这大部分时间都可以使用更多层和神经元。然而,有一个隐藏层有一个神经元而偶尔有有两层(在我的情况下分别是3和2个神经元),我的结果相当差,总是形状相同:
唯一随机的是初始化权重,因此我认为它与此相关。但是,我必须承认,我还没有完全掌握神经网络的理论。我想知道的是,糟糕的结果是否是由于局部最小值('神经网络'使用弹性反向传播和默认的重量回溯)而我只是运气不好,或者如果我可以避免这种情况。我的印象是存在用于拟合的最佳数量的隐藏节点。 2阶段,5阶段,10阶段的多项式。如果不是,那么我最好的行动方式是什么?学习率更高?错误阈值较小?提前谢谢。
我没有尝试调整rprop参数,所以解决方案可能就在那里。
代码:
# DATA ----------------------
minute <- seq(0, 6*24 - 1)
temp <- rep.int(17, 6*24)
temp[(6*7):(6*20)] <- 20
n <- 10
dta <- data.frame(Zeit = minute, Status = temp)
dta <- dta[rep(seq_len(nrow(dta)), n), ]
# Scale everything
maxs <- apply(dta, 2, max)
mins <- apply(dta, 2, min)
nnInput <- data.frame(Zeit = dta$Zeit, Status = dta$Status)
nnInput <- as.data.frame(scale(nnInput, center = mins, scale = maxs - mins))
trainingData <- nnInput[seq(1, nrow(nnInput), 2), ]
testData <- nnInput[seq(2, nrow(nnInput), 2), ]
# MODEL ---------------------
model <- as.formula("Status ~ Zeit")
net <- neuralnet::neuralnet(model,
trainingData,
hidden = 2,
threshold = 0.01,
linear.output = TRUE,
lifesign = "full",
stepmax = 100000,
rep = 1)
net.results <- neuralnet::compute(net, testData$Zeit)
results <- net.results$net.result * (maxs["Status"] - mins["Status"]) + mins["Status"]
testData <- as.data.frame(t(t(testData) * (maxs - mins) + mins))
cleanOutput <- data.frame(Actual = testData$Status,
Prediction = results,
diff = abs(results - testData$Status))
summary(cleanOutput)
plot(cleanOutput$Actual[1:144], main = "Zeittabelle", xlab = paste("Min. seit 0:00 *", n), ylab = "Temperatur")
lines(cleanOutput$Prediction[1:144], col = "red", lwd = 3)
答案 0 :(得分:7)
基本上 - 初始化非常重要。如果您没有随机初始化它,那么您可能会使您的网络根本不起作用(例如,通过将所有权重设置为0
)。事实证明,对于sigmoid和relu,某种类型的激活可能有助于培训您的网络。
但在你的情况下 - 我认为差异主要是由你的问题的复杂性造成的。如果模型具有复杂性,似乎适合您的问题的复杂性,那么表现很好。其他型号可能会受到以下原因的影响:
<强>更新强>
网络规模较小 - 通常会陷入局部最小值。根据您培训网络所需的时间,您可以使用以下技术来克服这一点:
关于图层大小和多项式程度之间的联系 - 我认为问题没有明确说明。您必须指定更多详细信息,例如激活功能。我还认为可以通过经典神经网络建模的多项式和函数的性质差别很大。在多项式中 - 参数值的微小变化通常比神经网络情况下的差异更大。通常神经网络的导数是有界函数,而当度数大于2时多项式导数是无界的。由于这个事实我认为 - 寻找多项式度与隐藏层大小之间的依赖关系可能是不值得认真考虑。
答案 1 :(得分:4)
您需要的只是一个好的初始化(2016):本文提出了一种简单的深度学习权重初始化方法(http://arxiv.org/abs/1511.06422)
通过andrew ng观看这6分钟视频(机器学习,课程 - &gt;第5周 - >随机初始化)解释了在反向传播(https://www.coursera.org/learn/machine-learning/lecture/ND5G5/random-initialization)中将所有初始权重设置为零的危险
如果我们将所有权重初始化为相同的值(例如零或一)。在这种情况下,每个隐藏单元将获得完全相同的信号。例如。如果所有权重都初始化为1,则每个单元获得的信号等于输入之和(并输出sigmoid(sum(输入)))。如果所有权重都为零,则更糟糕的是,每个隐藏单元将获得零信号。无论输入是什么 - 如果所有权重都相同,隐藏层中的所有单位也将是相同的。这就是人们应该随机初始化权重的原因。