유효성 검사 오류가 교육 오류보다 작습니까?


57

나는 이 문제에 관해 여기여기 에 두 가지 질문을 찾았 지만 아직 명확한 대답이나 설명이 없습니다 .Convolution Neural Network의 유효성 검사 오류가 훈련 오류보다 작은 동일한 문제를 시행합니다. 그게 무슨 뜻이야?


교차 검증 및 테스트 모두에서 MSE에 대해 관찰 된 편차뿐만 아니라 절대 훈련 (cv) 및 테스트 사례 수를 모르면이 질문에 대답 할 수 없다고 생각합니다.
cbeleites

데이터 셔플
user0

우리는 이것으로부터 무엇을 추론합니까? 예, 드롭 아웃 및 batchnorm 레이어가있는 고밀도 네트워크에서 생성됩니다. ! [여기에 이미지 설명을 입력하십시오 ] ( i.stack.imgur.com/KX1Fz.png )
Srinath

답변:


69

실제 방법론 (예 : 교차 유효성 검사 방법, 성능 메트릭, 데이터 분할 방법 등)을 모르면 확실하지 않습니다.

그러나 일반적으로 교육 오류는 거의 항상 유효성 검사 오류를 과소 평가 합니다. 그러나 유효성 검사 오류가 훈련보다 작을 수 있습니다. 두 가지 방법으로 생각할 수 있습니다.

  1. 훈련 세트에는 많은 '어려운'사례가있었습니다
  2. 검증 세트는 대부분 '쉬운'사례를 예측했습니다.

따라서 모델 훈련 방법론을 실제로 평가하는 것이 중요합니다. 제대로 훈련하기 위해 데이터를 분할하지 않으면 결과가 단순히 잘못된 것이 아니라도 혼란 스러울 수 있습니다.

모델 평가는 네 가지 범주로 생각합니다.

  1. 언더 피팅 – 검증 및 교육 오류가 높음

  2. 과적 합 – 유효성 검사 오류가 높고 교육 오류가 적습니다.

  3. 적합 – 유효성 검사 오류가 낮고 훈련 오류보다 약간 높음

  4. 알 수없는 맞춤-유효성 검사 오류 낮음, 교육 오류 '높음'

결과는 머신 러닝이 작동하는 방식에 반 직관적이기 때문에 '알 수 없음'이라고 말합니다. ML의 본질은 미지의 것을 예측하는 것입니다. '학습 한 것'보다 미지수를 더 잘 예측할 수 있다면 AFAIK는 훈련과 검증 사이의 데이터가 어떤면에서 달라야합니다. 이는 데이터 분할 방법을 재평가하거나 더 많은 데이터를 추가하거나 성능 메트릭을 변경해야한다는 것을 의미 할 수 있습니다 (실제로 원하는 성능을 측정하고 있습니까?).

편집하다

이전 파이썬 라자냐 질문에 대한 OP의 참조를 다루기 위해 .

따라서 교차 유효성 검사가 필요하지 않을 정도로 충분한 데이터가 있고 단순히 교육, 유효성 검사 및 테스트 데이터 하위 집합이 있음을 나타냅니다. 이제 라자냐 튜토리얼 을 보면 페이지 상단에 동일한 동작이 표시되는 것을 볼 수 있습니다. 저자가 이상하다면 그 결과를 게시 할 것이라고 믿기가 어려울 것입니다. 그러나 그들이 정확하다고 가정하는 대신 더 자세히 살펴 봅시다. 여기서 가장 관심이있는 섹션은 훈련 루프 섹션에 있으며 하단 바로 위에 손실 매개 변수가 어떻게 계산되는지 볼 수 있습니다.

