【发布时间】: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')
【问题讨论】:
-
看起来您在隐藏层中使用了 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