본문 바로가기
Coursera 강의/Deep Learning

ML Strategy 2-1 (Error Analysis, Data mismatched)

by 별준 2020. 10. 28.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 세 번째 강의 Structuring Machine Learning Projects를 듣고 정리한 내용입니다. (Week 2)

 

- Error Analysis

[Carrying out error analysis]

학습 알고리즘을 개발하면서 아직 학습 알고리즘이 인간레벨 수준의 성능에 미치지 못한다면, 수작업으로 알고리즘의 error들을 점검하는 것이 도움이 될 수 있다.

이런 프로세스를 Error Analysis라고 한다. 

 

고양이 판별기를 예제로 살펴보도록 하자. 

고양이를 분류하기 위한 학습 알고리즘을 개발하고 있고, 그 결과 90%의 정확도에 도달했다고 가정한다면, dev set에서 10%의 error를 가지고 있다고 볼 수 있고, 이 수치는 우리가 원하는 결과는 아닐 것이다. 이런 경우에 할 수 있는 것중 하나는 학습 알고리즘이 분류한 example들을 보면서 잘못 분류하는 것들을 찾을 수 있다. 강아지 사진을 고양이로 잘못 분류하는 경우와 같은 것들을 찾는 것이다.

위의 2가지 경우의 강아지 사진을 보면, 학습 알고리즘이 고양이처럼 보고 고양이로 판단할 수도 있다. 

문제를 해결하기 위해서 알고리즘을 더 강화할 수 있는데, 강아지 사진을 더 수집하거나, 강아지에 특화된 feature들을 디자인할 수 있을 것이다. 

 

우리는 강아지를 고양이로 인식하는 문제를 해결하기 위해서 우리는 위의 방법을 바로 시도하면 될까?

알고리즘에서 강아지 사진을 잘못 인식하는 것을 수정하는데 수개월의 시간이 걸릴 수도 있을 것이다. 과연 위의 방법들이 실제로 도움이 되는지 알 수 없으며, 그 방법을 사용해서 수개월이 지난 후에서야 성능이 좋아지지 않았다는 것을 발견할 수 있다.

 

이런 상황에서 Error Analysis가 어떤 방법이 시도해볼만한 방법인지를 가이드라인을 제시할 수 있다.

방법은 다음과 같다.

대략 100개의 mis-label된 dev set example을 뽑아서 수작업으로 검사한다. 그리고, 100개의 잘못 분류된 dev set example중에서 5%가 강아지 사진이라고 가정해보자. 즉, 잘못 분류된 100개의 dev set example 중에서 5개만이 강아지 사진이라는 것이고, 이것은 강아지 사진을 제대로 인식하도록 수정을 했더라도 100개 중에서 5개만이 제대로 분류된다는 의미이다. Error의 5%만이 수정되어서, dev set error를 10%에서 9.5%까지만 줄일 수 있다는 의미이다. 

합리적으로 생각했을 때, 강아지 사진을 제대로 인식하도록 강화하는 방법은 효율적이지 못하다는 것이다.

 

이렇게 Error Analysis를 수행하면, 강아지 인식 문제에 투자하는 것이 얼마나 도움이 되는지와 같은 가이드라인을 제시해준다.

 

이번에는 100개의 잘못 분류된 example에서 50장이 강아지 사진이라고 가정해보면, 강아지 인식 문제에 시간을 투자하는 것이 조금 더 효율적으로 느껴질 수 있다. 이와 같은 경우에는 만약 강아지 문제를 해결한다면, dev error를 10%에서 5%까지 감소시킬 수 있기 때문이다. 따라서 시도할만한 방법이 될 수 있다.

 

수작업이지만, 짧은 시간의 분석으로 어떤 방법에 포커스를 두어야하는지 알려주며 훨씬 더 좋은 결정을 내릴 수 있고, 시간을 절약하게 해준다.

 

Error Analysis에서 여러가지 오류 원인들을 parallel하게 분석해서 평가할 수도 있다.

고양이 이미지를 인식하는데, 강아지를 고양이로 잘못 인식할 수도 있고, 사자나 표범, 치타(Great Cat)를 고양이로 잘못 인식할 수도 있고, 사진이 흐릿해서 잘못 분류할 수도 있다. 이렇게 성능을 개선하기 위한 다양한 idea를 가지고 Error Analysis를 진행하는 것이다.

