Applying deep learning to real-world problems
아래 글을 읽고 정리해 본다.
https://medium.com/merantix/applying-deep-learning-to-real-world-problems-ba2d86ac5837
딥러닝을 실제 문제에 적용하기 위해 다음 3가지를 주의해야 한다.
1. the value of pre-training
양질의 데이타를 얻는 것은 비용이 많이 든다.
그러므로 pre-training을 이용해서 최소한의 비용으로 최대한의 성능을 얻어보자.
먼저, 유사한 domain의 대량의 데이타에서 모델을 학습한다. 예를 들어 ImageNet과 같은 1000개 class를 분류하는 데이타에서 모델을 학습하는 것이다. 이 후 내가 해결해야 하는 문제 즉 나는 10개의 class만 분류한다면 내가 갖고 있는 dataset에 위에서 학습한 모델을 fine-tunning 하는 것이다.
그렇다면 pre-training을 하기 위해 데이타를 어떻게 수집할까?
◆ Sources of data for pre-training
1> Pre-trained models
이미 다양한 곳(학교, 회사)에서 미리 학습된 모델을 제공한다.
2> Public datasets
아래와 같이 공개한 데이타가 많다.
http://www.cvpapers.com/datasets.html
https://github.com/caesar0301/awesome-public-datasets
https://archive.ics.uci.edu/ml/datasets.html
3> Data crawling
웹사이트에서 데이타를 크롤링하는 방법이 있다.
▶ Weakly labeled data
데이타를 대량으로 사람의 annotation 없이 수집하다보면 잘 못된 label 이 발생한다. 하지만 소수의 데이타로 분류를 하는 것보다 잘 못 annotation 되더라도 대량의 데이타를 이용하는 것이 성능 향상에 더 도움이 된다.
2. caveats of real-world label distributions
아카데믹한 데이타는 minst, cifar10과 같이 class간의 분포가 동일하다.
하지만 의료 영상과 같은 경우 건강한 환자는 99% 이고 실제 질병이 있는 환자는 1% 이다. 이 경우 99:1 의 분포도 데이타가 언밸런스하다.
이런 데이타를 아카데믹하게 푼다면 각 class에 대해 오분류하는 cost가 동일하게 둘 것이다. 하지만 건강한 환자를 병에 걸렸다고 판단하는 것과 병에 걸린 환자를 건강하다고 판단하는 것은 서로 다른 cost를 가져야 한다.
그렇다면 이 문제를 어떻게 해결해야 할까?
1> 더 많은 데이타를 수집하라. 학습 데이타에 병에 걸린 환자의 데이타를 더 많이 넣는다면, 실제 inference 시 병에 걸렸다고 판단하는 수가 더 많아 질 것이다.
2> 만약 rare classes에 대한 데이타를 더 수집하지 못 한다면 taxonomy를 다시 생각해봐야 한다. 즉 아래 그림과 같이 rare class A, B를 하나의 class로 묶는 것이다.
3> sampling.
만약 위의 1> , 2>의 방법을 적용하지 못 하는 환경이라면, batch 학습 시 uniformly sampling 한다면 내가 갖고 있는 각 class의 db의 수와 동일하게 학습에서도 각 class의 수만큼을 사용한다는 것이다.
다음과 같은 다른 sampling 방법을 이용할 수 있다.
▷ Ignore : 빈번하게 사용되는 class의 sample을 사용하지 않는 것이다.
▷ Over- or undersample : rare class의 sample을 학습에 더 많이 사용하는 것이다.
이 경우 위의 ignore 대비 장점은 모든 sample을 학습에 이용한다는 것이다.
▷ Negative mining: 모든 sample을 다 사용하는 것이 아니라 구분이 어려운 hard 한 데이타만 학습에 이용하는 것이다.
4> Weighting the loss
아래 그림과 같이 rare classes에 대한 sample loss의 weight를 높이는 방법이 있다.
https://medium.com/merantix/applying-deep-learning-to-real-world-problems-ba2d86ac5837
딥러닝을 실제 문제에 적용하기 위해 다음 3가지를 주의해야 한다.
1. the value of pre-training
양질의 데이타를 얻는 것은 비용이 많이 든다.
그러므로 pre-training을 이용해서 최소한의 비용으로 최대한의 성능을 얻어보자.
먼저, 유사한 domain의 대량의 데이타에서 모델을 학습한다. 예를 들어 ImageNet과 같은 1000개 class를 분류하는 데이타에서 모델을 학습하는 것이다. 이 후 내가 해결해야 하는 문제 즉 나는 10개의 class만 분류한다면 내가 갖고 있는 dataset에 위에서 학습한 모델을 fine-tunning 하는 것이다.
그렇다면 pre-training을 하기 위해 데이타를 어떻게 수집할까?
◆ Sources of data for pre-training
1> Pre-trained models
이미 다양한 곳(학교, 회사)에서 미리 학습된 모델을 제공한다.
2> Public datasets
아래와 같이 공개한 데이타가 많다.
http://www.cvpapers.com/datasets.html
https://github.com/caesar0301/awesome-public-datasets
https://archive.ics.uci.edu/ml/datasets.html
3> Data crawling
웹사이트에서 데이타를 크롤링하는 방법이 있다.
▶ Weakly labeled data
데이타를 대량으로 사람의 annotation 없이 수집하다보면 잘 못된 label 이 발생한다. 하지만 소수의 데이타로 분류를 하는 것보다 잘 못 annotation 되더라도 대량의 데이타를 이용하는 것이 성능 향상에 더 도움이 된다.
2. caveats of real-world label distributions
아카데믹한 데이타는 minst, cifar10과 같이 class간의 분포가 동일하다.
하지만 의료 영상과 같은 경우 건강한 환자는 99% 이고 실제 질병이 있는 환자는 1% 이다. 이 경우 99:1 의 분포도 데이타가 언밸런스하다.
이런 데이타를 아카데믹하게 푼다면 각 class에 대해 오분류하는 cost가 동일하게 둘 것이다. 하지만 건강한 환자를 병에 걸렸다고 판단하는 것과 병에 걸린 환자를 건강하다고 판단하는 것은 서로 다른 cost를 가져야 한다.
그렇다면 이 문제를 어떻게 해결해야 할까?
1> 더 많은 데이타를 수집하라. 학습 데이타에 병에 걸린 환자의 데이타를 더 많이 넣는다면, 실제 inference 시 병에 걸렸다고 판단하는 수가 더 많아 질 것이다.
2> 만약 rare classes에 대한 데이타를 더 수집하지 못 한다면 taxonomy를 다시 생각해봐야 한다. 즉 아래 그림과 같이 rare class A, B를 하나의 class로 묶는 것이다.
3> sampling.
만약 위의 1> , 2>의 방법을 적용하지 못 하는 환경이라면, batch 학습 시 uniformly sampling 한다면 내가 갖고 있는 각 class의 db의 수와 동일하게 학습에서도 각 class의 수만큼을 사용한다는 것이다.
다음과 같은 다른 sampling 방법을 이용할 수 있다.
▷ Ignore : 빈번하게 사용되는 class의 sample을 사용하지 않는 것이다.
▷ Over- or undersample : rare class의 sample을 학습에 더 많이 사용하는 것이다.
이 경우 위의 ignore 대비 장점은 모든 sample을 학습에 이용한다는 것이다.
▷ Negative mining: 모든 sample을 다 사용하는 것이 아니라 구분이 어려운 hard 한 데이타만 학습에 이용하는 것이다.
4> Weighting the loss
아래 그림과 같이 rare classes에 대한 sample loss의 weight를 높이는 방법이 있다.
댓글
댓글 쓰기