완성작들의 점수 차이로 생성 과정을 고친다 — DiffusionART

여러 결과물의 점수 차이에서 교정 방향 하나를 추정해 생성 단계들이 나눠 쓴다. 과제별 재튜닝 없이 적은 GPU로 배우는 DiffusionART를 읽는다.
English  ·  日本語  ·  한국어
← 목록으로
온
온틀 리서치
2026년 10월 12일 수정 2026.10.16 읽기 20분 조회 2

이미지나 영상을 만드는 AI는 보통 완성작 한 장에만 점수를 받는다. 그런데 그 한 장이 나오기까지, 모델은 흐릿한 노이즈를 수십 번에 걸쳐 조금씩 걷어낸다. 맨 끝에 매긴 점수 하나로 그 수십 단계를 어떻게 고칠 것인가. 이 글이 다룰 DiffusionART의 답부터 적는다. 여러 완성작의 점수 차이에서 "점수를 올리는 방향" 하나를 뽑고, 그 방향을 생성의 모든 중간 단계가 나눠 쓴다. 이름 ART도 그대로다 — Aggregation-First Reward Tilting, 보상을 먼저 한 방향으로 모은(aggregation-first) 뒤 그쪽으로 생성 분포를 기울인다(tilting).

이 한 줄이 왜 중요한지는, 기존 방식들이 바로 이 지점에서 미끄러졌기 때문이다.

공로 배분이라는 골칫거리

확산 모델이나 플로우 매칭 모델(둘 다 노이즈에서 출발해 데이터를 조금씩 만들어 내는 생성 모델 계열)은 원래 "주어진 데이터 분포를 흉내 내라"는 목표로만 학습된다. "보기 좋은가", "움직임이 자연스러운가", "사람이 더 선호하는가"는 그 목표에 없다. 그래서 완성된 결과물을 평가하는 보상으로 모델을 한 번 더 손보는 단계가 따로 붙는다. 여기 쓰는 것이 온라인 강화학습이다. 미리 모아둔 데이터가 아니라, 지금 학습 중인 생성기가 방금 뽑은 결과물을 그 자리에서 평가해 반영한다. 점수를 어떻게 계산하는지 몰라도 나온 점수만 있으면 된다는 게 장점이다. 사람이 누른 선호 버튼이든 외부 평가 모델이 내놓은 숫자든 가리지 않는다.

까다로운 대목은 그 점수가 완성작에 대해 딱 한 번 주어진다는 데 있다. 한 장을 만드는 데 노이즈를 걷는 단계가 수십 번 드는데, 점수 하나를 그 많은 단계에 얼마씩 나눠 줄지 정해야 한다. 이것이 공로 배분(credit assignment)이다. 어느 단계가 좋은 결과에 얼마나 기여했는지를 가늠해 그만큼 고치는 일이다. 기존 두 방식은 이 배분을 정반대로 처리했고, 각자의 약점도 거기서 나왔다.

생성 과정을 따라가며 고치는 방식(대표: Flow-GRPO)은 생성기가 실제로 밟은 단계들을 그대로 손본다. 문제는 한 단계가 결과를 일부만 좌우했는데도 완성작 전체 성적으로 평가받는다는 점이다. 어느 단계를 얼마나 고칠지가 부정확해 학습이 더디다.

완성작에 다시 노이즈를 넣어 배우는 방식(대표: DiffusionNFT)은 깨끗한 결과물에 노이즈를 다시 입혀, 보상이 높은 쪽은 닮게·낮은 쪽은 멀어지게 만든다. 단계별 확률 계산이 없어 효율적이지만 학습이 불안정하다. 그래서 안정 장치를 다는데, 그중 EMA(과거 모델을 천천히 따라가게 묶어두는 장치)는 과제가 바뀔 때마다 세기를 손으로 다시 맞춰야 한다. 한쪽은 느리고, 다른 한쪽은 손이 많이 간다.

DiffusionART는 완성작을 기준으로 방향을 잡되(두 번째 방식의 효율), 그 방향을 실제로 거쳐 간 단계들에 적용한다(첫 번째 방식의 장점).