훈련 손실이 과다 계산되는 전체 훈련 데이터 집합 . 마찬가지로 유효성 검사 손실전체 유효성 검사 데이터 집합에 대해 계산 됩니다. 훈련 세트는 일반적으로 검증 (80-20)의 4 배 이상입니다. 모든 샘플에 대해 오류가 계산되면 유효성 검사 세트의 손실 측정 값을 최대 약 4 배까지 기대할 수 있습니다. 그러나 교육이 계속됨에 따라 교육 손실과 유효성 검사 손실이 서로 다가오고 있음을 알 수 있습니다. 훈련 오류가 유효성 검사 오류보다 낮은 얻을 시작하면 이것은 의도적 인 당신이 모델을 overfit 시작된다!

이것이 오류를 명확히하기를 바랍니다.


2
좋은 대답입니다. 또한 코드에 버그가있을 수 있으므로 훈련이 훈련 세트에 대한 최적의 솔루션으로 수렴되지 않았을 수 있습니다. 또는 훈련 목표가 볼록하지 않고 훈련 알고리즘이 검증 세트에 적합한 로컬 최소값으로 수렴하는 경우.
Sobi

@ cdeterman thanks. RMSE를 성능 지표로 사용합니다. 데이터를 테스트의 경우 20 %, 교육 및 검증의 경우 80 %로 나눕니다 (훈련 데이터의 20 %가 유효성 검증 오류를 계산하기 위해 교차 검증됩니다). 실제로 유효성 검사 오류는 낮으며 훈련 오류보다 약간 낮습니다. 테스트 오류는 교육 및 유효성 검사 오류보다 높습니다. 우리는 필기 인식에 대한 MNISTdataset에서 비슷한 경우 찾을 수 stats.stackexchange.com/questions/178371/...
Bido

@Bido에서 가장 최근에 편집 한 내용이 질문입니까?
cdeterman

@cdeterman 감사합니다. 방금 답변을 편집 한 것으로 나타났습니다. 명확하고 도움이됩니다.
Bido

몇 가지 그래프를 추가 할 수 있다면 훌륭한 설명이 될 수 있습니다. – 최상의 결과 일 것입니다
Taras Matsyk

109

한 가지 가능성 : 네트워크에서 드롭 아웃 정규화 계층을 사용하는 경우 유효성 검사 오류가 교육 오류보다 작은 것이 합리적입니다. 일반적으로 학습시 드롭 아웃이 활성화되지만 유효성 검사 세트에서 평가할 때는 비활성화됩니다. 후자의 경우 더 매끄러운 (보통 더 나은 의미) 기능을 얻습니다.


12
간단하고 현명한 답변입니다!
rajb245

4
그렇습니다. 이것은 정답으로 표시되어야합니다.
Simanas 2016 년

2
드롭 아웃 레이어를 제거했지만 처음에는 검증 손실이 교육 손실보다 낮습니다. (나도 레이어에 정규화를 지정하지 않았습니다!)
Josiah Yoder

내 경우에 적합합니다. 많은 드롭 아웃 사용.
앙드레 크리스토퍼 앤더슨

@JosiahYoder-이것에 대해 더 공유 할 것이 있습니까? 1650 개의 입력 기능이 있습니다. 네트워크를 작게 (1650, 50, 1) 드롭 아웃하거나 드롭 아웃하지 않으면 초기 에포크의 교육 오류가 유효성 검사 오류보다 높습니다. 대규모 네트워크 (1650, 1200, 800, 100 ..... 10 셀룰러 활성화와 함께 약 10 개 레이어)를 사용할 때 더 높은 유효성 검사 정확도의 이상한 패턴이 다소 완화됩니다.
MiloMinderbinder

19

@DK의 답변에 대한 의견이 충분하지 않지만 Keras의 설명서에 대한 FAQ로 답변됩니다.

"훈련 손실이 테스트 손실보다 훨씬 높은 이유는 무엇입니까?

Keras 모델에는 교육과 테스트의 두 가지 모드가 있습니다. Dropout 및 L1 / L2 가중치 정규화와 같은 정규화 메커니즘은 테스트시 해제됩니다.