다양한 방법이 있겠지만, 위와 같은 방식으로 분석을 진행할 수 있다. 행은 잘못 인식된 사진들의 index에 해당하고, 열은 강아지 인식 문제, Great Cat 인식 문제, 흐릿한 이미지 문제에 해당한다. 그래서 잘못 인식된 이미지가 어떠한 문제를 가지고 있는지 확인하고, 필요하다면 코멘트도 남겨둔다. 기억해야될 것은 이 잘못 분류된 이미지들이 dev set example에서 추출되었다는 것이다.

 

Error Analysis를 진행하고 이미지 리뷰가 끝났다면, 100개의 example에서 각 문제점이 몇 %를 차지하는지 수치로 정리한다. 여기서는 강아지 인식 문제가 8%, Great Cat 인식 문제가 43%, 흐릿한 이미지 문제가 61%로 나타났다. 이렇게 진행하다보면, 또 다른 문제점을 발견할 수도 있는데(예를 들어서, 인스타그램의 사진 필터로 인한 문제), 이런 경우에는 열에 추가해서 다시 체크하고, 몇 %를 차지하는지 확인한다.

 

이 절차를 모두 끝내면, 어떤 문제에 대해서 개선을 하는 것이 가장 효율적인지 추정할 수 있다. 위와 같은 경우에는 흐릿한 이미지에서 많은 Error가 있고, Great Cat에 대한 Error로 꽤 많았다. 따라서, 분석 결과가 무조건 흐릿한 이미지 문제를 개선해야된다는 아니다. 이 분석 결과는 직접적으로 답을 내려주는 것이 아니라, 어떤 것을 선택해야되는지 수치적인 가이드라인을 제시하는 것이다. 강아지 인식 문제를 개선하면 8%까지밖에 개선을 하지 못한다거나, Great Cat 인식 문제를 개선하면 43%정도 개선이 가능하다라는 것을 말해주는 것이다. 이 분석은 각 문제에 따라서 성능을 개선하는 부분에 있어서 특정한 한계치를 나타내고 있는데, 여기서는 great cat에 대해서 개선하는 방법과 흐릿한 이미지에 대한 개선을 하는 방법 중에 선택하는 경우가 있을 수 있고, 또는 여유가 많다면 두개의 팀으로 나누어서 한팀은 great cat 인식 문제를 개선하고, 다른 한팀은 흐릿한 이미지 인식 문제를 개선하는 방법을 선택할 수도 있다.

 

이렇게 수작업으로 분석하는 것은 시간이 꽤 짧게 소요되는데, 그럼에도 불구하고 우리가 해야되는 것들 중에서 우선순위를 정하는데 많은 도움을 주고, 접근 방법에 대한 효율을 수치적으로 측정할 수 있다.

 

[Cleaning up incorrectly labeled data]

Supervised Learning의 데이터는 입력 X와 결과 Y Label로 이루어져 있는데, 데이터를 확인하다가 결과값 Y가 다르다는 것을 확인해서 데이터가 잘못되었다는 것을 찾는다면 어떻게 될까? 이런 데이터의 레이블을 수정하는 것이 효과적일까?

 

고양이 분류기에서 사진이 고양이인 경우에는 Y가 1이고, 고양이가 아닌 경우에는 Y가 0의 값을 갖는다.

위와 같은 경우에는 강아지를 1로 잘못 레이블되어 있다. 이런 경우에 mislabeled example이라는 용어를 사용하지 않고, incorrectly labeled example이라고 할 것이다(mislabeled example은 학습 알고리즘이 잘못된 Y값으로 레이블할 때를 사용한다). 여기서는 training set이나 dev/test set에 있는 dataset에서 잘못 레이블된 Y값은 사실 0이어야 되며, dataset을 레이블한 사람이 잘못 입력했을 수 있다. 이렇게 데이터에 잘못 레이블된 example이 있으면 어떻게 해야할까?

 

우선 training set에서 고려해보면, 딥러닝 알고리즘은 training set에서 random error에 대해서 상당히 견고하다는 것이 밝혀져있다. 따라서, 이렇게 잘못 레이블된 example들이 고의적으로 발생한 것이 아니라, 단순 실수에 의한 것이고 랜덤으로 발생되었다고 한다면, 이 error는 그대로 두어도 괜찮고, 고치는데 많은 시간을 쏟을 필요가 없다. 물론 training set를 살펴보면서 직접 검사하고 수정해도 나쁠 것은 없다. 하지만, 전체 dataset의 크기가 충분히 크고, error의 %가 너무 크지만 않다면, 굳이 수정하지 않아도 괜찮으며, 실제로 training set의 레이블에서 error가 있음에도 정상적으로 동작하는 머신러닝 알고리즘들이 많다.

 

