All posts
AI/ML Research

DPO의 우도 변위를 고친 0차 정렬, ComPO

DPO 같은 직접 선호 정렬을 쓰다 보면 좋은 응답의 절대 확률이 오히려 떨어지는 '우도 변위'가 나타나요. 비교 기반 0차 정렬 'ComPO'는 확률이 비슷한 노이즈 쌍을 버리지 않고 방향 정보로 살려, Mistral·Llama·Gemma에서 길이 보정 승률을 끌어올렸어요.

Sep 18, 2026 8분 읽기

DPO가 남긴 찝찝함, '우도 변위'

요즘 LLM을 사람 취향에 맞추는 선호 정렬에선 DPO 같은 '직접 정렬(direct alignment)'이 대세예요. RLHF처럼 보상 모델을 따로 학습하지 않고, 선호 쌍(좋은 응답·나쁜 응답)만 있으면 정책을 바로 최적화할 수 있어 계산과 메모리 부담이 훨씬 작죠.

그런데 이 방식에는 '우도 변위'(likelihood displacement)라는 숨은 문제가 있어요. 좋은 응답이 나쁜 응답에 비해 상대 확률은 오르는데, 정작 좋은 응답의 절대 확률은 오히려 떨어지는 역설이에요. 논문이 드는 사례가 재밌어요. "No를 Never보다 선호하라"고 학습시켰더니 정작 'Yes'의 확률이 통 크게 올라갔다는 거예요.

정렬 학습이 의도와 반대로 확률 질량을 옮겨버리는 '의도치 않은 탈정렬'이 일어나는 셈이죠. 실제 안전 문제로도 이어져요. 논문이 인용한 사례 중 하나로, Gemma-2B 모델은 정부기관 침투 방법 같은 위험한 질문에 원래 거절 응답을 냈는데 DPO 학습 후엔 오히려 위험 요청에 응하는 쪽으로 확률이 쏠렸어요.

우도 변위가 거절 응답의 확률 질량을 위험한 답변 쪽으로 옮겨준 거죠. 관련해 '장황함'(응답은 비슷한데 길이만 늘어나는 현상)도 같은 계열로 꼽아요.

어디서 심해지나: '노이즈 선호 쌍'

우도 변위는 특히 '노이즈 선호 쌍'(noisy pair)에서 심해져요. 좋은 응답과 나쁜 응답이 모델 기준 확률이 거의 비슷해서 선호 신호가 약하고 애매한 짝이에요.

기존엔 이런 쌍을 어떻게 다뤘을까요. 정규화 항을 추가해 변위를 막는 방식, 그리고 요즘 유행인 CHES 점수로 문제 쌍을 골라내 '빼버리는' 필터링이 있어요. 그런데 필터링은 그 쌍에 담긴 유용한 비교 정보까지 통째로 버려요.

이 논문(arXiv 2609.19144)은 "모호한 쌍을 버리지 말고 비교 신호로 쓰면 어떨까?"라는 질문에서 출발해요.

ComPO: 그라디언트 없이 '방향'만 보는 0차 정렬

그 답이 ComPO(Comparison-based Preference Optimization)예요. 이름처럼 비교 기반으로 움직이는데, 핵심은 정책을 살짝 흔들어 좋은 방향인지 물어보는 거예요. 기술 용어로 **0차 최적화(zeroth-order)**라고 해요. 그라디언트(기울기)를 계산하는 대신 함수값만으로 탐색 방향을 추정하죠.

작동은 이래요. 현재 정책에 작은 섭동을 여러 개 가하고, 각각에 대해 '좋은 응답 확률을 올리고 나쁜 응답 확률을 내리나?'를 묻는 비교 오라클(oracle)이 예·아니오 같은 1비트 답을 줘요.

그 신호들을 모아 정규화된 업데이트 방향을 추정해요. DPO처럼 미분 가능한 선호 손실을 직접 최적화하지 않고, 노이즈 쌍에서 방향 정보만 뽑아내는 셈이죠.

실전 구현은 더 날렵해요. 출력층(output layer)만 섭동하고, 업데이트 항목은 문턱값(λg)으로 걸러 큰 값 위주로만 건드려요. Mistral-7B 기준 출력층의 약 1% 항목만 갱신하는데, 70억 파라미터 모델에서 약 150만 개, 즉 **전체의 0.02%**에 불과해요.

나머지는 얼어 있는 채로 두죠.

온라인 확장 버전도 있어요. 오프라인 비교 메커니즘은 그대로 두고, 현재 정책이 뽑은 라벨 없는 생성문으로 역 KL(reverse-KL)을 추정해 스텝 크기를 조절해요. 스텝이 너무 커져 정책이 레퍼런스에서 멀어지는 걸 막아주는 역할이에요.

이론적으로는 얼마나 단단한가

이 방법은 은닉 목적 함수를 전제로 해서 이론도 조심스러워요. 오프라인 기본 방식은 평활성, 그라디언트 희소성(sparsity), 오라클 호환성 가정 아래 최고 방문점(best-iterate) 수렴 보장을 증명해요. 그라디언트가 희소하다는 건 출력층 위주로 섭동하는 실전 구현과도 맞아떨어져요.

온라인 방식은 상대 정책 주변의 '국소 커버리지'와 분포 내 쌍 비교 정확도 조건 아래 수행 보장을 유도해요. 역KL 제약 덕분에 전체 정책 공간이 아니라 레퍼런스 주변 이웃만 커버하면 되도록 가정을 좁히는 거예요. 다만 커버리지는 별도의 가정이라, KL 제약에서 자동으로 따라나오진 않아요.

실험: Mistral·Llama·Gemma에서 본 결과

실험은 Mistral-7B, Llama-3-8B, Gemma-2-9B를 UltraFeedback으로 학습하고 AlpacaEval 2·Arena-Hard·MT-Bench로 평가했어요. 데이터를 마진 임계값(δ=3)으로 깨끗한 쌍과 노이즈 쌍으로 나누고, DPO는 깨끗한 쌍으로만 학습한 뒤(DPOclean) ComPO를 노이즈 쌍 100개로 100회 반복 돌리는 2단계 구성이에요. DPO 비교 결과를 볼게요.

모델지표(%)DPODPOclean+ComPO
Mistral-7B-InstructAlpacaEval 2 LC24.1426.17
Mistral-7B-InstructAlpacaEval 2 WR16.7118.32
Llama-3-8B-InstructAlpacaEval 2 LC32.5935.79
Llama-3-8B-InstructAlpacaEval 2 WR31.9935.03

길이 보정형 승률(LC)에서 특히 일관된 개선이 나와요. ComPO가 노이즈 쌍 첫 100개만 써도 대부분의 모델·벤치마크 조합을 개선한다는 점도 흥미로워요. 작은 어려운 쌍 묶음이 비교 오라클을 거치면 꽤 유용한 정렬 정보를 담는다는 뜻이에요.

예외도 있어요. Mistral-7B-Instruct의 Arena-Hard 원시 승률은 DPO(14.4)가 ComPO(10.5)보다 높은데, Arena-Hard는 길이 보정 없는 지표라 긴 답변에 유리해서 그래요.

실제 평균 응답 길이가 DPO 513 대비 ComPO 468로 짧았고, 보정형 지표와는 다르게 해석됐어요.

쌍 단위 진단도 통과해요. 노이즈 쌍에서 선호 응답 로그 확률은 줄지 않고, 비선호 응답은 늘지 않도록 학습이 움직였어요. 우도 변위 완화 가설과 일치하는 신호죠.

SimPO와의 조합, 그리고 효율

ComPO는 DPO에만 붙는 게 아니에요. 잘 튜닝된 SimPO 체크포인트에 바로 얹어도 AlpacaEval 2 지표를 끌어올려요.

모델지표(%)SimPOSimPO+ComPO
Mistral-7B-InstructAlpacaEval 2 LC40.2242.27
Gemma-2-9B-itAlpacaEval 2 LC60.3662.42

메모리 효율도 장점이에요. Llama-3-8B ComPO는 A40 GPU당 피크 약 23GB인데, 같은 모델의 DPO·SimPO는 H100 기준 각각 77GB·69GB였어요. 하드웨어가 달라 직접 비교는 아니지만 실전 자원 부담이 가벼운 편임은 알 수 있어요.

섭동 600개를 A40 30장에 나눠 병렬로도 잘 돌아가요.

남은 의미와 실용 포인트

결이 다른 지점은 '어려운 선호 쌍은 버리는 게 아니라 비교 신호로 살린다'는 관점 전환이에요. CHES 필터링 흐름을 보완하면서, 미분 가능한 손실을 직접 최적화하지 않는 0차 정렬을 선호 정렬에 끌어들인 시도라는 의미가 있어요. NeurIPS 2025에 먼저 나왔던 오프라인 버전의 저널 확장판이기도 해요.

실무에서 가장 쓸모 있는 건 '공개된 정렬 모델에서 바로 시작한다'는 워크플로예요. DPO를 클린 셋으로 다시 학습할 필요 없이, 공개 체크포인트 위에 작업 맞춤 노이즈 선호 데이터와 희소 출력층 업데이트만으로 개선을 얻을 수 있어요.

한계도 짚어요. 마진 임계값은 CHES보다 덜 정확한 대리 지표이고, 실전 온라인 구현은 이론의 하드 제약을 근사적으로만 따르며, Arena-Hard 예외처럼 원시 승률 지표와는 해석이 어긋나는 경우도 있어요. 논문은 미래 작업으로 추론 과제와 확산 모델 정렬 확장을 언급해요.

참고 링크

#LLM#선호 정렬#우도 변위#0차 최적화#DPO
Robeedau

Curated, fact-checked, and edited by a single operator before publishing.