신경망 전문가는 아니지만 다음 사항이 도움이 될 것입니다. 숨겨진 유닛에 대한 멋진 게시물도 있습니다.이 사이트에서 신경망의 기능에 대해 검색 할 수 있습니다.
1 큰 오류 : 예제가 전혀 작동하지 않은 이유
왜 오류가 너무 커서 모든 예측 값이 거의 일정합니까?
이는 신경망이 사용자가 제공 한 곱셈 함수를 계산할 수 없었고의 범위에 y
상관없이 중간에 상수를 출력하는 x
것이 훈련 중 오류를 최소화하는 가장 좋은 방법 이었기 때문입니다. (58749가 1과 500 사이의 두 숫자를 곱한 평균에 얼마나 가까운 지 알 수 있습니다.)
신경망이 어떻게 곱셈 함수를 합리적인 방식으로 계산할 수 있는지 보는 것은 매우 어렵습니다. 네트워크 콤바인의 각 노드는 이전에 계산 방법의 결과에 대해 생각해는 테이크 가중 합 이전 노드들로부터의 출력을 (그리고 예를 들어, 참조, 그것에 S 자형 함수를 적용 신경망을 소개 inbetween 출력을 깨 물어하기 그리고 ). 두 개의 입력을 곱하기 위해 가중 합계를 어떻게 얻습니까? (그러나 나는 매우 많은 방법으로 곱셈이 작동하도록 많은 숨겨진 레이어를 취할 수 있다고 생각합니다.)−11
2 지역 최소치 : 이론적으로 합리적인 예가 효과가없는 이유
그러나 추가를 시도해도 예제에서 문제가 발생합니다. 네트워크가 성공적으로 훈련되지 않습니다. 나는 이것이 두 번째 문제 때문이라고 생각합니다 . 훈련 중에 지역 최소치를 얻는 것 . 실제로, 5 개의 숨겨진 유닛으로 2 개의 레이어를 사용하는 것은 덧셈을 계산하기에는 너무 복잡합니다. 숨겨진 유닛 이 없는 네트워크는 완벽하게 훈련됩니다.
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
물론 로그를 사용하여 원래 문제를 추가 문제로 변환 할 수는 있지만 이것이 원하는 것 같지는 않습니다.
3 추정 할 매개 변수 수와 비교 한 교육 예제 수
그렇다면 원래와 같이 5 개의 숨겨진 유닛으로 구성된 2 개의 레이어로 신경망을 테스트하는 합리적인 방법은 무엇입니까? 신경망은 종종 분류에 사용되므로 가 합리적인 선택의 문제인지 판단합니다. I 사용 와 . 학습해야 할 몇 가지 매개 변수가 있습니다.x⋅k>ck=(1,2,3,4,5)c=3750
아래 코드에서 나는 두 개의 신경망을 훈련한다는 것을 제외하고는 당신과 매우 비슷한 접근 방식을 취합니다. 하나는 훈련 세트의 50 가지 예와 500 가지입니다.
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
netALL
훨씬 더 잘하는 것이 분명합니다 ! 왜 이런거야? plot(netALL)
명령으로 얻는 것을 살펴보십시오 .
나는 훈련 중에 추정되는 66 개의 매개 변수 (11 개의 노드 각각에 5 개의 입력 및 1 개의 바이어스 입력)를 만듭니다. 50 개의 교육 예제를 통해 66 개의 매개 변수를 안정적으로 추정 할 수 없습니다. 이 경우 단위 수를 줄이면 추정 할 매개 변수 수를 줄일 수 있다고 생각합니다. 또한 신경망을 구축하여 훈련하는 동안 단순한 신경망이 문제를 일으킬 가능성이 적다는 것을 알 수 있습니다.
그러나 머신 러닝 (선형 회귀 포함)의 일반적인 규칙으로 추정 할 매개 변수보다 훨씬 더 많은 교육 예제가 필요합니다.