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 = 3750x ⋅ k >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à netALL
là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:
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.