교정 방향 하나를 어떻게 뽑나

작동은 네 걸음이다. 같은 프롬프트로 결과를 여러 개 만든다 → 각각 보상으로 평가한다 → 점수가 오를수록 결과물이 공통으로 어느 쪽으로 달라지는지 추정해 '교정 방향' 하나를 만든다 → 그 방향을 생성 중간 단계들에 적용한다. 세 번째 걸음이 핵심이니 예로 풀어 보자.

같은 프롬프트로 후보 셋을 만들었다고 하자. 모델은 이 셋을 눈에 보이는 그림 그대로 다루지 않는다. 내부에서는 저마다 여러 숫자로 된 하나의 값, 말하자면 공간 위의 한 점으로 표현한다. 세 후보는 그 공간 위 서로 다른 세 점이다. '방향'이란 이 점을 어느 쪽으로 밀지를 가리킨다.

이제 세 점에 점수를 매긴다. 점수가 높은 점일수록 한쪽으로 쏠려 있다면, 그 쏠린 쪽이 곧 점수를 올리는 방향이다. 여기서 점수가 가장 높은 후보 하나를 골라 통째로 베끼지 않는다. 세 점의 위치 차이와 점수 차이를 함께 놓고, 점수 차이가 큰 쌍일수록 비중을 키워 공통 방향을 추린다. 점수 차이로 가중해 평균을 내는 셈이라, 한 후보에만 우연히 나온 특이한 세부보다 여러 후보의 점수를 함께 끌어올린 성분이 방향에 더 크게 반영되는 쪽으로 기운다. 다만 이건 그런 공통 성분을 추정하는 계산이지, 후보별 특이한 세부가 말끔히 상쇄되고 공통 성분만 남는다는 보장은 아니다. (부록 용어로는 '보상과 결과물 사이의 공분산'을 추정한 방향이다.)

한 가지는 분명히 짚어 두자. 이 방향은 사람이 이름 붙일 수 있는 화질 항목과 반드시 일치하지는 않는다. '밝기를 올려라'나 '손가락 개수를 맞춰라' 같은 말로 번역되는 보장이 없다. 어디까지나 그 점수 공간 안에서 점수가 올라가는 쪽을 가리키는 내부 수치일 뿐이다.

방향 하나를 모든 단계가 나눠 써도 되나

완성작에서 추정한 방향은 하나다. 그런데 생성의 중간 단계들은 저마다 상태가 다르다. 노이즈가 많이 낀 초반과 거의 걷힌 후반은 전혀 다른 그림을 쥐고 있다. 서로 다른 단계에 같은 방향 하나를 밀어 넣어도 괜찮을까.

DiffusionART는 한 프롬프트 안에서는 방향 하나를 모든 단계가 공유하도록 설계한다. 하지만 이것이 '각 단계의 방향이 원래 같다'는 뜻은 아니다. 논문은 이 공유 방향이 각 상태(단계)의 조건부 방향과 어긋날 수 있고, 그 오차가 단계를 거치며 누적될 수 있다고 명시한다(§4.1·부록 B.3). 즉 방향 공유는 보장된 등식이 아니라 완성작에서 추정한 값 하나를 전 단계에 적용하는 근사이고, 단계별 조건부 방향이 들쭉날쭉 흩어질수록 그 오차는 커진다. 오히려 이렇게 방향을 상태끼리 공유하는 설계는, NFT에서 상태별 유도 신호가 서로 상쇄돼 복원력이 업데이트를 지배해 버리던 현상을 줄이는 쪽으로 작동한다고 논문은 설명한다(§4.2).

대신 포기하는 것도 분명하다. 단계마다 교정량을 따로 쪼개는 세밀함은 버린다. 그런데 애초에 그 쪼갬이 부정확해서 학습이 흔들렸던 터라, 세밀함을 포기한 대가로 흔들림이 줄어든다. 손해와 이득이 같은 자리에서 나온다.

안정화를 두 기능으로 읽기

DiffusionART의 안정화는 서로 다른 두 가지 일을 한다. 하나는 불필요한 교정 신호를 아예 만들지 않는 것, 다른 하나는 모델이 너무 멀리 움직였을 때 되돌리는 것이다.

