모두의 AI
머신러닝플레이그라운드
로딩 중…

배우기

Ch.04

손실 함수 심화: 불균형 데이터와 거리로 배우기

학교 시험에서 100문제 중 99문제가 쉬운 덧셈이고, 딱 1문제만 아주 어려운 서술형 문제라고 상상해 볼까요? 덧셈만 다 맞춰도 99점이 나오기 때문에 '공부를 잘한다'고 착각하기 쉽습니다. 인공지능 세계에서도 이와 똑같은 일이 벌어지는데, 이를 클래스 불균형(Class Imbalance)이라고 부릅니다. 다수결에만 의존하면, 정작 중요한 소수의 정답(예: 희귀병 진단, 불량품 탐지)은 모두 놓치게 됩니다.
이번 장에서는 손실 함수(Loss Function) 자체를 똑똑하게 고쳐서 불균형 문제를 해결해 봅니다. 더 나아가, 단순히 정답을 맞추는 것을 넘어 데이터 사이의 '거리'를 계산해 유사도를 학습하는 메트릭 러닝(Metric Learning)의 세계까지 함께 탐험해 보겠습니다.
가중 CE, Focal loss, Triplet/Contrastive loss를 개념→직관적 비유→수식→실전 팁 순으로 익히면, '점수는 높은데 정작 중요한 문제는 틀리는' 실무의 흔한 함정을 피할 수 있습니다.
아래 2×2 도식은 네 가지 손실이 임베딩 공간을 학습 전 → 학습 후 어떻게 바꾸는지 보여 줍니다.
학습 전학습 후Contrastive Loss학습 전학습 후Triplet Loss학습 전학습 후w↑Weighted CE학습 전학습 후어려움Focal Loss
각 패널은 학습 전(왼쪽) → 학습 후(오른쪽) 변화를 보여 줍니다. Contrastive는 같은·다른 쌍을 당기고 밀고, Triplet은 anchor–positive는 가깝게·negative는 margin 이상 멀게 배웁니다. Weighted CE는 소수 클래스에 w↑, Focal은 쉬운 샘플은 작게·어려운 샘플은 크게 집중합니다.

같은 것은 당기고(pull), 다른 것은 밀고(push) — 거리로 배우기

불균형은 가중·Focal로, 유사도는 Contrastive·Triplet으로

손실 함수 심화: 불균형 데이터와 거리로 배우기

1. 클래스 불균형이란? (다수결의 함정에 빠진 AI)
개념: 데이터 안에서 특정 정답(클래스)의 개수가 다른 정답에 비해 압도적으로 많거나 적은 현상을 말합니다. 일반적인 학습 방법을 쓰면, AI는 맞추기 쉬운 다수 클래스에만 집중하게 됩니다.
직관적 비유: 공장 불량품 탐지에서 99%가 정상품일 때, AI가 무조건 '모두 정상입니다!'라고 찍어도 정확도는 99%가 나옵니다. 하지만 우리가 AI를 만든 진짜 이유는 숨어있는 1%의 불량품(소수 클래스)을 찾기 위해서입니다.
실전 팁: 이를 해결하기 위해 기본 손실 함수에 클래스별 가중치를 주거나, 틀리기 쉬운 문제에 집중하는 Focal loss를 사용해야 합니다.
2. 가중 교차엔트로피 (Weighted CE)
개념: 정답 클래스 ccc마다 서로 다른 가중치 wcw_cwc​를 곱해주는 방법입니다. 데이터가 적은 소수 클래스를 틀렸을 때 더 큰 벌점을 줍니다. 핵심 수식은 L=−wclog⁡(pc)L = - w_c \log(p_c)L=−wc​log(pc​) 입니다.
직관적 비유: 채점표의 배점을 바꾸는 것과 같습니다! 흔한 덧셈 99문제는 1점짜리로 만들고, 희귀한 서술형 1문제는 100점짜리로 배점을 확 올려버리는 것입니다. 그럼 학생(AI)은 서술형 문제를 절대 무시할 수 없게 됩니다.
실전 팁: 하지만 소수 정답에 가중치를 너무 크게 주면, 엉뚱한 노이즈 데이터까지 억지로 외우려다 성능이 떨어질 수 있습니다. 정답률을 꼼꼼히 확인하며 조금씩 조절하세요.
3. 포컬 로스 (Focal Loss) — 아는 문제는 패스, 모르는 문제에 집중!
개념: AI가 이미 정답을 확신하는 쉬운 샘플(예측 확률 ptp_tpt​가 높음)은 손실값을 확 줄여버리고, 자꾸 헷갈리는 어려운 샘플에만 집중하게 만드는 마법의 수식입니다. 핵심 수식은 Lfocal=−(1−pt)γlog⁡(pt)L_{\text{focal}} = - (1-p_t)^\gamma \log(p_t)Lfocal​=−(1−pt​)γlog(pt​) 이며, 여기서 γ\gammaγ가 집중도를 조절합니다.
직관적 비유: 시험공부를 할 때 이미 완벽하게 아는 단원은 과감히 건너뛰고, 매번 틀리는 취약한 단원에 모든 공부 시간을 쏟아붓는 '효율적인 벼락치기' 전략과 같습니다.
실전 팁: 사진 속 작은 물체를 찾는 객체 검출(Object Detection)처럼 배경(다수)과 물체(소수)의 비율 차이가 극심할 때 아주 효과적입니다.
4. 메트릭 러닝 (Metric Learning) — 끼리끼리 모으고, 남남은 띄우기
개념: AI에게 단순히 정답을 알려주는 대신, '고양이 사진들끼리는 가깝게, 강아지 사진과는 멀게' 데이터 간의 거리(Distance)를 학습시키는 방법입니다. 대표적으로 기준점(Anchor), 긍정(Positive), 부정(Negative) 짝을 짓는 트리플릿 로스(Triplet loss)가 있습니다. 핵심 수식은 L=max⁡(0,d(a,p)−d(a,n)+α)L = \max(0, d(a,p) - d(a,n) + \alpha)L=max(0,d(a,p)−d(a,n)+α) 입니다.
직관적 비유: 결혼식장 자리 배치표를 짜는 원리입니다. 친한 친구들(Positive)은 같은 테이블에 가깝게 모아두고, 사이가 안 좋은 사람들(Negative)은 최소한의 안전거리 α\alphaα 이상 뚝 떨어뜨려 놓는 것입니다.
실전 팁: 얼굴 인식, 비슷한 상품 추천 등 데이터 간의 유사도를 비교해야 할 때 실무에서 가장 널리 쓰이는 강력한 도구입니다.

