22. 영상 생성 모델의 학습 — 시퀀스와 디퓨전 사이에서 무엇을 "강제"하는가

노출 편향: 정답 과거로만 배우면 생기는 일

자기회귀 모델은 어떻게 학습할까? 가장 쉬운 방법은 학습 영상의 앞 프레임들을 그대로 넣어 주고 다음 프레임을 맞히게 하는 것이다. 과거는 늘 정답이다. 그런데 영상을 만들 때는 정답 과거가 없다. 모델은 자기가 방금 만든, 조금씩 틀린 프레임을 딛고 다음 프레임을 만들어야 한다. 학습 때 한 번도 보지 못한 입력이다.

아래 그림에서 공은 프레임마다 오른쪽으로 일정하게 움직인다. 학습 때 모델이 받는 과거와 영상을 만들 때 받는 과거를 위아래로 놓았다.

학습 때 (티처 포싱) 정답 프레임 모델 다음 프레임을 맞힌다 영상을 만들 때 모델이 만든 프레임 모델 처음 보는 과거 위에서 점선 원 = 정답 자리. 모델이 만든 과거는 조금씩 어긋나 있다
역사: 티처 포싱에서 노출 편향까지

정답 과거를 넣어 다음을 맞히게 하는 티처 포싱(teacher forcing — 학습 때 과거를 모델의 출력이 아니라 정답에서 가져오는 방식)은 학습이 빠르고 안정적이어서 순환 신경망 시절부터 시퀀스 모델의 표준 학습법이 되었다.

문제를 정면으로 겨냥한 것은 2015년이다. 새미 벤지오(Samy Bengio) 등 구글 연구진은 스케줄드 샘플링(scheduled sampling, NIPS 2015)에서 학습 초반에는 정답 과거를, 후반으로 갈수록 모델이 직접 만든 과거를 더 자주 넣는 커리큘럼을 제안했고, 이 방법을 쓴 모델이 MSCOCO 2015 이미지 캡션 대회에서 우승했다. 같은 해 마크아우렐리오 란차토(Marc’Aurelio Ranzato) 등은 이 불일치에 노출 편향(exposure bias — 모델이 학습 데이터의 분포에만 노출되고 자기 예측에는 노출되지 않아서 생기는 편향)이라는 이름을 붙이고(MIXER, ICLR 2016), 모델이 스스로 만든 문장 전체에 BLEU 점수(만든 문장이 정답 문장과 몇 낱말 묶음을 함께 갖는지 세는 점수)를 매겨 REINFORCE(정책 그래디언트)로 학습했다. 노출 편향과 강화학습이 처음 만난 자리다. 2016년 알렉스 램(Alex Lamb) 등의 프로페서 포싱(professor forcing, NIPS 2016)은 판별기를 두어 정답 과거로 돌 때와 자기 과거로 돌 때 신경망 내부의 움직임이 구별되지 않게 만들었다.

장난감 예제: 어긋남이 쌓이는 속도