첫째, 불필요한 교정 신호를 없앤다. 완성작에 노이즈를 다시 넣는 방식에는 보상과 무관한 힘이 딸려 온다. 다시 노이즈를 입히는 계산 안에서 '모델이 내놓은 속도'와 '이상적인 속도'가 어긋나기 때문이다(여기서 속도는 처리 시간이 아니라, 한 단계에서 생성 상태가 얼마나 어느 쪽으로 바뀌는지를 가리키는 값이다). 이 어긋남이 보상과 상관없이 모델을 엉뚱한 쪽으로 끌어당긴다. NFT는 이 힘을 사후에 억누르려고 장치를 더 달았다. DiffusionART는 억누르는 대신 처음부터 만들지 않는다. 방향을 결과물과 보상만으로 짜고 그 다시-노이즈 계산을 건드리지 않으니, 어긋남이 생길 자리 자체가 없다.

둘째, 과도한 이동을 되돌린다. NFT에서 EMA가 하던 진짜 역할은 '천천히 움직이는 과거 분포'가 아니라, 모델이 너무 멀리 간 만큼 제자리로 당기는 복원력이었다 — 저자들의 해석이다. DiffusionART는 과거 모델을 따로 묶어두는 대신 한 묶음의 데이터를 겹치지 않는 두 덩이로 쪼갠다. 먼저 첫 덩이로 모델을 한 번 움직인다. 두 번째 덩이로 업데이트할 때, 방향 계산의 기준점을 '지금 막 움직인 모델'이 아니라 '움직이기 전 모델'에 둔다. 이 설정이 복원력을 만든다. 두 번째 업데이트가 움직이기 전 상태를 기준으로 삼으니, 모델이 그 기준에서 멀리 벗어났을수록 당겨 들이는 힘이 커지고 조금만 움직였으면 약해진다. 이동 거리에 비례해 복원이 걸리는 셈이라, EMA처럼 세기를 손으로 맞출 눈금이 필요 없다. 과제별 재튜닝이 사라지는 지점이 바로 여기다.

(이 둘째 기능에는 기준에서 멀어지는 업데이트만 막고 가까워지는 업데이트는 살리는 '마스킹'이 보조로 붙는다. 저자들은 이를 핵심 기여가 아니라 보조 장치로 선을 긋는다. 첫째 기능에서 생략한 '줄다리기' 구도와 마스킹의 세부는 「더 깊이」에 두었다.)

점수가 없고 '선택'만 있을 때

점수 대신 "둘 중 뭐가 나은가"만 있을 때를 위한 DiffusionART-Pairwise가 있다. 결과물을 쌍으로 묶어 승·패(동점 포함)를 매기고, 그 라벨이 점수 자리를 대신한다. 그림과 영상은 정답이 딱 떨어지지 않아, 점수를 억지로 붙이기보다 둘을 견주는 쪽이 오히려 자연스러운 피드백이라는 판단이다.

실험은 어떻게 설계됐나

실험은 텍스트→이미지(T2I)에서 시작해 텍스트→영상(T2V), 이미지→영상(I2V)으로 넓힌다. T2I에서는 SD3.5-M으로 모델의 작은 일부만 학습하고, T2V에서는 대표 모델 HunyuanVideo-13B의 전체 파라미터를 미세조정한다. T2V 지표는 셋이다 — 요청 문장과 맞는지(텍스트 정합 TA), 화면이 보기 좋은지(시각 품질 VQ), 움직임이 자연스러운지(동작 품질 MQ). 이 점수는 VideoReward라는 보상 모델이 매긴다. 공정한 비교를 위해 경쟁 방식 DiffusionNFT에는 원 논문이 과제마다 손으로 맞춰 둔 설정값을 그대로 줘 최대 성능을 뽑게 했다.

숫자를 읽기 전에 단위 세 개만 맞춰 두자. 생성의 '단계'는 한 장을 뽑을 때 노이즈를 걷는 횟수고(아래 '스텝'과 다르다), 학습의 '스텝'은 모델을 한 번 고치는 업데이트 횟수다. 'GPU시간'은 GPU 한 장을 한 시간 돌린 양으로, 같은 점수에 도달하는 데 든 계산 비용을 잰다.