하지만, 딥러닝 알고리즘은 systemic errors에 대해서는 문제가 발생할 수 있다. 예를 들어서, dataset의 레이블을 담당하는 사람이 지속적으로 흰색 강아지를 고양이로 레이블했다면, 분류기가 모든 흰색 강아지를 고양이로 분류하도록 배울 수 있기 때문에 문제가 될 수 있다.

 

만약 dev set이나 test set에서 잘못 레이블된 example들이 있다면 어떨까?

이런 문제가 우려스럽다면, 추천하는 방법은 Error Analysis를 진행하면서, 카테고리를 추가해서 잘못 레이블된 example의 %를 구하는 것이다. 

(가끔 잘못 레이블된 example들을 살펴보면, 학습 알고리즘이 잘못 분류한 것이 아니라, 데이터를 레이블한 사람이 미처 뒷배경에 있는 고양이를 보지 못하고 잘못 레이블한 경우도 있을 수 있다.)

그렇게 잘못 레이블된 example의 %를 구한다. 그리고 이 문제를 개선해서 dev set에서 알고리즘의 성능이 현저하게 개선될 수 있다면 레이블이 잘못된 것을 수정하라고 이야기할 수 있지만, 그 성능이 크게 바뀌지 않는다면 효율적이지 않다. 

전체적인 dev set error를 살펴보고 결정하는 것을 추천한다. 이전 예제처럼 10%의 dev error를 가지고 있고, 잘못 레이블된 이미지를 수정해서 개선한다면 10% error 중에서 6%, 즉, 0.6%를 개선할 수 있다는 것이다. 따라서 레이블을 수정한다고 해도 9.4%까지밖에 성능이 개선되지 않는다는 것이고, 이는 매우 비중이 작다고 볼 수 있다.

 

만약 잘못 레이블된 example의 비율이 30%이고, dev error가 2%라면, error의 30%는 0.6%이고, 레이블을 수정하면 error를 1.4%까지 줄일 수 있기 때문에 꽤 비중이 높다고 할 수 있고, 시도할만한 방법이라고 할 수 있다.

 

 

dev set의 주목적은 여러 분류기 사이에서 어떤 것을 선택할 지 도움을 주는 것이다. 만약 classifier A가 2.1% error를 가지고 있고, classifier B가 1.9%의 error를 가지고 있다면, classifier B를 선택할 수 있을 것이다. 하지만, error 중에서 잘못된 레이블로 인한 error가 0.6%라고 한다면, 더이상 B가 더 낫다고 할 수 없다. 그렇다면, 직접 dev set에서 잘못 레이블된 부분을 고치는 것은 좋은 선택이 될 것이다.

 

위 이미지에서 두 가지 예제를 살펴보면, 오른쪽 예제는 dev error가 2%이고, dev error에서 잘못된 레이블로 인한 error가 0.6%이기 때문에 알고리즘에 큰 영향을 끼치고 있다. 반면에, 왼쪽 예제는 10%의 dev error에서 0.6%만이 잘못된 레이블로 인한 error이며, 알고리즘에 끼치는 영향이 더 적다고 볼 수 있다.

 

만약 dev set에서 레이블을 수작업으로 검사하고 직접 고치려고 한다면, 다음의 가이드라인을 추가적으로 고려하는 것을 권장한다.

첫번째로 어떤 방식을 적용하든, dev set과 test set이 계속해서 같은 분포도를 갖도록 해야한다. 따라서, dev set에서 어떤 방법을 사용해서 수정한다면, test set에도 동일하게 적용해야한다.(dev set과 test set은 같은 분포를 갖도록 해야한다)

두번째는 학습 알고리즘에서 잘못 분류한 example뿐만아니라, 제대로 분류한 example들도 포함해서 살펴보아야 한다. 98%의 정확도를 나타낼 때, 틀린 2%만 고치는 게 쉽고, 98%를 검토하는 것은 어렵지만, 고려해볼만 하다.(올바르게 레이블되지 않아서 맞춘 것이 있을 수 있음)

