2016-12-19 6 views
3

Я не смог получить разумную производительность, используя mxnetLinearRegressionOutput слой.Плохая производительность mxnet LinearRegressionOutput

Автономный ниже пример попытки выполнить регрессию простой полиномиальной функции (y = x1 + x2^2 + x3^3) с небольшим количеством случайного шума придачу.

mxnet регрессионный пример, приведенный here используется, наряду с немного более сложная сеть, которая включает скрытый слой.

Пример ниже также обучает сети регрессии, используя пакеты neuralnet и nnet, которые, как видно из графиков, работают намного лучше.

Я понимаю, что ответ на плохо выполняемые сети заключается в том, чтобы выполнить некоторую настройку гиперпараметров, однако я пробовал ряд значений без какого-либо улучшения производительности. Поэтому у меня есть следующие вопросы:

  1. У меня есть ошибка в реализации регрессии mxnet?
  2. Есть ли у кого-нибудь опыт, который может помочь мне получить разумную производительность от mxnet для простой проблемы с регрессией, такой как рассмотренная здесь?
  3. Есть ли у кого-нибудь пример регрессии mxnet с хорошей производительностью?

Моя установка следующим образом:

MXNet version: 0.7 
R `sessionInfo()`: R version 3.3.2 (2016-10-31) 
Platform: x86_64-w64-mingw32/x64 (64-bit) 
Running under: Windows 7 x64 (build 7601) Service Pack 1 

Плохие результаты регрессии mxnet:

mxnet regression performance

Из этого воспроизводимым например:

## SIMPLE REGRESSION PROBLEM 
# Check mxnet out-of-the-box performance VS neuralnet, and caret/nnet 

library(mxnet) 
library(neuralnet) 
library(nnet) 
library(caret) 
library(tictoc) 
library(reshape) 

# Data definitions 
nObservations <- 1000 
noiseLvl <- 0.1 

# Network config 
nHidden <- 3 
learnRate <- 2e-6 
momentum <- 0.9 
batchSize <- 20 
nRound <- 1000 
verbose <- FALSE 
array.layout = "rowmajor" 

# GENERATE DATA: 
df <- data.frame(x1=runif(nObservations), 
       x2=runif(nObservations), 
       x3=runif(nObservations)) 

df$y <- df$x1 + df$x2^2 + df$x3^3 + noiseLvl*runif(nObservations) 
# normalize data columns 
# df <- scale(df) 

# Seperate data into train/test 
test.ind = seq(1, nObservations, 10) # 1 in 10 samples for testing 
train.x = data.matrix(df[-test.ind, -which(colnames(df) %in% c("y"))]) 
train.y = df[-test.ind, "y"] 
test.x = data.matrix(df[test.ind, -which(colnames(df) %in% c("y"))]) 
test.y = df[test.ind, "y"] 

# Define mxnet network, following 5-minute regression example from here: 
# http://mxnet-tqchen.readthedocs.io/en/latest//packages/r/fiveMinutesNeuralNetwork.html#regression 
data <- mx.symbol.Variable("data") 
label <- mx.symbol.Variable("label") 
fc1 <- mx.symbol.FullyConnected(data, num_hidden=1, name="fc1") 
lro1 <- mx.symbol.LinearRegressionOutput(data=fc1, label=label, name="lro") 

# Train MXNET model 
mx.set.seed(0) 
tic("mxnet training 1") 
mxModel1 <- mx.model.FeedForward.create(lro1, X=train.x, y=train.y, 
             eval.data=list(data=test.x, label=test.y), 
             ctx=mx.cpu(), num.round=nRound, 
             array.batch.size=batchSize, 
             learning.rate=learnRate, momentum=momentum, 
             eval.metric=mx.metric.rmse, 
             verbose=FALSE, array.layout=array.layout) 
toc() 

