R neuralnet - hesaplama sürekli bir cevap verir


11

Tahmin için R'nin neuralnetpaketini ( burada dokümantasyon ) kullanmaya çalışıyorum .

İşte yapmaya çalıştığım şey:

library(neuralnet)
x <- cbind(runif(50, min=1, max=500), runif(50, min=1, max=500))
y <- x[, 1] * x[, 2]
train <- data.frame(x, y)
n <- names(train)
f <- as.formula(paste('y ~', paste(n[!n %in% 'y'], collapse = ' + ')))
net <- neuralnet(f, train, hidden = c(5, 5), threshold=0.01)
print(net)

all: neuralnet(formula = f, data = train, hidden = c(5, 5), threshold = 0.01)

1 repetition was calculated.

    Error Reached Threshold Steps
1 66136930789    0.004658283648 97938

test <- cbind(runif(10, min=1, max=500), runif(10, min=1, max=500))
res <- compute(net, test)
res$net.result
         [,1]
[1,] 58749.01798
[2,] 58749.01798
[3,] 58749.01798
[4,] 58749.01798
[5,] 58749.01798
[6,] 58749.01798
[7,] 58749.01798
[8,] 58749.01798
[9,] 58749.01798
[10,] 58749.01798

Birisi bana hataların neden bu kadar büyük olduğunu ve tüm tahmin edilen değerlerin neredeyse sabit olduğunu açıklayabilir mi?

Yanıtlar:


6

Sinir ağlarında uzman değilim ama aşağıdaki noktaların size yardımcı olabileceğini düşünüyorum. Ayrıca, bu sitede yararlı nöral ağların ne yapabileceği hakkında arayabileceğiniz bazı gizli yayınlar, örneğin gizli birimlerde bu var.

1 Büyük hatalar: Örneğiniz neden hiç çalışmadı

neden hatalar bu kadar büyük ve tahmin edilen tüm değerler neden neredeyse sabit?

Sinir ağı, ona verdiğiniz çarpma fonksiyonunu hesaplamak edemedi ve aralığının ortasında sabit bir sayı çıkışı Bunun nedeni yne olursa olsun, xeğitim sırasında hataları en aza indirmek için en iyi yolu oldu. (58749'un iki sayıyı 1 ile 500 arasında çarpma ortalamasına ne kadar yakın olduğuna dikkat edin.)

-11

2 Yerel minima: teorik olarak makul bir örnek neden işe yaramayabilir

Ancak, ek yapmaya çalıştığınızda bile, örneğin sorunlarınızla karşılaşırsınız: ağ başarılı bir şekilde eğitilmez. Bunun ikinci bir sorundan kaynaklandığına inanıyorum: eğitim sırasında yerel minimuma ulaşmak . Aslında, ek olarak, 5 gizli birimin iki katmanını kullanmak, eklemeyi hesaplamak için çok karmaşıktır. Gizli üniteleri olmayan bir ağ mükemmel bir şekilde eğitilir:

x <- cbind(runif(50, min=1, max=500), runif(50, min=1, max=500))
y <- x[, 1] + x[, 2]
train <- data.frame(x, y)
n <- names(train)
f <- as.formula(paste('y ~', paste(n[!n %in% 'y'], collapse = ' + ')))
net <- neuralnet(f, train, hidden = 0, threshold=0.01)
print(net) # Error 0.00000001893602844

Tabii ki, orijinal probleminizi günlükleri alarak bir ilave problemine dönüştürebilirsiniz, ancak bunun istediğini sanmıyorum, bu yüzden ...

3 Tahmin edilecek parametre sayısı ile karşılaştırıldığında egzersiz örneği sayısı

xk>ck=(1,2,3,4,5)c=3750

Aşağıdaki kodda, biri eğitim setinden 50, diğeri 500 ile olmak üzere iki sinir ağını eğitmem dışında, sizinkine çok benzer bir yaklaşım benimsiyorum.

library(neuralnet)
set.seed(1) # make results reproducible
N=500
x <- cbind(runif(N, min=1, max=500), runif(N, min=1, max=500), runif(N, min=1, max=500), runif(N, min=1, max=500), runif(N, min=1, max=500))
y <- ifelse(x[,1] + 2*x[,1] + 3*x[,1] + 4*x[,1] + 5*x[,1] > 3750, 1, 0)
trainSMALL <- data.frame(x[1:(N/10),], y=y[1:(N/10)])
trainALL <- data.frame(x, y)
n <- names(trainSMALL)
f <- as.formula(paste('y ~', paste(n[!n %in% 'y'], collapse = ' + ')))
netSMALL <- neuralnet(f, trainSMALL, hidden = c(5,5), threshold = 0.01)
netALL <- neuralnet(f, trainALL, hidden = c(5,5), threshold = 0.01)
print(netSMALL) # error 4.117671763
print(netALL) # error 0.009598461875

# get a sense of accuracy w.r.t small training set (in-sample)
cbind(y, compute(netSMALL,x)$net.result)[1:10,]
      y                 
 [1,] 1  0.587903899825
 [2,] 0  0.001158500142
 [3,] 1  0.587903899825
 [4,] 0  0.001158500281
 [5,] 0 -0.003770868805
 [6,] 0  0.587903899825
 [7,] 1  0.587903899825
 [8,] 0  0.001158500142
 [9,] 0  0.587903899825
[10,] 1  0.587903899825

# get a sense of accuracy w.r.t full training set (in-sample)
cbind(y, compute(netALL,x)$net.result)[1:10,]
      y                 
 [1,] 1  1.0003618092051
 [2,] 0 -0.0025677656844
 [3,] 1  0.9999590121059
 [4,] 0 -0.0003835722682
 [5,] 0 -0.0003835722682
 [6,] 0 -0.0003835722199
 [7,] 1  1.0003618092051
 [8,] 0 -0.0025677656844
 [9,] 0 -0.0003835722682
[10,] 1  1.0003618092051

Çok netALLdaha iyi yaptığı belli ! Bu neden? Komutla ne elde ettiğine bir göz at plot(netALL):

resim açıklamasını buraya girin

Antrenman sırasında tahmin edilen 66 parametreyi yapıyorum (11 düğümün her birine 5 giriş ve 1 önyargı girişi). 50 eğitim örneğiyle 66 parametreyi güvenilir bir şekilde tahmin edemezsiniz. Bu durumda, tahmin edilecek parametre sayısını, birim sayısını azaltarak azaltabileceğinizden şüpheleniyorum. Ve daha basit bir sinir ağının eğitim sırasında problemlerle karşılaşma olasılığının daha düşük olduğunu eklemek için bir sinir ağı inşa etmekten görebilirsiniz.

Ancak herhangi bir makine öğrenmesinde (doğrusal regresyon dahil) genel bir kural olarak, tahmin edilecek parametrelerden çok daha fazla eğitim örneğine sahip olmak istersiniz.


1
Düşünmek için çok fazla bilgi, teşekkürler! Kesinlikle haklısın! Değişkenler normalleştirilmişse, eğitim örneklerinin sayısı daha fazla ve bir gizli katmandaki nöronların sayısı bire eşitse, çok daha iyi görünecektir. Tabii ki, bir çarpma işlevi değil, benzer bir şey. Ah, 2 hafta önce böyle harika bir yanıt alırsam işler daha kolay olurdu. Ancak, cevabınız için çok minnettarım, teşekkür ederim!
luckyi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.