세번째는 train data에도 dev/test data에 적용한 방법을 동일하게 적용할 수 있지만, 적용하지 않아도 된다. 이전에 이야기했듯이 train data를 수정하는 것은 덜 중요한 편이고, 많은 노력을 투자하지 않아도 된다. 따라서, train과 dev/test set의 분포도가 조금 달라도 된다.

 

[Build your first system quickly]

만약 완전히 새롭게 학습 알고리즘 app을 작업한다면, 추천하는 부분은 우선 시스템을 먼저 빠르게 만들고, 반복 테스트 업무를 진행하라는 것이다.

음식 인식 시스템을 예시로 들어보면, 학습 알고리즘을 개발하는데 여러가지 방법들이 있고, 우선순위를 정할 수 있는 것들 또한 많다. 예를 들어서, 시끄러운 주변환경에서 잘 동작하는 음성 인식 시스템을 만들 수 있는 특정한 테크닉이 있거나, 억양이 있는 음성이 더 잘 인식되도록 하는 방법, 스피커가 마이크와 멀리 떨어져 있는 경우에 발생하는 문제를 위한 방법, 어린이들의 음성 인식 방법 등이 있을 수 있다. 일반화시켜서 이야기하자만, 머신러닝 app에서 접근할 수 있는 방법이 50가지가 될 수 있는데, 이 방법들은 모두 합리적이고 시스템 개선에 도움이 될 수 있는 부분이다. 

 

문제는 정확히 어떤 방법을 선택해서 집중하느냐이다. 

해당 분야에서 수년간 개발했더라도, 새로운 app을 만드는 경우에는 쉽게 선택하지 못할 수 있다. 따라서, 새롭게 개발하는 경우에는 우선 시스템을 빠르게 만들고, 반복 테스트를 진행하는 것을 추천한다.

 

  • Set up dev/test set and metric
  • Build initial system quickly
  • Use Bias/Variance anylysis & Error analysis to priority next steps.

구체적으로 우선 dev/test set과 metric을 설정하는 것이다. 결국에는 목표를 어디에 둘지 설정하는 과정이다. 만약 잘못된 경우에는 언제든지 변경할 수 있다. 일단, 목표를 설정하고, 그 다음에 머신러닝 시스템을 우선 만든다. traing set를 수집하고, 학습한 다음 결과를 살펴본다. 그리고 dev/test set과 metric을 통해서 얼마나 잘 동작하는지 살펴보고 이해하는 것이다. 그런 다음에 Bias/Variance analysis나 Error analysis를 사용해서 다음 단계에 대한 우선순위를 지정해서 개선할 수 있다.

 

요약하자면, 초기 시스템으로 우선 학습을 완료하고, 학습 완료된 시스템을 통해 bias/variance를 조절하고, error analysis를 통해서 error를 살펴보고 많은 접근 방법 중에서 우선순위를 정해서 다음 과정을 진행하는 것을 반복하라는 것이다. 

 

물론 이런 가이드가 덜 적용되는 특정 분야도 있을 수 있다. 만약 얼굴인식 시스템을 만든다면, 방대한 자료를 토대로 처음으로 복잡한 시스템을 만드는 것도 괜찮을 것이다. 하지만, 처음으로 문제를 해결해나가는 과정이라면 너무 많은 생각을 하지 말고, 복잡하지 않게 우선 빠르게 시스템을 구축하고 이것을 바탕으로 시스템의 우선순위를 정해서 개선해 나가는 방식으로 접근하는 것을 추천한다.

 

- Mismatched training and dev/test set

딥러닝은 train set이 충분할 때 가장 잘 동작한다. 이런 이유로 많은 개발자들이 단지 단순히 데이터를 최대한 많이 수집하고 training set으로 사용하는 결과를 초래한다. 하지만 이렇게 사용하는 데이터 중에 일부, 혹은 많은 데이터들이 dev/test set과 같은 분포도를 가지지 않을 수 있다. 

 

만약 우리가 사용자들이 핸드폰으로 찍은 사진을 업로드 시키는 앱을 만들고, 앱을 통해 업로드한 사진들이 고양이인지 아닌지 분류하고 싶다고 가정해보자. 그렇다면 우리는 두 가지 종류의 데이터를 얻게 된다. 하나는 우리가 정말 관심있어하는 분포의 데이터(웹페이지에서 얻은 자료)이고, 다른 하나는 핸드폰에서 업로드된 사진의데이터인데, 아마추어들에 의해서 찍힌 사진으므로 프레임이 낮고, 심지어 희미해보일 수도 있다.

