Learning

Active Learning을 활용해 데이터가공 작업 속도 가속하기

효율성과 데이터의 상관관계

2023
.
01
.
04
Active Learning을 활용해 데이터가공 작업 속도 가속하기

Active Learning 이란?

인공지능 학습 과정에서 Active Learning 이란 아직 레이블링이 되어 있지 않은 데이터(unlabeled data) 중에 모델 학습에 가장 효과적일 것 같은 데이터를 고르는 작업을 말합니다. 여기서 말하는 효과적인 학습이란, 결과적으로 가지고 있는 데이터셋 전체를 잘 학습했을 때의 기대 성능이 100이라면 샘플링 작업 속도 측면에서 ‘어떻게 하면 100에 빠르게 도달할 수 있는지’ 또는 ‘혹시 그 이상의 성능을 확보할 수 있는지’가 있을 수 있습니다.

인공지능 모델 입장에서는 아직 공부한 적도 없는 문제들(데이터)인데, 누가 나한테 더 도움이 될지 어떻게 알아?라고 할 수 있지만, 사실 사람도 직감적으로 알 때가 있습니다. 어떤 문제가 더 어려운지, 어떤 챕터를 공부하면 지금 나에게 더 중요할지.

Active learning 왜 필요한가요?

데이터헌트에서는 AI 모델을 통해 사전 레이블링(Pre-labeling) 작업을 하고 이후 사람 작업자가 작업을 수정합니다. 이를 설명하기 위해 하나의 상황을 만들어 보겠습니다.

손을 다쳐서 문제를 직접 푸는데 시간이 많이 걸리는 나(작업자)는 학교 시험을 대비하여 친구(AI)에게 컨닝 페이퍼(pre-label)를 부탁했습니다. 친구가 공부를 잘할수록 내가 직접 풀 문제도 적어지고 시험 성적도 올라갈 것 같습니다. 그래서 공부를 잘하는 나는 친구에게 수업을 해주기로 했습니다.

컨닝 페이퍼 버전 1

  1. [나] 일단 아무 문제(데이터)나 소량을 골라 직접 푼다.
  2. [친구] 내가 푼 문제로 공부(모델 학습)를 한다.
  3. [친구] 공부한 내용을 바탕으로 컨닝 페이퍼(pre-label)를 만든다.
  4. [나] 친구(AI)가 건네준 컨닝 페이퍼를 참고해 시험을 본다

얼핏 보면 훌륭한 것 같지만 결국 모델은 초기 소량의 데이터로만 학습한 그다지 똑똑하지 않은 모델일 가능성이 높습니다. 제대로 공부도 하지 않은 친구가 만든 컨닝 페이퍼는 신뢰하기 어려운 구석이 많을 것 같습니다… 오히려 우리의 머리를 복잡하게 할 가능성이 높겠죠.

그래서 주기적으로 친구에게 공부를 가르쳐 주기로 했습니다. 24시간 붙어 공부를 가르쳐주기는 어려우니까 적당한 주기로 수업을 진행해 보겠습니다.

컨닝 페이퍼 버전 2

  • [나] 일단 아무 문제(데이터)나 소량을 골라 직접 푼다.
  • 다음을 반복한다.
  • ~[친구] 내가 푼 문제로 공부(모델 학습)를 한다.
  • ~[친구] 공부한 내용을 바탕으로 컨닝 페이퍼(pre-label)를 만든다.
  • ~[나] 컨닝 페이퍼를 참고하여 소량의 문제(데이터)를 직접 푼다.
  • [나] 친구(AI)가 건네준 컨닝 페이퍼를 참고해 시험을 본다

작업자가 작업을 진행할수록 모델이 공부하는 내용이 많아집니다. 만약 수업을 하루에 한 번씩 진행한다면 매일매일 똑똑해지는 모델을 만들 수 있고, 우리가 얻는 컨닝 페이퍼는 점점 더 정답에 가까워지고 신뢰할 수 있을 것 같습니다.

하지만 모든 내용을 한 번씩 공부한다고 해서 각 내용에 대한 실력이 똑같기는 어렵습니다. 이해가 잘 되는 내용이 있으면 그렇지 않은 내용도 있을 수 있으니까요. 그래서 친구가 잘 모르는 내용 위주로 수업을 진행하면 더 효과적일 것 같습니다

