了解随机起始权重对神经网络性能的影响

时间:2016-07-26 14:54:34

标签: r machine-learning neural-network deep-learning

使用R和包neuralnet,我尝试建模如下所示的数据:

training data

这些是几天内以10分钟为间隔的温度读数(以上是2天切除)。使用下面的代码,我将神经网络拟合到数据中。可能有更简单的方法来模拟这些确切的数据,但将来数据可能看起来很不一样。使用具有2个神经元的单个隐藏层给出了令人满意的结果:

good neural network performance

这大部分时间都可以使用更多层和神经元。然而,有一个隐藏层有一个神经元而偶尔有有两层(在我的情况下分别是3和2个神经元),我的结果相当差,总是形状相同:

poor neural network performance

唯一随机的是初始化权重,因此我认为它与此相关。但是,我必须承认,我还没有完全掌握神经网络的理论。我想知道的是,糟糕的结果是否是由于局部最小值('神经网络'使用弹性反向传播和默认的重量回溯)而我只是运气不好,或者如果我可以避免这种情况。我的印象是存在用于拟合的最佳数量的隐藏节点。 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)

2 个答案:

答案 0 :(得分:7)

基本上 - 初始化非常重要。如果您没有随机初始化它,那么您可能会使您的网络根本不起作用(例如,通过将所有权重设置为0)。事实证明,对于sigmoidrelu,某种类型的激活可能有助于培训您的网络。

但在你的情况下 - 我认为差异主要是由你的问题的复杂性造成的。如果模型具有复杂性,似乎适合您的问题的复杂性,那么表现很好。其他型号可能会受到以下原因的影响:

  1. 太小的复杂性 - 对于一个节点,您可能基本上无法学习正确的功能。
  2. 太大的复杂性 - 使用双层网络,您可能会遇到局部最小化问题。增加网络参数的数量也会增加参数空间的大小。当然 - 一方面你可能得到更好的模型 - 另一方面 - 你可能落在参数空间的这个区域,这将导致解决方案不佳。也许尝试使用不同初始化的相同模型 - 并选择最佳模型可能会克服此问题。
  3. <强>更新

    1. 网络规模较小 - 通常会陷入局部最小值。根据您培训网络所需的时间,您可以使用以下技术来克服这一点:

      • 辍学/批量规范化/批量学习随机化:当您能够在一段时间内训练网络时 - 您可能会使用辍学或批量规范化的随机化属性。由于这种随机波动,您可以从较差的局部最小值(通常被认为相对较浅)移动。
      • 交叉验证/多次运行:当您多次开始训练时 - 您在最低限度内完成训练的概率会显着降低。
    2. 关于图层大小和多项式程度之间的联系 - 我认为问题没有明确说明。您必须指定更多详细信息,例如激活功能。我还认为可以通过经典神经网络建模的多项式和函数的性质差别很大。在多项式中 - 参数值的微小变化通常比神经网络情况下的差异更大。通常神经网络的导数是有界函数,而当度数大于2时多项式导数是无界的。由于这个事实我认为 - 寻找多项式度与隐藏层大小之间的依赖关系可能是不值得认真考虑。

答案 1 :(得分:4)

enter image description here 如果我们将所有权重初始化为相同的值(例如零或一)。在这种情况下,每个隐藏单元将获得完全相同的信号。例如。如果所有权重都初始化为1,则每个单元获得的信号等于输入之和(并输出sigmoid(sum(输入)))。如果所有权重都为零,则更糟糕的是,每个隐藏单元将获得零信号。无论输入是什么 - 如果所有权重都相同,隐藏层中的所有单位也将是相同的。这就是人们应该随机初始化权重的原因。