또한 훈련 손실은 각 훈련 데이터 배치에 대한 손실의 평균입니다. 시간이 지남에 따라 모델이 변경되기 때문에 에포크의 첫 번째 배치에 대한 손실은 일반적으로 마지막 배치에 비해 높습니다. 다른 한편으로, 에포크의 테스트 손실은 에포크의 끝에서와 같이 모델을 사용하여 계산되어 손실이 더 적습니다. "


1
이것도 질문에 완전히 대답하지는 않습니다. 드롭 아웃이 비활성화 된 상태에서도 몇 번의 에포크에 대한 교육 손실의 절반 정도가 유효성 검사 손실로 표시됩니다.
Josiah Yoder

교육 데이터가 개발자 데이터를 대표합니까?
dter

데이터 세트를 무작위로 훈련과 테스트로 나누었습니다. 시각적으로 좋은 샘플 인 것처럼 보입니다. 최고의 분류 기준이 항상 평균값을 예측하는 것보다 약간 더 나은 회귀 문제를 연구하고있었습니다.
Josiah Yoder

귀하의 답변은 요청 된 질문 인 유효성 검사 손실보다 큰 훈련 손실에 대해 이야기하지 않습니다. 교육 손실 및 테스트 손실
enjal

6

내 2 센트 : 드롭 아웃 레이어가 없어도 동일한 문제가 발생했습니다. 제 경우에는 배치 표준 레이어가 범인이었습니다. 내가 그들을 삭제했을 때-훈련 손실은 검증 손실과 비슷해졌습니다. 아마 훈련 배치 표준이 주어진 입력 배치의 평균과 분산을 사용하기 때문에 발생했습니다. 이는 배치마다 다를 수 있습니다. 그러나 평가 중에 배치 규범은 실행 평균과 분산을 사용하며, 둘 다 훈련 중 단일 배치의 평균 및 분산보다 전체 훈련 세트의 특성을 훨씬 더 잘 반영합니다. 적어도 pytorch에서 batch-norm이 구현되는 방식입니다.


1
@ Mans007에게 감사드립니다. 이것은 저에게 있었고 Keras를 사용하고있었습니다. 배치 표준 층이 원인이었습니다.
Roei Bahumi

4

의 답을 모두 결합하여 또 다른 가능성 @cdeterman@DK 일부 데이터 증가 메커니즘을 사용하는 경우 어떤 방법입니다. 실제로 데이터 보강은 일반적으로 검증 세트가 아닌 훈련 세트에서만 수행되며 (드롭 아웃 정규화와 같이) 이는 훈련 세트의 경우보다 예측하기 쉬운 "더 쉬운"사례를 포함하는 검증 세트로 이어질 수 있습니다.


2

비슷한 결과를 얻었습니다 (테스트 손실은 교육 손실보다 훨씬 낮았습니다). 드롭 아웃 정규화를 제거하면 두 손실이 거의 동일 해졌습니다.


0

@cdeterman과 @DK는 좋은 설명이 있습니다. 하나 더 이유를 원합니다- data leakage. 열차 데이터의 일부는 테스트 데이터와 "밀접한 관련이 있습니다".

잠재적 인 예 : 애완 동물 한 마리당 500 마리의 비슷한 사진을 가진 1000 마리의 개와 1000 마리의 고양이가 있다고 가정 해 봅시다 (일부 소유자는 애완 동물을 매우 비슷한 위치에서 사진을 찍는 것을 좋아합니다). 따라서 무작위 70/30 분할을 수행하면 열차 데이터의 데이터 누출이 테스트 데이터로 전달됩니다.


0

간단히 말해 훈련 손실과 검증 손실이 올바르게 계산되면 훈련 손실이 검증 손실보다 높은 것은 불가능합니다. 역 전파는 학습 세트에서 계산 된 오류를 직접 줄이고 보증 세트에서 계산 된 오류를 간접적으로 만 줄이기 때문입니다.

훈련 및 검증 중에 다른 몇 가지 추가 요소가 있어야합니다. 탈락은 좋은 것이지만 다른 것들도있을 수 있습니다. 사용중인 라이브러리의 설명서를 확인하십시오. 모델과 레이어는 일반적으로 우리가 일반적으로 관심을 갖지 않는 기본 설정을 가질 수 있습니다.


