최근 Andrew Ng 교수님의 Deep Learning Specialization(DLS) 과정을 들었습니다. Machine Learning이라는 완전히 다른 패러다임에 적응하지 어렵고 오랫만에 보는 수식들에 정신이 없지만, 그래도 나름 재미있게 공부하고 있어요.
DLS 강의 중 “ML Strategy” 강의가 특히 흥미로웠습니다. 이 강의를 통해 “ML engineering"을 어떻게 하는지 엿볼 수 있었기 때문입니다. 처음에는 ML System의 general 성능(실행속도 아닌 정확도를 의미)을 측정하는 게 불가능해 보였지만, 이 강의를 통해 ML System을 체계적으로, 전략적으로 분석, 개선하는 방법을 (조금이나마) 배울 수 있었습니다. 개인적으로 기억에 남는 강의여서 이 부분만 따로 정리해 올려봅니다. 총 2편으로 나눠집니다.
Introduction to ML Strategy
: how to structure your ML project quickly and efficiently
ML의 성능이 원하는 만큼 나오지 않았을 때(e.g., 분류 시스템의 분류정확도가 떨어질 때) 시스템 개선을 위해 할 수 있는 일은 굉장히 많습니다. 더 많은 학습 데이터를 구해볼 수도 있고, ML model을 바꿔볼 수도 있고, hyperparameter들을 tuning해 볼 수도 있습니다. 하지만 아무 방법이나 마구잡이로 시도해 볼 순 없을 겁니다. 요즘의 ML 시스템의 규모와 모델 학습에 소요되는 어마어마한 시간을 고려해 본다면, 다양한 선택지를 전략적으로 접근하는 게 더욱 중요합니다.
이렇게 많은 선택지 중 전략적인 접근을 하기 위해서는 “what to tune in order to try to achieve one effect” 를 아는 것이 굉장히 중요합니다. 이 특징을 “orthogonalization” 이라 하고, 하나의 “knob"을 돌려 한 가지의 효과를 얻을 수 있는 것을 의미합니다.
ML System의 성능 목표는 다음과 같은 순서로 타겟팅 되어야 합니다. 그리고 이 목표는 각각 다른 “knob"을 사용해서 조절해야 합니다. 각 성능 목표들을 달성시키는 과정이 다른 목표에 영향을 끼치지 않습니다. (=모두 orthogonal 합니다)
- Chain of assumptions in ML
- Fit training set well on cost function
knob
: bigger network, better optimization algorithms,,,
- Fit dev set well on cost function
knob
: regularization, bigger training set, …
- Fit test set well on cost function
knob
: bigger dev set, …
- Performs well in real world
knob
: Change dev set or cost function
- Fit training set well on cost function
그런 의미에서, “early stopping"을 추천하지 않는다고 합니다. Training set, dev set 성능 둘 다에 영향을 미치기 때문입니다.
Setting Up your Goal
Single Number Evaluation Metric
성능을 평가할 때 가장 중요한 것은 “평가 기준“을 세우는 것 일겁니다. 평가 기준을 세울 때는 현재 시스템의 문제를 “single number evaluation metric“으로 표현할 수 있어야 합니다. 적절한 single number metric을 가지고 있다면 변경의 효과를 빠르게 파악할 수 있어 효율적인 실험이 가능합니다.
사용할 수 있는 metric의 예는 다음과 같습니다.
- Precision: of examples recognized as cat, what % actually are cats?
- cat으로 recognized된 것 중 몇 %가 진짜 cat인가
- Recall: what % of actual cats are correctly recognized?
- actual cat 중 몇 %가 올바르게 recognized 되었는가?
이 때, Precision-Recall 두 개의 기준을 사용한다면 “single number"가 아닙니다. Best 옵션이 무엇인지 알기 어렵습니다. 그럴 땐, 두 지표를 합친 새로운 하나의 지표를 만들고, 이를 기준으로 판단하는 것이 좋습니다.
Precision, Recall의 경우 F1 score 를 많이 사용합니다. (harmonic mean of P and R)
$$ F1score = { 2 \over {{ 1 \over P} + {1 \over R }}} $$
중요한 건
- well-defined dev set = how your’e measuring precision and recall
- single real number evaluation metric = quickly tell which is better
이고 이를 통해 학습 및 실험의 iterating process를 speed-up 할 수 있습니다.
Satisficing and Optimizing Metric
하지만 단 하나의 지표를 만들어 내기 모호한 경우가 있습니다. 예를 들면, “accuracy"와 “running time"의 평가 조건이 있을 때, 두 값을 평균을 낸다거나 “cost = accuracy - 0.5 * running_time"이라는 수식을 사용하면 원하는 목표를 적절하게 표현하지 못할 수 있습니다.
이 경우엔 accuracy는 높으면 높을 수록 좋고 running time은 최소 조건만 만족하면 됩니다. accuracy는 optimizing metric
으로, running time은 satisficing metric
으로 정의하고, satisficing metric을 만족하는 것 중 optimizing metric을 최대화하는 모델을 고르면 됩니다. 이 때, N 개의 metric 중, 1개는 optimizing metrics, (N-1)개는 satisficing metric이 되어야 합니다.
예를 들어, “trigger word” 인식 시스템의 평가 기준을 세워 봅시다. “trigger word"는 인공지능 스피커에서 사용자 입력 시작을 말합니다. 아이폰의 “Hi siri"나 구글의 “Okay google” 같은 단어입니다. 이 경우, accuracy, 즉 “Hi siri"를 인식하는 정확도는 높으면 높을수록 좋은 optimizing metric으로, false positivitiy(e.g., ≤1 false positive every 24 hours)는 satisficing metric으로 잡을 수 있습니다.
Size of the Dev and Test Sets
ML System 구축 시 사용되는 data는 보통 3가지의 data set로 나눠서 사용하게 됩니다.
- Training set: machine training 용 data set
- Dev set: used to evaluate different ideas and pick one
- Test set: 최종 성능을 보는 data set. 이게 만족스러울 때 까지 dev set으로 최적을 찾는다
예전에는 다음과 같은 구성을 많이 사용했다고 하는데요, 이 구성은 data set이 작을 때, 예를 들면 100, 1K, 10K 정도의 데이터가 있을 때는 좋은 구성이라고 합니다.
- 70 % training set, 30% test set
- 60% training set, 20% dev set, 20% test set
Modern ML에서는 사용하는 데이터 양이 굉장히 많습니다. 1000K 정도의 데이터를 사용하는 요즘에는, 1%만 사용해도 test set이 10K example을 갖게 됩니다. 그래서 이 경우엔 training set에 최대한 많은 데이터를 사용하는 것이 더 좋다고 합니다. 엄청나게 큰 training set을 쓰는 것이 트렌드라고 하네요.
- 98% training set, 1% dev set, 1% test set
여기서 test set의 크기에 대해 좀 더 얘기하자면,
- Test set은 시스템의 성능을 평가할 수 있을 만큼 big enough 해야 합니다.
- 아주 아주 accurate measure가 필요한 경우가 아니라면 millions 이상의 sample이 필요하지 않을 것, 즉 10K, 100K 면 충분하다고 합니다.
- 때로 high confidence가 필요하지 않은 경우엔, test set을 사용하지 않거나 dev set을 test set으로 사용할 수도 있습니다 - 추천하는 좋은 방향은 아니지만, 데이터가 절실할 땐 이런 시도도 해볼 수 있는 것 같습니다.
Train/Dev/Test Distributions
갖고 있는 data들을 3개의 data set으로 나눌 때 주의해야 할 점들이 있습니다. 바로 “data distrubution” 입니다.
Dev data set과 test data set의 data distribution은 최대한 유사해야 합니다. 예를 들어, 여러 region에서 얻은 data가 있다면 이걸 어떻게 사용해야 할까요?
- 특정 지역에서 나온 데이터를 dev set으로 / 또 다른 지역에서 나온 것 test set으로 사용
좋지 않은 선택입니다. dev/test set의 distribution이 달라져, 타겟 분포가 아닌 분포를 갖고 학습시키기 때문입니다. 학습과 테스트의 타겟 자체가 달라지는 것 입니다.
- randomly shuffle into dev / test set
이렇게 하면 dev/test set의 distribution이 같아지므로, 좋은 선택입니다.
수업에서 제시 된 Guideline은 다음과 같습니다.
- Choose a dev set and test set to reflect data you expect to get in the future and consider important to do well on
- same distribution! 타겟하는 형태로 트레이닝/테스트 해야 한다!
참고로, 이후 다른책에서 “훈련/테스트 데이터 분포에 차이가 있을 때” 할 수 있는 전략을 알 수 있었는데요. 보통의 ML 과제에서는 data distribution 조절이 그리 어렵지 않으나, 캐글 대회에서는 정해진 training, test set 이 있어서 이런 상황에 대응해야 할 때가 있습니다. 이럴 때 취할 수 있는 전략은 아래와 같습니다.
- 억제: dev/test set 분포가 같아질 때가지, 결과에 가장 큰 영향을 미치는 변수를 제거해 본다.
- test set과 가장 유사한 세트로 훈련: test set과 유사한 분포를 가진 dev set을 sampling 하여 사용한다.
- test set를 모방한 검증: 모든 데이터를 학습에 사용하되, test set과 유사한 분포의 데이터만 평가에 사용한다.
When to Change Dev/Test Sets and Metrics?
ML System을 개발하다 보면, 어떤 이유에서든 원하지 않는 혹은 잘못된 결과가 나온다면, 더 나은 알고리즘을 판별하는 기준을 바꿔야 할 수 있습니다. Evaluation metric 혹은 dev/test set을 바꿔야 합니다.
-
Evaluation metric을 새로 만드는 예시:
- 기존의 cost function에 새로운 weight를 추가할 수 있습니다.
-
dev/test set을 바꾸는 예시:
- Dev/test set에서는 고화질의 사진을 사용했는데, user images는 low quality,./. 일 경우 데이터셋의 변화가 필요합니다.
- If doing well on your metric + dev / test set does not correspond to doing well on your application, change your metric and/or dev/test set
중요한 건, 완벽하지 않은 evaluation metric을 갖고 있더라도 일단 이를 타겟으로 빠르게 시작하는 것 입니다.
Comparing to Human-level Performance
최근의 ML의 급격한 발전으로, 그 성능이 human-level 성능과 비교할 만 해졌습니다. 그래서 이제는 성능 목표를 human-level performance, 혹은 그 이상을 잡는 경우가 많은 것 같습니다.
완벽한 성능은 불가능 할 수도 있습니다. 이미지 분류 시스템에서 사진 혹은 그림이 애매하여 사람조차도, 그 누구도 그게 무엇인지 말할 수 없는 경우가 그 예입니다. 반면 Bayes-optimal performance
는 특정 task에 도달할 수 있는 이론 상 최대 성능입니다. Human-level performance
보다 높은 정확도로, 우리가 타겟하는 성능이 될 수 있습니다.
위의 그래프에서 보는 것과 같이, ML System의 성능이 human-level performance에 도달하기 까지는 금방이지만, 그 이후에는 성능 개선이 어려워 집니다. 하지만 사실 human-level performance가 꽤 높습니다(bayes-optimal에 꽤 가깝습니다). Human-level performance보다 낮을 땐 사용할 수 있는 tool이 꽤 많이 있으나, 그 이후 개선에 사용할 수 있는 툴은 많지 않습니다.
많은 task들에 대해, Human-level performance는 꽤 좋습니다. 그래서, ML System이 human-level performance 이하라면, 다음과 같은 것들을 해 볼 수 있습니다.
- Get labeled data from humans
- Gain insight from manual error analysis: Why did a person get this right?
- Better analysis of bias/variance (아래 이어질 내용)
Avoidable Bias
Bayes-optimal performance
의 값을 정확히 알 수 없으니, 우리는 Human level performance
를 bayes optimal performance의 proxy로 사용할 수 있습니다. Human level performance에 도달하는 것을 목표로 잡는 것만으로도 충분할 수 있는 거죠.
풀고자 하는 문제의 최대 성능, human level performance를 dev/training set의 성능과 비교할 때, human level performance와 training set performance 간 차이를 avoidable bias
라고 하고 training set 과 dev set 사이의 performance 차이는 variance
라고 합니다.
다음 그림과 같이, 여러 ML 모델의 성능이 다음과 같다고 예를 들면,
-
왼쪽: training set error는 8%, Dev set error는 10%인데, human level error는 1%인 경우입니다. 이 경우 training-dev error 차이를 좁히는 것도 의미가 있지만, training set의 성능 자체를 human level 까지 올리는 데 집중하는 것이 좀 더 의미 있습니다. (avoidable bias에 집중하는 것이 좋다)
-
오른쪽: training/dev set error는 왼쪽과 동일하나 human level error가 7.5%, 즉 dev set error와 크게 차이가 나지 않는 경우 입니다. 이 경우는 human level performance에 도달하는 것 보다, training-dev set 간 성능 차이를 개선하는 것이 더 의미있습니다. (variance에 집중하는 것이 좋다)
Understanding Human-level Performance
그렇다면, Human level performance
은 어떻게 측정할 수 있을까요. 사실 이 성능은 애매할 수 있습니다. “어떤 사람"이냐에 따라 그 성능은 천차만별일 수 있기 때문입니다.
X-ray 이미지 분류 예시에서는, 보통의 사람들은 3%의 에러율로 이미지를 분류하지만, 숙련된 전문가들은 0.7%의 에러율을, 숙련된 전문가들이 토론을 통해 낸 결론에서는 고작 0.5%의 에러율로 이미지를 분류했다고 합니다.
이 때 human-level performance
는 어떤 사람으로 잡아야 할까요? 이 경우 Bayes-optimal performance
의 proxy로 사용할 성능은 가장 좋은 성능입니다. 즉, bayes-optimal 성능은 0.5%보다 낮을 것 이기 때문에, 0.5를 목표 성능, human-level performance로 잡아야 하는 것 입니다.
하지만 용도에 따라 조금씩 선택이 달라질 수 있다곤 합니다. Human level performance를 최대치로 잡으면 집중해야 하는 부분을 잘못 선택할 수도 있습니다. Variance 문제를 풀어야 하는데, bias 에 집중하게 만드는 경우이죠. Human-level 성능과 training-dev set 성능이 충분히 높아 그 차이가 매우 크지 않을 때 이 문제가 두드러진다고 해요. 항상 마지막 행주를 쥐어짜는 성능 개선은 미묘하고 어려운가 봅니다.
Surpassing Human-level Performance
다음과 같은 분야들에선 ML System이 human-level 성능을 “surpass” 하곤 합니다.
- Online advertising
- Product recommendations
- Logistics (predicting transit time)
- Loan approvals
- Speech recognition
- Some image recognition
- Medical tasks
대부분 structured data로부터 학습하는 것, 많은 데이터를 분석하는 것, 그리고 natural perception이 아닌 것들입니다. Natural perception 과 관련된 task는 인간을 이기기가 어렵습니다.
Improving your Model Performance
지금까지의 내용을 요약하면 다음과 같습니다.
Supervised learning에서 원하는 성능을 만족시키기 위해선 다음 두가지를 고려해야 합니다. 그리고 두 task는 서로 orthogonal 합니다.
- You can fit the training set pretty well (low avoidable bias)
- The training set performance generalizes pretty well to the dev/test set (low variance)