조기 중지를 위해 어떤 매개 변수를 사용해야합니까?


100

Keras를 사용하여 프로젝트를 위해 신경망을 훈련하고 있습니다. Keras는 조기 중지 기능을 제공했습니다. 조기 중지를 사용하여 신경망이 과적 합되는 것을 방지하기 위해 어떤 매개 변수를 관찰해야하는지 알 수 있습니까?

답변:


160

조기 중지

조기 중지는 기본적으로 손실이 증가하기 시작하면 (즉, 유효성 검사 정확도가 감소하기 시작하면) 훈련을 중지하는 것입니다. 문서 에 따르면 다음과 같이 사용됩니다.

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

값은 구현 (문제, 배치 크기 등)에 따라 다르지만 일반적으로 과적 합을 방지하기 위해 사용합니다.

  1. monitor 인수를 로 설정하여 유효성 검사 손실을 모니터링합니다 (교차 유효성 검사 또는 최소한 훈련 / 테스트 세트를 사용해야 함) 'val_loss'.
  2. min_delta일부 시대의 손실을 개선으로 정량화할지 여부에 대한 임계 값입니다. 손실의 차이가. 이하 min_delta이면 개선이없는 것으로 정량화됩니다. 손실이 악화 될 때 관심이 있으므로 0으로 두는 것이 좋습니다.
  3. patience인수는 손실이 증가하기 시작하면 (개선이 중지됨) 중지되기 전 에포크 수를 나타냅니다. 이것은 구현에 따라 다르며, 매우 작은 배치 또는 큰 학습률 을 사용하는 경우 손실 지그재그 (정확도는 더 시끄러움)이므로 큰 patience인수를 설정하는 것이 좋습니다 . 큰 배치작은 학습률 을 사용하면 손실이 더 부드러워 져 더 작은 patience인수를 사용할 수 있습니다 . 어느 쪽이든 2로 남겨 두어 모델에 더 많은 기회를 줄 것입니다.
  4. verbose 인쇄 할 내용을 결정하고 기본값 (0)으로 둡니다.
  5. mode인수는 모니터링 된 수량의 방향 (감소 또는 증가)에 따라 달라집니다. 손실을 모니터링하므로 min. 하지만 keras가 우리를 위해 처리하도록 놔두고auto

그래서 저는 이와 같은 것을 사용하고 조기 중지를 사용하거나 사용하지 않고 오류 손실을 플로팅하여 실험합니다.

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

콜백 작동 방식에 대한 모호성을 위해 더 설명하려고합니다. fit(... callbacks=[es])모델 을 호출하면 Keras는 지정된 콜백 객체에 미리 지정된 함수를 호출합니다. 이 함수를 호출 할 수 있습니다 on_train_begin, on_train_end, on_epoch_begin, on_epoch_endon_batch_begin, on_batch_end. 조기 중지 콜백은 모든 Epoch 종료시 호출되며, 최상의 모니터링 값을 현재 값과 비교하고 조건이 충족되면 중지됩니다 (최적 모니터링 값을 관찰 한 이후 몇 Epoch가지나 갔는지 인내 인수 이상입니까? 마지막 값은 min_delta 등보다 큽니다.).

@BrentFaust가 주석에서 지적했듯이 모델의 학습은 조기 중지 조건이 충족되거나 epochs매개 변수 (기본값 = 10) 가 충족 될 때까지 계속됩니다 fit(). 조기 중지 콜백을 설정해도 모델이 epochs매개 변수 이상으로 학습되지 않습니다 . 따라서 fit()더 큰 epochs값으로 함수를 호출 하면 Early Stopping 콜백에서 더 많은 이점을 얻을 수 있습니다.


3
@AizuddinAzman close min_delta는 모니터링 된 값의 변화를 개선으로 정량화할지 여부에 대한 임계 값입니다. 그래서 예, 우리가 주면 monitor = 'val_loss'현재 검증 손실과 이전 검증 손실의 차이를 나타냅니다. 실제로 min_delta=0.10.1보다 작은 유효성 검사 손실 (현재-이전)을 줄이면 정량화되지 않으므로 훈련이 중지됩니다 (있는 경우 patience = 0).
umutto

3
callbacks=[EarlyStopping(patience=2)]신 (新) 시대가 부여되지 않는 한, 아무 효과가 없습니다 model.fit(..., epochs=max_epochs).
Brent Faust

1
@BrentFaust 그것은 저의 이해이기도합니다. 모델이 최소 10 epoch (기본값)로 훈련되고 있다는 가정하에 답변을 작성했습니다. 귀하의 의견 후에 프로그래머 epoch=1가이 콜백이 실패하는 for 루프 (다양한 사용 사례의 경우)에서 fit with 를 호출하는 경우가있을 수 있음을 깨달았습니다 . 내 대답에 모호성이 있으면 더 나은 방식으로 설명하려고 노력할 것입니다.
umutto

4
@AdmiralWen 답변을 작성한 이후로 코드가 약간 변경되었습니다. 최신 버전의 Keras를 사용하는 경우 restore_best_weights학습 후 최적의 가중치로 모델을로드하는 인수 (아직 문서에 없음)를 사용할 수 있습니다 . 그러나 귀하의 목적을 위해 ModelCheckpoint콜백을 save_best_only인수 와 함께 사용 합니다. 문서를 확인할 수 있습니다. 사용하기는 간단하지만 훈련 후 최고의 가중치를 수동으로로드해야합니다.
umutto

1
@umutto 안녕하세요 restore_best_weights의 제안에 감사드립니다. 그러나 사용할 수 없습니다.`es = EarlyStopping (monitor = 'val_acc', min_delta = 1e-4, patience = patience_, verbose = 1, restore_best_weights = True) TypeError : __init __ ()에 예기치 않은 키워드 인수 'restore_best_weights'`가 있습니다. 어떤 아이디어? keras 2.2.2, tf, 1.10 버전은 무엇입니까?
Haramoz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.