챗봇 정렬을 넘어선 DPO 활용 소개
직접 선호 최적화(Direct Preference Optimization, DPO) 는 지금까지 거의 전적으로 챗봇의 답변을 사람의 선호에 맞추는 정렬(alignment) 용도로 쓰여 왔지만, Dharma AI가 공개한 이번 글은 DPO를 "모델 자신의 실패 출력을 거부 쌍(rejected pair)으로 재활용하여 특정 실패 모드를 직접 억제하는 도구" 로 쓸 수 있음을 OCR 도메인에서 실증한 사례입니다. 테스트한 다섯 개 모델 패밀리 전부에서 텍스트 퇴화(Text Degeneration) 비율이 예외 없이 감소했고, 평균 감소율은 59.4%, 최대 감소율은 87.6%에 달했습니다.
배경을 조금 더 풀어보면 이렇습니다. Dharma AI는 지난 4월, 브라질 포르투갈어 문서를 대상으로 한 구조화 OCR 특화 모델 DharmaOCR(7B 규모의 Full과 3B 규모의 Lite 두 가지)을 공개하면서, 방법론과 벤치마크를 담은 논문을 함께 발표했습니다. 논문에 따르면 이는 저자들이 아는 한 DPO를 OCR에 적용한 첫 사례입니다. 인쇄물, 필기, 법률 및 행정 문서를 포괄하는 자체 벤치마크(DharmaOCR-Benchmark)는 오픈소스와 상용을 아우르는 주요 비전-언어 모델(Vision-Language Model, VLM) 패밀리들을 구조화 문서 추출 작업에서 비교했는데, 핵심 측정 지표 중 하나가 바로 텍스트 퇴화율, 즉 모델이 정상적인 전사(transcription) 대신 같은 토큰을 무한히 반복하는 루프에 빠지는 빈도였습니다. 기본(vanilla) 모델들의 퇴화율은 1% 미만에서 33% 이상까지 패밀리별로 크게 달랐고, 지도 미세조정(Supervised Fine-Tuning, SFT) 으로 대부분 줄어들긴 했지만 프로덕션에서 허용 가능한 수준까지 내려가는 경우는 드물었습니다. 논문이 퇴화율을 단위 비용과 함께 일급(first-class) 지표로 추적한 이유도 분명합니다. 퇴화는 단순한 품질 문제가 아니라, 비정상적으로 긴 생성 때문에 응답 시간 증가, 처리량 감소, 연산 비용 상승으로 직결되는 프로덕션 문제이기 때문입니다.
이 글이 주목할 만한 이유는 두 가지입니다. 첫째, Rafailov et al. (2023)이 제안한 DPO의 거의 모든 공개 사례가 "도움이 되는가, 무해한가"라는 주관적 판단을 다루는 챗봇 정렬이었던 반면, OCR은 정답이 객관적으로 존재하고 대화 맥락도 없는 작업입니다. 그럼에도 "올바른 전사는 선택(chosen), 퇴화 루프는 거부(rejected)" 라는 명확한 이진 선호 신호가 존재하므로 DPO가 작동할 수 있었습니다. 둘째, 학습 신호를 사람의 어노테이션이 아니라 모델 자신이 실패할 때 생성한 출력 에서 얻었다는 점입니다. 실패 데이터를 정제 과정에서 버려야 할 노이즈가 아니라 가장 직접적인 학습 신호로 뒤집어 활용한 설계 결정이 이 방법론의 핵심입니다.
반복 루프는 왜 SFT 이후에도 살아남는가: 어트랙터의 기하학
텍스트 퇴화가 무엇인지부터 정리해 보겠습니다. 자기회귀(autoregressive) 언어 모델은 관측된 시퀀스의 우도(likelihood)를 최대화하도록 학습되는데, 이 과정에서 확률 질량이 분포 공간의 특정 영역에 집중됩니다. 추론 중에 모델이 이런 고확률 영역 중 하나에 들어서면, 다음 스텝에서 같은 토큰에 더 높은 확률을 할당하게 되고, 이것이 다시 확률을 끌어올리는 자기 강화 루프가 만들어집니다. 모델은 최대 토큰 한도에 도달할 때까지 외부 개입 없이는 이 루프를 빠져나오지 못합니다. Holtzman et al. (2020)이 The Curious Case of Neural Text Degeneration 에서 분석했던 바로 그 현상으로, 원문은 이를 어트랙터(attractor), 즉 한 번 들어가면 빠져나오기 어려운 분포 공간상의 "끌림 영역"이라는 기하학적 개념으로 설명합니다.
중요한 것은 이 현상이 순수한 디코딩 문제가 아니라는 점입니다. 반복 패널티(repetition penalty), 온도(temperature) 조정, 조기 중단 로직 같은 추론 단계의 개입은 샘플링 스텝에서 증상을 억제할 뿐, 증상을 만들어내는 분포 자체는 건드리지 못합니다. 참고로 반복 패널티는 CTRL 논문에서 제안된 기법으로 지금도 널리 쓰이지만, 원문의 표현을 빌리면 "어트랙터는 그대로 살아남습니다". 학습 목표, 학습된 분포, 추론 중 확률 질량이 집중되는 방식이 함께 만들어내는 시스템 수준의 실패이기 때문입니다. 위 그림에 원문이 붙인 설명이 이 관계를 한 문장으로 압축합니다. "디코더는 이 기하학에서 샘플링할 뿐, 기하학을 결정하지 않는다." 한편 논문의 벤치마크에서 퇴화 여부는 (1) 설정된 출력 토큰 한도에 도달했고 (2) n-gram 반복 기준으로 동일 텍스트 구간의 반복이 탐지된 요청을 플래그하는 방식으로 판정했습니다.
그렇다면 SFT는 왜 이 문제를 해결하지 못할까요? 원문이 제시하는 유력한 가설은 손실(loss)의 granularity, 즉 학습 신호가 적용되는 단위입니다. SFT는 토큰 단위로 학습합니다. 각 토큰 예측이 개별적으로 평가되기 때문에, 반복 루프가 "완성된 출력 전체 차원의 실패"로 패널티를 받는 일은 없습니다. 루프를 구성하는 각 토큰은 지역적으로는 충분히 그럴듯한(locally probable) 토큰이기 때문입니다. SFT의 목표 함수에는 반복 루프를 벌하는 항이 아예 존재하지 않으므로, 퇴화라는 실패 모드는 학습 신호가 최적화하는 범위 바깥에 있습니다.
이 글에서 가장 흥미로운 데이터 포인트가 이 지점에서 나옵니다. 벤치마크에 포함된 Qwen2.5-VL-3B는 기본 상태에서 퇴화율이 0.60%로 낮았는데, SFT 이후 오히려 3.23%로 올라갔습니다. 단일 데이터 포인트이므로 일반화는 경계해야 하지만, 원문은 이를 "SFT가 모델을 작업 능력과 작업의 실패 기하학 양쪽으로 동시에 이동시켰다" 고 해석합니다. 기본 Qwen2.5-VL-3B는 애초에 긴 구조화 출력을 시도조차 하지 않을 만큼 범용적이어서 어트랙터 근처에 갈 일이 없었고, SFT로 작업 수행 능력이 생기면서 비로소 어트랙터에 노출되기 시작했다는 것입니다. 작업 능력과 퇴화 저항성은 서로 독립적으로 움직일 수 있는 별개의 속성이며, 이것이 SFT와 DPO를 별도의 학습 단계로 두는 구조적 근거가 됩니다.
설계 결정: 퇴화 출력을 버리지 않고 거부 쌍으로 쓴다
DPO는 같은 입력에 대해 선택된 출력과 거부된 출력으로 이루어진 선호 쌍(preference pair) 을 요구합니다. 챗봇 정렬에서는 사람 어노테이터가 응답들을 비교 평가하여 이 쌍을 만들지만, 구조화 생성 작업에는 그런 어노테이션 소스가 없습니다. DharmaOCR 파이프라인이 찾은 답은, 구조화 생성 작업이 이미 만들어내고 있는 선호 신호를 활용하는 것이었습니다. 어떤 작업을 수행할 수 있는 모델은 그 작업에서 특징적인 방식으로 실패할 수도 있으며, 퇴화 어트랙터에 빠진 출력들은 걸러낼 노이즈가 아니라 "가장 정보량이 많은 부정적 신호" 라는 발상입니다.
구체적인 구현을 논문 기준으로 따라가 보면 다음과 같습니다. 먼저 SFT 단계는 문서를 header, margin, footer, text의 네 영역으로 구분하는 엄격한 JSON 스키마를 따르도록 모델을 학습시킵니다. 그 다음 SFT 평가셋에 SFT 학습 데이터의 50% 무작위 샘플을 더해 23,726개 문서로 선호 데이터셋 풀을 구성하고, 각 문서마다 SFT 단계에서 좋은 성능을 보인 4개 모델의 추론 출력에 정답 전사 1개를 더해 문서당 5개의 후보 응답을 마련했습니다. 각 후보는 자동화된 LLM 심판(LLM-as-a-Judge) 이 완전성(completeness), 정확성(accuracy), 포맷팅(formatting), JSON 스키마 준수(adherence to expected JSON)의 네 가지 기준으로 0~1000점 척도로 채점하고 판단 근거를 함께 기록했습니다. 심판 후보로는 Qwen3-VL-235B-A22B-Instruct와 gemma-3-27b-it 두 모델을 함께 운용한 뒤, 사람의 정성 분석에서 더 일관되고 충실한 평가를 보인 전자만 최종 채택했습니다. LLM 심판 방식 자체에 대해서는 Zheng et al. (2023)의 연구를 참고하시면 좋습니다.
문서당 5개 후보의 모든 쌍대 조합(\binom{5}{2} = 10)을 비교해 총 237,260개의 후보 쌍을 만들고, Selective-DPO 원칙에 기반한 다단계 필터링과 통계적 이상치 제거, 무작위 샘플에 대한 인간 검수를 거쳐 최종 49,170쌍(후보의 약 21%)의 선호 데이터셋을 확정했습니다. 이 과정에서 심판은 깨끗한 추출 결과를 선택 쌍으로 검증하고, 퇴화를 보이는 출력을 거부 쌍으로 표시하는 두 가지 역할을 동시에 수행합니다. 규칙 기반 메커니즘으로도 반복 루프 탐지는 가능하지만, 어떤 출력이 선택 쌍으로 보존할 가치가 있는 고품질 전사인지는 판별할 수 없기 때문에 채점 모델이 필요합니다.
학습 데이터에 퇴화 출력이 섞여 있을 때의 통상적인 대응은 제거입니다. 저품질 신호이니 걸러내면 더 깨끗한 데이터셋이 된다는 논리입니다. DharmaOCR은 이 논리를 뒤집어, 퇴화 출력을 각 (선택, 거부) 쌍의 거부 예시로 의도적으로 보존했습니다. 퇴화야말로 DPO 단계가 억제하도록 설계된 바로 그 실패 모드이므로, 이를 제거하는 것은 가장 명확한 타깃을 버리는 일이기 때문입니다. 논문은 이 방식을 "선호 기반 암묵적 비우도(preference-guided implicit unlikelihood)" 라고 부르는데, 이름에서 짐작할 수 있듯 Welleck et al. (2019)의 비우도 학습(unlikelihood training)처럼 모델을 더 나은 출력 쪽으로만 학습시키는 것이 아니라 특정 실패 클래스로부터 멀어지도록 학습시킵니다.
수식으로 보면 SFT와의 차이가 분명해집니다. DPO의 손실 함수는 다음과 같습니다:
여기서 y_w 는 선택된 출력, y_l 은 거부된 출력, \pi_\text{ref} 는 참조 모델(보통 SFT를 마친 모델), \beta 는 참조 모델로부터의 이탈 강도를 조절하는 하이퍼파라미터입니다. 핵심은 손실이 개별 토큰이 아니라 완성된 출력 전체(y_w, y_l) 단위로 정의된다 는 점입니다. 토큰 하나하나는 그럴듯해 보여도 전체적으로는 퇴화한 시퀀스에 명시적으로 "잘못된 결과"라는 레이블을 붙일 수 있게 되는 것입니다. 퇴화 출력이 거부 예시로 특히 적합한 이유도 여기에 있습니다. 단어를 빠뜨린 전사는 저품질이지만 실패 양상이 사례마다 다른 반면, 반복 루프는 문서와 모델 패밀리를 가리지 않고 일관된 형태로 나타나는 실패 모드여서 일관된 학습 타깃이 되기 때문입니다.
이 접근의 실용적 매력은 별도의 어노테이션 인프라가 전혀 필요 없다는 데 있습니다. 필요한 것은 수용 가능한 출력과 식별 가능한 실패 출력을 모두 생성할 수 있는 모델, 그리고 선호 쌍에 레이블을 붙일 채점 모델뿐입니다. 직접 구현해 보고 싶으시다면 Hugging Face의 TRL 라이브러리가 SFTTrainer와 DPOTrainer를 모두 제공하므로, 같은 2단계 파이프라인을 그대로 재현할 수 있습니다.
DPO와 선호 최적화 더 알아보기
Direct Preference Optimization: Your Language Model is Secretly a Reward Model - Rafailov et al. (NeurIPS 2023)
TRL DPOTrainer 공식 문서 - Hugging Face
RLHF Book - RLHF와 사후 학습 전반을 다루는 오픈소스 교재 (PyTorchKR 소개 게시물)
OAT: Online Alignment Toolkit - 온라인 정렬 연구 프레임워크 (PyTorchKR 소개 게시물)
다섯 모델 패밀리에서 예외 없이 확인된 감소
DPO 단계는 테스트된 모든 모델 패밀리에서 텍스트 퇴화를 줄였습니다. SFT 단독 대비 감소율은 37.3%에서 87.6% 사이였고 평균은 59.4%였습니다. 이 결과는 서로 다른 아키텍처, 파라미터 규모, 그리고 열 배 이상 차이 나는 초기 퇴화 프로파일에 걸쳐 일관되게 유지되었습니다.
블로그에는 일부 수치만 등장하지만, 논문의 Table 1에는 다섯 패밀리 전체의 단계별 퇴화율이 공개되어 있습니다:
| 모델 패밀리 | Vanilla | SFT | SFT+DPO | SFT 대비 감소율 |
|---|---|---|---|---|
| Qwen2.5-VL-7B-Instruct | 2.42% | 1.61% | 1.01% | 37.3% |
| Qwen2.5-VL-3B-Instruct | 0.60% | 3.23% | 1.41% | 56.3% |
| olmOCR-2-7B | 1.41% | 1.01% | 0.40% | 60.4% |
| gemma-3-4b-it | 33.96% | 16.13% | 4.03% | 75.0% |
| Nanonets-OCR2-3B | 2.62% | 1.61% | 0.20% | 87.6% |
표를 보면 네 패밀리에서는 Vanilla, SFT, SFT+DPO로 단계가 진행될 때마다 퇴화율이 꾸준히 떨어지고, Qwen2.5-VL-3B-Instruct 한 곳에서만 SFT 후 퇴화가 늘었다가 DPO가 이를 교정하는 패턴이 보입니다.
앞서 살펴본 Qwen2.5-VL-3B의 사례를 결과 관점에서 다시 보면, DPO 이후 퇴화율 1.41%는 기본 상태의 0.60%로 돌아간 것이 아닙니다. 원문은 이것이 의도된 결과라고 설명합니다. SFT를 거친 모델은 기본 모델보다 작업 수행 능력이 높아진 상태이고, 0.60%로 되돌리려면 그 능력을 되돌려야 했을 것입니다. DPO 단계가 한 일은 SFT가 새로 들여온 실패 기하학을 겨냥해 억제하는 것이었고, 이는 "SFT와 DPO가 서로 다른 실패 차원을 다루는 별개의 연산" 이라는 가설과 정확히 부합합니다. 원문이 이 사례를 "가장 분석적으로 중요한 데이터 포인트" 라고 부르는 이유입니다.
일관성의 폭도 눈여겨볼 만합니다. gemma-3-4b-it는 두 번째로 높은 모델(2.62%)의 10배가 넘는 33.96%라는 기본 퇴화율로 벤치마크에 들어왔습니다. SFT가 이를 16.13%로 절반 이상 줄였지만 여전히 프로덕션과는 거리가 먼 수준이었고, DPO 단계가 이를 다시 4.03%까지 끌어내려 SFT 대비 75%를 추가로 줄였습니다. 어떤 패밀리도 DPO 이후 퇴화가 늘지 않았고, 어떤 패밀리도 효과에서 면제되지 않았습니다. 감소율의 범위(37.3%~87.6%)는 초기 조건과 아키텍처의 차이를 반영할 뿐, 개입 방향의 비일관성을 의미하지 않는다는 것이 원문의 정리입니다.
추출 품질이 퇴화 감소의 대가로 희생되지 않았는지도 논문 수치로 확인할 수 있습니다. 다섯 패밀리 중 네 곳에서 DPO 이후 벤치마크 점수가 유지되거나 오히려 올랐고(예: Nanonets-OCR2-3B 0.917에서 0.921로, gemma-3-4b-it 0.640에서 0.654로), 유일하게 Qwen2.5-VL-3B-Instruct만 0.819에서 0.793으로 소폭 하락했습니다. 이 실험의 최종 산출물이 바로 DharmaOCR Full(olmOCR-2-7B 기반)과 DharmaOCR Lite(Nanonets-OCR2-3B 기반)입니다. 두 모델은 AWQ 양자화까지 거쳐 각각 0.925와 0.911의 벤치마크 점수와 0.40%, 0.20%의 퇴화율을 기록했고(양자화로 페이지당 비용은 최대 22% 절감, 점수 손실은 0.002 수준), 같은 벤치마크에서 GPT-5.4(0.750), Gemini-3.1-Pro(0.820), Claude-Opus-4.6(0.833) 같은 상용 모델들을 추출 품질에서 앞섰습니다. 논문에 따르면 DharmaOCR Lite는 Claude-Opus-4.6보다 약 52배 저렴하면서 더 높은 벤치마크 점수를 달성했습니다.
다만 원문 스스로 명확히 선을 긋는 부분도 있습니다. 이 결과는 보편적 적용 가능성의 증명이 아닙니다. DPO가 모든 도메인, 모든 실패 모드, 모든 모델 패밀리에 이전되리라는 보장은 없으며, 이 벤치마크가 제공하는 것은 다섯 개 OCR 아키텍처에 걸쳐 "토큰 수준 우도 최대화가 아니라 완전한 선호 쌍에 대한 최적화가, SFT가 구조적으로 겨냥할 수 없는 실패 모드를 다룰 수 있다" 는 핵심 가설을 지지하는 증거입니다.
OCR 너머: 이 방법이 작동하기 위한 세 가지 구조적 조건
원문의 마지막 섹션은 이 방법론이 OCR이라는 도메인의 특수성이 아니라 세 가지 구조적 조건 덕분에 가능했다고 분석합니다. 같은 방법을 다른 작업에 적용할 수 있는지 판단하는 체크리스트로 쓸 수 있는 부분입니다.
실패 모드의 범주적 구별 가능성: 실패가 품질 연속선 위의 한 점이 아니라 구별되는 출력 클래스로 식별되어야 합니다. 텍스트 퇴화는 단어를 빠뜨리거나 글자를 잘못 읽는 것과 범주적으로 다른, 행동적으로 인식 가능한 방식으로 "고장난" 출력이기 때문에 이 조건을 충족합니다. 실패 모드가 수용 가능한 변동 범위와 섞여 구분되지 않는 작업에는 이 속성이 없습니다.
사람 어노테이션 없는 신뢰할 만한 채점: 채점 메커니즘이 수용 가능한 출력과 실패 모드 출력을 사람의 개입 없이 구별할 수 있어야 합니다. 채점이 완벽할 필요는 없지만, 선택과 거부 사이에 의미 있는 품질 격차가 있는 선호 쌍을 만들 만큼은 일관적이어야 합니다. 품질 차이가 모호한 쌍은 DPO 학습에 신호가 아니라 노이즈를 더하기 때문에, 심판의 일관성은 부수적 특징이 아니라 설계 요구사항입니다.
충분한 볼륨: 품질에 의미 있는 분산이 있는 선호 데이터셋을 만들 만큼 충분한 추론 출력이 필요합니다. 미세조정 기준으로 특별한 요구사항은 아니지만 실재하는 조건입니다.
세 조건이 모두 충족되면, "모델 자신의 실패 출력을 걸러내는 대신 거부 예시로 쓴다" 는 설계 결정은 도메인과 무관하게 구조적으로 가능해집니다. JSON 추출, 표 구조화, 코드 생성처럼 출력 형식이 정해져 있고 실패가 특징적인 형태로 나타나는 구조화 생성 파이프라인이라면 어디든 검토해 볼 수 있다는 뜻입니다.
ML 엔지니어 관점의 실용적 함의는 직접적입니다. SFT는 범용 모델과 작업 수행 가능 모델 사이의 거리를 좁히는 필수 단계지만, 작업 능력과 퇴화 저항성은 분포의 서로 다른 속성이므로 구조화 출력의 신뢰성에는 충분하지 않습니다. SFT 이후의 DPO 단계는 일회성 학습 투자이며, DharmaOCR의 결과에서는 퇴화 감소가 대부분의 패밀리에서 추출 품질의 유지 또는 개선과 함께 이루어졌습니다. 두 지표가 함께 움직이는 양상은 같은 팀의 Specialization Beats Scale 글에서도 벤치마크 수치로 확인할 수 있습니다.
시사점: 실패 데이터는 버릴 노이즈가 아니라 학습 신호다
이 글의 메시지를 한 문장으로 압축하면, 원문 결론부의 표현 그대로 "파이프라인은 실패를 버리지 않았다. 실패로 학습했다" 입니다. 실패 모드를 학습 신호로 쓸 수 있는지를 결정하는 것은 도메인이 아니라 실패의 구조입니다. 충분히 일관적이고, 식별 가능하고, 충분히 많은 실패는 분포가 가지 말아야 할 곳을 알려주는 가장 직접적인 증거가 됩니다.
이는 InstructGPT 이후 정렬 기법으로만 소비되어 온 선호 최적화 계열 기법들을 다시 보게 만듭니다. 사람의 주관적 선호가 없는 객관적 작업이라도, 작업 자체의 정답 기준이 만들어내는 선호 신호가 있다면 DPO는 특정 실패 모드를 겨냥하는 외과적 도구로 쓸 수 있습니다. 국내에서도 문서 디지털화나 데이터 추출 파이프라인에서 DeepSeek-OCR이나 GLM-OCR 같은 OCR 특화 모델을 미세조정해 쓰는 사례가 늘고 있는 만큼, SFT 한 단계로 끝내지 않고 자기 모델의 실패 출력을 모아 DPO 단계를 추가하는 구성은 충분히 시도해 볼 가치가 있어 보입니다.
Direct Preference Optimization Beyond Chatbots 원문 블로그
DharmaOCR 논문 (arXiv)
DharmaOCR Lite 모델 (Hugging Face)
더 읽어보기
-
Text Degeneration: The Production Failure Mode That LLM Benchmarks Ignore (영문)
-
The Curious Case of Neural Text Degeneration, Holtzman et al. 2020 (영문)
-
RLHF Book: 인간 피드백 기반 강화학습(RLHF)과 사후 학습(Post-training) 전반을 다루는 오픈소스 교재 및 코드 라이브러리
-
OAT 🌾: 대규모 언어 모델(LLM)의 온라인 정렬을 위한 연구 친화적 프레임워크 (Online Alignment Toolkit for LLMs)
-
olmOCR, PDF 및 이미지를 효과적으로 분석하고 구조화하는 오픈소스 OCR 도구 (feat. Allen AI)
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()



