Lỗi xác nhận ít hơn lỗi đào tạo?


57

Tôi đã tìm thấy hai câu hỏi ở đâyở đâ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 không nghĩ câu hỏi này có thể được trả lời mà không cần biết số lượng đào tạo (cv) và trường hợp kiểm tra tuyệt đối cũng như phương sai quan sát được đối với MSE cho cả kiểm tra chéo và kiểm tra.
cbeleites hỗ trợ Monica

xáo trộn dữ liệu
user0

Chúng ta suy luận điều gì? Có, nó được tạo ra từ một mạng lưới dày đặc với các lớp bỏ học và các lớp. ! [nhập mô tả hình ảnh tại đây ] ( i.stack.imgur.com/KX1Fz.png )
Srinath

Câu trả lời:


69

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:

  1. Tập huấn luyện của bạn có nhiều trường hợp 'khó' để học
  2. Bộ xác thực của bạn có hầu hết các trường hợp 'dễ dàng' để dự đoán

Đó 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:

  1. Underfising - Xác nhận và đào tạo lỗi cao

  2. Quá mức - Lỗi xác thực cao, lỗi đào tạo thấp

  3. 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

  4. 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.


2
Câu trả lời tốt đẹp. Cũng có khả năng là có một lỗi trong mã khiến cho việc đào tạo không được hội tụ đến mức tối ưu trên tập huấn luyện. Hoặc, nếu mục tiêu đào tạo là không lồi và thuật toán đào tạo hội tụ đến mức tối thiểu cục bộ có thể tốt cho tập xác thực.
Sobi

@cdeterman thank.I sử dụng RMSE làm chỉ số hiệu suất. Tôi đã chia dữ liệu của mình thành 20% cho kiểm tra và 80% cho đào tạo và xác nhận (20% dữ liệu đào tạo được xác thực chéo để tính toán xác nhận lỗi). Trên thực tế, lỗi Xác thực thấp, thấp hơn một chút so với lỗi đào tạo. Các lỗi kiểm tra cao hơn so với lỗi đào tạo và xác nhận. Chúng tôi có thể tìm thấy một trường hợp tương tự trong MNISTdataset cho các số liệu thống kê nhận dạng chữ viết tay.stackexchange.com / questions / 178371 / trên
Bido 18/12/15

@Bido có chỉnh sửa địa chỉ gần đây nhất của bạn không?
cdeterman

@cdeterman Cảm ơn. Tôi chỉ nhận thấy rằng bạn đã chỉnh sửa câu trả lời của bạn. Nó là rõ ràng và hữu ích.
Bido

Giải thích tuyệt vời, nếu bạn có thể thêm một vài biểu đồ - đó sẽ là biểu đồ tốt nhất có thể
Taras Matsyk

109

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.


12
Thật là một câu trả lời đơn giản, hợp lý!
rajb245

4
Vâng, điều này nên được đánh dấu là câu trả lời chính xác thực sự.
Simana

2
Tôi đã loại bỏ lớp bỏ học của mình, nhưng vẫn thấy tổn thất xác nhận thấp hơn so với tổn thất đào tạo ban đầu! (Tôi cũng không chỉ định bất kỳ chính quy hóa nào trên các lớp!)
Josiah Yoder

Phù hợp với trường hợp của tôi. Sử dụng nhiều học sinh bỏ học.
André Christoffer Andersen

@JosiahYoder - bạn có muốn chia sẻ gì thêm về điều này không? Tôi có 1650 tính năng đầu vào. khi tôi giữ mạng nhỏ (1650, 50, 1) bỏ học hoặc không bỏ học, lỗi đào tạo trong các kỷ nguyên ban đầu cao hơn lỗi xác nhận. Khi tôi sử dụng các mạng lớn (1650, 1200, 800, 100 ..... khoảng 10 lớp 100 với kích hoạt selu), mô hình kỳ lạ về độ chính xác xác thực cao hơn có phần được giảm nhẹ.
MiloMinderbinder

19

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. "


1
Điều này cũng không hoàn toàn trả lời câu hỏi. Với việc bỏ học bị vô hiệu hóa, tôi vẫn thấy mất xác nhận khoảng một nửa số tổn thất đào tạo trong một vài kỷ nguyên liên tiếp!
Josiah Yoder

Là dữ liệu đào tạo của bạn đại diện của dữ liệu dev?
dter

Tôi ngẫu nhiên chia dữ liệu thành đào tạo và thử nghiệm. Nó trực quan dường như là một mẫu tốt. Tôi đã làm việc với một vấn đề hồi quy trong đó các phân loại tốt nhất chỉ tốt hơn một chút so với việc luôn dự đoán giá trị trung bình.
Josiah Yoder

Câu trả lời của bạn không nói về tổn thất đào tạo lớn hơn tổn thất xác nhận, đó là câu hỏi đã được hỏi. Bạn tập trung hơn vào Mất đào tạo và mất kiểm tra
enjal

6

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


1
Cảm ơn @ Mans007, điều này đã xảy ra với tôi và tôi đang sử dụng Keras. Các lớp định mức hàng loạt là nguyên nhân.
Roei Bahumi

4

Một khả năng khác kết hợp cả câu trả lời của @cdeterman@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.


2

Tôi đã nhận được kết quả tương tự (mất kiểm tra thấp hơn đáng kể so với mất đào tạo). Khi tôi loại bỏ việc bỏ học chính quy, cả hai mất mát gần như bằng nhau.


0

@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.


0

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.


0

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ệ.


0

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
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.