Tôi đã tìm thấy hai câu hỏi ở đây và ở đây về vấn đề này nhưng vẫn chưa có câu trả lời hoặc giải thích rõ ràng nào. Tôi thi hành cùng một vấn đề trong đó lỗi xác nhận ít hơn lỗi đào tạo trong Mạng thần kinh chuyển đổi của tôi. Điều đó nghĩa là gì?
Tôi đã tìm thấy hai câu hỏi ở đây và ở đây về vấn đề này nhưng vẫn chưa có câu trả lời hoặc giải thích rõ ràng nào. Tôi thi hành cùng một vấn đề trong đó lỗi xác nhận ít hơn lỗi đào tạo trong Mạng thần kinh chuyển đổi của tôi. Điều đó nghĩa là gì?
Câu trả lời:
Thật khó để chắc chắn nếu không biết phương pháp thực tế của bạn (ví dụ: phương pháp xác thực chéo, số liệu hiệu suất, phương pháp phân tách dữ liệu, v.v.).
Nói chung, mặc dù, lỗi đào tạo sẽ hầu như luôn đánh giá thấp lỗi xác nhận của bạn. Tuy nhiên, lỗi xác nhận có thể ít hơn so với đào tạo. Bạn có thể nghĩ về nó theo hai cách:
Đó là lý do tại sao điều quan trọng là bạn thực sự đánh giá phương pháp đào tạo mô hình của bạn. Nếu bạn không phân chia dữ liệu của mình để đào tạo đúng cách, kết quả của bạn sẽ dẫn đến sự nhầm lẫn, nếu không chỉ đơn giản là không chính xác, kết luận.
Tôi nghĩ về đánh giá mô hình trong bốn loại khác nhau:
Underfising - Xác nhận và đào tạo lỗi cao
Quá mức - Lỗi xác thực cao, lỗi đào tạo thấp
Phù hợp tốt - Lỗi xác nhận thấp, cao hơn một chút so với lỗi đào tạo
Phù hợp không xác định - Lỗi xác thực thấp, lỗi đào tạo 'cao'
Tôi nói 'không rõ' phù hợp vì kết quả phản tác dụng trực quan với cách hoạt động của máy học. Bản chất của ML là dự đoán những điều chưa biết. Nếu bạn giỏi dự đoán những điều chưa biết hơn những gì bạn đã 'học', thì AFAIK dữ liệu giữa đào tạo và xác nhận phải khác nhau theo một cách nào đó. Điều này có thể có nghĩa là bạn cần phải đánh giá lại phương pháp phân tách dữ liệu của mình, thêm nhiều dữ liệu hơn hoặc có thể thay đổi chỉ số hiệu suất của bạn (bạn có thực sự đo lường hiệu suất bạn muốn không?).
BIÊN TẬP
Để giải quyết tham chiếu của OP cho câu hỏi lasagne python trước đó .
Điều này cho thấy rằng bạn có đủ dữ liệu để không yêu cầu xác thực chéo và chỉ cần có các tập hợp dữ liệu đào tạo, xác thực và kiểm tra. Bây giờ, nếu bạn nhìn vào hướng dẫn lasagne bạn có thể thấy rằng hành vi tương tự được nhìn thấy ở đầu trang. Tôi sẽ khó tin rằng các tác giả sẽ đăng kết quả như vậy nếu nó lạ nhưng thay vì chỉ cho rằng chúng là chính xác, hãy nhìn xa hơn. Phần quan tâm nhất đối với chúng tôi ở đây là trong phần vòng lặp đào tạo , ngay phía dưới bạn sẽ thấy các thông số tổn thất được tính toán như thế nào.
Các lỗ đào tạo được tính trên toàn bộ số liệu đào tạo . Tương tự, tổn thất xác nhận được tính trên toàn bộ dữ liệu xác nhận . Tập huấn luyện thường lớn hơn ít nhất 4 lần so với xác nhận (80-20). Cho rằng lỗi được tính trên tất cả các mẫu, bạn có thể mong đợi tới khoảng 4 lần số đo tổn thất của bộ xác thực. Tuy nhiên, bạn sẽ nhận thấy rằng tổn thất đào tạo và mất xác nhận đang tiếp cận nhau khi đào tạo tiếp tục. Đây là cố ý như thể lỗi đào tạo của bạn bắt đầu thấp hơn lỗi xác nhận của bạn, bạn sẽ bắt đầu vượt qua mô hình của mình !!!
Tôi hy vọng điều này làm rõ những lỗi này.
Một khả năng: Nếu bạn đang sử dụng lớp chính quy hóa bỏ học trong mạng của mình, điều hợp lý là lỗi xác thực nhỏ hơn lỗi đào tạo. Bởi vì thường bỏ học được kích hoạt khi đào tạo nhưng bị vô hiệu hóa khi đánh giá trên bộ xác nhận. Bạn có được một chức năng trơn tru hơn (thường có nghĩa là tốt hơn) trong trường hợp sau.
Tôi không có đủ điểm để nhận xét về câu trả lời của @ DK, nhưng điều này hiện được trả lời dưới dạng Câu hỏi thường gặp về tài liệu của Keras:
"Tại sao tổn thất đào tạo cao hơn nhiều so với tổn thất thử nghiệm?
Một mô hình Keras có hai chế độ: đào tạo và thử nghiệm. Các cơ chế chính quy, chẳng hạn như Dropout và chuẩn hóa trọng lượng L1 / L2, bị tắt tại thời điểm thử nghiệm.
Bên cạnh đó, tổn thất đào tạo là trung bình của tổn thất trong mỗi đợt dữ liệu đào tạo. Bởi vì mô hình của bạn đang thay đổi theo thời gian, tổn thất trong các đợt đầu tiên của một kỷ nguyên thường cao hơn so với các đợt trước. Mặt khác, tổn thất thử nghiệm cho một kỷ nguyên được tính bằng cách sử dụng mô hình vì nó ở cuối kỷ nguyên, dẫn đến tổn thất thấp hơn. "
2 xu của tôi: Tôi cũng gặp vấn đề tương tự ngay cả khi không có lớp bỏ học. Trong trường hợp của tôi - các lớp định mức hàng loạt là thủ phạm. Khi tôi xóa chúng - mất đào tạo trở nên tương tự như mất xác nhận. Có lẽ, điều đó đã xảy ra bởi vì trong quá trình đào tạo định mức lô sử dụng giá trị trung bình và phương sai của lô đầu vào đã cho, có thể khác nhau từ lô này sang lô khác. Nhưng trong quá trình đánh giá, định mức lô sử dụng giá trị trung bình và phương sai đang chạy, cả hai đều phản ánh các thuộc tính của toàn bộ tập huấn tốt hơn nhiều so với giá trị trung bình và phương sai của một lô trong quá trình đào tạo. Ít nhất, đó là cách thực hiện định mức hàng loạt trong pytorch
Một khả năng khác kết hợp cả câu trả lời của @cdeterman và @DK theo một cách nào đó là nếu bạn đang sử dụng một số cơ chế tăng dữ liệu. Việc tăng dữ liệu nguyên vẹn thường chỉ được thực hiện trên tập huấn luyện chứ không phải trên tập xác thực (như đối với quy tắc bỏ học) và điều này có thể dẫn đến một tập xác thực chứa các trường hợp "dễ" hơn so với các tập trong tập huấn luyện.
@cdeterman và @DK có lời giải thích tốt. Tôi muốn một lý do nữa - data leakage
. Một phần dữ liệu tàu của bạn "liên quan chặt chẽ" với dữ liệu thử nghiệm.
Ví dụ tiềm năng: hãy tưởng tượng bạn có 1000 con chó và 1000 con mèo với 500 bức ảnh tương tự cho mỗi thú cưng (một số chủ sở hữu thích chụp ảnh thú cưng của chúng ở những vị trí rất giống nhau), nói trên nền. Vì vậy, nếu bạn chia ngẫu nhiên 70/30, bạn sẽ bị rò rỉ dữ liệu dữ liệu tàu hỏa vào dữ liệu thử nghiệm.
Nói một cách đơn giản, nếu tổn thất đào tạo và mất xác nhận được tính toán chính xác, thì tổn thất đào tạo không thể cao hơn tổn thất xác nhận. Điều này là do lan truyền ngược TRỰC TIẾP làm giảm lỗi được tính toán trên tập huấn luyện và chỉ có ĐỘC LẬP (thậm chí không được bảo đảm!) Làm giảm lỗi được tính trên tập xác thực.
Phải có một số yếu tố bổ sung khác nhau trong khi đào tạo và trong khi xác nhận. Bỏ học là một trong những tốt, nhưng có thể có những người khác. Hãy chắc chắn kiểm tra tài liệu của bất kỳ thư viện nào bạn đang sử dụng. Mô hình và lớp thường có thể có các cài đặt mặc định mà chúng ta thường không chú ý đến.
Một xác nhận thấp hơn so với lỗi đào tạo có thể được gây ra bởi các biến động liên quan đến bỏ học hoặc khác, nhưng nếu nó tồn tại trong thời gian dài thì điều này có thể chỉ ra rằng các bộ dữ liệu đào tạo và xác thực không thực sự được rút ra từ cùng một tập hợp thống kê. Điều này có thể xảy ra nếu các ví dụ của bạn đến từ một loạt và nếu bạn không chọn ngẫu nhiên các bộ dữ liệu huấn luyện và xác nhận hợp lệ.
Tại thời điểm này, các phương pháp dựa trên độ dốc ngẫu nhiên hầu như luôn là thuật toán được lựa chọn để học sâu. Điều này có nghĩa là dữ liệu xuất hiện theo lô, độ dốc được tính toán và các tham số được cập nhật. Điều này có nghĩa là bạn cũng có thể tính toán tổn thất trên dữ liệu khi mỗi lô được chọn. Trong khuôn khổ này, có hai cách thức như thế nào sự mất mát được tính mà tôi có thể nghĩ ra có thể dẫn đến hiện tượng này rằng lỗi đào tạo lớn hơn sai số xác nhận. Dưới đây, trên thực tế, tôi cho thấy Keras thực sự xuất hiện để tính toán các lỗi trong mẫu theo những cách này.
1.) Lỗi đào tạo được tính trung bình trên toàn bộ kỷ nguyên, thay vì tất cả cùng một lúc ở cuối kỷ nguyên, nhưng lỗi xác thực chỉ ở cuối kỷ nguyên. Lưu ý rằng lỗi xác thực có lợi ích là được cập nhật đầy đủ, trong khi lỗi đào tạo bao gồm các tính toán lỗi với ít cập nhật hơn. Tất nhiên, nói chung hiệu ứng này sẽ biến mất.
2.) Lỗi đào tạo được tính toán trước khi cập nhật hàng loạt được thực hiện. Trong một phương pháp dựa trên độ dốc ngẫu nhiên, có một số nhiễu độ dốc. Trong khi một người đang leo lên một ngọn đồi, có khả năng cao là một người đang giảm tổn thất toàn cầu được tính toán trên tất cả các mẫu đào tạo. Tuy nhiên, khi một chế độ rất gần với chế độ, hướng cập nhật sẽ âm đối với các mẫu trong lô của bạn. Nhưng vì chúng ta đang nảy xung quanh một chế độ, điều này có nghĩa là trung bình chúng ta phải chọn một hướng tích cực đối với các mẫu racủa đợt. Bây giờ, nếu chúng ta sắp cập nhật liên quan đến các mẫu trong một đợt nhất định, điều đó có nghĩa là chúng đã bị đẩy xung quanh bởi nhiều bản cập nhật lô mà chúng không được đưa vào, bằng cách tính toán mất trước khi cập nhật, đây là khi ngẫu nhiên các phương pháp đã đẩy các tham số có lợi nhất cho các mẫu khác trong tập dữ liệu của bạn, do đó mang lại cho chúng tôi một xu hướng tăng nhỏ trong tổn thất dự kiến.
Lưu ý rằng trong khi không có triệu chứng, hiệu ứng của (1) sẽ biến mất, (2) thì không! Dưới đây tôi chỉ ra rằng Keras dường như làm cả (1) và (2).
(1) Hiển thị rằng các số liệu được tính trung bình trên mỗi lô theo thời gian, thay vì tất cả cùng một lúc ở cuối. Lưu ý sự khác biệt lớn về độ chính xác trong mẫu so với val_accuracy ủng hộ val_accuracy ở kỷ nguyên đầu tiên. Điều này là do một số lỗi trong mẫu được tính toán với rất ít cập nhật hàng loạt.
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample
- loss: 0.2320 - accuracy: 0.9216
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1487 - accuracy: 0.9662
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample
- loss: 0.1471 - accuracy: 0.9687
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>
(2) Hiển thị lỗi được tính toán trước khi cập nhật cho từng lô. Lưu ý rằng đối với epoch 1, khi chúng ta sử dụng batch_size = nRows
(nghĩa là tất cả dữ liệu trong một đợt), lỗi trong mẫu là khoảng 0,5 (đoán ngẫu nhiên) cho epoch 1, nhưng lỗi xác thực là 0,82. Do đó, lỗi trong mẫu được tính toán trước khi cập nhật lô, trong khi lỗi xác thực được tính sau khi cập nhật lô.
>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows,
... validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample
- loss: 0.7126 - accuracy: 0.5088
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample
- loss: 0.5770 - accuracy: 0.8211
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample
- loss: 0.4921 - accuracy: 0.8268
- val_loss: 0.4502 - val_accuracy: 0.8249