결과: 세 질문으로 읽기

얼마나 빨리 배우나(속도). HunyuanVideo-13B 주 설정에서 시각 품질 VQ 5.5에 도달하는 데 DiffusionART는 24스텝·63.4 GPU시간이 든 반면, 가장 공들여 튜닝한 DiffusionNFT(EMA)는 273스텝·1,401.4 GPU시간이 들었다. 학습 스텝 11.4배, GPU시간 22.1배 적다. 이 숫자는 'VQ 5.5라는 한 지점까지'의 비용 비교이며, 그 자체로 최종 품질의 우열을 말하지는 않는다.

배우다 무너지지 않나(안정성). 복원(두 번 업데이트)을 뺀 '한 번 업데이트' 변형은 빠르게 배우다 점점 나빠졌고, 복원을 넣자 장기적으로 안정됐다. 마스킹도 같아서, 뺀 T2V 실험은 200스텝 부근에서 성능이 꺼졌다 회복한 반면 넣으면 꾸준히 올랐다. 두 장치가 각자 다른 붕괴를 막는다는 것을 보여주는 대조다.

설정을 안 바꿔도 다른 모델로 옮겨가나(전이). 더 큰 FLUX.1-dev(12B)로 옮겼을 때, NFT는 SD3.5-M용으로 맞춰둔 설정값을 그대로 들고 간 탓에 보상이 크게 출렁였다. DiffusionART는 같은 설정으로 가장 빠르게 학습했다. 이 결과는 '절대 성능이 더 높다'가 아니라 '설정을 손대지 않아도 무너지지 않는다'를 가리킨다.

실무에 가장 가까운 결과는 '선택'만 있을 때의 쌍별 실험이다. 400스텝·VQ-only 조건에서 비용과 점수가 이렇게 갈렸다.

쌍별 선호 실험(400스텝, VQ-only) GPU시간 VQ 품질
점수를 직접 쓴 경우 891.1h 13.637
선호 비교(후보 수 3설정) 260.8h / 465.6h / 883.3h 12.235 / 10.883 / 12.092

세 설정은 프롬프트당 후보 수를 달리한 것으로, 후보 수를 줄이면 GPU시간이 260.8h까지 내려간다. 비용을 이만큼 깎아도 VQ 점수는 점수를 직접 쓴 13.637에서 12점대로, 큰 폭으로 벌어지지는 않는다. 다만 "이 정도 점수 차가 눈으로 볼 때 작은 손실인가"는 숫자만으로 단정할 수 없다. VQ는 보상 모델이 매긴 척도이고, 체감 품질의 판단에는 출력 예시나 수용 기준이 따로 필요하다. 표가 말해 주는 것은 분명하다 — 선호 비교는 점수 직접 사용에 근접한 VQ를 내면서 후보 수에 둔감해, GPU 예산이 빠듯하면 후보 수부터 줄여 볼 여지가 있다.

이 수치를 어떻게 읽을까

효율 배수는 조심해서 읽어야 한다. 배수의 크기는 비교 기준선을 얼마나 잘 튜닝했느냐에 민감하고, 배수가 가장 크게 벌어지는 구간은 상대 방식이 붕괴하거나 설정이 과제에 안 맞게 전이된 때다. 그래서 두 주장을 갈라 읽어야 한다. "튜닝을 안 하면 경쟁 방식이 불안정하다"(설정 전이 이득)와 "충분히 튜닝한 경쟁 방식보다도 낫다"(절대 성능 우위)는 실무에서 뜻이 전혀 다르다. 앞쪽이 참이면 '손 덜 가는 레시피'로서 값지고, 뒤쪽까지 참이어야 '그냥 더 좋은 방법'이 된다. 저자들은 NFT에서 상태별 유도 신호가 상쇄돼 복원력이 업데이트를 지배하는 현상을 짚고, DiffusionART는 방향을 상태끼리 공유해 그 상쇄를 줄인다고 설명하며, 마스킹은 보조 장치로 선을 그었다. 도입을 저울질한다면 내 과제의 기준선을 제대로 맞춰 비교하는 검증이 남는다.