# Train network with a hidden layer 
fc1 <- mx.symbol.FullyConnected(data, num_hidden=nHidden, name="fc1") 
tanh1 <- mx.symbol.Activation(fc1, act_type="tanh", name="tanh1") 
fc2 <- mx.symbol.FullyConnected(tanh1, num_hidden=1, name="fc2") 
lro2 <- mx.symbol.LinearRegressionOutput(data=fc2, label=label, name="lro") 
tic("mxnet training 2") 
mxModel2 <- mx.model.FeedForward.create(lro2, X=train.x, y=train.y, 
             eval.data=list(data=test.x, label=test.y), 
             ctx=mx.cpu(), num.round=nRound, 
             array.batch.size=batchSize, 
             learning.rate=learnRate, momentum=momentum, 
             eval.metric=mx.metric.rmse, 
             verbose=FALSE, array.layout=array.layout) 
toc() 

# Train neuralnet model 
mx.set.seed(0) 
tic("neuralnet training") 
nnModel <- neuralnet(y~x1+x2+x3, data=df[-test.ind, ], hidden=c(nHidden), 
        linear.output=TRUE, stepmax=1e6) 
toc() 

# Train caret model 
mx.set.seed(0) 
tic("nnet training") 
nnetModel <- nnet(y~x1+x2+x3, data=df[-test.ind, ], size=nHidden, trace=F, 
        linout=TRUE) 
toc() 

# Check response VS targets on training data: 
par(mfrow=c(2,2)) 
plot(train.y, compute(nnModel, train.x)$net.result, 
    main="neuralnet Train Fitting Fake Data", xlab="Target", ylab="Response") 
abline(0,1, col="red") 

plot(train.y, predict(nnetModel, train.x), 
    main="nnet Train Fitting Fake Data", xlab="Target", ylab="Response") 
abline(0,1, col="red") 

plot(train.y, predict(mxModel1, train.x, array.layout=array.layout), 
    main="MXNET (no hidden) Train Fitting Fake Data", xlab="Target", 
    ylab="Response") 
abline(0,1, col="red") 

plot(train.y, predict(mxModel2, train.x, array.layout=array.layout), 
    main="MXNET (with hidden) Train Fitting Fake Data", xlab="Target", 
    ylab="Response") 
abline(0,1, col="red") 

ответ

3

Я спросил те же вопросы в mxnet github (link) и uzhao было достаточно любезным, чтобы предложить использовать другой подход к оптимизации, поэтому кредит им подходит.

Использование «rmsprop» оптимизатор, а также увеличение размера партии позволил mxnet обеспечивает высокую производительность, сравнимую с neuralnet и nnet инструментов на этой простой регрессионной задаче. Я также включил производительность линейной регрессии lm.

Результаты и отдельные примеры кода, приведенные ниже. Надеюсь, это поможет кому-то другому (или я в будущем).

среднеквадратическая ошибка 5 моделей:

$mxModel1 
[1] 0.1404579862 

$mxModel2 
[1] 0.03263213499 

$nnet 
[1] 0.03222651138 

$neuralnet 
[1] 0.03054112057 

$linearModel 
[1] 0.1404421006 

Графика, показывающая хорошую/разумную производительность mxnet регрессии (и линейных результаты регрессии в зеленом цвете): mxnet regression results using rmsprop optimization

и, наконец, код для этого автономного примера:

## SIMPLE REGRESSION PROBLEM 
# Check mxnet out-of-the-box performance VS neuralnet, and caret/nnet 

library(mxnet) 
library(neuralnet) 
library(nnet) 
library(caret) 
library(tictoc) 
library(reshape) 

# Data definitions 
nObservations <- 1000 
noiseLvl <- 0.1 

# Network config 
nHidden <- 3 
batchSize <- 100 
nRound <- 400 
verbose <- FALSE 
array.layout = "rowmajor" 
optimizer <- "rmsprop" 

# GENERATE DATA: 
set.seed(0) 
df <- data.frame(x1=runif(nObservations), 
       x2=runif(nObservations), 
       x3=runif(nObservations)) 

df$y <- df$x1 + df$x2^2 + df$x3^3 + noiseLvl*runif(nObservations) 
# normalize data columns 
# df <- scale(df) 

# Seperate data into train/test 
test.ind = seq(1, nObservations, 10) # 1 in 10 samples for testing 
train.x = data.matrix(df[-test.ind, -which(colnames(df) %in% c("y"))]) 
train.y = df[-test.ind, "y"] 
test.x = data.matrix(df[test.ind, -which(colnames(df) %in% c("y"))]) 
test.y = df[test.ind, "y"] 