0

교육 오류보다 낮은 유효성 검사는 드롭 아웃과 관련된 변동으로 인해 발생할 수 있지만 장기적으로 지속되는 경우 교육 및 유효성 검사 데이터 세트가 실제로 동일한 통계 앙상블에서 도출되지 않았 음을 나타낼 수 있습니다. 이것은 예제가 시리즈에서 나온 것이고 교육 및 유효성 검사 데이터 세트를 올바르게 무작위 화하지 않은 경우 발생할 수 있습니다.


0

현재 확률 적 그라디언트 기반 방법은 거의 항상 딥 러닝을위한 알고리즘입니다. 이는 데이터가 배치로 제공되고 그라디언트가 계산되고 매개 변수가 업데이트됨을 의미합니다. 즉, 각 배치를 선택할 때 데이터 손실을 계산할 수도 있습니다. 이 프레임 워크 에서 손실을 계산하는 방법에는 두 가지 방법 이 있습니다. 내가 생각할 수 있는 방법 은 훈련 오류가 유효성 검사 오류보다 크다는 현상을 초래할 수 있습니다. 아래에서 Keras는 실제로 이러한 방식으로 샘플 내 오류를 계산하는 것으로 나타납니다.

1.) 훈련 오류는 전체 시대에 걸쳐 평균화되는 것이 아니라, 시대 전체의 끝에서 한 번에 모두 평균화되지만 유효성 검사 오류는 시대 전체의 끝에서만 발생합니다. 유효성 검사 오류에는 완전히 업데이트되는 이점이 있지만 훈련 오류에는 업데이트 횟수가 적은 오류 계산이 포함됩니다. 물론 무증상으로이 효과는 일반적으로 사라져야합니다.

2) 배치 업데이트가 완료 되기 전에 교육 오류가 계산 됩니다. 확률 적 그라디언트 기반 방법에서는 약간의 그라디언트 노이즈가 있습니다. 언덕을 오르는 동안 모든 훈련 샘플에서 계산 된 전체 손실이 감소 할 가능성이 높습니다. 그러나 모드에 매우 가까워지면 배치 의 샘플 대해 업데이트 방향이 음수입니다 . 우리는 모드 주위에 수신 거부하기 때문에 그러나, 이는 평균적으로 우리가 샘플에 대한 긍정적 인 방향으로 선택해야 아웃배치의. 이제 주어진 배치의 샘플과 관련하여 업데이트하려고 할 때, 포함되지 않은 많은 배치 업데이트에 의해 업데이트 전에 손실을 계산하여 샘플이 푸시되었다는 것을 의미합니다. 분석법은 데이터 세트의 다른 샘플에 가장 유리한 매개 변수를 제공하여 예상 손실에서 약간의 상향 편향을 제공합니다.

무증상이지만 (1)의 효과는 사라지고 (2)는 그렇지 않습니다! 아래에서 Keras는 (1)과 (2)를 모두 수행하는 것으로 보입니다.

(1) 측정 항목이 한 번에 한꺼번에 발생하지 않고 에포크 단위로 각 배치에 대해 평균화되었음을 보여줍니다. 첫 번째 에포크에서 val_accuracy를 선호하는 샘플 정확도의 val_accuracy 차이에 주목하십시오. 이는 일부 샘플 업데이트 오류가 배치 업데이트가 거의없이 계산 되었기 때문입니다.

>>> 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) 각 배치마다 업데이트 전에 표시 오류가 계산됩니다 . 에포크 1의 경우 batch_size = nRows(즉, 한 배치의 모든 데이터를 사용하는 경우 ) 샘플 내 오류는 에포크 1에 대해 약 0.5 (무작위 추측)이지만 유효성 검사 오류는 0.82입니다. 따라서 배치 업데이트 전에 샘플 내 오류가 계산 되고 배치 업데이트 후에 유효성 검사 오류가 계산 되었습니다 .

>>> 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.