매번 개입하지 않고도 거의 같은 결과에 도달하는 법
모든 디노이징 스텝에 SMC 가이던스를 거는 대신 예산 안에서 고른 타이밍에만 개입하는 VISTA의 발상과 그 대가를 해설합니다.
원문 논문 보기
오늘 살펴볼 논문은 arXiv에 공개된 Value-Informed Schedule Trimming for Accelerated Sequential Monte Carlo Guidance in Discrete Diffusion(2610.20669)입니다. 원문 링크는 제목 아래에 걸어 두었습니다. 이 논문이 내세우는 주장은 한 문장으로 정리됩니다. 학습 없이 정해진 예산 안에서 가이던스를 걸 스텝만 골라 전체 가이던스 경로에 최대한 가깝게 머무르면 지연 시간을 크게 낮추면서도 거의 같은 수준의 결과를 얻을 수 있다는 것입니다.
여기까지가 사실관계이고, 이제부터는 제가 이 논문을 왜 끝까지 읽었는지 말씀드리겠습니다. 저는 test-time alignment라는 말이 주는 느낌을 좋아합니다. 모델을 다시 학습시키지 않고도 뽑는 과정에서 원하는 방향으로 이끌 수 있다는 발상이기 때문입니다. 그런데 discrete diffusion에서 reward-guided 생성을 실제로 돌려본 분들은 같은 지점에서 고개를 갸웃하셨을 겁니다. 매 디노이징 스텝마다 Sequential Monte Carlo 가이던스를 걸면 품질은 좋아지는데, 속도가 너무 느려서 실감이 나지 않는다는 점이죠. 저도 처음에는 이 방법이 연구실에서는 좋지만 운영에서는 쓰기 어렵겠다고 생각했습니다. 그렇다면 매번 개입하지 않고도 비슷한 궤적을 유지할 수는 없을까요. 오늘은 그 질문을 파고든 VISTA 이야기를 함께 따라가 보겠습니다.
매 스텝마다 간섭하면 왜 이렇게 느려질까
이 논문을 이해하려면 먼저 비용이 어디에서 생기는지 감각적으로 잡아야 합니다. Discrete diffusion은 한 번에 완성된 문장을 내놓는 대신 여러 스텝에 걸쳐 조금씩 다듬으면서 답에 가까워지는데요. 이때 reward-guided SMC 가이던스는 매 스텝마다 여러 후보를 두고 어떤 방향이 downstream 목표에 더 가까운지 평가합니다. 후보마다 reward를 계산하고 value의 gradient와 관련된 계산까지 얹으면, 스텝 수가 늘어날수록 곱절로 부담이 커집니다. 생성 길이가 길거나 배치로 뽑는 상황에서는 밤사이 실험 하나가 아침까지 안 끝나는 경우도 생기죠.
문제는 그다음입니다. 비용이 크다고 해서 가이던스를 끄면 방향이 흐트러지고, 비용을 감수하자니 지연 시간이 감당이 안 됩니다. 저는 이 대목에서 예전에 겪었던 서빙 고민이 떠올랐습니다. 품질 그래프는 분명히 올라가는데, p99 지연 시간 그래프가 함께 올라가면 결국 롤백을 고민하게 되니까요. 그렇다면 모든 스텝에 공평하게 돈을 쓸 것이 아니라, 돈이 가장 아깝지 않은 스텝에만 쓰는 방법은 없을까요. VISTA는 바로 이 지점에서 출발합니다.

