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 y
ne olursa olsun, x
eğ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ı
x ⋅ k >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 netALL
daha iyi yaptığı belli ! Bu neden? Komutla ne elde ettiğine bir göz at plot(netALL)
:
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.