그리고 우리는 웹사이트에서 고해상도의 전문가들이 찍은 고양이 사진을 충분히 다운받을 수 있고, 앱 사용자는 많지 않아서 앱으로 업로드된 사진은 적다고 하자. 어쩌면 10,000개의 사진들을 앱을 통해서 얻을 수 있고, 웹을 통해서는 200,000개의 사진을 다운받을 수 있을 수도 있다. 

이런 경우에 최종 시스템이 과연 모바일 앱 이미지의 분포에서 잘 동작하게 될까? 아마 아닐 가능성이 높다.

 

우리가 목표로 하는 이미지는 10,000개 정도로 많지 않아서 이것만을 사용해서는 안될 것 같고, 200,000개의 웹 이미지를 사용하는데, 이 웹 이미지들이 도움이 될 것 같지만, 우리가 목표로하는 앱을 통해 업로드되는 이미지는 200,000개의 웹 이미지와 다른 분포도를 가지고 있다.

 

이런 경우에 한 가지 시도할 수 있는 방법은 두 가지의 데이터를 합해서 임의로 섞어서, train/dev/test set으로 나누어서 학습하는 것이다. 즉, 210,000개의 모든 사진을 임의로 섞은 다음에, 205,000개는 training set으로, 나머지 2500, 2500개의 이미지는 dev/test set으로 사용하는 것이다. 

이 방법은 장점도 있지만, 단점도 있다.

장점은 train/dev/test set을 같은 분포도를 가지게 할 수 있지만, 단점으로는 학습의 결과가 웹 이미지의 분포도를 따를 수 있다는 것이다. 즉, 학습의 목표가 앱을 통해 업로드된 사진을 분류하는 것이 아니라, 웹 이미지를 분류하는 데에 더 집중이 된다는 것이다.

따라서, 이 방법을 추천하지는 않고, 다음 방법을 추천한다.

 

여전히 웹 이미지가 200,000개이고 앱을 통해 업로드된 이미지가 10,000개일 때, training set으로는 웹이미지 200,000개와 추가로 앱을 통해 업로드된 이미지 5,000개를 사용해서 구성한다. 그리고 나머지는 dev/test set으로 나눈다. 여기서 핵심은 dev/test set은 우리가 중점적으로 집중해야하는 데이터 분포도를 갖는 이미지인 것이다. 즉, 모바일 앱에서 업로드된 사진을 분류하는 것이 목적이기 때문에, dev/test set의 분포도를 모바일 앱을 통한 이미지 분포도를 갖도록 하는 것이다. 하지만, 여전히 training data와 dev/test set의 분포도는 서로 다르다. 그러나 이렇게 나누어진 데이터에서의 결과가 장기적으로 훨씬 더 좋은 성과를 보인다.

 

 

다른 예제로 음성 인식 기기(백미러 음성 인식 기기)를 살펴보면, 우리는 어떤 데이터를 사용해서 이 음식 인식 시스템을 학습해야할까? 위에 나타난 방법처럼 training set, dev/test set을 구성할 수 있는 방법이 다양하게 있다. training을 위해서 축적된 음성 인식 데이터들을 구매할 수 있고, 스마트 스피커 관련 일을 한적이 있어서, 그 데이터를 가지고 있을 수도 있으며, 음성 키보드 관련 업무를 해본적이 있어서 관련 데이터를 가지고 있을 수 있다. 예를 들어서 이런 데이터들이 500,000개가 있다고 가정한다. 

그리고, dev/test set의 경우에는 실제로 백미러를 통해서 음식인식된 음성 데이터가 training set보다 적게 있다고 하자. 대략 20,000개가 있다. 운전을 하면서 말하는 것이기 때문에 training을 위해 수집된 데이터와 실제 백미러를 통해 음성인식된 데이터의 분포도는 매우 다를 것이다. 하지만, 우리가 목표로 두고, 관심을 가지는 데이터는 바로 실제 백미러 음성 데이터이고, 우리는 이 데이터들이 작 동작되고 dev/test에서 잘 되도록 하는 것이 목표이다.

 

그래서 방금 전의 예시처럼, 이번에도 training set을 위한 데이터에서 추가로 백미러 음성 데이터의 절반인 10k를 학습에 사용한다. 그리고 나머지 10k는 5k, 5k씩 나누어서 dev와 test set으로 사용할 수 있다.

 

[Bias and Variance with mismatched data distributions]

