지난 글에서 손실 함수가 학습 목표를 정하고, 그 손실 위에 항을 더하거나 절차를 바꾸는 방식으로 과적합을 억제한다는 것을 봤다. 그런데 손실을 계산하려면 모델의 출력과 견줄 무언가가 있어야 한다. 그 '견줄 무언가'를 어디서 얻느냐가 머신러닝을 몇 갈래로 나눈다. 이 글에서는 그 갈래 넷 — 지도·비지도·반지도·자기지도 학습 — 을 "정답이 어디서 오는가"라는 질문 하나로 꿰어 보고, 각 갈래가 무엇을 전제하며 그 전제가 깨지면 무엇이 틀어지는지를 scikit-learn으로 직접 확인한다. 마지막에는 LLM이 실제로 이 넷을 어떤 순서로 이어 붙여 만들어지는지까지 따라간다.
레이블의 유무
하나의 고객 데이터
온라인 쇼핑몰의 고객 표 하나를 떠올려 보자. 행 하나가 고객 한 명이고, 열에는 방문 횟수·평균 구매액·마지막 접속일·주로 보는 상품군이 들어 있다. 이 표에 무엇을 더 붙이느냐에 따라 같은 데이터가 전혀 다른 문제가 된다. "다음 달에 떠날 고객인가"라는 예·아니오 열을 붙이면 분류 문제가 되고, "다음 달 구매액"이라는 숫자 열을 붙이면 회귀 문제가 된다. 아무 열도 붙이지 않고 "비슷한 고객끼리 묶어 달라"고 하면 군집화 문제가 된다.
여기서 새로 붙이는 그 열을 레이블이라 부른다. 모델이 맞혀야 할 정답이고, 입력 열들은 그 정답을 맞히는 데 쓰는 단서다. 레이블이 있으면 모델의 예측과 레이블을 견줘 손실을 계산할 수 있고, 손실이 있으면 지난 글에서 본 대로 파라미터를 그 손실이 줄어드는 쪽으로 옮길 수 있다. 레이블이 없으면 이 고리가 끊긴다. 그래서 레이블이 있느냐 없느냐가 알고리즘 선택보다 먼저 오는 질문이다.
레이블 획득 비용
레이블은 공짜가 아니다. 고객 이탈 여부는 한 달을 기다리면 저절로 생기지만, 흉부 X선 사진에 "폐렴 있음"을 적는 일은 영상의학과 전문의가 한 장씩 판독해야 한다. 계약서 조항을 "위험 조항"으로 표시하는 일에는 변호사의 시간이 든다. 레이블 한 건이 수천 원에서 수만 원에 이르는 도메인에서는 데이터가 수백만 건 있어도 레이블이 붙은 것은 수천 건뿐인 상황이 흔하다.
이 비용이 알고리즘 선택을 앞선다. 성능이 가장 좋은 지도 학습 모델을 고를 수 있어도 그 모델을 먹일 레이블이 없으면 소용이 없다. 실무에서 "무슨 모델을 쓸까"보다 "레이블을 얼마나, 얼마에 구할 수 있나"를 먼저 묻는 까닭이다. 반지도 학습과 자기지도 학습은 둘 다 이 비용을 줄이려는 시도로 읽으면 이해가 쉽다.
네 가지 패러다임
학습 방식의 큰 틀을 패러다임이라 부르고, 여기서는 넷을 다룬다. 넷은 나란한 네 가지가 아니라 한 질문의 네 가지 답이다 — 정답이 어디서 오는가.
- 지도 학습: 사람이 모든 데이터에 정답을 붙여 준다.
- 비지도 학습: 정답이 없다. 데이터의 모양 자체가 목표다.
- 반지도 학습: 일부에만 사람이 정답을 붙이고, 나머지로 그 정답을 퍼뜨린다.
- 자기지도 학습: 데이터의 일부를 가려 두고, 가린 부분을 정답으로 쓴다.
지도 학습
분류와 회귀
지도 학습(supervised learning)은 입력 X와 레이블 y를 쌍으로 받아 인 함수 f를 찾는다. 여기서 f가 모델이고, f 안에서 값을 바꿀 수 있는 숫자들이 파라미터이며, 그 숫자를 레이블에 맞게 정하는 절차가 학습이다. 레이블이 무엇이냐에 따라 두 갈래로 나뉜다. 레이블이 이산적인 부류이면 분류(classification), 연속적인 수이면 회귀(regression)다.
두 갈래는 손실 함수가 다르다. 분류는 모델이 각 부류에 확률을 나눠 주게 하고, 정답 부류에 준 확률의 음의 로그를 손실로 쓴다 — 교차 엔트로피다. 회귀는 예측과 정답의 차이를 제곱해 평균 내는 평균제곱오차가 기본이다. 지난 글에서 본 대로 손실이 곧 학습 목표이므로, 분류냐 회귀냐는 "무엇을 맞혔다고 칠 것인가"를 정하는 선택이다.
공통 인터페이스
scikit-learn은 알고리즘이 무엇이든 같은 동사 셋을 쓴다. fit으로 학습하고, predict로 예측하고, score로 채점한다. 아래 코드에서 RandomForestClassifier를 LogisticRegression으로 바꿔도 나머지 줄은 한 글자도 안 바뀐다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train) # 레이블을 보고 학습
pred = clf.predict(X_test) # 레이블 없이 예측
print(f"정확도: {accuracy_score(y_test, pred):.3f}") # 1.000
이 통일이 실무에서 갖는 의미는 크다. 모델을 바꿔 보는 비용이 한 줄이므로 여러 알고리즘을 같은 데이터로 돌려 보고 고르는 일이 싸진다. 붓꽃 데이터처럼 테스트가 30개뿐이면 1.000이 나와도 한두 개 차이로 요동치는 값이니, 비교할 때는 교차 검증 평균을 보는 편이 안전하다.
레이블 잡음
지도 학습은 레이블을 진실로 믿는다. 그래서 레이블이 틀려 있으면 모델은 그 틀린 것까지 배우려 한다. 레이블 중 일부가 잘못 붙은 상태를 레이블 잡음(label noise)이라 부른다. 판독자마다 경계 사례를 다르게 적거나, 크라우드소싱 작업자가 서두르거나, 규칙이 중간에 바뀌면 생긴다.
레이블 잡음은 성능의 천장을 미리 정한다. 이진 분류에서 테스트 레이블의 10%가 무작위로 뒤집혀 있다면, 진짜 규칙을 완벽히 배운 모델도 채점에서는 90%를 넘지 못한다. 10%는 모델이 맞혔는데 채점표가 틀린 자리이기 때문이다. 반대로 훈련 레이블의 잡음은 모델을 흐리게 만든다. 모델이 클수록 잡음까지 외워 버리므로, 레이블 품질을 5% 올리는 일이 모델을 한 단계 키우는 일보다 효과가 큰 경우가 흔하다.
비지도 학습
네 가지 과제
비지도 학습(unsupervised learning)은 레이블 없이 X만 받는다. 맞힐 정답이 없으니 목표는 데이터의 모양을 드러내는 것이고, 무엇을 드러내려 하느냐로 과제가 넷으로 갈린다.
| 과제 | 얻으려는 것 | 대표 알고리즘 |
|---|---|---|
| 군집화 | 비슷한 것끼리의 묶음 | K-Means, DBSCAN |
| 차원 축소 | 정보를 덜 잃는 적은 수의 축 | PCA, t-SNE, UMAP |
| 이상 탐지 | 다수와 동떨어진 점 | Isolation Forest |
| 밀도 추정 | 데이터가 어디에 얼마나 몰렸는가 | GMM, KDE |
넷은 서로 이어져 있다. 밀도를 알면 밀도가 낮은 곳이 이상치이고, 밀도의 봉우리 하나하나가 군집이다. 차원 축소는 흔히 군집화 앞에 붙어 거리 계산을 안정시킨다.
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
X_scaled = StandardScaler().fit_transform(X)
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(X_scaled) # 레이블 없이 묶기
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X_scaled)
print(f"분산 설명력: {pca.explained_variance_ratio_.sum():.1%}") # 95.8%
붓꽃의 네 특성을 두 축으로 줄여도 분산의 95.8%가 남는다. 네 특성이 서로 강하게 얽혀 있어 실제로는 두 방향만으로 대부분이 설명된다는 뜻이다.
내부 지표 평가
정답이 없으면 채점도 정답 없이 해야 한다. 비지도 학습의 결과는 그래서 내부 지표, 곧 결과물 자체의 모양만 보고 매기는 점수로 평가한다. 군집화라면 "같은 군집 안은 가깝고 다른 군집과는 먼가"를 재는 실루엣 계수 같은 것이다. 이 지표들은 클러스터링 평가 지표에서 따로 다룬다.
여기서 기억할 것은 내부 지표가 "쓸모 있는가"를 재지 못한다는 점이다. 고객을 나이대별로 깔끔하게 나눈 군집은 실루엣이 높아도 마케팅팀이 이미 아는 내용이면 쓸모가 없다. 비지도 학습의 마지막 검증은 결국 도메인을 아는 사람이 군집 몇 개를 열어 보고 이름을 붙일 수 있는지 확인하는 일이다.
스케일링
지도 학습에서도 특성의 단위를 맞추는 스케일링은 중요하지만, 비지도 학습에서는 결과를 통째로 바꾼다. K-Means는 점 사이의 거리로 군집을 정하는데, 거리 계산에서는 값의 범위가 큰 특성이 거의 모든 것을 결정하기 때문이다. 지도 학습은 레이블이 "그 특성은 별로 안 중요하다"고 알려 줄 수 있지만, 비지도 학습에는 그런 교정 신호가 없다.
와인 데이터로 확인하면 차이가 크다. 13개 특성 중 프롤린은 2781,680 사이를 오가고 다른 특성들은 대부분 0.130 사이다. 스케일링 없이 K-Means를 돌리면 사실상 프롤린 하나로 군집을 나누게 되고, 실제 품종과의 일치도(ARI, 1이 완전 일치)가 0.37에 그친다. 표준화를 거치면 0.90으로 오른다. 그런데 붓꽃에서는 반대로 표준화가 일치도를 0.73에서 0.62로 떨어뜨린다. 꽃잎 길이처럼 범위가 큰 특성이 하필 품종을 가르는 핵심 특성이었기 때문이다. 스케일링은 "특성을 모두 똑같이 중요하게 보겠다"는 선언이고, 그 선언이 데이터와 맞는지는 매번 확인해야 한다.
반지도 학습
군집 가정과 매니폴드 가정
반지도 학습(semi-supervised learning)은 레이블이 붙은 소수와 붙지 않은 다수를 함께 쓴다. 레이블 없는 데이터가 도움이 되려면 그 데이터의 모양이 레이블에 대해 무언가를 알려 줘야 한다. 이 "무언가"에 대한 믿음을 가정으로 적어 두면 둘이다. 군집 가정은 같은 군집에 속한 점들이 같은 레이블을 가진다는 믿음이다. 매니폴드 가정은 고차원 데이터가 실제로는 낮은 차원의 휘어진 면 위에 놓여 있고, 그 면을 따라 가까운 점끼리 레이블이 같다는 믿음이다.
가정이 맞으면 레이블 없는 점들이 결정 경계를 데이터가 성긴 골짜기로 밀어내 준다. 가정이 틀리면 반대다. 두 부류가 한 덩어리 안에 섞여 있는 데이터에서는 레이블 없는 점들이 "여기는 한 군집"이라고 우겨 경계를 엉뚱한 곳에 긋게 만들고, 레이블 있는 점만 쓴 지도 학습보다 성능이 오히려 내려간다.
레이블 전파
가정을 가장 곧이곧대로 쓰는 방법이 레이블 전파(label propagation)다. 모든 점을 이웃과 잇는 그래프를 만들고, 레이블 있는 점에서 출발한 레이블을 가까운 이웃으로 조금씩 번지게 한다. 번짐이 멈추면 레이블 없던 점도 가장 강하게 도착한 레이블을 갖는다.
import numpy as np
from sklearn.semi_supervised import LabelPropagation
from sklearn.linear_model import LogisticRegression
rng = np.random.RandomState(0)
labeled = rng.rand(len(y)) < 0.1 # 10%만 레이블을 남긴다
y_partial = y.copy()
y_partial[~labeled] = -1 # -1 = 레이블 없음
lp = LabelPropagation(kernel='rbf', gamma=20).fit(X_scaled, y_partial)
lp_acc = accuracy_score(y[~labeled], lp.transduction_[~labeled])
sup = LogisticRegression(max_iter=1000).fit(X_scaled[labeled], y[labeled])
sup_acc = accuracy_score(y[~labeled], sup.predict(X_scaled[~labeled]))
비교할 때는 두 가지를 조심한다. 채점은 레이블을 가렸던 점에서만 해야 한다 — 레이블 있는 점까지 넣으면 이미 아는 답을 맞힌 것이 섞인다. 그리고 비교 대상은 "레이블 있는 점만으로 학습한 지도 모델"이어야 반지도가 보탠 몫이 보인다. 붓꽃에서 레이블 비율을 바꿔 가며 시드 20개로 평균을 내면 이렇다.
| 레이블 비율 | 레이블 전파 | 지도 학습만 |
|---|---|---|
| 30% | 0.941 | 0.943 |
| 10% | 0.881 | 0.823 |
| 5% | 0.805 | 0.762 |
레이블이 30%면 반지도의 이득이 없다. 그 정도면 지도 모델이 이미 경계를 충분히 안다. 레이블이 줄수록 차이가 벌어져, 10%에서 약 6%p, 5%에서 약 4%p를 보탠다. 반지도 학습은 레이블이 모자랄 때 쓰는 도구이지 언제나 더 나은 방법이 아니다.
의사 레이블
딥러닝에서 더 흔한 방식은 의사 레이블(pseudo-label)이다. 레이블 있는 데이터로 모델을 먼저 학습하고, 그 모델이 레이블 없는 데이터에 내놓은 예측 중 확신이 높은 것을 정답인 양 붙여 다시 학습한다. 이 되풀이를 자기 훈련(self-training)이라 부른다.
위험은 되먹임에 있다. 첫 모델이 어떤 부류를 체계적으로 틀리면, 그 틀린 예측이 확신과 함께 레이블이 되고, 다음 모델은 그 오류를 더 굳게 배운다. 한 바퀴 돌 때마다 오류가 증거처럼 쌓이는 것이다. 그래서 실무에서는 확신 문턱을 높게 잡고, 부류별로 붙이는 개수에 상한을 두고, 레이블 있는 검증 세트로 매 바퀴 성능이 실제로 오르는지 확인한다. FixMatch처럼 약하게 증강한 이미지의 예측을 강하게 증강한 이미지의 정답으로 쓰는 방법도 이 되먹임을 누르려는 장치다.
자기지도 학습
데이터에서 만드는 레이블
자기지도 학습(self-supervised learning)은 사람이 붙인 레이블을 아예 쓰지 않으면서도 지도 학습의 틀을 그대로 쓴다. 비결은 데이터의 일부를 가리고, 가린 부분을 정답으로 삼는 것이다. 이렇게 스스로 만든 문제를 사전 과제(pretext task)라 부른다.
- GPT 계열: 문장 앞부분을 주고 다음 토큰을 맞힌다. 정답은 원문에 이미 있다.
- BERT: 토큰의 15%를 가리고 가린 토큰을 맞힌다.
- MAE: 이미지 패치의 75%를 가리고 가린 패치의 픽셀을 복원한다.
- SimCLR: 한 이미지를 두 번 다르게 증강하고, 두 결과를 짝으로 알아보게 한다.
모양은 달라도 넷 다 "레이블을 데이터에서 만든다"는 한 가지 발상이다. 레이블 비용이 0이 되므로 웹 전체 규모의 데이터를 쓸 수 있고, 이것이 오늘날 LLM이 가능해진 조건이다. 사전 과제를 풀면서 모델이 배운 내부 표현이 목적이고, 사전 과제의 점수 자체는 부산물이다.
대조 학습과 온도
SimCLR 같은 대조 학습(contrastive learning)은 짝이 맞는 둘은 가깝게, 나머지는 멀게 만드는 손실을 쓴다. 배치 안의 모든 쌍의 코사인 유사도를 구하고, 각 샘플에게 "배치 안에서 네 짝이 누구인가"를 맞히는 분류 문제를 풀게 한다. 이 손실을 NT-Xent라 부른다.
import torch
import torch.nn.functional as F
def nt_xent(z1, z2, temperature=0.5):
z = F.normalize(torch.cat([z1, z2]), dim=1)
sim = z @ z.T / temperature
sim.fill_diagonal_(float('-inf')) # 자기 자신은 후보에서 뺀다
N = z1.size(0)
target = torch.cat([torch.arange(N, 2*N), torch.arange(N)])
return F.cross_entropy(sim, target)
유사도를 나누는 온도(temperature)가 분포의 날카로움을 정한다. 유사도는 −1~1 사이라 그대로 소프트맥스에 넣으면 모든 후보의 확률이 비슷하게 나온다. 온도 0.1로 나누면 유사도 차이가 열 배로 벌어져, 짝과 헷갈릴 만큼 닮은 오답 몇 개에 손실이 집중된다. 온도가 너무 낮으면 그 몇 개에만 매달려 학습이 불안정해지고, 너무 높으면 쉬운 오답과 어려운 오답을 구별하지 못해 표현이 흐려진다. 자기 자신과의 유사도(대각선)는 언제나 1이라 빼 주지 않으면 정답보다 높은 오답이 되므로, 위 코드처럼 −∞로 가린다.
사전 과제의 어긋남
사전 과제를 잘 푼다고 쓸모 있는 표현을 배운 것은 아니다. 모델은 과제를 가장 쉽게 푸는 지름길을 찾는다. 이미지 조각 두 개의 상대 위치를 맞히게 한 초기 연구에서는 모델이 사물의 모양 대신 렌즈의 색수차 — 사진 가장자리로 갈수록 색이 번지는 현상 — 로 위치를 맞히는 것이 발견됐다. 과제 점수는 높았지만 배운 것은 렌즈의 결함이었다.
그래서 자기지도 학습의 성패는 사전 과제 점수가 아니라 하류 과제에서 판가름한다. 흔한 확인법은 선형 평가(linear probe)다. 사전학습한 표현을 얼려 두고 그 위에 선형 분류기 하나만 레이블로 학습시켜, 표현 안에 부류 정보가 얼마나 곧게 들어 있는지 재는 것이다. 증강을 설계하는 일도 같은 맥락이다. 색 변화를 증강에 넣으면 모델은 색에 기대지 못하고 모양을 봐야 한다.
패러다임 고르기
선택표
고르는 순서는 세 질문이다. 레이블이 있는가, 있다면 얼마나 있는가, 없다면 구하는 데 얼마가 드는가. 레이블이 넉넉하면 지도 학습이 가장 곧은 길이다. 레이블이 없고 구할 계획도 없으면 비지도 학습으로 구조를 먼저 본다. 레이블이 조금 있고 더 구하기 비싸면 반지도 학습을, 레이블 없는 데이터가 압도적으로 많으면 자기지도 사전학습 뒤 소량 레이블로 파인튜닝하는 길을 본다.
| 상황 | 추천 패러다임 | 이유 |
|---|---|---|
| 레이블 있음, 소규모 | 지도 학습 (XGBoost/RF) | 빠르고 해석 가능 |
| 레이블 있음, 대규모 | 지도 학습 (딥러닝) | 데이터 많을수록 강력 |
| 레이블 없음, 그룹 발견 | 비지도 학습 (군집화) | 탐색적 분석 |
| 소수 레이블, 다수 무레이블 | 반지도 학습 | 레이블링 비용 절감 |
| 대규모 무레이블 데이터 | 자기지도 + 파인튜닝 | LLM/CLIP 패러다임 |
표의 경계는 고정이 아니다. 비지도 군집화로 데이터를 먼저 훑어 대표 샘플만 골라 레이블을 붙이면, 같은 예산으로 더 많은 부류를 덮는 지도 데이터가 만들어진다. 패러다임은 하나만 고르는 것이 아니라 단계마다 갈아 끼우는 부품에 가깝다.
이어 붙이는 흐름
오늘날 LLM이 만들어지는 과정은 이 부품들을 차례로 잇는 모습이다. 먼저 웹 텍스트로 다음 토큰 예측을 한다 — 자기지도 사전학습이다. 여기서 언어와 지식의 대부분이 들어간다. 다음으로 사람이 쓴 질문·답변 쌍으로 지도 파인튜닝을 한다. 이 단계는 수만~수십만 건이면 되는데, 모델이 이미 언어를 알기 때문에 "대화하는 형식"만 배우면 된다. 마지막으로 사람의 선호를 반영하는 정렬 단계를 거친다.
이 흐름에서 레이블의 양과 값은 반비례한다. 사전학습 토큰은 수조 개지만 한 개의 값은 거의 0이고, 파인튜닝 데이터는 훨씬 적지만 한 건 한 건을 사람이 썼다. 선호 데이터는 더 적고 더 비싸다. 자기지도 학습이 값싼 레이블로 바탕을 깔아 두었기 때문에, 비싼 레이블은 적게 써도 된다.
RLHF의 자리
마지막 정렬 단계의 대표가 RLHF(Reinforcement Learning from Human Feedback)다. 흔히 "적은 인간 데이터로 무한한 출력에 적용하니 반지도 학습의 일종"이라고 소개되지만, 단계를 나눠 보면 그렇게 부르기 어렵다. RLHF의 첫 단계는 보상 모델 학습이다. 한 질문에 대한 답 두 개를 사람에게 보여 주고 어느 쪽이 나은지 고르게 한 뒤, 그 선택을 레이블로 삼아 "나은 쪽에 더 높은 점수를 주는" 모델을 학습한다. 이것은 레이블이 명시적으로 붙은 평범한 지도 학습이다.
두 번째 단계는 그 보상 모델이 매기는 점수를 올리는 쪽으로 언어 모델을 강화 학습으로 조정하는 것이다. 여기서는 사람의 레이블이 직접 쓰이지 않고, 보상 모델이 레이블 없는 새 출력에 점수를 대신 매긴다. 이 대목이 의사 레이블과 닮아 반지도라는 말이 붙지만, 정확히는 "지도 학습으로 만든 채점기를 강화 학습의 보상으로 쓰는 것"이다. 이렇게 갈라 두면 보상 모델이 틀리는 자리에서 언어 모델이 그 틀림을 파고드는 현상 — 보상 해킹 — 이 왜 생기는지도 보인다. 채점기가 지도 학습의 한계를 그대로 물려받기 때문이다.
다음 글에서는 지도 학습의 가장 기본이 되는 모델, 선형 회귀와 로지스틱 회귀에서 시작한다. 입력에 가중치를 곱해 더하는 단순한 형태가 회귀와 분류의 두 갈래로 어떻게 나뉘는지를 본다.
읽어주셔서 감사합니다. 😊