손실 함수 한눈에 짚기

가중 CE — 데이터가 적은 클래스를 틀리면 벌점을 크게 매깁니다.
핵심 수식: L=−wclog⁡(pc)L = -w_c \log(p_c)L=−wc​log(pc​)
기호 정리 — pcp_cpc​는 모델이 정답 클래스 ccc라고 예측하는 확률(0~1)입니다. wcw_cwc​는 클래스 ccc의 배점으로, 소수 클래스일수록 크게 둡니다. log⁡(pc)\log(p_c)log(pc​)는 확률이 낮을수록(많이 틀릴수록) 값이 커지고, 앞의 마이너스(-) 덕분에 학습은 pcp_cpc​를 키우는 방향으로 진행됩니다.
가중치 예: 전체 샘플 NNN개, 클래스 KKK개일 때 wc∝N/(Knc)w_c \propto N/(K n_c)wc​∝N/(Knc​) — 클래스 ccc의 표본 수 ncn_cnc​가 작을수록 wcw_cwc​가 커집니다.
숫자 예: pc=0.2p_c=0.2pc​=0.2, wc=5w_c=5wc​=5이면 손실 ≈−5log⁡(0.2)≈8\approx -5\log(0.2) \approx 8≈−5log(0.2)≈8 — 같은 오답이라도 가중치가 크면 벌점이 세집니다.
비유: 일반 시험에 과목별 배점을 붙인 것과 같습니다.
Focal loss — 이미 잘 맞춘 샘플은 손실을 줄이고, 헷갈리는 샘플에 집중합니다.
핵심 수식: Lfocal=−(1−pt)γlog⁡(pt)L_{\text{focal}} = -(1-p_t)^\gamma \log(p_t)Lfocal​=−(1−pt​)γlog(pt​)
기호 정리 — ptp_tpt​는 이 샘플에 대한 모델의 예측 확신도(정답일 확률)입니다. (1−pt)(1-p_t)(1−pt​)는 아직 헷갈리는 정도이고, (1−pt)γ(1-p_t)^\gamma(1−pt​)γ는 γ\gammaγ가 클수록 쉬운 샘플(ptp_tpt​ 높음)의 기여를 더 많이 깎습니다. log⁡(pt)\log(p_t)log(pt​)는 Cross Entropy와 같은 기본 손실 뼈대입니다.
숫자 예: pt=0.9p_t=0.9pt​=0.9, γ=2\gamma=2γ=2이면 (1−0.9)2=0.01(1-0.9)^2=0.01(1−0.9)2=0.01 — 손실이 1% 수준으로 줄어 이미 맞춘 문제는 거의 무시됩니다. 반면 pt=0.3p_t=0.3pt​=0.3이면 (0.7)2=0.49(0.7)^2=0.49(0.7)2=0.49로 여전히 큰 페널티가 남습니다.
비유: 복습할 때 이미 외운 단원은 건너뛰고, 매번 틀리는 유형만 반복하는 것과 같습니다.
Triplet loss — 친한 사람은 가깝게, 사이 안 좋은 사람은 멀게 배치합니다.
핵심 수식: L=max⁡(0, d(a,p)−d(a,n)+α)L = \max(0,\, d(a,p) - d(a,n) + \alpha)L=max(0,d(a,p)−d(a,n)+α)
기호 정리 — aaa는 기준(anchor), ppp는 같은 정체(positive), nnn은 다른 정체(negative) 샘플입니다. d(⋅,⋅)d(\cdot,\cdot)d(⋅,⋅)는 두 점 사이 거리(L2 등)이고, α\alphaα는 negative가 anchor에서 최소한 떨어져야 하는 간격(margin) 입니다. max⁡(0,⋅)\max(0,\cdot)max(0,⋅)는 이미 조건을 만족하면 손실이 0이 되어 더 밀 필요가 없다는 뜻입니다.
숫자 예: d(a,p)=1d(a,p)=1d(a,p)=1, d(a,n)=4d(a,n)=4d(a,n)=4, α=0.5\alpha=0.5α=0.5이면 1−4+0.5=−2.51-4+0.5=-2.51−4+0.5=−2.5 → max⁡(0,−2.5)=0\max(0,-2.5)=0max(0,−2.5)=0. negative가 충분히 멀어 추가 벌점 없음. 반면 d(a,n)=1.2d(a,n)=1.2d(a,n)=1.2이면 1−1.2+0.5=0.31-1.2+0.5=0.31−1.2+0.5=0.3 → 아직 negative가 가까워 0.3만큼 벌점.
비유: 결혼식 자리 배치 — 친구(ppp)는 anchor 옆에, 안 친한 사람(nnn)은 최소 α\alphaα만큼 떨어뜨립니다.
Contrastive loss — 같은 정체(또는 증강본)는 당기고, 다른 정체는 밉니다.
핵심 수식 — positive 쌍: L+=0.5 d2L_+ = 0.5\,d^2L+​=0.5d2 · negative 쌍: L−=0.5 max⁡(0, m−d)2L_- = 0.5\,\max(0,\, m - d)^2L−​=0.5max(0,m−d)2
기호 정리 — ddd는 두 임베딩 사이 거리입니다. positive 쌍은 ddd가 0에 가까울수록 손실이 작아져 서로 당겨집니다. negative 쌍의 mmm은 최소 간격(margin) 으로, d≥md \ge md≥m이면 max⁡(0,m−d)=0\max(0,m-d)=0max(0,m−d)=0이라 더 밀 필요가 없습니다. 0.50.50.5는 스케일을 맞추는 상수입니다.
숫자 예: positive에서 d=0.4d=0.4d=0.4이면 0.5×0.16=0.080.5\times0.16=0.080.5×0.16=0.08 — 가까우면 벌점 작음. negative에서 d=0.6d=0.6d=0.6, m=1m=1m=1이면 0.5×(0.4)2=0.080.5\times(0.4)^2=0.080.5×(0.4)2=0.08 — 아직 너무 가까워 밀어내는 중.
비유: 같은 사람 사진은 한곳으로 모으고, 다른 사람 사진은 최소 mmm 이상 떨어뜨립니다.