컨닝 페이퍼 버전 3

  • [나] 일단 아무 문제(데이터)나 소량을 골라 직접 푼다.
  • 다음을 반복한다.
  • ~[친구] 내가 푼 문제로 공부(모델 학습)를 한다.
  • ~[친구] 공부한 내용을 바탕으로 컨닝 페이퍼(pre-label)를 만든다.
  • ~[친구] 컨닝 페이퍼를 만들면서 더 공부가 필요할 것 같은 문제를 골라본다(샘플링).
  • ~[나] 친구가 고른 문제(데이터)를 직접 푼다.
  • [나] 친구(AI)가 건네준 컨닝 페이퍼를 참고해 시험을 본다

자기가 약한 부분을 직접 파악하고 더 공부하겠다는 친구가 너무 대견스럽습니다. 이렇게 열심히 공부한 친구가 만들어 준 컨닝페이퍼를 갖고 시험을 보면 혹시 만점을 받는 건 아닌지 벌써부터 기대가 됩니다.

Active Learning 쉽게 알아보기

Active Learning 의 이런 과정을 그림으로 표현하면 아래와 같습니다.

Active Learning structure
Active Learning 쉽게 이해하기

그림을 통해 본 Active Learning 에서는 여러 가지 요소들이 존재합니다.

  • 초기 학습량
  • 학습 주기/추가 학습량
  • 샘플링 방법

이 중 가장 연구가 활발하게 진행되고 중요하게 다뤄지는 샘플링 방법에 대해 알아보고, 데이터헌트에서는 어떤 방법으로 Active Learning 을 통해 샘플링 작업 속도 에 효과적으로 도입했는지 살펴보겠습니다.

사실 Active Learning 에는 여러 가지 방법론이 존재합니다.

Membership Query Synthesis(현재 모델이 학습했으면 하는 데이터를 직접 생성하는 방법), Stream-based Selective Sampling(순차적으로 오는 데이터를 두고 학습 여부를 결정하는 방법), 그리고 Pool-based Sampling(보유한 전체 데이터를 두고 그 안에서 어떤 데이터를 먼저 학습할지 결정하는 방법)이 대표적입니다. 이번에는 그중 Pool-based Sampling에 대해 이야기하려 합니다. 그 이유는 아래에서 부연 설명하도록 하겠습니다.

샘플링 방법

데이터헌트에서는 Active Learning의 몇 가지 전략 중 Pool-based Sampling을 적용할 경우가 많습니다. 왜냐하면 작업에 앞서 전체 데이터셋을 확보하는 경우가 많기 때문입니다. 그리고 실제 서비스에서도 많은 데이터를 먼저 보유하고 있는 상황이 많은지 Pool-based 방식에서 가장 많은 연구가 이루어지고 있습니다.

많은 데이터 중 어느 것을 먼저 학습시키면 모델이 더 빠르게 똑똑해질까요? 이것 또한 방법이 여러 가지 존재하지만 그중 Uncertainty Sampling이 주목받고 있습니다. 구현도 쉽고, 범용적이며, 샘플링 속도 도 빠르는 장점이 크기 때문입니다. (이 점은 상당히 중요합니다. 모델은 쉬더라도 작업은 계속 진행되기 때문에 최대한 빠르게 pre-label을 전달할 수 있어야 하기 때문이죠.)

Uncertainty Sampling이란 단어 그대로 불확실성에 의거하여 데이터를 고르는 방법입니다. 모델이 뭐가 답인지 많이 헷갈릴수록 어려운 문제라는 것이 전제입니다. 불확실성을 판단하는 방법은 크게 3가지가 있는데, 그중 Maximum Entropy라는 엔트로피 기반의 불확실성 계산이 가장 유명합니다.

구체적으로...

가장 간단한 분류(Classification) 문제를 살펴보겠습니다. 이 모델은 3가지 클래스를 분류하고 있고 각 입력 데이터에 대해 얻은 결과는 아래와 같습니다.

Active Learning classification Result
classification Result

Least Confidence: 가장 유력한 클래스의 확률이 가장 낮은 데이터 선택

  • 각 후보의 가장 유력한 후보와 그 확률을 살펴보면, 후보 1: 0.5 (강아지), 후보 2: 0.34 (햄스터), 후보 3: 0.4 (강아지 또는 고양이)
  • 이에 따라 우선순위는 후보 3 > 후보 1 > 후보 2

Margin Sampling: 가장 유력한 클래스(Top-1)와 그다음 유력한 클래스(Top-2)의 확률 차이가 가장 작은 데이터 선택

  • 각 후보의 Top-1과 Top-2를 두고 계산하면, 후보 1: 0.1 (강아지 – 고양이), 후보 2: 0.01 (햄스터 – 강아지), 후보 3: 0.0 (강아지 – 고양이)
  • 이에 따라 우선순위는 후보 3 > 후보 2 > 후보 1

Maximum Entropy: Entropy가 가장 높은 데이터 선택

  • 엔트로피를 구하는 방법은

Maximum Entropy 쉽게 구하기

  • 각 후보의 엔트로피를 계산하면 후보 1: 1.361, 후보 2: 1.585, 후보 3: 1.522
  • 이에 따라 우선순위는 후보 2 > 후보 3 > 후보 1

각 방법에서 서로 다른 결과를 얻을 수 있습니다. 그중 Maximum Entropy 방법이 가장 효과가 좋다고 알려져 있습니다 (정보 이론에서 엔트로피의 개념을 열심히 강조하는 것은 다 이유가 있었다).

예시는 데이터 단 3개를 들었지만 실제로는 적게는 1만 개, 많게는 10만 개 단위의 큰 데이터 중에서 먼저 학습해야 할 녀석들을 골라야 합니다. 시간이 많이 걸리는 일이기도 하고, 모종의 이유로 전체 데이터를 대상으로 위와 같은 과정을 거치지는 않는데 데이터헌트에서는 어떤 이유에서 그랬는지 또 실험 결과는 어땠는지 설명하겠습니다.

데이터헌트의 Active Learning 실험

Beluch et al.에서 연구한 내용에 따르면 Unlabeled set에서 K-most uncertain samples를 뽑는 방법은 그다지 효과적이지 않다고 말하고 있습니다. 그 이유는 데이터셋 사이즈 대비 클래스의 수나 복잡도가 떨어지는 데이터에서는 정보의 중복이 발생하기 쉽기 때문이라고 합니다. 따라서 핵심은

  • 보다 작은 subset에서 샘플링 하는 것이 효과적이고, 해당 subset은 random 하게 뽑기
  • 장점은 정보의 중복을 줄일 수 있다는 점
  • 단점은 Global optimal을 찾아가기 어렵다는 점

의 사이즈를 어느 정도로 설정할 것인가는 실험에 따라 다를 수 있습니다. 저희의 실험에서는 전체 데이터 사이즈의 10%로 설정했습니다.

실험설계

  • 모델: YOLOv5s
    빠른 실험을 위해 가벼운 모델로 진행했습니다
  • Uncertainty 계산 대상: 결과로 얻는 각 Bounding box의 class probability
    Bounding box에는 클래스뿐만 아니라 좌표 또한 존재하지만 정답을 모르는 상태에서 좌표의 uncertainty를 구하기가 쉽지 않았습니다
  • 데이터셋: 비공개
    영업 비밀…
  • 초기 labeled 데이터양: 전체의 2%
    초기 모델을 학습하기 위한 최소 데이터양을 정했습니다. 너무 적으면 모델이 학습할 내용이 없고, 너무 많으면 그만큼 작업자들이 pre-label을 활용하지 못한다는 의미이기 때문에 적정 수준을 정했습니다.
  • 샘플링 주기 및 수량: 20 Epoch마다 전체 데이터의 10%씩 추가
    이것 또한 샘플링 및 모델 재학습의 주기가 실제 작업자의 작업 효율에 영향을 미치기 때문에 일정 수준을 정했습니다.
  • 전체 학습량: 총 100 Epoch 실험을 통해 전체의 42%에 해당하는 데이터가 레이블링 되고 학습에 쓰인다고 설정
    모든 데이터가 전부 학습에 쓰이는 시나리오는 없습니다. 왜냐하면 그 말인즉슨 이미 레이블링 작업이 끝났다는 것이기 때문입니다. 모든 데이터가 전부 레이블링 되기 전에 모델은 학습을 마치고 pre-label을 전달할 준비가 되어 있어야 합니다.

샘플링 작업 속도 를 높이는 실험 방법 1

실험 방법

  1. 아직 레이블링이 되지 않은 데이터()에서 20%를 랜덤하게 샘플링한다. 이 데이터의 집합을 이라고 한다.
  2. 의 모든 데이터에 대해 모델 추론 결과를 얻고, Entropy 값이 가장 높은 개의 데이터를 고른다 (실험 설계에 따라는 전체 데이터의 10%로 설정한다)
  3. 이미 레이블링이 되어 있는 데이터 집합()에 개의 데이터를 추가하여 모델을 재학습한다.
  4. 위의 과정을 매 20 epoch마다 진행하여 총 100 epoch까지 학습한다.

이렇게 했을 때 실험 결과는 mAP 기준 0.41 → 0.41로 변화가 없었습니다. 여기서 비교 군은 Active Learning을 진행하지 않고 무작위로 데이터를 골라 학습을 진행한 모델입니다.

분명 논문을 통해 연구된 내용으로는 효과적이었던 알고리즘이 이번 실험에선 왜 효과가 없었을까요? 그 이유를 여러 가지 생각해 봤습니다.

  • 논문의 실험과는 다른 초기 데이터양, 샘플링 양 및 재학습 주기 문제
  • 데이터셋 학습 자체의 난이도
  • 샘플링 방법의 차이

저희는 이 중 세 번째 – 샘플링 방법을 수정해 보기로 했습니다. 왜냐하면 첫 번째는 작업 스케줄링에 크게 영향을 줄 수 있고, 두 번째는 제어하기 어려운 요소이기 때문이었습니다.

생각해 보면 이 방법이 시사하는 바는 무엇일까요? 예시를 들어보겠습니다.

전교생이 1000명 있는 학교에서 임의로 5개 학급으로 나눠 놓고 하나의 학급에서 성적 순으로 100명을 선발하는 것으로 표현할 수 있습니다.

  • 그냥 전교생 중 성적순으로 100명을 뽑으면 성적에 대해 과하게 편향된 샘플링이 될 수 있고
  • 학급의 수를 10개로 늘려 한 학급 당 100명으로 만든 후 하나의 학급을 골라 100명을 뽑으면 결국 그 반에 있는 모든 학생을 뽑는 일이고, 이건 랜덤 샘플링과 다를 바가 없습니다.

모델이 현재 어려워하는 데이터만 모아서 학습을 진행하기보다는 조금 더 넓은 범위의 학습이 효과적이지 않을까요? 우리는 이것을 학습 데이터가 경계(decision boundary) 근처에 편향(bias) 되었다고 이야기하고 이런 학습은 특정 클래스에 편향된 학습을 야기하거나, 앞으로 학습해야 할 다른 데이터의 분포를 잘 고려하지 못하는 generalized 가 덜 된 학습을 유도하게 될 것입니다. 따라서 이 문제를 해결하기 위해 다른 방법을 제안했습니다.

샘플링 작업 속도를 높이는 실험 방법 2

실험 방법

  1. 아직 레이블링이 되지 않은 데이터()에서 20%를 랜덤하게 샘플링한다. 이 데이터의 집합을 이라고 한다.
  2. 의 모든 데이터에 대해 모델 추론 결과를 얻고, Entropy 값이 가장 높은 개의 데이터를 고른다 (실험 설계에 따라는 전체 데이터의 10%로 설정한다)
  3. 에서 랜덤하게 개의 데이터를 샘플링한다.
  4. 이미 레이블링이 되어 있는 데이터 집합()에 개의 데이터를 추가하여 모델을 재학습한다.
  5. 위의 과정을 매 20 epoch마다 진행하여 총 100 epoch까지 학습한다.

데이터 샘플링에 있어 decision boundary에 너무 집중되지 않은 Generalized Subset을 만들기 위해 나머지 그룹에서 정말 랜덤하게 샘플링을 수행합니다. 과 에서 샘플링 되는 데이터의 비율을 50:50으로 만들 수도, 30:70으로 만들 수도 있습니다. 하지만 이 실험에서는 너무 다양한 실험을 진행하지는 않았고 50:50으로 진행했습니다.

결과는 0.41 → 0.43으로 같은 양의 데이터를 학습했음에도 여러 번의 반복 실험 결과 유의미한 샘플링 속도 성능 향상을 얻을 수 있었습니다.

Epoch에 따른 mAP 그래프 – Active Learning을 적용한 결과(파랑)와 일반 학습 결과(빨강) 좌측은 전체 학습 과정에서의 테스트 셋 성능, 우측은 뒷부분을 확대한 그래프

결론

이번 글에서는 Active Learning에 대해 설명하고 데이터헌트에서 샘플링 작업 속도 에 어떻게 적용했는지에 대해 소개했습니다.

작업자의 작업 효율 향상을 위해 Pre-label을 전달하는 데 사용되는 모델을 학습하는 과정에서, 아무 전략 없이 학습하는 것이 아니라 아주 복잡하지는 않지만 나름의 전략과 실험을 통해 더 나은 모델을 만들 수 있었습니다.

Table of Contents
Talk to Expert