온틀이라면

온틀은 AI PM이 고객의 콘텐츠 제작을 대신 맡아, 매주 여러 시안을 묶어 넘기는 일을 한다. 한 장면을 끝까지 따라가 보자. AI PM이 이번 주 고객의 카드뉴스를 A안·B안으로 올리고, 고객이 "A가 낫다"를 고른다. 이 선택은 숫자 점수가 아니라 둘 중 하나를 고르는 비교다. DiffusionART-Pairwise가 다루는 입력 형식이 정확히 이것이다.

그래서 온틀이 지금 할 수 있는 일은 모델 학습이 아니라, 이 선택을 나중에 쓸 수 있게 남기는 기록 설계다. 기록은 셋이면 된다 — 무엇을 요청했는지(프롬프트), 어떤 후보가 올라왔는지, 어느 것이 선택됐는지. 이 셋만으로 승·패 라벨이 만들어진다. "왜 골랐는지"는 여기 섞지 않고 품질 분석용 별도 정보로 따로 붙인다. 피드백을 점수가 아니라 쌍별 선택으로 받아두는 이 결정은 오늘 당장 할 수 있다.

학습으로 넘어가는 건 그다음 이야기이고, 다음 세 조건이 풀려야 한다. 선택 기록이 충분히 쌓였는가. 고객이 쓰는 생성 모델의 가중치를 우리가 손댈 수 있는가, 아니면 외부 API라 막혀 있는가. 미세조정·추론 GPU 비용이 파견 단가 안에 들어오는가. 셋 다 "그렇다"가 되기 전까지, 오늘의 과제는 선택 로그를 반듯하게 모아 두는 것 하나다.

더 깊이

추가 용어

  • LoRA 어댑터 — 모델 전체가 아니라 끼워 넣는 작은 보조 파라미터만 학습하는 방식(T2I에서 사용).
  • 롤아웃 — 생성기가 정해진 횟수만큼 노이즈를 걷어 결과를 한 번 뽑는 것(T2I는 10-스텝 롤아웃).
  • 하이퍼파라미터 — 학습 전에 사람이 손으로 정하는 설정값.
  • 두 계열의 대표 — 역과정 계열(생성 과정을 따라감)에 Flow-GRPO와 변형(Flow-GRPO-Fast/CPS, DanceGRPO, Flow-DPPO), 순과정 계열(완성작에 노이즈를 다시 넣음)에 DiffusionNFT. 미분 가능한 보상을 역전파하는 ReFL, 미리 모은 선호쌍으로 배우는 Diffusion-DPO와는 '온라인·블랙박스'라는 점에서 갈린다.

수식 배경

