지난 글에서 학습 데이터를 모으는 방법을 다뤘다. 모아 온 원시 데이터에는 정답이 없다. 지도 학습은 「이것이 고양이다」, 「이 문장은 불만이다」를 알려 주는 정답, 곧 레이블이 있어야 시작되고, 그 레이블을 만드는 일이 레이블링이다.
레이블링은 지루한 잡일로 취급되지만 실제로는 모델 성능의 상한을 정하는 자리다. 사람 둘이 같은 데이터에 다른 답을 붙이고 있다면 모델은 그 둘의 평균을 배우고, 평가셋도 같은 사람들이 만들었으므로 그 혼란은 점수에도 안 보인다. 그래서 이 글이 다루는 것은 레이블링 도구가 아니라 판정 기준을 어떻게 세우고 지켜지는지를 어떻게 재는가다.
순서는 여섯이다. 판정 기준을 적는 법, 그것이 지켜지는지를 재는 법, 한정된 예산으로 무엇을 먼저 붙일지 고르는 법, 사람 아닌 것이 붙인 레이블을 검수하는 법, 전체 비용을 세는 법, 그리고 답이 하나로 정해지지 않는 과제에서 쓰는 다른 형태의 레이블이다.
가이드라인
정의가 아니라 판정 절차
가이드라인을 「긍정: 제품에 만족하는 내용」처럼 정의로 쓰면 대부분의 애매한 항목에서 아무 도움이 안 된다. 「배송은 빨랐는데 제품은 별로」는 만족인가. 레이블러는 각자 답을 정하고, 그 차이는 수천 건에 걸쳐 조용히 쌓인다.
쓸모 있는 가이드라인은 정의가 아니라 판정하는 순서로 되어 있다. 위에서부터 물어 처음 「그렇다」가 나오는 칸에 넣는 식이다. 순서가 정해져 있으면 두 사람이 같은 항목에서 같은 답에 도달하고, 나중에 기준을 고칠 때도 어느 질문을 고칠지가 분명해진다.
앞의 예로 돌아가면 이렇게 적힌다. 「제품에 대한 평가가 있는가 → 없으면 중립. 있으면 그 평가가 부정적인가 → 배송·응대 같은 다른 요소의 평가는 세지 않는다.」 무엇을 세지 않는지까지 적히는 것이 중요하다. 레이블러가 망설이는 자리는 대개 무엇을 봐야 하는지가 아니라 무엇을 무시해도 되는지를 몰라서다.
경계 사례를 먼저 모은다
가이드라인은 책상에서 쓰는 것이 아니라 데이터에서 자란다. 실제 데이터를 백 건쯤 훑으면서 판정이 갈리는 항목만 모으고, 그것들을 놓고 기준을 정한 뒤, 정해진 판정을 예시로 가이드에 박아 넣는다. 이 예시 목록이 가이드라인의 본체이고, 앞의 정의 문장은 그 목록의 머리말에 가깝다.
경계 사례를 모을 때는 그 항목이 왜 갈렸는지도 한 줄씩 적어 둔다. 나중에 같은 종류가 또 나왔을 때 예시 하나를 찾는 것보다 그 이유를 읽는 편이 빠르고, 기준을 개정할 때 무엇이 함께 움직이는지도 그 줄이 알려 준다.
경계 사례를 모으는 일은 가장 잘 아는 사람이 해야 한다. 이 단계를 외부에 맡기면 판정 기준이 없는 상태에서 판정 기준을 만들라는 요구가 되어, 돌아오는 것은 누군가의 임의 기준이다. 실제 작업은 나눠 맡기더라도 첫 백 건은 기준을 정할 사람이 직접 붙여 보는 편이 낫다.
고치는 주기
가이드라인은 한 번 쓰고 끝나지 않는다. 작업이 진행되면 예상 못 한 형태가 계속 나오고, 그때마다 판정을 정해 예시에 더해야 한다. 다만 고칠 때마다 이전에 작업한 것 중 어디까지가 영향을 받는지를 함께 적어야 한다. 기준을 바꿔 놓고 앞의 작업분을 그대로 두면 한 데이터셋 안에 두 기준이 섞이고, 그 섞임은 나중에 찾아내기가 거의 불가능하다.
그래서 가이드라인에도 판번호를 둔다. 각 항목에 어느 판으로 작업했는지를 같이 저장해 두면, 기준이 바뀌었을 때 되돌아볼 범위가 조회 한 번으로 나온다. 저장 칸 하나를 더 두는 비용으로 재작업 범위 산정이라는 가장 골치 아픈 작업이 사라진다.
판번호와 함께 남기면 좋은 것이 둘 더 있다. 누가 붙였는지와 언제 붙였는지다. 나중에 특정 구간의 품질이 의심스러울 때 이 둘이 없으면 데이터 전체를 의심하게 되고, 있으면 의심할 범위가 한 사람의 한 주로 줄어든다.
일치도
레이블러가 여럿이면 같은 항목에 다른 답이 붙는다. 이 정도를 재는 값이 레이블러 간 일치도(IAA)이고, 데이터 품질을 사람이 아니라 수로 보게 해 주는 유일한 장치다.
from sklearn.metrics import cohen_kappa_score
kappa = cohen_kappa_score(labels_a, labels_b)
우연을 보정하는 이유
단순 일치율을 쓰면 안 되는 이유가 있다. 두 사람이 아무 생각 없이 전부 「중립」으로 찍어도 항목의 80%가 중립이면 일치율은 80%가 나온다. 카파는 우연히 맞을 확률을 빼고 남는 만큼만 세므로 이런 경우 0에 가까워진다. 값의 해석은 관행적으로 0.6 이상이면 쓸 만하고 0.8 이상이면 좋다고 보지만, 이 구간은 과제에 따라 달라지므로 절대 기준으로 삼기보다 같은 과제에서 시간에 따라 어떻게 움직이는가를 보는 편이 낫다.
레이블러가 셋 이상이거나 레이블이 순서를 갖는 값이면 카파 대신 다른 계수를 쓴다. 중요한 것은 계수 선택이 아니라 재고 있다는 사실이다 — 일치도를 한 번도 안 재고 만든 데이터셋은 품질을 주장할 근거가 없다.
재는 방법은 간단하다. 전체의 일부를 두 사람에게 겹쳐 준다. 5%에서 10% 정도면 되고, 겹치는 항목이라는 사실을 작업자가 모르게 섞어 넣는다. 이 겹침 표본은 작업 내내 유지해야 한다 — 처음에만 재고 끝내면 작업 후반에 기준이 흐트러지는 것을 못 잡는다.
겹침 표본에는 부수적인 쓸모가 하나 더 있다. 작업이 길어지면 같은 사람도 초반과 후반의 판정이 달라지는데, 같은 항목을 시간을 두고 두 번 주면 그 흔들림이 수로 보인다. 사람 사이의 일치도와 한 사람 안의 일관성은 다른 값이고, 둘 다 낮으면 먼저 볼 것은 가이드의 애매함이다.
낮게 나왔을 때의 복구 절차
값이 기준 아래로 나오면 사람을 바꾸는 것이 아니라 가이드를 고친다. 순서는 넷이다. 먼저 불일치 항목만 모아 유형을 센다 — 대개 몇 가지 유형이 불일치의 대부분을 차지한다. 그다음 그 유형마다 판정을 정해 가이드에 예시로 넣고, 레이블러를 다시 교육한 뒤, 같은 표본으로 일치도를 다시 잰다.
마지막 단계가 재작업 범위 산정이다. 기준이 바뀌었으므로 이전 작업분 중 그 유형에 해당하는 것을 다시 봐야 하는데, 전부 다시 하는 것은 대개 불가능하다. 그래서 바뀐 유형에 걸리는 항목만 골라 내는 조건을 만들고 그만큼만 재작업한다. 이 조건을 만들 수 없으면 그때는 전수 재작업이거나, 그 구간을 버리는 것이다.
이 절차에서 자주 건너뛰는 것이 첫 단계다. 값이 낮게 나오면 바로 교육으로 가려는 힘이 작용하는데, 유형을 안 세고 하는 교육은 무엇을 고쳐야 하는지 없이 「더 신경 쓰자」로 끝나고 값도 안 오른다. 불일치 항목을 유형으로 묶는 데 반나절이면 되고, 그 반나절이 나머지 셋의 방향을 정한다.
불일치가 알려 주는 것
불일치 항목은 버릴 것이 아니라 가장 값진 데이터다. 사람이 갈리는 항목은 모델도 갈리는 항목이고, 그 목록이 곧 이 과제의 어려운 부분이다. 평가셋을 만들 때 이 항목들을 일부러 포함시키면 모델이 쉬운 구간에서만 잘하는 것을 잡아낼 수 있다. 다만 학습셋에 넣을 때는 판정이 확정된 뒤에 넣어야 한다.
불일치가 유독 높은 레이블러가 보이는 경우도 있다. 이때도 첫 반응은 사람 문제로 보지 않는 것이다. 한 사람만 다르게 판정하고 있다면 그 사람이 가이드의 어느 줄을 다르게 읽고 있는지가 드러나는 자리이고, 그 줄은 다른 사람들도 언젠가 다르게 읽을 줄이다. 실제로 가이드를 고칠 거리가 이 경로로 가장 많이 나온다.
무엇을 먼저 레이블링하나
예산은 유한하고 데이터는 많다. 무작위로 뽑아 순서대로 붙이는 것은 가장 나쁜 선택은 아니지만, 같은 예산으로 더 좋은 모델을 만드는 방법이 있다.
모델이 헷갈리는 것부터
이미 모델이 하나 있다면 그 모델에게 전체 데이터를 예측시키고, 가장 확신이 없는 항목부터 사람에게 준다. 모델이 이미 자신 있게 맞히는 항목은 레이블을 붙여도 배울 것이 거의 없고, 판단이 반반으로 갈리는 항목이 결정 경계 근처에 있어 정보량이 크다. 이 되풀이를 능동 학습이라 부르고, 실제로 같은 정확도에 닿는 데 필요한 레이블 수가 눈에 띄게 줄어드는 경우가 많다.
확신이 없다는 것을 무엇으로 재는지는 과제에 따라 다르다. 분류라면 가장 높은 확률이 낮은 항목이나 1등과 2등의 차이가 작은 항목을 쓰고, 모델을 여러 개 두었다면 그 모델들의 답이 갈리는 항목을 쓴다. 어느 쪽이든 같은 것을 재고 있다 — 지금 이 모델이 이 항목에서 아직 결정을 못 내리고 있다는 사실이다.
다만 이 방식에는 함정이 하나 있다. 이렇게 모은 데이터는 무작위 표본이 아니므로 평가셋으로 쓰면 안 된다. 어려운 항목만 모여 있어 실제 성능보다 낮게 나오고, 분포도 실제와 다르다. 평가셋은 처음에 무작위로 떼어 고정해 두고, 능동 학습은 학습셋만 키운다.
다양성도 같이 본다
확신도만 보고 뽑으면 한 가지 종류만 잔뜩 뽑히는 일이 생긴다. 비슷한 항목이 모여 있으면 그 근처에서 모델이 다 헷갈리기 때문이다. 그래서 확신이 없는 항목들 중에서 서로 멀리 떨어진 것을 고르는 단계를 하나 더 둔다. 묶음으로 뽑아 작업을 맡기는 현실에서는 이 단계가 특히 중요하다 — 백 건을 한꺼번에 뽑는데 그 백 건이 사실상 같은 항목이면 아흔아홉 건은 헛돈다.
고르는 방법은 복잡하지 않아도 된다. 후보를 확신도 순으로 넉넉히 뽑은 뒤 임베딩으로 몇 개의 무리로 나누고 무리마다 몇 건씩 가져오는 정도면 대부분의 경우 충분하다. 여기서 중요한 것은 정교함이 아니라 같은 것을 여러 번 묻지 않는 것이다.
규칙으로 먼저 훑기
모델이 아직 없을 때 쓰는 방법도 있다. 도메인 전문가가 「이런 낱말이 있으면 대개 불만」 같은 규칙을 여러 개 쓰고, 그 규칙들의 투표를 모아 잠정 레이블을 만드는 방식이다. 규칙 하나하나는 부정확해도 여러 개가 겹치는 자리는 대체로 맞고, 규칙들이 서로 엇갈리는 자리가 곧 사람이 봐야 할 자리다. 이렇게 하면 사람의 일이 「전부 붙이기」에서 「어려운 것만 판정하기」로 줄어든다.
규칙을 쓸 때 지킬 것이 하나 있다. 규칙은 정확하려고 애쓰지 말고 모르겠으면 기권하게 만든다. 애매한 항목까지 억지로 판정하는 규칙은 그 오류가 여러 규칙의 투표에 그대로 섞여 들어가고, 기권할 줄 아는 규칙 여럿은 겹치는 자리에서만 목소리를 내므로 결과가 훨씬 깨끗하다.
자동 레이블의 검수
LLM에게 레이블을 붙이게 하는 방식은 비용을 크게 줄인다. 다만 검수 설계까지 포함해야 이 방식이 성립한다 — 검수 없이 쓴 자동 레이블은 모델의 편향을 데이터에 박아 넣는 일이다.
얼마나 뽑는가
전수 검수는 자동화의 뜻을 없앤다. 표본을 뽑되 무작위로만 뽑지 않는다. 자동 레이블의 오류는 고르게 퍼지지 않고 특정 구간에 몰리므로, 층을 나눠 뽑는 편이 같은 표본 수로 훨씬 많은 오류를 찾는다. 나누는 층은 셋이면 충분하다 — 클래스별로, 모델이 확신한 정도별로, 그리고 규칙이나 다른 모델과 답이 엇갈린 항목이다.
마지막 층이 가장 값을 한다. 두 경로가 다른 답을 낸 항목만 모아 보면 자동 레이블의 실패 유형이 대부분 거기서 드러난다.
표본 크기는 찾으려는 오류율에 따라 정한다. 오류율이 10% 근처일 것으로 보고 그것을 몇 퍼센트 오차로 재려면 수백 건이 필요하고, 1% 근처의 드문 오류를 확인하려면 무작위 표본으로는 거의 잡히지 않는다. 드문 오류를 찾는 일은 표본 크기를 키우는 문제가 아니라 층을 잘 고르는 문제다.
검수하는 사람이 자동 레이블을 미리 보는지도 결과를 바꾼다. 붙어 있는 답을 보고 판정하면 그 답에 끌려가 틀린 것을 맞다고 넘기는 일이 늘어난다. 표본만큼은 답을 가리고 사람이 먼저 붙인 뒤에 대조하는 편이 낫고, 그렇게 재야 이 수를 다른 방식의 정확도와 나란히 놓을 수 있다.
무엇을 재는가
검수의 산출물은 「몇 건이 틀렸다」가 아니라 클래스별 오류율이어야 한다. 전체 정확도가 90%라도 소수 클래스에서만 절반이 틀리고 있다면 그 데이터로 학습한 모델은 그 클래스를 못 배운다. 클래스별로 나눠 재고, 오류율이 높은 클래스는 자동 레이블을 쓰지 않고 사람이 붙이는 식으로 갈라도 된다 — 전부 자동이거나 전부 수동일 필요가 없다.
클래스별로 나눠 재면 또 하나가 보인다. 자동 레이블이 어느 한 클래스로 답을 몰아넣는 버릇이 있는지다. 붙인 레이블의 분포를 사람이 붙인 표본의 분포와 나란히 놓아 보면 이 쏠림이 바로 드러나고, 쏠림이 크면 그 데이터로 학습한 모델은 그 쏠림을 그대로 물려받는다.
검수 결과를 되먹이기
찾아낸 오류는 고치고 끝낼 것이 아니라 두 곳으로 되돌린다. 하나는 자동 레이블에 쓰는 지시문이다. 틀린 유형이 반복되면 그 유형의 판정을 지시문에 예시로 넣는다. 다른 하나는 사람의 가이드라인이다 — 자동 레이블이 헷갈리는 자리는 대개 사람도 헷갈리는 자리라, 경계 사례 목록에 그대로 올라갈 항목이다.
되먹임을 돌릴 때는 검수 표본을 매번 새로 뽑는다. 지시문을 고친 뒤 같은 표본으로 다시 재면 그 표본에만 맞춘 개선이 되어, 실제로는 안 좋아졌는데 수만 오르는 일이 생긴다. 고치기 전의 표본은 기록으로 남기고 재는 것은 새 표본으로 한다.
비용
레이블링 비용을 건당 단가로만 세면 실제 청구서와 크게 어긋난다. 세야 하는 항목이 넷이다.
한 식으로 세기
총비용은 대략 이렇게 나뉜다 — 건당 단가 곱하기 건수, 재작업분, 검수에 드는 사람 시간, 그리고 가이드라인을 쓰고 고치고 교육하는 고정 비용이다. 재작업률이 20%면 단가가 20% 오른 것과 같고, 검수를 10% 표본으로 한다면 전문가 시간이 그만큼 더 들어간다.
이 식에서 가장 자주 빠지는 것이 마지막 항목이다. 가이드라인 작성과 교육은 건수에 비례하지 않는 고정 비용이라, 작업 규모가 작을수록 전체에서 차지하는 비중이 커진다. 천 건짜리 작업에서는 이 고정 비용이 절반을 넘기도 한다.
반대로 이 구조는 규모가 커질수록 유리해진다는 뜻이기도 하다. 같은 가이드라인으로 십만 건을 붙이면 고정 비용은 건당 거의 0에 수렴하므로, 큰 작업에서 아껴야 할 것은 준비가 아니라 재작업률이다. 작업 규모에 따라 어디에 힘을 쓸지가 갈린다.
품질을 올리는 것이 싼 이유
재작업률은 가이드라인 품질에 직접 매여 있다. 경계 사례를 미리 정해 두는 데 며칠을 쓰면 재작업률이 몇 분의 일로 떨어지고, 그 차이가 건수에 곱해진다. 그래서 규모가 큰 작업일수록 시작을 늦추더라도 기준을 먼저 세우는 편이 싸다. 일치도를 초기에 한 번 재 보는 것도 같은 이유의 투자다 — 천 건을 만든 뒤에 알게 되는 것과 오십 건에서 알게 되는 것의 값이 다르다.
그래서 큰 작업은 작게 시작한다. 오십 건에서 백 건 정도를 먼저 붙이고 일치도를 재고 가이드를 고치는 한 바퀴를 두세 번 돌린 뒤에 본 작업을 연다. 이 준비 구간을 건너뛴 작업은 거의 예외 없이 중간에 멈추고 처음부터 다시 한다.
어디까지 사람이 하나
비용을 줄이는 결정은 결국 「어느 부분을 사람이 하는가」로 수렴한다. 쉬운 구간은 자동 레이블에 맡기고 사람은 경계와 검수에만 들어가는 구성이 대체로 가장 싸다. 이 배치를 정하려면 앞의 셋이 다 필요하다 — 어느 구간이 쉬운지는 모델의 확신도가, 자동 레이블을 믿어도 되는지는 검수 결과가, 사람이 붙일 수 있는 양은 비용 식이 알려 준다.
배치를 한 번 정했다고 고정할 필요도 없다. 모델이 좋아지면 자동에 맡길 수 있는 구간이 넓어지고, 새로운 종류의 데이터가 들어오면 다시 좁아진다. 검수 결과를 주기적으로 보면 이 경계를 어느 쪽으로 옮길지가 수로 나온다.
선호 데이터
정답이 아니라 비교를 모은다
지금까지의 레이블링은 「이 항목의 정답은 무엇인가」를 묻는다. 모델의 답변 품질을 다루는 자리에서는 이 질문이 성립하지 않는다 — 좋은 답변이 하나로 정해지지 않기 때문이다. 그래서 정답 대신 두 답변 중 어느 쪽이 나은가를 모으고, 그 비교가 학습 신호가 된다.
이 형태가 필요한 이유는 사람이 절대 점수보다 상대 비교를 훨씬 일관되게 매기기 때문이다. 같은 답변에 10점 만점으로 점수를 매기라고 하면 사람마다 기준이 다르고 같은 사람도 날마다 다르지만, 둘을 놓고 고르라고 하면 일치도가 크게 오른다.
대신 비교는 정보량이 적다. 어느 쪽이 낫다는 것만 알려 줄 뿐 얼마나 나은지는 안 알려 주므로, 같은 수의 판정으로 얻는 신호가 점수보다 얇다. 그래서 선호 데이터는 대개 절대 점수보다 많이 모아야 하고, 어느 쪽 답이 왜 나은지를 한 줄씩 같이 받아 두면 그 얇음을 어느 정도 메울 수 있다.
그리고 비교에는 「둘 다 별로」라는 답이 있어야 한다. 억지로 하나를 고르게 하면 나쁜 답 둘 중 하나가 좋은 답으로 기록되고, 그 신호를 학습한 모델은 그 수준을 목표로 삼는다. 기권할 수 있게 두는 것은 앞의 규칙 기반 레이블에서와 같은 이유이고, 기권이 많이 나오는 프롬프트는 그 자체로 모델이 아직 못 하는 구간을 알려 준다.
여기서도 가이드가 먼저다
비교라고 해서 기준이 필요 없는 것은 아니다. 「정확하지만 무례한 답」과 「친절하지만 부정확한 답」 중 무엇을 고를지가 정해져 있지 않으면 수집한 선호는 방향이 없는 잡음이 된다. 기준의 우선순위를 미리 정하고, 그 순위로 판정한 경계 사례를 예시로 두는 것까지가 앞 절들과 같다.
수집 방식과 모은 비교를 어떻게 학습으로 옮기는가는 선호 데이터 수집이 맡는다. 여기서는 레이블링의 갈래가 하나 더 있다는 것과, 그 갈래에서도 기준을 먼저 세운다는 원칙이 같다는 것만 짚어 둔다.
읽어주셔서 감사합니다. 😊