그렇다면 어디에만 개입하면 될까
VISTA라는 이름이 가리키는 것은 Value-Informed Schedule Trimming for Accelerated SMC guidance의 줄임말로, 정해진 예산 안에서 가이던스를 걸 타임스텝만 자동으로 고르는 학습 없는 방법입니다. 여기서 예산이란 가이던스를 켤 수 있는 스텝 수의 상한이라고 읽으시면 됩니다. 전체 스텝이 백 개라면 그중 열 개만 골라서 쓰는 식이죠. 저는 이 설정을 보고 급행열차가 떠올랐습니다. 모든 역에 서면 도착이 늦어지니까, 승객이 가장 많이 타는 역에만 서는 것과 비슷합니다.
그런데 어떤 역이 승객이 많은 역인지 미리 알 수 있을까요. 균등 간격으로 나누는 방법은 손이 덜 가지만, 매번 잘 맞는다는 보장이 없습니다. 앞쪽 스텝이 더 결정적일 수도 있고, 뒤쪽에서 미세 조정이 더 큰 차이를 만들 수도 있기 때문입니다. 실제로 논문이 보여주는 선택 결과는 태스크마다 달라지는데, 이 점은 뒤에서 다시 다루겠습니다. 어쨌든 VISTA가 하려는 일은 감으로 간격을 정하는 것이 아니라, 값(value)에 대한 정보를 보고 어디를 끊어낼지 정하는 것입니다. 그래서 이름에 value-informed라는 말이 들어간 것이고요.
전체 경로를 흉내 낸다는 발상은 어떻게 나왔을까
제가 이 논문에서 가장 흥미롭게 본 부분은 문제를 바라보는 틀 자체입니다. 성긴(sparse) 가이던스를 따로 노는 근사 기법으로 보지 않고, 이상적인 전체 가이던스 확률 경로에 대한 근사로 바라보기 때문입니다. 모든 스텝에 가이던스를 걸었을 때의 궤적이 기준선이라면, 몇 개 스텝을 건너뛰더라도 그 기준선에서 크게 벗어나지 않으면 된다는 생각이죠. 길 안내로 비유하면 매 교차로마다 전화를 거는 대신, 헤매기 쉬운 분기점에서만 전화를 거는 셈입니다.
여기서 재미있는 질문이 생깁니다. 벗어나지 않았다는 것을 어떻게 잴 수 있을까요. 논문은 l1 경로 이탈(path deviation)에 대한 추정 가능한 상한(upper bound)을 유도합니다. 직접 측정이 어려운 이상적인 차이를 그대로 두지 않고, 손에 잡히는 통계로 계산할 수 있는 상한을 대신 최적화 목표로 삼는 것이죠. 상한을 줄인다고 해서 실제 차이가 정확히 그만큼 줄어든다는 보장은 없습니다. 하지만 상한이 작아지면 실제 이탈이 크게 벌어질 여지가 줄어들기 때문에, 스케줄을 고르는 나침반으로는 충분히 쓸 수 있습니다. 저는 이 대목이 꽤 영리하다고 봅니다. 정확한 답을 구할 수 없을 때, 정확한 답을 감싸는 틀을 구해서 그 틀을 조이는 방식으로 문제를 풀었기 때문입니다.

웜업 몇 번으로 스케줄이 정해질 수 있을까
이론적인 틀이 섰다면 다음에는 실제로 숫자를 채워 넣어야 합니다. VISTA는 소수의 전체 가이던스 웜업 생성에서 모은 value 통계를 이용해 경험적인 대리 목표(empirical surrogate)를 만들고, 그 목표를 정확히 최적화합니다. 말이 어렵게 들리지만 과정은 직관적입니다. 먼저 전부 개입하는 방식으로 몇 번만 뽑아보면서, 어느 스텝에서 값의 움직임이 컸는지 기록합니다. 움직임이 컸던 스텝은 건너뛰면 궤적이 크게 흔들릴 가능성이 높으니 예산을 우선 배정하는 것이죠.
좋은데, 몇 번의 웜업으로 전체 그림을 알 수 있을까요. 저는 여기서 조금 의심했습니다. 웜업 횟수가 적으면 통계가 흔들릴 수 있고, 많으면 웜업 자체가 부담이 되기 때문입니다. 논문의 태도는 웜업을 무거운 사전 학습처럼 다루지 않고 가볍게 몇 번 돌려보는 정도로 쓰는 것입니다. 물론 웜업 분포가 뒤따르는 대량 생성과 어긋나면 선택이 빗나갈 수 있습니다. 프롬프트 분포가 바뀌거나 reward 정의가 바뀌면 스케줄도 다시 봐야 한다는 뜻이죠. 그럼에도 발상 자체는 실용적입니다. 모델 가중치를 건드리지 않고, 뽑아보는 과정에서 얻은 정보만으로 스케줄을 정하기 때문입니다.

동적 프로그래밍은 여기서 무슨 일을 할까
스텝별 중요도가 손에 들어왔다면 남은 일은 예산 안에서 조합을 고르는 일입니다. VISTA는 이 대리 목표를 동적 프로그래밍으로 정확히(exactly) 최적화합니다. 탐욕적으로 하나씩 고르는 방식과 달리, 동적 프로그래밍은 주어진 대리 목표 아래에서는 전역 최적의 부분집합을 찾아줍니다. 저는 이 선택이 마음에 들었습니다. 어차피 대리 목표 자체가 근사라면, 그 위에서의 최적화만큼은 정확히 해서 불확실성을 한 곳에 모아두는 편이 해석하기 쉽기 때문입니다.
실제로 머릿속으로 따라가 보면 흐름이 단순합니다. 각 스텝을 가이던스 켜짐과 꺼짐으로 표시하고, 예산을 다 쓰기 전까지 이탈 상한을 가장 많이 줄이는 조합을 표를 채우듯 찾아갑니다. 예산이 하나 늘어날 때마다 어디에 추가하는 것이 좋은지도 자연스럽게 드러나는데요. 이 과정은 모델을 다시 돌릴 필요가 없어서 계산 부담이 크지 않습니다. 다만 여기서 정확하다는 말은 대리 목표에 한정된 정확함이라는 점을 잊으면 안 됩니다. 진짜 전체 경로와의 차이가 아니라, 웜업 통계로 만든 상한 안에서의 정확함이니까요. 그래서 다음 질문이 바로 생깁니다. 이 상한 기반 선택이 실제 생성에서도 통할까요. 뒤에 나오는 수치가 그 답을 대신 말해줍니다.

