seb*_*nmm 5 r machine-learning neural-network deep-learning
使用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)
Run Code Online (Sandbox Code Playgroud)
基本上 - 初始化非常重要.如果您没有随机初始化它,那么您可能会使您的网络根本无法工作(例如,通过设置所有权重0).事实证明,对于sigmoid和relu,某种激活可能有助于训练您的网络.
但在你的情况下 - 我认为差异主要是由你的问题的复杂性造成的.如果模型具有复杂性,似乎适合您的问题的复杂性,那么表现很好.其他型号可能会受到以下原因影响:
更新:
网络规模较小 - 通常会陷入局部最小值.根据您培训网络所需的时间,您可以使用以下技术来克服这一点:
关于层大小和多项式度之间的联系 - 我认为问题没有明确说明.您必须指定更多详细信息,例如激活功能.我还认为可以通过经典神经网络建模的多项式和函数的性质差别很大.在多项式中 - 参数值的微小变化通常比神经网络情况下的差异更大.通常神经网络的导数是有界函数,而当度数大于2时多项式导数是无界的.由于这个事实我认为 - 寻找多项式度与隐藏层大小之间的依赖关系可能是不值得认真考虑.
您只需要一个好的 init (2016):本文提出了一种用于深度网络学习的权重初始化的简单方法 ( http://arxiv.org/abs/1511.06422 )
观看 Andrew ng 的 6 分钟视频(机器学习,Coursera -> 第 5 周 -> 随机初始化)解释了在反向传播中将所有初始权重设置为零的危险(https://www.coursera.org/learn/machine-learning/讲座/ND5G5/随机初始化)
如果我们将所有权重初始化为相同的值(例如零或一)。在这种情况下,每个隐藏单元将获得完全相同的信号。例如,如果所有权重都初始化为 1,则每个单元获得等于输入总和的信号(并输出 sigmoid(sum(inputs)))。如果所有的权重都为零,更糟的是,每个隐藏单元都会得到零信号。无论输入是什么——如果所有的权重都相同,隐藏层中的所有单元也将相同。这就是为什么应该随机初始化权重。
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |