본문 바로가기

개발 공부/Deep Learning 스터디

Confident learning(CL) : 데이터에서 잘못된 라벨을 찾아내는 방법

원본 논문 링크 : https://arxiv.org/pdf/1911.00068

 Confident Learning(이하 CL)은 대략 '신뢰도 기반 학습' 정도로 번역할 수 있겠다. CL은 데이터 셋의 라벨(정답)이 틀렸을 가능성을 찾아내고, 그런 라벨 오류(Noisy Label)를 직접 식별하고 수정하기 위한 프레임워크, 방법론, 접근이다.

핵심 아이디어와 작동 방식

 기존의 경우 지도학습은 라벨이 정확하다는 것을 전제로 한다. 하지만 실제 데이터 셋에 경우에는 오류가 섞여있을 수 있고, 이런 상태를 Noisy Label이라고 한다. Confident Learning은 이런 Noisy Label을 식별하기 위해서 다음과 같은 과정을 거친다. 아주아 간단하게 요약하자면, 모델이 정답(이라고 주어진, 오류일 수 있는) Label과 다른 클래스를 정답이라고 매우 확신한다면 그 라벨이 틀렸을 가능성이 높다고 보는 것이다. 이 과정을 논문에서는 크게 Count - Rank - Prune의 과정으로 설명한다.

  1. Count
    1. Noisy Label을 가지고 학습하여 학습 데이터에 대한 예측 확률 (Predicted Probabilities)을 구한다.
      1. 즉, 하나의 데이터가 모델을 거쳐 나온 각 클래스 별 logits를 Softmax 함수를 통과시킨 값을 구하는 것이다.
      2. 이때 자기 자신을 학습하여 자기 자신의 확률을 예측하는 경우를 막기 위해서 k-fold cross-validation을 사용한다. 각 데이터마다 자신을 학습에 사용하지 않은 모델의 예측 확률을 구한다.
    2. 클래스별 Confidence Threshold를 계산한다.
      1. 이 Confidence Threshold는 그 클래스에 속한다고 라벨링 되어있는 데이터들의 평균 자기 확신도(Softmax를 거친 logits 중 자기 클래스의 값, 자기 클래스에 속할 확률로 여겨지는 값)이다.
        1. 즉, '개'로 분류된 데이터들의 자기 확신도( '개 일 확률' 계산값)를 평균을 낸 것이 '개' 클래스의 Confidence Threshold가 된다.
      2. 논문에서는 평균 대신 90th percentile 같은 다른 기준을 사용할 수도 있다고 언급한다.
      3. 이렇게 클래스마다 서로 다른 Threshold를 사용하기 때문에 클래스 불균형이나 클래스별 confidence 분포 차이로 인한 문제를 완화할 수 있다.(클래스 불균형에 강건하다.)
    3. Confident Joint를 만든다.
      1. 주어진 라벨/모델이 분류한 라벨을 행과 열로 하는 표에, '자기 확신도가 가장 높은 클래스에서 그 클래스의 Confidence Threshold를 넘긴 데이터'의 수를 세어 넣은 것을 Confident Joint 행렬이라고 한다.
        1. 일반적인 모델에서 Confusion Matrix(혼동 행렬)과 비슷해 보이지만 큰 차이가 있다. 혼동 행렬은 일단 각 데이터가 무조건 자기 확신도가 가장 높은 클래스 하나로 분류되지만, Confident Joint는 만약 그 데이터의 각 클래스에 속할 확률이 각 클래스의 Confidence Threshold를 하나도 넘기지 못했다면, 즉 모든 클래스에 대한 확신도가 낮다면 아얘 포함되지 않게 된다.
        2. 이 행렬의 대각선은 주어진 라벨 = 모델이 분류한 라벨인 것들이므로, 라벨이 정확하다면 올바르게 분류된 데이터이다. CL의 경우에는 반대로 '올바르게 라벨링 됐을 가능성이 높은 데이터'로 본다. 
    4. Confident Joint를 통해서 데이터셋 전체의 라벨 오류 구조를 추정한다.
      1. 3단계에서, 모든 데이터가 Confident Joint에 포함되는 것은 아니라는 얘기를 했다. 즉 데이터의 총량이 맞지 않을 수 있다. 그래서 데이터 수를 Noisy Label에 맞도록 보정하는 과정을 거친다. 즉 실제(Noisy Label 상으로) '개'인 것의 수가 200개인데, 틀렸든 맞았든 확신을 가지고 분류된(Confidence Threshold를 넘긴) 개 데이터가 160개라면, 각각의 경우를 200/160을 곱해주는 것이다. 이는 '관찰된 상대적인 오류 비율'은 믿을 믿고, 각 행의 총량을 실제 데이터 셋에 관측된 라벨과 맞춰주는 것이다.
      2. 이렇게 보정한 데이터를 전체 데이터 수로 나워 합이 1이 되는 (Joint Distribution)결합 확률 분포로 바꾼다.
      3. 라벨의 오류 확률은 개별 데이터에 있는게 아니라 class에 의해 결정된다고 가정한다. 류가 잦은 클래스가 따로 있다고 여기는 것이다.
  2. Rank
    1. 라벨이 잘못되었을(Label Error) 가능성이 높은 데이터를 찾고 순위를 매긴다.
      1. 논문에서 몇 가지 방법이 제시된다. 예를 들어 단순하게 Confident Joint의 비대각선 자리를 모두 라벨 오류 후보로 쓰는 방법이 있다. 이 중 분류된 클래스의 자기 확신도가 낮고 다른 클래스의 자기 확신도가 높은 것들을 추려낼 수 있다.
        1. 가령 라벨이 '고양이'인데 '고양이'에 대한 자기 확신도가 매우 낮고 '개'에 대한 지기 확신도가 높다면, (그러나 Confidence Threshold를 넘기지 못해 고양이로 분류됐다면) 이 데이터는 라벨이 잘못됐을 확률이 높다고 여기는 것이다.
      2. 논문이 재시하는 한 단계 더 나아간 방법이 있다. Confident Joint를 보정해서 만든 Joint Distribution를 가지고 '각 클래스의 label error가 몇 개 정도 존재하는지'를 추정할 수 있다. 가령 '개'를 '고양이'라고 잘못 확신할 가능성이 0.04라면 전체 데이터 중 4%에 해당하는 수만큼은 '개'인데 '고양이'로 잘못 분류했다고 생각하는 것이다.
        1. Prune by Class (PBC) : 위 경우를 모두 종합하여 '고양이'로 잘못 분류된 데이터의 비율(예를 들어 4%)을 추측할 수 있다. 그러면 '고양이'로 분류된 샘플 중 자기 확신도가 낮은 순으로 전체 데이터에서 그 비율(4%)만큼을 Label Error 후보로 판단할 수 있다.
        2. Prune by Noise Rate (PBNR) : 가령 '개'를 '고양이'로 잘못 판단할 확률이 1%라고 하면, '개' 라벨을 가진 샘플 중에서 '고양이일 확률 - 개일 확률'이 가장 높은 샘플을 전체 데이터의 1%만큼 골라 Label Error 후보로 판단할 수 있다.
  3. Prune
    1. 라벨이 잘못됐다고 판단한 샘플들을 제거(Prune)하여 정제된 데이터 셋으로 모델을 재학습 한다.
      • 논문에서는 이 Label Error를 가지고 어떤 학습 절차를 사용할지 까지는 특정 방법으로 강제하지 않는다고 명시된다.
      • Label Error로 판단된 샘플을 제거하여 그 모델로 재학습하는 것은 논문이 제시한 한가지 방법이다. 이때,
        • 클래스 별로 데이터 수가 원래 데이터 수보다 줄을게 되므로, 클래스 별 Loss의 Weight를 조정한다.

 

특징

  • CL은 특정 모델 아키텍쳐나 손실 함수에 종속되지 않고 사용할 수 있다. 모델이 출려가는 predicted probability만 존재하면 된다.
  • 클래스 별로 다른 임계값을 사용하여 클래스 불균형에 강건하다.
  • 라벨 오류의 총량 분 아니라 오류의 방향까지 추정한다. 가령 '개'인데 '고양이'로 잘못 본 경우가 얼마나 되는지를 추정할 수 있다.

활용 사례

  • ImageNet, MNIST 등 대형 데이터 셋에서 오류 라벨을 탐지
    • ImageNet에서 projectile ↔ missile, tub ↔ bathtub, green lizard ↔ chameleon 처럼 상위 개념, 단위의 중의성에 의한 문제 사례를 발견, 단순 Label Error 뿐만 아리 클래스 설계 자체의 문제도 발견할 수 있음을 보여줌
    • 거의 오류가 없다고 여겨졌던 MNIST에서도 명백한 Label Error를 발견
    • WebVision과 같이 애초에 noisy한 웹 수집 데이터에서 오류 탐지
      • WebVision : 온라인 이미지 검색 결과를 이용해 구축한 데이터 셋, 검색어 자체를 Noisy Label로 사용
  • Amazon 리뷰의 감성 분류에 적용, CL이 딥러닝 이미지 분류 전용 기법이 아니라는 것, 모델 독립적이라는 특성을 보임

소감

 예전 학부생 시절, 대학원을 다니는 친구에게 아르바이트를 제안 받은 적이 있었다. 영상에서 사람을 식별하기 위한 라벨링을 하는 작업이었는데, 정말 끔찍한 시간이었던 게 생각난다. 아르바이트를 제안한 내 친구를 포함한, 해당 연구실 학생들이 촬영된 CCTV 영상에서 사람의 위치를 사각형으로 표시하는, 데이터 라벨링 작업이었다. 덕분에 요즘 Deep Learning을 배우면서 'Deep Learning에서 가장 어려운 부분은 좋은 데이터를 얻는 것이다'라는 말에 뼈져리게 공감할 수 있었다. 딥러닝 모델들은 정말 신기할 정도로 정확한 능력을 발휘하곤 하지만, 이를 위해서는 일단 사람이 노동력을 쏟아부어 학습 데이터를 만들어야 하는 것이다. 그리고 이를 해결하기 위한 수많은 노력이 있으리라 짐작한다.

 그런 의미에서 CL은 참 인상깊었다. 물론 CL도 생각했던 것처럼 '뿅'(요즘은 '딸깍'이라는 표현이 더 흔하려나)하고 데이터를 정상 분류해주는 것은 아니지만, 오류가 있는 데이터를 모델 스스로 추정해 수정하는 방법을 제법 설득력 있게 설계해냈다는 게 감탄스러웠다. 그리고 덕분에 그 학부생 아르바이트 시절 고통스러운 아르바이트 기억도 상기시켜줬고.