왜 중요한지

1. 착시를 일으키는 가짜 100점 성적표 걸러내기
데이터 불균형 상태에서 AI가 받은 '정확도 99%'는 아무 의미 없는 착시 현상일 수 있습니다. 정작 중요한 문제를 풀고 있는지 확인하려면, 단순히 정확도만 볼 것이 아니라 가중 CE나 Focal loss를 통해 '무엇이 진짜 중요한지'를 AI에게 손실 함수의 형태로 직접 알려주어야 합니다.
2. 손실 함수가 우선순위를 정한다
모델이 무엇을 더 중요하게 볼지는 손실 함수의 형태로 결정됩니다. 목표(손실)가 잘못 잡혀 있으면, 아무리 학습을 오래 해도 원하는 결과를 얻기 어렵습니다. 불균형·거리 학습에서는 ‘어디에 벌점을 줄지’를 손실 설계로 직접 말해 주는 것이 핵심입니다.
3. 실생활 추천·검색 서비스의 든든한 뼈대
쇼핑앱에서 '비슷한 옷 찾기'를 하거나 스마트폰의 '얼굴 잠금 해제'를 쓸 때, AI는 정해진 객관식 정답을 고르는 게 아니라 두 사진이 얼마나 닮았는지(거리)를 계산합니다. 메트릭 러닝은 이러한 현대 AI 서비스들을 가능하게 하는 가장 핵심적인 기술입니다.

어떻게 쓰이는지

① 불균형 데이터 해결하기 — 순서대로 진단하고 처방하기
증상: AI가 흔한 정답만 맞추고 희귀한 정답은 다 틀립니다.
해결 순서:
1. 분포 확인: 클래스별 데이터 개수 차이가 얼마나 나는지 살펴봅니다.
2. 손실 함수 교체: 일반 손실 함수 대신 가중 CE나 Focal Loss로 변경합니다.
3. 학습 설정 점검: 손실이 바뀌었으면 학습률·배치 크기 등도 함께 다시 맞춰 봅니다.
② 메트릭 러닝 활용하기 — 짝꿍 지어 학습시키기
메트릭 러닝을 쓰려면 데이터를 '세트'로 준비해야 합니다.
- Triplet 방식: (기준 사진, 같은 사람, 다른 사람) 이렇게 3개를 한 세트로 묶습니다.
- Contrastive 방식: (원본 사진, 살짝 변형한 원본)을 긍정(Positive) 쌍으로 묶어 서로 당기게 하고, 나머지는 밀어냅니다.
이후 AI가 이들 사이의 거리를 계산해 끼리끼리 모이도록 훈련시킵니다.
③ 너무 쉬운 문제는 버려라! (Hard Negative Mining)
사과와 자동차처럼 이미 너무 다르게 생겨서 구분하기 쉬운 데이터만 학습시키면, AI가 금방 자만하고 성장을 멈춥니다. AI의 실력을 진짜 고수로 키우려면 아주 비슷하게 생겼지만 정답은 다른 데이터(Hard Negative)를 일부러 찾아내어 학습시켜야 합니다. 마치 어려운 모의고사를 풀어야 실전에서 고득점을 받는 것과 같습니다.
④ 거리 재는 자(Ruler) 고르기 — L2 거리 vs 코사인 유사도
- L2 거리: 두 점 사이의 '직선 거리'를 잽니다. 크기와 위치가 모두 중요할 때 씁니다.
- 코사인 유사도: 두 화살표가 가리키는 '방향'이 얼마나 비슷한지 각도를 잽니다. 단어의 의미나 이미지의 느낌처럼 방향성이 중요할 때 씁니다.
실무 꿀팁: 만약 소수 클래스를 계속 무시한다면 가중/Focal을, 쉬운 문제만 푼다면 Focal의 γ\gammaγ를 높이고, 검색 품질이 낮다면 어려운 문제(Hard negative)를 추가해 보세요!

요약

한 줄 요약: 이 장에서는 손실 함수를 설계해 불균형 데이터를 다루고, 임베딩 거리로 유사도를 학습하는 방법을 익혔습니다.
핵심 손실 함수는 네 가지입니다. 가중 CE는 역빈도 wcw_cwc​로 소수 클래스 오분류를 크게 벌하고, Focal loss는 α\alphaα와 (1−pt)γ(1-p_t)^\gamma(1−pt​)γ로 쉬운 샘플의 기여를 줄입니다. Triplet loss는 margin α\alphaα로 positive는 가깝게·negative는 멀게 배치하고, Contrastive loss는 positive/negative 쌍을 당기고 밀어 임베딩 공간을 정리합니다.
실무에서 모델이 다수 클래스만 맞춘다면 가중 CE나 Focal을 쓰면서 클래스별 F1을 함께 봐야 합니다. 학습이 쉬운 샘플에만 머문다면 Focal의 γ\gammaγ를 조절하되, 너무 크면 불안정해질 수 있습니다. Triplet 손실이 거의 0에 가깝다면 negative가 너무 쉬워 hard negative mining이 필요할 때가 많습니다. 얼굴 인증·유사 검색 문제라면 메트릭 임베딩과 L2·코사인 거리 선택이 핵심입니다.
튜닝은 먼저 클래스 분포와 지표를 확인한 뒤 손실을 고르고, 학습률 등 하이퍼파라미터를 맞춥니다. 한 번에 여러 가지를 바꾸지 말고 한 가지씩 바꿔 효과를 비교하는 것이 안전합니다.

문제 풀이를 위한 설명

이 장의 문제는 크게 불균형 분류와 거리 기반 유사도 학습 두 줄기로 나뉩니다. 불균형에서는 다수 클래스만 맞춰도 정확도가 높게 나오기 때문에, 일반 교차엔트로피만으로는 희귀·중요한 소수 클래스를 놓치기 쉽습니다. 이때 가중 CE는 클래스마다 wcw_cwc​를 두어 소수 오분류의 벌점을 키우고, Focal loss는 (1−pt)γ(1-p_t)^\gamma(1−pt​)γ로 이미 잘 맞춘 쉬운 샘플의 기여를 줄여 어려운 샘플에 집중하게 합니다. 반면 메트릭 러닝은 정답 라벨 하나만 맞추는 대신, 임베딩 공간에서 거리로 ‘얼마나 비슷한지’를 배웁니다. Triplet loss는 anchor·positive·negative 세 점으로 L=max⁡(0,d(a,p)−d(a,n)+α)L=\max(0,d(a,p)-d(a,n)+\alpha)L=max(0,d(a,p)−d(a,n)+α)를 줄이고, Contrastive loss는 같은 쌍은 당기고 다른 쌍은 밀어냅니다. 문항에서 ‘소수만 계속 틀린다’면 가중/Focal, ‘negative가 너무 쉬워 학습이 안 된다’면 hard mining, ‘얼굴 인증·유사 검색’이면 메트릭 임베딩을 먼저 떠올리면 방향을 잡기 쉽습니다.
정의형 문제를 풀 때는 손실이 ‘무엇을 더 크게 벌하는지’를 먼저 생각합니다. 예를 들어 "가중 CE에서 소수 클래스에 큰 wcw_cwc​를 주는 이유는?"라는 문항이 나오면,
① 역전파 생략은 학습 메커니즘과 무관하고
③ 배치 고정도 가중치의 목적이 아닙니다. 가중 CE의 핵심은 소수 클래스를 틀렸을 때 오분류 비용을 키우는 것(②)이므로 정답은 2입니다.

응용형 문제에서는 데이터 상황을 먼저 읽습니다. "사기 탐지에서 정상 99%, 사기 1%"처럼 극심한 불균형이라면, 일반 CE만 유지(①)하거나 소수 클래스를 삭제(③)하는 것은 목적과 맞지 않습니다. 먼저 시도할 손실은 가중 CE 또는 Focal loss(②)입니다. → 정답 2

계산형 문제는 공식에 숫자만 차근차근 대입하면 됩니다. wB=N/(K⋅nB)w_B = N/(K\cdot n_B)wB​=N/(K⋅nB​)에 N=1000N=1000N=1000, K=2K=2K=2, nB=100n_B=100nB​=100을 넣으면 1000/(2⋅100)=51000/(2\cdot100)=51000/(2⋅100)=5이므로 정답
②입니다.
정의형 예시 — "Focal loss에서 (1−pt)γ(1-p_t)^\gamma(1−pt​)γ의 역할은?"라는 문항이면, 이 항은 예측이 이미 잘 된 쉬운 샘플의 손실을 줄여 학습이 어려운 샘플에 집중하게 만듭니다.
① 동일 손실·
③ 학습률 증가가 아니라 ② 쉬운 샘플의 기여 감소가 맞으므로 정답 2입니다.

참/거짓 예시 — "Triplet loss는 anchor, positive, negative 세 점이 필요하다."는 맞는 말입니다. 세 점 사이 거리 관계로 학습하므로 정답 1입니다.

응용 예시 — "얼굴 인증용 임베딩을 학습한다"면 클래스 하나를 고르는 분류보다 Triplet/Contrastive로 거리를 배우는 편이 자연스럽습니다. → 정답 1

선택 예시 — 배경이 압도적으로 많은 극심한 불균형에서는 Focal이 특히 자주 쓰입니다. CE만(①)보다 Focal(②)이 맞으므로 정답 2입니다.

개념 예시 — d(a,p)=1d(a,p)=1d(a,p)=1, d(a,n)=4d(a,n)=4d(a,n)=4, α=0.5\alpha=0.5α=0.5일 때 Triplet 항은 max⁡(0,1−4+0.5)=0\max(0,1-4+0.5)=0max(0,1−4+0.5)=0입니다. margin을 이미 만족해 더 이상 벌하지 않으므로 정답 3(손실 0)입니다.

계산 예시 — L2 거리 (0,0)(0,0)(0,0)–(3,4)(3,4)(3,4)는 32+42=5\sqrt{3^2+4^2}=532+42​=5이므로 정답
②입니다.