Carrying out Error Analysis
"고양이 분류기에서 개도 고양이로 분류해버리는 상황"에 처했다고 해보자. 이때 개가 아니라고 분류하기 위해 시간을 쓸 지말지 결정해야하는 상황에서, 에러 케이스를 분석해볼 수 있다. dev set에서 100개의 잘못 분석된 경우를 구해보고, 여기서 개 사진인 경우의 개수를 세어보자. 만약 5% 정도라면 굳이 시간을 들여서 개에 대한 분석의 성능을 높일 필요는 없을 것이다. 반면 50%가 개 사진이라면 개에 대한 분류를 해볼 필요성을 느낄 것이다. 이런 식으로 이미 에러인 케이스들을 분석해봄으로써(오차분석) 이후 방향을 결정할 수 있다.
만약 모델을 개선하기 위해 여러 아이디어가 있다고 가정해보자. 이럴 때 에러 케이스가 어떤 사진에서 나타나는지 각각 개수를 세어보고(거짓 양성, 거짓 음성), 에러 %가 많은 경우를 선택할 수 있을 것이다.
ML에서 이렇게 하나하나 오차 분석하는 것을 무시하는 경향이 있는데, 상당히 중요한 과정이다.
Cleaning Up Incorrectly Labeled Data
*개인적으로 이전에 대회에 참여했을 때 겪었던 문제였어서 흥미롭게 보았다.
training data set에서 잘못 라벨링 된 데이터가 있다면 어떻게 할 것인가? 만약 random으로 잘못된 라벨링이 있는 경우, DL 모델은 이에 대해 robust하다고 한다. 즉 크게 문제가 되지 않는다. 하지만 규칙적으로 잘못된 라벨링이 있을 경우 문제가 된다. 만약 지속적으로 흰 개를 고양이로 라벨링했다면, 모델 또한 흰 개가 주어질 때 고양이로 분류하게 될 것이다.
dev set에서 잘못 라벨링된 데이터가 있다면 이전 오차 분석에 더해서 잘못 라벨링되어서 잘못된 결과가 나오는 비율이 어느정도 되는지 살펴볼 수 있다. 만약에 전체 에러율에서 큰 비율을 차지하지 않는다면, 다른 원인으로 일어난 error에 집중하는 것이 좋다. 하지만 오른쪽 경우처럼 상당한 비율을 차지한다면 잘못된 라벨링을 고치는 것이 도움이 많이 될 것이다.
1. dev set과 test set은 같은 데이터 분포에서 나와야 한다고 배웠었다. 따라서 만약 라벨링을 다시한다면 test set의 데이터 또한 다시 라벨링하는 것이 좋다.
2. 틀린 경우의 예시를 살펴보는 것이 더 쉽지만, 맞는 경우의 예시를 살펴보는 것도 중요하다. 우연히 맞았을 수도 있기 때문이다. 물론, 성능이 좋은 경우 (e.g. 98%) 틀린 경우(2%)의 예시를 보고 고치는 것이 훨씬 쉽고 효율적이기 때문에 항상 살펴볼 필요는 없다.
3. dev/test set을 리라벨링하는 과정에서 train set도 똑같이 할 필요는 없다. 보통 train data가 훨씬 양이 많기 때문에 전체를 살펴보면서 라벨링을 다시하는 것은 비효율적일 수 있다.
요즘 딥러닝 모델을 설계하는 데에 있어 점점 자동화가 이루어지고 있지만 실제 시스템에 적용할 때는 여러 manual한 과정이 필요하다고 한다. 그리고 예시를 직접 살펴보면서 개수를 세어보는 과정이 중요하다고 강조하며 해당 영상을 마무리하고 있다.
Build your First System Quickly, then Iterate
만약 새로운 ML 시스템을 구축한다면 처음부터 완벽하고 복잡한 시스템을 구축하지말고, 우선 목표를 설정하고 그에 맞게 간단하게 (대충) 빠르게 시스템을 구축하고 오차 분석을 통해 어떻게 개선할지 살펴보는 것을 추천한다. (물론, 이미 많은 연구가 이루어진 분야는 기존 연구를 참고해서 복잡하게 만들어볼 수도 있을 것)
Training and Testing on Different Distributions
Data from webpages (200000): 더 많은대신 실제로 사용할 때와 다른 데이터셋
Data from mobile app (10000): 더 적은 대신 실제로 사용할 때와 유사한 데이터셋
일 때 어떻게 데이터셋을 분류해야하는가?
모두 랜덤으로 섞어서 train/dev/test set에 나누는 것은 추천하지 않는다. 왜냐하면 이럴 경우 dev, test set이 webpage data set일 확률이 매우 커지고, 그러면 엉뚱한 data set을 기준으로 모델을 최적화하게 되기 때문이다. 추천하는 방법은 test, dev set은 모두 mobil app data로 하고, 나머지 일부 data를 train data에 넣는 것이다. 이렇게 되면 문제가 train data set의 데이터 분호와 dev/test set의 분포가 다르다는 것인데, 장기적으로 보았을 때 후자 방법이 더 도움이 된다.
정리하면, train data에는 양이 많은 대신 꼭 목적과 완벽히 부합하는 data를 안쓸 수 있으나, dev/test set은 적은 대신 실제로 적용할 data를 넣는 것이 좋다.
Bias and Variance with Mismatched Data Distributions
training error와 dev error의 차이가 클 때 그 원인이 variance(오버피팅에서 오는) 때문인지, 데이터 분포의 다름 (mismatched data distributions)때문인지 구분하기 어려울 수 있다. 이럴 때는 training-dev set을 구성하면 좋다.
training-dev set : training set과 같은 데이터 분포인데 훈련에는 사용하지 않는 데이터를 의미한다.
만약 training error와 training-dev error 차이가 많이 난다면, variance 문제일 것이다.
반면, training error와 training-dev error 차이는 별로 안나지만 dev error와 차이가 많이 난다면 data mismatch(데이터 불일치) 문제일 것이다.
지금까지 배운 내용을 일반화하면 다음과 같다.
- human level와 training set error의 차이는 avoidable bias
- training set error와 training dev set error는 variance
- training dev set error와 dev set error는 data mismatch
- dev set error와 test set error는 dev set에 과적합한 정도
보통 밑으로 내려갈수록 에러율이 커지는데 train set보다 dev set이 더 쉬운 task인 경우에는 에러율이 적어질 수도 있다. 데이터 불일치를 해결하는 데에 특별한 체계적인 방법이 있지는 않다고 한다. 그래도 시도할 수 있는 몇가지 방법에 대해 다음 강의에서 소개하고자 한다.
Addressing Data Mismatch
data mismatch (train data set과 dev/test set과 잘 맞지 않는 현상)을 어떻게 해결해야할까? 크게 두가지 방법이 있다.
1. 오차 분석을 통해 어떻게 train data set과 dev/test set이 다른지를 이해한다.
2. train data set을 유사하게 만든다. (혹은 dev/test set과 유사한 data를 모은다.)
train data set을 test/dev set과 유사하게 만드는 한가지 방법은 "data synthesis"이다.
만약 dev/test set이 소음 속에서의 음성이라고 가정해보자. 우리는 깨끗한 음성 파일과 car noise를 합성해서 차 소음이 있는 환경에서의 음성데이터를 얻을 수 있다. 이에 대한 한계점은, 만약 car noise data는 한정되어있고 음성 데이터는 많은 경우에 모델이 소음 데이터에 과적합될 수 있다는 것이다. 하지만 사람의 귀에는 소음 데이터가 다 유사하게 느껴지기 때문에, 사람은 자각하지 못하는 과적합 문제를 발생시킬 수 있다. (낮은 질의 합성 데이터가 만들어진다.) 이는 이미지 합성 분야에도 적용할 수 있다.
Transfer Learning
Transfer learning (전이학습) : 기존 모델에서 마지막 층을 제거하고, 분류하고자 하는 문제에 적합한 새로운 층을 연결하여 해당 층에 대해 학습하는 것을 말한다. 풀고자 하는 문제의 데이터가 많으면 모든 층을 재학습시키지만, 풀고자 하는 문제의 데이터가 거의 없을 경우에는 기존 층의 파라미터는 freezet시키고 새롭게 추가한 마지막 층에 대해서만 학습을 한다. 전이학습에서 기존 훈련된 변수들에 대해서는 pre-training, 새롭게 학습시키는 것에 대해서는 fine tuning이라는 용어를 쓴다.
전이학습은 언제 효과적일까?
A라는 작업에서 학습하고 해당 지식을 B 작업으로 전이(transfer)하는 과정이라고 가정해보자.
1 A와 B가 같은 input값을 가질 떄
2. A가 B보다 더 많은 데이터를 가질 때
3. A에서 학습한 낮은 레벨의 특성들이 B를 학습 하는 데에 도움이 될 때.
*A에 쓰이는 데이터의 양이 B에 쓰이는 데이터의 양보다 적을 때 전이학습은 크게 도움이 되지 않는다.
*보통 A 학습은 초반 학습 레이어에서 이루어지기 때문에 낮은 레벨의 특성을 학습한다. (이미지의 기본적인 특성, 음성의 기본적인 특성)
Multi-task Learning
전이학습은 A 작업에서 B 작업으로 가는 과정이 순차적이라면, 다중 작업 학습은 한 신경망이 여러 작업을 동시에 할 수 있도록 한다. 예를 들면 하나의 이미지에서 동시에 여러 물체를 인식하는 것과 같은 작업이 있다.
한 이미지에서 여러 물체를 인식하는 경우, 최종 예측값(y hat)도 물체의 개수만큼의 차원을 가진다. (multiple labels)
만약 4개라고 가정하면, 손실 함수를 계산할 때 시그마를 하나 더 두어서 레이블의 개수만큼 더하고 평균을 구한다. 차를 인식하든 보행자를 인식하든 신경망 초반에서는 이미지 인식 자체에 대한 학습을 거치기 때문에 이후 어떤 작업을 하든 도움이 된다.
언제 multi task learning을 적용할 수 있을까?
1. 여러 task들이 낮은 level에서 특성을 공유할 때 : 즉, 차량, 보행자, 표지판 등등을 인식하는 task는 모두 도로 이미지를 기반하고 있기 때문에 낮은 level에서 특성을 공유한다고 말할 수 있다.
2. (필수는 아님) 각 task에 대한 data의 양이유사할 때
3. 충분히 큰 신경망일 때 다중 작업 학습이 의미가 있다. (만약 작은 신경망이라면 각 task에 독립된 신경망을 훈련하는 것이 나을 수도 있다. 하지만 큰 신경망이라면 웬만하면 성능이 잘 나온다.)
multi task learning은 한번의 훈련으로 여러 task들을 수행하고 싶을 때 이루어진다. 평균적으로 multi task learning보다는 transfer learning이 훨씬 더 많이 사용된다. 보통 컴퓨터 비전에서 동시에 여러 물체를 인식할 때 multi task learning이 많이 사용된다고 한다.
What is End-to-end Deep Learning?
audio를 transcript하는 task가 있다고 생각해보자. 기존 방법론은 각 단계별로 파이프라인을 구상해서 그에 맞는 처리를 하면서 결과물을 냈었다. 반면 end to end learning은 신경망을 통해 중간 단계를 모두 생략하고 바로 입력에서 결과물이 나오도록 학습하는 것이다. (이로 인해 각 단계 중 일부를 연구하던 사람들이 많은 충격을 받았다.)
data set이 크지 않은 경우에는 기존 방법론이 더 알맞지만, data set이 충분히 많은 경우에는 end to end learning을 하는 것이 효과적일 수 있다.
하지만, end to end learning이 항상 효과적인 것은 아니다. face recognition task에 대해서 보자.
만약 개찰구에 찍힌 사람의 얼굴을 보고 그 사람의 신원을 식별하는 task가 있다고 가정해보자.
만약 end to end learning이라면 개찰구에 찍힌 사진이 입력으로, 그리고 그 신원을 결과로 받을 것이다.
하지만 관련 논문을 제시한 사람에 따르면 그렇게 end to end learning을 하는 것보다는
1. 먼저 개찰구에 찍힌 사진을 기반으로 얼굴 인식을 하고
2. 인식된 얼굴을 크롭하여 신원을 확인하는 것
위와 같이 두 단계로 쪼개서 문제를 푸는 것이 훨씬 효과적이라고 말했다. 그 이유는 얼굴 인식을 위한 data set도 많고, 크롭된 얼굴 기반으로 신원을 확인하는 data set도 많지만 단순히 개찰구에 찍힌 사진으로 신원을 확인하는 data set은 많지 않기 때문이다. 이렇게 두 문제로 쪼개서 해결하는 것이 훨신 잘 풀릴 때도 존재한다.
end to end learning은 분명 효과적이고 아키텍처를 간단하게 구성할 수 있다는 장점이 있다. 하지만 항상 만능인건 아니다. 그렇다면 언제 end to end learning을 해야할까?
Whether to use End-to-end Deep Learning
end to end learning의 장점과 단점은 아래와 같다.
장점 : (1) 사람의 손을 타지 않기 때문에 data 그 자체의 성질을 학습할 수 있다. (2) 중간 과정을 설계하는 번거로움이 줄어든다.
단점 : (1) 입력과 출력에 대한 많은 data가 필요하다. 중간 과정을 설계함으로써 얻는 이점을 못얻게 된다.
end to end deep learning의 적용 유무를 결정하는 것은,
end to end의 복잡한 task를 할 수 있을 정도로의 충분한 데이터 (x, y)를 갖췄는지에 따라 결정된다.
여기서 "충분한"이 어느정도인지 애매하긴 하다. 어떤 task를 하고 싶은지에 따라 x와 y를 잘 결정하는 것도 머신러닝 프로젝트를 하는 데에 있어 중요하다.
'Deep Learning Specialization 강의 > Structing Machine Learning Projects' 카테고리의 다른 글
ML Strategy (1주차) 정리 (2) | 2024.07.23 |
---|