학습 알고리즘의 bias와 variance를 추정하는 것은 다음 스텝으로 어떤 업무를 수행해야할 지에 대한 우선순위를 결정하는데 큰 도움을 준다. 하지만, 학습 알고리즘의 training set과 dev/test set이 서로 다른 분포도를 가지고 있다면 bias/variance를 분석하는 방법이 달라진다.

 

계속해서 고양이 인식 예제로 살펴보자. 이 인식 기능에서 인간은 거의 완벽에 가까운 능력을 보여서, Bayes error(or Bayes optimal error)가 거의 0%에 가깝다는 것을 의미한다. 그리고 Error Analysis를 하기 위해서 training error, dev error를 구한다.

위 경우에는 training error가 1%이고, dev error가 10%라고 해보자. 그렇다면 이 경우에는 평소와 같다면 variance의 문제가 심해서 학습 알고리즘이 일반화를 잘 못시킨다는 것을 의미한다. 하지만, training set과 dev set의 분포도가 서로 다르기 때문에, variance 문제라고 단정지을 수 없다. training set의 data들은 고화질의 이미지로 아주 쉽게 분류가 가능했지만, dev set은 흐릿한 이미지로 쉽게 분류하지 못했을 수 있다는 것이다.

 

이런 Error Analysis 상황에서 training error와 dev error를 비교할 때, training set과 dev set의 분포도가 서로 다르기 때문에, error의 차이가 얼마만큼 알고리즘이 dev set의 분포도를 학습하지 못해서 생기는 오류인지, 정말 variance 문제로 인해서 발생하는 error인지 구분하기가 쉽지 않다.

 

이 문제를 해결하기 위해서 우리는 training-dev set이라고 새롭게 데이터 set을 정의하고 사용하는 것이 도움이 될 수 있다. training-dev set은 training set에서 일부 추출한 데이터인데, training set과 동일한 분포도를 가지게 되지만, 이 데이터는 학습을 위한 데이터는 아니다.

위와 같이 데이터를 분배하게 되고, train과 train-dev는 서로 같은 분포도를 갖고, dev와 test가 서로 같은 분포도를 갖는다. 물론 train/train-dev와 dev/test의 분포도는 서로 다르다.

이렇게 분배한 후에, training set으로만 학습시키고, Error Analysis를 진행하기 위해서, training error, training-dev error, dev error를 구한다. 

 

위 두가지 예시를 살펴보자.

왼쪽 예시는 training error가 1%, training-dev error가 9%, dev error가 10%이다. 결과를 보면 training -> training-dev error에서 많이 증가한 것을 볼 수 있고, 같은 분포도를 갖더라도 일반화가 잘 되지 않았다는 것을 볼 수 있기 때문에, 이 문제는 variance 문제가 있다고 볼 수 있을 것이다.

오른쪽 예시는 training error는 1%, training-dev error는 1.5%, dev error는 10%이다. 이 경우에는 training과 training-dev error의 차이가 크지 않으므로, low variance를 갖는다고 할 수 있으며, dev error에서 많이 증가한다. 이런 경우가 전형적인 data mismatch문제를 갖고 있다고 할 수 있다.

 

다음 두가지 예시를 더 살펴보자.

이번에는 human error까지 포함했는데, 왼쪽 예시는 human error가 0%, training error는 10%, training-dev error가 11%, dev error가 12%이다. bayes error가 0%라는 의미인데, training error와의 차이인 avoidable bias가 매우 큰 것을 볼 수 있고, bias 문제가 있다고 볼 수 있다.(high bias setting을 가지고 있음)

오른쪽 예시는 동일하게 human error가 0%, training error 10%, training-dev error 11%, 그리고 dev error가 20%이다. 이 경우에는 두 가지의 문제점이 존재한다. 첫 번째로 bayes error와 training error의 차이가 크기 때문에 avoidable bias문제가 존재하고, 두 번째는 training-dev error와 dev error의 차이가 크기 때문에 data mismatch의 문제도 있다고 볼 수 있다.

 

핵심은 human-level error, training error, training-dev error, dev error를 확인하고, 이 오류들의 차이를 분석해서 avoidable bias problem이나 variance, mismatch문제가 있는지 확인하는 것이다.

추가로, test error를 구해서 얼마나 dev set에 overfitting 되었는지 확인하는 척도로 사용할 수 있다.