프레임을 하나 만들 때마다 정답에서 작은 오차 e0\textcolor{#206049}{e_0}만큼 어긋난다고 하자. 앞 프레임까지 쌓인 어긋남 dn\textcolor{#993600}{d_n}은 다음 프레임에 그대로 넘어가지 않는다. 모델이 어긋난 입력을 어떻게 다루느냐에 따라 g\textcolor{#cc00ff}{g}배가 되어 넘어간다.

dn+1=g dn+e0⟹dn=e0 g n−1g−1 \textcolor{#993600}{d_{n+1}} = \textcolor{#cc00ff}{g}\,\textcolor{#993600}{d_n} + \textcolor{#206049}{e_0} \quad\Longrightarrow\quad \textcolor{#993600}{d_n} = \textcolor{#206049}{e_0}\,\frac{\textcolor{#cc00ff}{g}^{\,n} - 1}{\textcolor{#cc00ff}{g} - 1}
dnn번째 프레임까지 쌓인 어긋남 (d0=0)e0프레임 하나를 만들 때 새로 생기는 오차g어긋난 과거를 받았을 때 어긋남이 넘어가는 배율 \small\begin{array}{ll} \textcolor{#993600}{d_n} & n\text{번째 프레임까지 쌓인 어긋남 } (\textcolor{#993600}{d_0} = 0) \\ \textcolor{#206049}{e_0} & \text{프레임 하나를 만들 때 새로 생기는 오차} \\ \textcolor{#cc00ff}{g} & \text{어긋난 과거를 받았을 때 어긋남이 넘어가는 배율} \end{array}

티처 포싱으로 배운 모델은 어긋난 과거를 본 적이 없다. 처음 보는 입력에서는 원래 오차에 더해 엉뚱한 반응까지 얹으므로 g>1\textcolor{#cc00ff}{g} > 1이 되기 쉽다. e0=0.02\textcolor{#206049}{e_0} = 0.02, g=1.15\textcolor{#cc00ff}{g} = 1.15이면 10번째 프레임에서 d10≈0.41\textcolor{#993600}{d_{10}} \approx 0.41이다. 오차를 그냥 더하기만 했다면(g=1\textcolor{#cc00ff}{g}=1) 10번째에 0.20.2였을 것이다. 반대로 자기 과거 위에서 배운 모델은 어긋난 입력에서 제자리로 돌아오는 법을 배웠으므로 g<1\textcolor{#cc00ff}{g} < 1이다. 이때 어긋남은 한없이 불어나지 않고 한 값에 머문다.

아래 그림은 한 프레임 오차를 e0=0.02\textcolor{#206049}{e_0} = 0.02로 같게 두고 g\textcolor{#cc00ff}{g}만 바꿔 10번째 프레임까지 그린 것이다.

0 2 4 6 8 10 0.0 0.1 0.2 0.3 0.4 프레임 번호 n 쌓인 어긋남 d g = 1.15 · 0.41 g = 1 · 0.20 g = 0.9 · 0.13 한 프레임 오차 e₀ = 0.02

이렇게 프레임을 이어 갈수록 어긋남이 불어나는 것을 오류 누적(error accumulation, 영상 논문에서는 drift라고도 부른다)이라 한다. 처음 몇 초는 멀쩡하던 영상이 점점 색이 바래거나, 과하게 선명해지거나, 인물이 뭉개지는 것이다.

ML에서: 영상에서는 왜 더 심한가

언어모델에서 노출 편향이 그럭저럭 견딜 만했던 데는 까닭이 있다. 토큰은 몇만 개 중 하나를 고르는 이산값이라, 조금 틀려도 다음 입력은 여전히 「있을 법한 토큰 하나」다. 영상 프레임은 연속값이다. 작은 오차가 그대로 다음 입력에 섞이고, 프레임 수는 초당 십여 장이라 1분이면 수백 단계가 쌓인다. 자기회귀 영상 모델이 짧은 영상에서는 전체 시퀀스 모델에 버금가다가 길어지면 무너지는 까닭이 여기 있다.

문제 2 — 늘 바로잡힌 자리에서 출발한 연수

운전 연수 내내 강사가 보조 브레이크와 보조 핸들로 차를 차선 한가운데로 돌려놓은 뒤에야 학생에게 핸들을 맡겼다. (가) 학생이 연습한 장면은 모두 어떤 자리에서 시작했는가? 혼자 운전하는 첫날, 학생이 처음 겪게 되는 상황은 무엇인가? (나) 연수 기록에는 「핸들을 맡긴 뒤 3초 동안 차선을 지킨 비율 99%」라고 적혀 있다. 이 숫자가 혼자 운전하는 실력을 말해 주는가?

김민준 (평상)
김민준
(가)는 늘 차선 한가운데요. 그런데 혼자 운전해도 처음엔 차선 한가운데서 출발하잖아요. 똑같은 거 아니에요?
선생님 (질문)
선생님
혼자 운전한 지 10초 뒤, 차는 어디에 있죠?
김민준 (당황)
김민준
아… 제가 조금씩 틀어 놓은 자리요. 강사님이 바로잡아 주지 않으니까 다음 순간은 제 실수 위에서 시작하네요. 차가 한쪽으로 치우친 채 핸들을 잡는 건 연수 때 한 번도 없었어요.
이서연 (평상)
이서연
(나)는 99%가 어떤 출발점들에서 잰 비율인지 봐야 해. 출발점이 전부 차선 한가운데면, 그건 「한가운데서 3초 버티기」 성공률이지.
선생님 (평상)
선생님
그래요. 그럼 혼자 운전할 때의 출발점들은 어떻게 생겼을까요?
이서연 (깨달음)
이서연
앞 3초 동안 제가 만든 자리들이요. 한가운데가 아닌 출발점이 섞이는데, 그런 자리에서의 성공률은 기록에 한 번도 잡힌 적이 없어요. 99%는 연수 때의 출발점에서만 맞는 숫자예요.
김민준 (평상)
김민준
조교님이 매번 첫 줄을 고쳐 준 코드로만 채점받은 셈이네요. 혼자 짜면 첫 줄이 틀린 채로 그다음 줄을 짜야 하는데요.

정리 (가) 늘 바로잡힌 자리(차선 한가운데)에서 시작했다. 혼자 운전하면 다음 순간은 자기가 조금 틀어 놓은 자리에서 시작하므로, 연수 때 한 번도 없던 출발점을 만난다. (나) 아니다. 99%는 바로잡힌 출발점에서만 잰 비율이다. 혼자 운전할 때의 출발점은 자기 실수가 만든 자리들이고, 그 자리에서의 실력은 잰 적이 없다.

문제 3 — 20번째 프레임의 어긋남

프레임마다 오차 e0=0.02\textcolor{#206049}{e_0} = 0.02가 생긴다. (가) 티처 포싱으로 배운 모델(g=1.15\textcolor{#cc00ff}{g} = 1.15)의 20번째 프레임 어긋남 d20\textcolor{#993600}{d_{20}}을 구하시오. (나) 자기 과거로 배운 모델(g=0.9\textcolor{#cc00ff}{g} = 0.9)의 어긋남은 프레임이 한없이 길어지면 어디로 가는가? 풀었으면 이 절 위젯의 「문제 3 값 불러오기」로 맞춰 본다.

김민준 (자신만만)
김민준
0.02씩 스무 번이니까 0.4요.
선생님 (질문)
선생님
민준 학생, 그 계산은 g\textcolor{#cc00ff}{g}가 얼마일 때의 답이죠?
김민준 (당황)
김민준
1일 때요… 앞 프레임의 어긋남이 1.15배가 돼서 넘어가는 걸 뺐네요. 식대로 하면 0.02×(1.1520−1)/0.150.02 \times (1.15^{20} - 1)/0.15, 코드로 돌리면 2.0492.049예요. 다섯 배가 넘어요.
이서연 (평상)
이서연
(나)는 극한을 보면 돼. g=0.9\textcolor{#cc00ff}{g} = 0.9면 g n→0\textcolor{#cc00ff}{g}^{\,n} \to 0이니까 dn→e0/(1−g)=0.2\textcolor{#993600}{d_n} \to \textcolor{#206049}{e_0}/(1-\textcolor{#cc00ff}{g}) = 0.2.
선생님 (평상)
선생님
그래요. 두 모델의 한 프레임 오차 e0\textcolor{#206049}{e_0}는 같았어요. 달라진 건 어긋난 과거를 받았을 때의 반응 하나예요.
이서연 (깨달음)
이서연
등비급수가 수렴하느냐 발산하느냐가 공비 하나로 갈리는 거네요. 첫째 항은 같아도요.
김민준 (평상)
김민준
첫 주 과제에서 한 실수를 다음 과제가 그대로 가져다 쓰면, 학기 말엔 원래 실수보다 훨씬 커져 있는 거랑 같네요.

정리 (가) d20=0.02×(1.1520−1)/0.15≈2.05\textcolor{#993600}{d_{20}} = 0.02 \times (1.15^{20}-1)/0.15 \approx 2.05. 오차를 더하기만 한 0.40.4의 다섯 배가 넘는다. (나) g<1\textcolor{#cc00ff}{g} < 1이면 e0/(1−g)=0.2\textcolor{#206049}{e_0}/(1-\textcolor{#cc00ff}{g}) = 0.2로 수렴한다. 한 프레임의 오차보다 어긋난 과거에 대한 반응이 긴 영상의 운명을 정한다.

문제 4 — 스케줄드 샘플링이 섞는 것

스케줄드 샘플링은 학습 중 과거 입력의 일부를 모델이 만든 것으로 바꾼다. 그런데 맞혀야 하는 다음 프레임(목표)은 여전히 학습 데이터의 정답 xn\textcolor{#1c9c60}{x^{n}}이다. 이 방법으로 노출 편향이 완전히 풀리는가? 풀리지 않는다면 무엇이 어긋나는가?

김민준 (평상)
김민준
후반에는 과거를 전부 모델이 만든 걸로 넣잖아요. 그러면 생성할 때랑 똑같으니까 풀리죠.
이서연 (의심)
이서연
과거는 모델 것인데 정답은 데이터 거잖아. 모델이 3번째 프레임에서 사람을 조금 왼쪽에 그렸는데, 4번째 정답은 원래 자리에 있는 사람이야.
선생님 (질문)
선생님
그러면 모델은 그 쌍에서 무엇을 배우게 되죠?
이서연 (평상)
이서연
왼쪽에 그려진 과거를 받아도 원래 자리로 순간 이동시키라고요. 실제 영상이라면 사람이 그렇게 튀지 않죠. 되돌아오는 법을 배우긴 하는데, 부자연스럽게 되돌아오는 법이에요.
김민준 (아하)
김민준
과거와 목표가 서로 다른 영상에서 온 거네요. 입력만 생성할 때와 맞췄지, 입력과 목표의 짝은 안 맞았어요.
선생님 (평상)
선생님
그래요. 그래서 뒤의 방법들은 목표도 바꿔요. 정답 프레임 하나를 맞히는 대신, 모델이 만든 영상 전체가 진짜 영상처럼 보이는지를 따지죠.
김민준 (평상)
김민준
앞 문제를 틀리게 푼 풀이에 이어서 다음 문제의 모범답안을 붙여 놓고 채점하는 셈이네요.

정리 스케줄드 샘플링은 과거 입력을 생성할 때와 비슷하게 만들지만, 목표는 데이터의 정답 프레임이라서 입력(모델의 과거)과 목표(데이터의 미래)가 한 영상에서 나온 짝이 아니다. 노출 편향을 줄이긴 하지만 완전히 풀지는 못하고, 부자연스러운 되돌아오기를 가르칠 수 있다.