# Define mxnet network, following 5-minute regression example from here: 
# http://mxnet-tqchen.readthedocs.io/en/latest//packages/r/fiveMinutesNeuralNetwork.html#regression 
data <- mx.symbol.Variable("data") 
label <- mx.symbol.Variable("label") 
fc1 <- mx.symbol.FullyConnected(data, num_hidden=1, name="fc1") 
lro1 <- mx.symbol.LinearRegressionOutput(data=fc1, label=label, name="lro") 

# Train MXNET model 
mx.set.seed(0) 
tic("mxnet training 1") 
mxModel1 <- mx.model.FeedForward.create(lro1, X=train.x, y=train.y, 
             eval.data=list(data=test.x, label=test.y), 
             ctx=mx.cpu(), num.round=nRound, 
             array.batch.size=batchSize, 
             eval.metric=mx.metric.rmse, 
             verbose=verbose, 
             array.layout=array.layout, 
             optimizer=optimizer 
             ) 
toc() 

# Train network with a hidden layer 
fc1 <- mx.symbol.FullyConnected(data, num_hidden=nHidden, name="fc1") 
tanh1 <- mx.symbol.Activation(fc1, act_type="tanh", name="tanh1") 
fc2 <- mx.symbol.FullyConnected(tanh1, num_hidden=1, name="fc2") 
lro2 <- mx.symbol.LinearRegressionOutput(data=fc2, label=label, name="lro2") 
tic("mxnet training 2") 
mx.set.seed(0) 
mxModel2 <- mx.model.FeedForward.create(lro2, X=train.x, y=train.y, 
             eval.data=list(data=test.x, label=test.y), 
             ctx=mx.cpu(), num.round=nRound, 
             array.batch.size=batchSize, 
             eval.metric=mx.metric.rmse, 
             verbose=verbose, 
             array.layout=array.layout, 
             optimizer=optimizer 
             ) 
toc() 

# Train neuralnet model 
set.seed(0) 
tic("neuralnet training") 
nnModel <- neuralnet(y~x1+x2+x3, data=df[-test.ind, ], hidden=c(nHidden), 
        linear.output=TRUE, stepmax=1e6) 
toc() 
# Train caret model 
set.seed(0) 
tic("nnet training") 
nnetModel <- nnet(y~x1+x2+x3, data=df[-test.ind, ], size=nHidden, trace=F, 
        linout=TRUE) 
toc() 

# Check response VS targets on training data: 
par(mfrow=c(2,2)) 
plot(train.y, compute(nnModel, train.x)$net.result, 
    main="neuralnet Train Fitting Fake Data", xlab="Target", ylab="Response") 
abline(0,1, col="red") 

# Plot linear model performance for reference 
linearModel <- linearModel <- lm(y~., df[-test.ind, ]) 
points(train.y, predict(linearModel, data.frame(train.x)), col="green") 

plot(train.y, predict(nnetModel, train.x), 
    main="nnet Train Fitting Fake Data", xlab="Target", ylab="Response") 
abline(0,1, col="red") 

plot(train.y, predict(mxModel1, train.x, array.layout=array.layout), 
    main="MXNET (no hidden) Train Fitting Fake Data", xlab="Target", 
    ylab="Response") 
abline(0,1, col="red") 

plot(train.y, predict(mxModel2, train.x, array.layout=array.layout), 
    main="MXNET (with hidden) Train Fitting Fake Data", xlab="Target", 
    ylab="Response") 
abline(0,1, col="red") 

# Create and print table of results: 
results <- list() 
rmse <- function(target, response) { 
    return(sqrt(mean((target - response)^2))) 
} 
results$mxModel1 <- rmse(train.y, predict(mxModel1, train.x, 
              array.layout=array.layout)) 
results$mxModel2 <- rmse(train.y, predict(mxModel2, train.x, 
              array.layout=array.layout)) 
results$nnet <- rmse(train.y, predict(nnetModel, train.x)) 
results$neuralnet <- rmse(train.y, compute(nnModel, train.x)$net.result) 
results$linearModel <- rmse(train.y, predict(linearModel, data.frame(train.x))) 

print(results) 

 Смежные вопросы

  • Нет связанных вопросов^_^