그리고 training error보다 dev/test error가 더 잘 동작할 수도 있는데, 이런 경우는 dev/test set보다 training set이 학습하기에 더 힘든 데이터 경우에 발생할 수 있다.

 

더 일반화해서, 백미러 음성인식 시스템 예제를 가지고 살펴보도록 하겠다.

가로 축은 general speech recognition, 즉, 일반적인 음성인식 시스템에서 가지고 온 데이터가 있고, Rearview mirror speech data, 백미러를 통한 음성인식 데이터가 있다. 세로축에는 human-level error, 학습 알고리즘이 학습한 examples의 error, 그리고 학습하지 않은 examples의 error가 있다. 각 칸의 의미는 위와 같고, 이전에 살펴본 예제와 같이 동일하게 분석해서 avoidable bias, variance, data mismatch 문제를 분석하는 것이다.

추가적으로 rearview mirror speech data에서 human level error와 error on examples trained on의 값들을 구해서 분석하는 경우에 부가적인 인사이트를 제공하기도 한다. 위 예시에 따르면, 백미러 음성인식 데이터는 일반 음성인성 인식 데이터보다 human level error가 더 크기 때문에, 보통 인식하기 더 어렵다는 것을 볼 수 있다.

 

[Addressing data mismatch]

이번에는 data mismatch 문제를 해결하기 위한 방법을 알아보도록 하자.

Error Analysis로 mismatch문제가 있다는 것을 알았을 때, 위와 같은 방법이 있다.

첫 번째로는 training set과 dev/test set이 어떤 차이가 있는지 수작업으로 error analysis를 수행하는 것이다. test set에 overfitting하는 것을 피하려면, dev set에서만 error analysis를 수행해야 한다.

예를 들어서, 백미러 음성인식 시스템을 개발하고 있다면, training set과 dev set을 비교해서 dev set이 보통 소음이 더 심하고, 자동차 소음도 많다는 점을 발견할 수도 있다. 이처럼 training set이 dev set과 어떻게 다른지 파악할 수 있다면, 이후에 traininig data를 dev set과 더 유사하게 만들 수 있는 방법을 찾을 수 있다.

두 번째 방법은 dev/test set과 유사한 데이터를 만들거나 또는 수집하는 것이다. 자동차 소음이 가장 큰 원인이라고 발견했다면, 차량 내에서 소음이 심한 데이터를 학습할 수 있다.

 

위 방법들은 systematic한 방법이 아니고, 인사이트를 얻는 것이 보장되지 않는 것처럼 생각될 수 있지만, 수작업으로 이렇게 error 분석하는 것은 종종 많은 문제들을 해결하는데 도움이 될 수 있다.

 

이렇게 분석을 해서 결국 training data를 dev set와 더 유사하게 만드는 것이 목표라면 우리가 할 수 있는 방법은 무엇이 있을까? 우리가 사용할 수 있는 방법 중에 하나는 인공적으로 데이터를 합성하는 것이 있다.(Artificial data synthesis)

우리가 깨끗한 오디오를 많이 녹음했다고 가정하고, 차 소음 데이터를 가지고 있다면, 이 두 개의 음성을 합성해서 시끄러운 차 안에서 말하는 것과 같은 효과를 낼 수 있다. 실제로 밖에 나가서 시간을 쏟으면서 엄청난 양의 음성 자료를 모을 필요없이, 인공적인 데이터 합성을 통해서 더 빨리 데이터를 생성할 수 있다.

하지만, 이 방법을 사용할 때 한가지 주의할 점이 있다. 만약 우리가 10,000시간 동안 소음없이 깨끗하게 녹음된 데이터가 있고, 자동차 소음 데이터가 1시간짜리가 있다면, 자동차 소음 데이터를 10,000번 반복시켜서 합성할 수 있다. 실제 차량에서는 다양한 소음들이 있지만, 이 경우에는 우리가 1시간짜리 소음에 대해서만 학습을 진행하게 된다면, 한 시간짜리 자동차 소음에 overfitting할 수도 있다. 10,000시간 동안의 자동차 소음을 수집하는 것이 가능할지는 모르겠지만, 1만 시간의 자동차 소음으로 합성을 한다면 더 좋은 성능을 낼 수 있을 것이다.

 

즉, 합성을 통해서 만든 데이터들이 단지 전체의 일부분이 될 수도 있다는 것이다. 따라서 합성한 데이터에 overfitting할 위험이 존재하고, 합성할 때에 이 부분을 유의해야 한다.

댓글