Những thông số nào nên được sử dụng để dừng sớm?


97

Tôi đang đào tạo mạng nơ-ron cho dự án của mình bằng Keras. Keras đã cung cấp một chức năng để dừng sớm. Tôi có thể biết những thông số nào cần được quan sát để tránh mạng nơ-ron của tôi bị quá tải bằng cách dừng sớm không?

Câu trả lời:


156

dừng lại sớm

Dừng sớm về cơ bản là dừng việc đào tạo khi khoản lỗ của bạn bắt đầu tăng lên (hay nói cách khác là độ chính xác của việc xác nhận bắt đầu giảm). Theo các tài liệu nó được sử dụng như sau;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

Giá trị phụ thuộc vào việc triển khai của bạn (sự cố, kích thước lô, v.v.) nhưng nói chung để tránh trang bị quá mức, tôi sẽ sử dụng;

  1. Theo dõi việc mất xác thực (cần sử dụng xác thực chéo hoặc ít nhất là bộ huấn luyện / kiểm tra) bằng cách đặt monitor đối số thành 'val_loss'.
  2. min_deltalà một ngưỡng để xác định liệu lượng lỗ tại một số kỷ nguyên có được cải thiện hay không. Nếu chênh lệch lỗ dưới đây min_delta, nó được định lượng là không cải thiện. Tốt hơn nên để nó là 0 vì chúng ta quan tâm đến thời điểm tổn thất trở nên tồi tệ hơn.
  3. patienceđối số đại diện cho số kỷ nguyên trước khi dừng lại khi khoản lỗ của bạn bắt đầu tăng lên (ngừng cải thiện). Điều này phụ thuộc vào việc triển khai của bạn, nếu bạn sử dụng các lô rất nhỏ hoặc tỷ lệ học tập lớn theo đường zig-zag mất mát của bạn (độ chính xác sẽ ồn ào hơn) vì vậy tốt hơn nên đặt một patienceđối số lớn . Nếu bạn sử dụng các lô lớntỷ lệ học tập nhỏ, việc thua lỗ của bạn sẽ suôn sẻ hơn, vì vậy bạn có thể sử dụng một patienceđối số nhỏ hơn . Dù bằng cách nào, tôi sẽ để nó là 2 vì vậy tôi sẽ cho người mẫu nhiều cơ hội hơn.
  4. verbose quyết định những gì sẽ in, để nó ở mặc định (0).
  5. modeđối số phụ thuộc vào hướng số lượng được theo dõi của bạn (nó được cho là đang giảm hay tăng), vì chúng tôi theo dõi tổn thất, chúng tôi có thể sử dụng min. Nhưng hãy để keras xử lý điều đó cho chúng tôi và đặt nó thànhauto

Vì vậy, tôi sẽ sử dụng một cái gì đó như thế này và thử nghiệm bằng cách vẽ biểu đồ tổn thất lỗi có và không có điểm dừng sớm.

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

Đối với sự mơ hồ có thể xảy ra về cách hoạt động của lệnh gọi lại, tôi sẽ cố gắng giải thích thêm. Khi bạn gọi fit(... callbacks=[es])trên mô hình của mình, Keras sẽ gọi các đối tượng gọi lại đã cho các hàm được xác định trước. Các chức năng này có thể được gọi on_train_begin, on_train_end, on_epoch_begin, on_epoch_endon_batch_begin, on_batch_end. Gọi lại dừng sớm được gọi trên mọi kết thúc kỷ nguyên, so sánh giá trị được giám sát tốt nhất với giá trị hiện tại và dừng nếu các điều kiện được đáp ứng (bao nhiêu kỷ nguyên đã qua kể từ khi quan sát giá trị được theo dõi tốt nhất và nó không chỉ là đối số kiên nhẫn, sự khác biệt giữa giá trị cuối cùng lớn hơn min_delta, v.v.).

Như được chỉ ra bởi @BrentFaust trong phần nhận xét, quá trình đào tạo của mô hình sẽ tiếp tục cho đến khi đáp ứng các điều kiện Dừng sớm hoặc epochstham số (mặc định = 10) trong fit()được thỏa mãn. Đặt lệnh gọi lại Dừng sớm sẽ không làm cho mô hình đào tạo vượt quá epochstham số của nó . Vì vậy, fit()hàm gọi với epochsgiá trị lớn hơn sẽ được hưởng lợi nhiều hơn từ lệnh gọi lại Dừng sớm.


3
@AizuddinAzman đóng, min_deltalà một ngưỡng để đánh giá liệu lượng thay đổi trong giá trị được giám sát như một sự cải thiện hay không. Vì vậy, có, nếu chúng tôi đưa ra monitor = 'val_loss'thì nó sẽ đề cập đến sự khác biệt giữa mất xác thực hiện tại và mất xác thực trước đó. Trong thực tế, nếu bạn đưa ra min_delta=0.1mức giảm mất xác thực (hiện tại - trước đó) nhỏ hơn 0,1 sẽ không định lượng được, do đó sẽ ngừng đào tạo (nếu bạn có patience = 0).
umutto

3
Lưu ý rằng callbacks=[EarlyStopping(patience=2)]không có tác dụng, trừ khi các kỷ nguyên được đưa ra model.fit(..., epochs=max_epochs).
Brent Faust

1
@BrentFaust Đó cũng là hiểu biết của tôi, tôi đã viết câu trả lời dựa trên giả định rằng mô hình đang được đào tạo với ít nhất 10 kỷ nguyên (theo mặc định). Sau nhận xét của bạn, tôi nhận ra rằng có thể có trường hợp lập trình viên đang gọi phù hợp epoch=1trong vòng lặp for (cho các trường hợp sử dụng khác nhau) trong đó việc gọi lại này sẽ không thành công. Nếu có sự mơ hồ trong câu trả lời của tôi, tôi sẽ cố gắng giải thích nó theo cách tốt hơn.
umutto

4
@AdmiralWen Vì tôi đã viết câu trả lời, mã đã thay đổi một chút. Nếu bạn đang sử dụng phiên bản Keras mới nhất, bạn có thể sử dụng restore_best_weightsđối số (chưa có trong tài liệu), đối số này tải mô hình với trọng lượng tốt nhất sau khi tập luyện. Tuy nhiên, cho mục đích của bạn, tôi sẽ sử dụng ModelCheckpointcallback với save_best_onlyđối số. Bạn có thể kiểm tra tài liệu hướng dẫn sử dụng nhưng bạn cần phải tự nạp tạ tốt nhất sau khi tập.
umutto

1
@umutto Xin chào, cảm ơn vì đề xuất của restore_best_weights, tuy nhiên tôi không thể sử dụng nó, `es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, patin = patbose_, verbose = 1, restore_best_weights = True) TypeError: __init __ () có đối số từ khóa không mong muốn 'restore_best_weights' '. Có ý kiến ​​gì không? keras 2.2.2, tf, 1.10 phiên bản của bạn là gì?
Haramoz 23/09/18
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.