웜업 샘플을 버리지 않아도 되는 이유는 무엇일까
운영 관점에서 보면 이 대목이 꽤 반갑습니다. 웜업 생성은 스케줄을 고르기 위해 뽑은 결과물이지만, 그대로 모델 출력으로 간직할 수 있기 때문입니다. 스케줄 선택이라는 준비 운동을 했다고 해서 그 산출물을 버릴 필요가 없다는 뜻이죠. 실험실에서는 몇 개 샘플이 아깝지 않아 보일 수 있지만, 실제로 유료 GPU 시간으로 돌리면 버려지는 샘플 하나하나가 비용입니다. 저는 그래서 이 설계를 연구실 점수 이상으로 평가했습니다. 낭비를 줄이는 장치는 현장에서 오래 살아남기 때문입니다.
그리고 스케줄이 정해진 뒤의 이야기도 분명합니다. VISTA는 선택이 끝난 뒤에는 같은 예산의 다른 성긴 스케줄과 생성당 가이던스 복잡도가 같습니다. 가령 예산이 열 개라면, 어떤 열 개를 골랐든 생성할 때 드는 가이던스 계산량은 같다는 뜻입니다. 차이가 있다면 어느 열 개를 골랐느냐뿐이죠. 저희가 새로운 AI 아키텍처를 볼 때도 benchmark 숫자만 보지는 않습니다. 실제로 무엇이 바뀌었고, 그 변화가 시스템에서 어떤 비용 구조를 만드는지를 함께 봅니다. 이런 기준으로 보면 VISTA의 매력은 생성 시점의 추가 부담 없이 선택의 질로 승부한다는 데 있습니다. 물론 웜업 자체의 일회성 비용은 남습니다. 다만 한 번 고른 스케줄을 같은 분포의 대량 생성에 반복해 쓸 수 있다면, 그 일회성 비용은 금방 옅어집니다.

태스크마다 스케줄이 달라진다는 것은 무슨 뜻일까
논문이 텍스트와 생물 서열과 이미지 생성에 걸쳐 실험했다는 점은 가볍게 넘길 일이 아닙니다. 보통 이런 가속 기법은 특정 모달리티에서만 잘 되고 다른 곳에서는 시들해지기 때문입니다. 그런데 VISTA는 태스크에 따라 다른 스케줄을 찾아내고, 대부분의 테스트 설정에서 손으로 설계한 성긴 스케줄보다 좋은 결과를 냈다고 합니다. 여기서 대부분이라는 표현을 주의해서 읽을 필요가 있습니다. 모든 경우에 이긴다는 뜻이 아니라, 시도한 범위 안에서는 손으로 짠 방식보다 나은 경우가 많았다는 뜻이니까요.
그렇다면 태스크마다 스케줄이 달라진다는 것은 무슨 뜻일까요. 제 해석은 이렇습니다. 어느 스텝이 결정적인지는 데이터의 결이 정한다는 것입니다. 문장 생성에서는 앞부분의 방향 잡기가 클 수 있고, 서열 설계에서는 중간 어딘가의 선택이 갈림길이 될 수 있으며, 이미지에서는 coarse한 구조가 잡히는 구간과 디테일이 붙는 구간의 역할이 다를 수 있습니다. 균등 간격처럼 태스크를 모르는 스케줄은 이런 결을 무시할 수밖에 없습니다. 반면 값 통계를 보고 고르면 결이 다른 태스크에는 다른 답을 내놓게 되죠. (괄호를 열고 덧붙이자면, 저도 예전에는 균등 간격이 꽤 강한 기준선이라고 생각했는데, 이 결과를 보고 생각이 바뀌었습니다. 결이 다르면 정답도 달라야 하니까요.)

