【问题标题】:Why is this simple regression (keras) ANN is failing so bad?为什么这个简单的回归(keras)人工神经网络失败得如此糟糕?
【发布时间】:2019-01-11 23:34:06
【问题描述】:

我正在尝试对一个非常简单的数据进行非线性回归。运行以下代码时,我得到了非常糟糕的结果。几乎每次的结果都是简单的线性回归。当我检查模型的权重时,大多数(如果不是全部)神经元都是“死的”。它们都具有带负偏差的负权重,使得 ReLu 函数为所有输入返回 0(因为所有输入都在 [0,1] 范围内)。

据我所知,这是优化器的问题。我还尝试使用非常低和非常高的学习率,但没有运气。优化器似乎陷入了“非常”的次优局部最小值。

我还尝试将初始权重设置为全部为正 [0,0.1],优化器通过将所有偏差设置为大致相同的值来“欺骗”进入线性回归。

有什么可以帮助我的吗?我做错了什么?这真的是最先进的 ANN 在简单回归问题上所能达到的最好水平吗?

library(keras)
fun <- function(x) 0.2+0.4*x^2+0.3*x*sin(15*x)+0.05*cos(50*x).

x_test <- seq(0,1,0.01)
y_test <- fun(x_test)
plot(x_test, y_test, type = 'l')

x_train <- runif(50)
y_train <- fun(x_train)
points(x_train, y_train)

model <- keras_model_sequential() %>%
  layer_dense(10, 'relu', input_shape = 1) %>%
  layer_dense(1)

model %>% compile(
  optimizer = 'sgd',
  loss = "mse"
)

history <- model %>% 
  fit(x = x_train, y = y_train,
      epochs = 100,
      batch_size = 10,
      validation_data = list(x_test, y_test)
  )

y_pred <- model %>% predict(x_test)

plot(x_test, y_test, type = 'l')
points(x_train, y_train)
lines(x_test, y_pred, col = 'red')

predicted outputs versus actual ones.

【问题讨论】:

  • 看起来您在隐藏层中使用了 sigmoid 函数。首先回归不应该有sigmoid函数,其次sigmoid主要用于最后一层用于分类目的。删除它并使用 relu 应该会有所帮助。
  • 是的,这是一个错字,我现在修复了代码。我尝试了所有的激活函数,但没有成功。
  • 学习率可能是个问题。我想高学习率会导致你的权重变化太多,一旦它们变成负数,relu 就会剪掉激活。这个过程可能会重复。
  • 将学习率更改为 0.0001 并将时期更改为 10000 根本没有帮助
  • 我自己试过这个。使用以下配置 dense(24)->relu ->dense(32)-> relu 与 Adam 优化器和 0.001 lr。这很容易在 50 个 epoch 中过拟合。不要做数千个。并使用 5-10 的批量大小

标签: r optimization keras regression non-linear-regression


【解决方案1】:

使用 relu 激活更改 sigmoid 并修复 sgd 末尾的 ) 类型错误。

编辑

还添加第二个密集层并训练更多时期,如下所示:

model <- keras_model_sequential() %>%
  layer_dense(10, 'relu', input_shape = 1) %>%
  layer_dense(10, 'relu') %>%
  layer_dense(1)

model %>% compile(
  optimizer = 'sgd',
loss = "mse"
)

history <- model %>% 
  fit(x = x_train, y = y_train,
      epochs = 2000,
      batch_size = 10,
      validation_data = list(x_test, y_test)
  )

【讨论】:

  • 修正了两个错别字,我尝试了隐藏层上的所有激活函数,但没有成功
  • 添加更多神经元
  • 添加更多的神经元肯定不是这样,一个训练有素的10个神经元应该能够比这更好地拟合模型。问题不在于模型容量,肯定是优化问题。
  • 你说得对,我刚刚编辑了我的答案,这应该可以。
猜你喜欢
  • 2018-06-27
  • 2019-01-02
  • 1970-01-01
  • 2019-07-13
  • 2018-03-23
  • 1970-01-01
  • 2016-11-28
  • 2018-12-28
  • 1970-01-01
相关资源
最近更新 更多