고등어찌짐 2022. 7. 9. 21:23

 

Active learning 이란 ? 

 인공지능이 데이터를 학습하려면 데이터, 그리고 GT 레이블 값이 있어야 하는데, 사람이 직접 레이블을 만들어야하기 때문에 비용이 굉장히 많이 든다. 그래서 나온 개념이 active learning 이다.  unlabel 데이터셋에서 특정 기준을 통해 선별한 subset 만 사람이 레이블하도록 해 최소한의 비용으로 label 데이터셋을 구성한다. 이 프로세스를 반복해서 모델 성능을 점차 올려가는 것이 active learning 이다. 


Active learning 의 특징

(1) Query learning

환자가 아파서 의사한테 갔는데 아무말도 안하고 가만히 있으면, 의사가 환자의 질병이 무엇인지 알 수 없다.  따라서 의사가 질병을 진단하기 위해 여러가지 질문을 환자에게 하게 된다.  이렇게 무언가 알아내기 위해 질문하는 것을 "qeury" 라고 한다. 

 이것과 비슷한 과정이 active learning 에서도 일어난다. unlabel 데이터셋에서 모델 성능을 향상시킬 수 있는 특정 정보 ( ROI ) 만을 뽑아내고, 이것을 사람에게 레이블 요청하는 것이다. 그래서 active learning 은 query learning 이라고도 부른다. 


(2) Optimal experimental design 

 예를 들어, 한 명의 의사가 이 세상의 모든 질병을 알 수 는 없다. 하지만 오늘은  a 라는 질병읜 사람, 내일은 b 라는 질병의 사람이 오고 이걸 계속 판단해 나간다면 이전에는 알지 못했던 지식이 늘어나는 셈이다. 즉 이전에는 없었던 정보를 추가로 얻게 되어 기존의 데이터셋을 개선해나갈 수 있으므로 말 그대로 "Optimal experimental design" 인 것이다. 

 

(3) Actor - Oracle

Active learning 의 큰 특징 중 하나는 Oracle 이라고 불리는 액터가 존재한다는 것이다.  액터는 말 그대로 unlabel 데이터를 label 하는 사람이다. 액터는 레이블되지 않은 데이터 풀 Du ( large unlabelled data ) 에서 쿼리 ( select instance ) 된 데이터들을 레이블한다. 이를 레이블된 풀 Dl ( small amout of labelled data )데이터와 함께 모델에 학습시키는 것이다. 


Active learning 과정

Yuexiang Li et al, Reversed Active Learning based Atrous DenseNet for Pathological Image Classification,BMC Bioinformatics Vol. 20, 2019, Article Number 445

 먼저 학습할 모델을 생성한다. 이 모델을 m0 라고 하다. 이제 unlabeld data ( Du ) 을 활용해야하는데, 어떻게 사용해야할까? 바로 Du 에서 어떤 기준을 통해 데이터를 잘 골라 subset s1 을 샘플링하면 된다. 이 과정이 위 그림의 "select queries' 에 해당한다. 이를 oracle 에게 전달하면 데이터를 라벨링하고, 라벨링된 데이터를 기존의 labeled training set ( Dl ) 에 더해서 모델 m0 를 학습시킨다. 이렇게 학습이 완료된 모델은 m1 으로 업데이트되고, 이 프로세스를 계속해서 반복하는 것이 active learning 의 전 과정이다.  

 


Uncertainty sampling

 그럼 어떻게 Du 에서 subset 를 잘 골라낼까? 샘플링 방법은 여러가지가 연구되고 있는데, 그중 가장 간단한 샘플링 방법을 살펴보자. 

 

Binary calssification 에서의 uncertainty estimation

모델이 0, 1의 binary classification 을 한다고 할 때 어떤 데이터가 들어오면 0~1 사이의 prediction 값이 나오게 된다. 

yi = P(yi=1|xi)

즉, Du 가 X 사이즈일 때, 어떤 i 번째 데이터 Xi 가 클래스 1 에 속할 확률 Yi 를 알 수 있다. 만약, 이 확률이 0.1 보다 작으면 m0 은 이 데이터를 0 으로 분류할 것이고, 확률이 0.9 보다 크다면 1 로 분류하게 된다. 하지만 확률이 0.4 ~ 0.6 과 같이 0.5 사이를 맴도는 값이라면, 어떤 클래스로 분류해야 옳은 것일지 모델이 헷갈릴 것이다. 이런 경우에  uncertainty 가 높다고 할 수 있을 것이다. 모델이 헷갈려하는 이런 데이터들만 액터에게 label 하도록 하는 방법이 uncertainty sampling 이다. 

Multiclass calssification 에서의 uncertainty estimation

첫번째 방법. 

한 데이터가 여러 클래스에 속할 확률 중, 각 확률 사이의 difference 가 가장 작은 데이터를 선택해 사용한다. 또한, 대부분의 확률이 하나의 카테고리에 속하지 못하고 여러 카테고리에 분포하게 되면 엔트로피 값이 증가하기 때문에 엔트로피 값으로도 샘플링할 데이터를 선택할 수 있다. 

다만, 모델이 잘못된 confidence 로 틀린 답을 높은 확률로 틀린 답을 예측하고 있는 경우가 있을 수 있다. 이럴 때 사용하는 방법이 approximate posterior 이다. 이 방법은 각 클래스 1 ~ 10 까지 한 이미지가 어떤 라벨에 속할지 확률 분포를 계산한다. 

 

이외에도 데이터를 샘플링하는 방법, uncertainty 를 측정하는 방법은 여러가지가 있다. 데이터 자체의 uncerainty 를 측정할 수도 있고, 모델의 uncertainty 를 측정할 수도 있다. 추가 예시로는 다음 방법들이 있다. 

(1) markov chain Monte Carlo : sort of approximate posteriro distribution
(2) model : approximate posterior Neural net
- monte calro dropout 
- stochastic weight modelling 


추가적으로 필요한 것들

액티브 러닝에는 모델을 학습하고 테스트하는 코드 이외의 프로세스 - 액터가 레이블할 데이터를 로드해서, 레이블하고 이걸 다시 학습 데이터로 만드는 등의 과정을 구현하는 코드가 추가로 필요하다. 즉, 프론트와 백엔드의 추가적인 개발이 필요한 것이다. 

 

백엔드에서 액터가 데이터를 선택하면 이를 DB 에서 로드하고 모델을 핏시키는 과정이 필요할 것이고, 액터가 레이블할 수 있는 프론트 엔드도 개발해야 할 것 이다. 또한 액터가 여러명이 있을 때는 액터끼리 내가 어디까지 라벨링을 완료했는지 바로바로 공유하기가 힘들기 때문에 분리된 서버를 사용해 각 서버마다 모델을 학습하도록 한다. 


#참조

Machine Learning | Active Learning

https://www.youtube.com/watch?v=fR0n_lwRr0k


Active Learning in ML

https://www.youtube.com/watch?v=8O32fikUj9s

Jan Freyberg: Active learning in the interactive python environment | PyData London 2019

https://www.youtube.com/watch?v=W2bJH0iXTKc