204초가 38초가 되면 실제로 무엇이 달라질까
이제 숫자를 보겠습니다. 독성 텍스트(toxic-text) 생성에서 VISTA는 고유 독성 비율(unique-toxic ratio) 0.99를 기록했는데, 전체 가이던스의 1.00과 거의 같은 수준입니다. 같은 조건에서 지연 시간은 204.23초에서 38.16초로 줄었고, 이를 나누면 약 5.35배의 속도 향상이 됩니다. 숫자를 문장 안에 다시 풀면, 품질 지표는 1.00에서 0.99로 0.01만 내려앉았는데 시간은 다섯 배 이상 짧아졌다는 뜻이죠. 체감으로 말하면 점심시간에 돌리던 작업이 커피 한 잔 마시는 사이에 끝나는 정도의 차이입니다.
저는 이 숫자보다 그 뒤의 구조가 더 중요하다고 봅니다. 0.99라는 값 자체가 모든 유해성 평가에서 통용되는 절대 점수는 아니기 때문입니다. 고유 독성 비율은 특정 측정 방식 아래에서의 결과이고, reward 정의가 바뀌면 숫자도 함께 움직입니다. 그럼에도 이 실험이 주는 메시지는 분명합니다. 잘 고른 성긴 개입만으로 전체 개입의 궤적을 거의 따라갈 수 있다는 것이죠. 다만 지연 시간 204초와 38초는 특정 하드웨어와 배치와 구현에서의 측정입니다. 다른 환경에서는 배율이 달라질 수 있으니, 5.35라는 숫자를 모든 곳에 붙여 쓰는 것은 조심해야 합니다. 그 조건을 감안하더라도, 품질은 거의 그대로 두고 시간을 몇 분의 일로 줄였다는 방향은 분명해 보입니다.
손으로 짠 스케줄과 무엇이 달랐을까
여기서는 조금 조심해서 읽을 필요가 있습니다. 손으로 짠 스케줄이 나쁘다는 이야기가 아니라, 손으로 짤 때는 보지 못했던 정보를 VISTA는 본다는 이야기이기 때문입니다. 사람이 스케줄을 짤 때는 보통 앞쪽에 몰아주거나 뒤쪽에 몰아주거나 균등하게 나누는 식으로 시작합니다. 합리적인 출발이지만, 값의 움직임이 실제로 어디에서 컸는지는 모른 채 정하는 것이죠. VISTA는 웜업에서 그 움직임을 직접 재고, 이탈 상한을 줄이는 쪽으로 예산을 배분합니다. 그래서 같은 열 개의 예산이라도 쓰는 위치가 달라지고, 그 위치 차이가 결과 차이로 이어집니다.
실제 시스템 관점에서 보면 다음 질문이 바로 생깁니다. 이 선택을 얼마나 자주 다시 해야 할까요. 분포가 고정된 대량 생성이라면 한 번 고르고 오래 쓰면 됩니다. 반면 프롬프트 경향이 바뀌거나 reward 함수가 바뀌거나 모델 버전이 바뀌면 값의 풍경도 바뀌니 스케줄을 다시 봐야 합니다. 이 점은 단점이라기보다 성격에 가깝습니다. 적응형 방법치고 다시 보지 않아도 되는 방법은 없기 때문입니다. 저는 앞으로 보고 싶은 것이 바로 이 지점입니다. 스케줄의 수명이 얼마나 되는지, 분포가 조금만 바뀌어도 선택이 크게 흔들리는지, 아니면 꽤 오래 버티는지가 현장 도입의 관건이 될 것 같습니다.
그래서 다음에 보면 좋을 질문은 무엇일까
앞에서 미뤄뒀던 질문으로 돌아올 차례입니다. 상한을 줄이는 것과 실제 품질을 올리는 것은 같은 일일까요. 논문의 실험은 그 둘이 대체로 같은 방향으로 움직인다는 쪽에 손을 들어줍니다. 하지만 상한은 어디까지나 상한이라서, 상한이 느슨한 구간에서는 선택이 빗나갈 여지가 남습니다. 상한이 얼마나 타이트한지, 예산이 아주 작거나 아주 클 때 선택이 어떻게 달라지는지는 더 들여다볼 여지가 있습니다. 예산이 극단적으로 작아지면 어디를 포기할지 정하는 문제가 되고, 예산이 넉넉해지면 어디를 더해도 이득이 별로 없는 구간이 드러날 테니까요.
그렇다면 사람의 역할은 무엇일까요. 스케줄을 자동으로 고르는 시대일수록 무엇을 재고 무엇을 예산으로 묶을지 정하는 일이 더 중요해질 것 같습니다. reward를 어떻게 정의할지, 웜업을 어떤 분포에서 뽑을지, 지연 시간과 품질을 어떤 기준으로 교환할지는 여전히 사람의 결정이기 때문입니다. VISTA는 그 결정을 대신하지 않고, 결정이 내려진 뒤에 예산을 가장 아깝지 않게 쓰는 법을 알려줍니다. 매번 개입하지 않아도 된다는 것을 값의 기록으로 보여준 셈이죠. 다음에 비슷한 가속 논문을 볼 때 저는 같은 질문을 들고 갈 것 같습니다. 어디를 건너뛰었는지보다, 건너뛰어도 되는 근거를 무엇으로 삼았는지를 먼저 보는 것입니다.