R nơ-ron - tính toán cho một câu trả lời không đổi


11

Tôi đang cố gắng sử dụng neuralnetgói R (tài liệu ở đây ) để dự đoán.

Đây là những gì tôi đang cố gắng làm:

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

Ai đó có thể giải thích cho tôi tại sao lỗi rất lớn và tại sao tất cả các giá trị dự đoán gần như không đổi?

Câu trả lời:


6

Tôi không phải là một chuyên gia về mạng lưới thần kinh nhưng tôi nghĩ những điểm sau đây có thể hữu ích cho bạn. Ngoài ra còn có một số bài viết hay, ví dụ bài này trên các đơn vị ẩn , mà bạn có thể tìm kiếm trên trang web này về những mạng lưới thần kinh nào mà bạn có thể thấy hữu ích.

1 lỗi lớn: tại sao ví dụ của bạn không hoạt động

tại sao sai số rất lớn và tại sao tất cả các giá trị dự đoán gần như không đổi?

Điều này là do mạng nơ ron không thể tính toán hàm nhân mà bạn đã cung cấp và xuất ra một số không đổi ở giữa phạm vi y, bất kể x, là cách tốt nhất để giảm thiểu lỗi trong quá trình đào tạo. (Lưu ý cách 58749 khá gần với giá trị nhân hai số từ 1 đến 500 với nhau.)

11

2 Cực tiểu địa phương: tại sao một ví dụ hợp lý về mặt lý thuyết có thể không hoạt động

Tuy nhiên, ngay cả khi cố gắng thực hiện bổ sung, bạn cũng gặp phải vấn đề trong ví dụ của mình: mạng không đào tạo thành công. Tôi tin rằng điều này là do vấn đề thứ hai: đạt cực tiểu cục bộ trong quá trình đào tạo. Trong thực tế, ngoài ra, sử dụng hai lớp 5 đơn vị ẩn là quá phức tạp để tính toán bổ sung. Một mạng không có đơn vị ẩn hoàn toàn tốt:

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

Tất nhiên, bạn có thể chuyển vấn đề ban đầu của mình thành vấn đề bổ sung bằng cách ghi nhật ký, nhưng tôi không nghĩ đây là điều bạn muốn, nên tiếp tục ...

3 Số ví dụ đào tạo so với số lượng tham số cần ước tính

Vì vậy, điều gì sẽ là một cách hợp lý để kiểm tra mạng lưới thần kinh của bạn với hai lớp 5 đơn vị ẩn như ban đầu bạn có? Mạng lưới thần kinh thường được sử dụng để phân loại, do đó, việc quyết định xem có vẻ là một lựa chọn hợp lý của vấn đề. Tôi đã sử dụng và . Lưu ý rằng có một số tham số sẽ được học.k = ( 1 , 2 , 3 , 4 , 5 ) c = 3750xk>ck=(1,2,3,4,5)c=3750

Trong đoạn mã dưới đây, tôi có một cách tiếp cận rất giống với bạn, ngoại trừ việc tôi huấn luyện hai mạng lưới thần kinh, một với 50 ví dụ từ tập huấn luyện và một với 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

Rõ ràng là netALLlàm tốt hơn rất nhiều! Tại sao lại thế này? Hãy xem những gì bạn nhận được bằng một plot(netALL)lệnh:

nhập mô tả hình ảnh ở đây

Tôi tạo cho nó 66 tham số được ước tính trong quá trình đào tạo (5 đầu vào và 1 đầu vào sai lệch cho mỗi 11 nút). Bạn không thể ước tính đáng tin cậy 66 tham số với 50 ví dụ đào tạo. Tôi nghi ngờ trong trường hợp này bạn có thể cắt giảm số lượng tham số để ước tính bằng cách cắt giảm số lượng đơn vị. Và bạn có thể thấy từ việc xây dựng một mạng lưới thần kinh để thực hiện thêm rằng một mạng lưới thần kinh đơn giản hơn có thể ít gặp phải các vấn đề trong quá trình đào tạo.

Nhưng như một quy tắc chung trong bất kỳ máy học nào (bao gồm cả hồi quy tuyến tính), bạn muốn có nhiều ví dụ đào tạo hơn các tham số để ước tính.


1
Rất nhiều thông tin để suy nghĩ, cảm ơn! Bạn hoàn toàn đúng! Nếu các biến được chuẩn hóa, số lượng ví dụ đào tạo lớn hơn và số lượng tế bào thần kinh trên một lớp ẩn bằng một, nó sẽ trông tốt hơn nhiều. Tất nhiên, không phải là một hàm nhân mà là một cái gì đó tương tự. Ah, nếu tôi nhận được phản hồi tuyệt vời như vậy 2 tuần trước, mọi thứ sẽ dễ dàng hơn. Tuy nhiên, rất biết ơn trả lời của bạn, cảm ơn bạn!
luckyi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.