아래는 확산/플로우 매칭의 전이와 KL 개념, 공분산을 미리 아는 독자를 위한 요약이다.

  • 왜 한쪽 가지만 쓰면 무너지나(Lemma 1). NFT의 양성·음성 가지는 이상적으로 같은 보상 방향을 가리킨다(두 방향이 평행). 그런데 회귀 목표가 '순방향 속도'에서 만들어져, "모델이 쓴 속도 = 결과물로부터 유도되는 이상적 순방향 속도"라는 암묵적 가정이 들어간다. 현실에서 둘은 어긋나고, 그 차이가 보상과 무관한 순–역 일관성 힘을 낳는다. 공동 학습이 이를 상쇄하지만 보상 센터링이 상태별이 아니라 샘플들 사이 평균이라 잔여 힘이 남고, 노이즈가 줄어 결과물 정보가 드러나는 후반 단계일수록 이 힘이 커진다.
  • 집계 우선 보상 틸팅(Lemma 2). 보상이 높은 결과물을 지수적으로 더 얹어 분포를 기울이면 결과물 평균이 '보상–결과물 공분산' 방향으로 움직인다. 이 공분산을 각 프롬프트의 롤아웃에서 추정하고 RMS 정규화로 크기를 고정한 뒤, 그 프롬프트의 모든 상태에 공유 방향으로 적용한다. 목표에 순방향 속도가 끼지 않아 일관성 힘이 설계상 생기지 않는다. 다만 이 공유 방향은 각 상태의 조건부 방향과 어긋날 수 있고, 저자들은 그 오차가 누적될 수 있다고 §4.1·부록 B.3에서 명시한다.
  • 복원이 핵심 안정 장치(Proposition 2). EMA 롤아웃은 유지하되 손실에서 과거 앵커(기준점)를 빼면 여전히 붕괴했고(오프폴리시 데이터만으로는 안정화 안 됨), 반대로 EMA 없이 배치를 둘로 나눠 두 번 업데이트하면 붕괴를 피했다. 단 NFT 안에서 이 두 번 업데이트는 학습을 15.2배 느리게 만들었다 — 상태별 유도가 서로 상쇄돼 복원이 업데이트를 지배했기 때문이다. DiffusionART는 유도를 프롬프트 내 상태끼리 공유해 이 상쇄를 줄인다.
  • 신뢰영역 마스킹. ODE 전이는 결정론적이라 쓸 만한 KL이 없다. 그래서 Flow-GRPO의 ODE→SDE 공식으로 참조 가우시안 전이를 정의하고, 속도 예측으로 드리프트를 재는 KL 대리값을 만든다. Flow-DPPO에서 착안해 바깥으로 벗어나는 업데이트만 막고 안쪽 교정은 살리며, 드리프트 임계값은 전 과정 고정, 노이즈가 큰 상태를 강조하는 계수를 둔다.

추가 실험 수치

서로 다른 실험이므로 하나의 성과로 합쳐 읽으면 안 된다. HunyuanVideo에서 VQ:MQ를 똑같이 섞은 설정 기준, 같은 평균 보상에 도달하는 GPU시간이 DiffusionNFT·Flow-GRPO-Fast 대비 각각 12.02배·11.72배 적었고, 평균 학습 보상은 두 기준선 대비 +28.8%·+53.0%였다. TA:VQ:MQ를 맞춘 주 설정에서는 학습 중 VQ 6에 29스텝, MQ 3에 46스텝으로 도달(세 기준선은 기록 구간 내 미도달)했고, 최종 평가 점수는 VQ 8.970·MQ 4.224로 최강 기준선 대비 VQ +31.4%·MQ +57.4%였다.

코드가 공개돼 있나요?

논문에 GitHub 저장소(github.com/vanzll/DiffusionART)와 프로젝트 페이지(vanzll.github.io/diffusionart-project) 주소가 명시돼 있습니다. 구현 세부와 의사코드 일부는 본문과 부록에 포함돼 있습니다.

언어모델의 GRPO 같은 강화학습과 뭐가 다른가요?

둘 다 그룹 단위 보상을 쓴다는 점은 닮았습니다. 다만 언어모델은 토큰이 곧 출력이라 공로 배분이 비교적 단순합니다. 이 논문의 난점은 하나의 그림·영상을 만드는 수십 번의 denoising 단계에 점수를 어떻게 반영하느냐에 있고, DiffusionART는 각 단계에 스칼라 점수 대신 공유 방향을 주는 방식으로 접근합니다.

일반 확산 모델에도 되나요, 아니면 rectified flow 전용인가요?

논문은 데이터–노이즈 선형 보간을 쓰는 rectified flow를 대상으로 삼되, 이것이 확산(diffusion)과 핵심 원리를 공유한다고 밝힙니다. 저자들은 'diffusion'을 포괄 용어로 쓰고 있어, 같은 선형 보간 계열에는 적용 여지가 있다고 읽힙니다.

학습에 사람이 직접 매긴 선호 데이터가 꼭 필요한가요?

반드시는 아닙니다. 본문 T2V 실험은 VideoReward 같은 보상 모델이 매긴 점수를 학습·평가에 사용했습니다. 사람 선호가 있다면 쌍별(winner/loser) 라벨 형태로 Pairwise 변형에 넣을 수 있다는 것이 추가 선택지입니다.

참고자료