옵션 |
|
오랜만에 놀러왔다가 이런 게시판이 있었지 재밌어서 또 적는 글. 장문주의. 수학주의.
시간에 대한 미분방정식 (ordinary differential equation, ODE)
의 의미는 사실 적분꼴로만 정의됩니다. 일반적으로 t=0 에서 출발한다고 치면,
이렇게 표현이 되지요. 그런데 이러한 정적분은 t가 0보다 작더라도 잘 정의되며, 또한 꼭 0에서 출발할 필요도 없습니다. 예를들어서
이렇게 쓸 수도 있지요. 우리는 이것을 x(T) 에서 출발해서, 시간을 거꾸로 돌려서 t까지 돌아간 것이라고 이해할 수 있습니다.
그런데 여기에 약간의 랜덤성을 가미하면 어떻게 될까요? 주식차트처럼 말이죠. 랜덤 노이즈(Brownian motion) 항을 포함한 미분방정식을 확률미분방정식, 영어로 stochastic differential equation (SDE) 라고 합니다.
이렇게 표현합니다. 잘 보면 왠지 양변을 dt로 나눠주고 싶어지는데, 그러면 처음 ODE에 dW 라는 항이 추가된 꼴입니다.
물론 이렇게 표현할 수도 있긴 합니다만, W(t) 가 Brownian motion 일 경우 미분불가능하죠 그래서 SDE 역시 적분꼴로 이해해야 합니다.
새로 추가된 항은 Ito stochastic integral 인데 자세한 이해는 넘어가기로 하고, 중요한 것은 이걸 써먹으려면 x(t)는 미래를 보고와선 안됩니다. 오직 과거의 정보만을 가지고 있어야 하지요.
그러다보니 SDE 는 ODE처럼 시간을 거꾸로 돌리기가 매우 곤란해집니다.
이렇게 써버리면 x(t) 가 미래 (t부터 T까지) 를 보고와버리거든요. 자칫하면 시공간의 모든 질서가 무너져버리게 됩니다!!
이를 해결하고 SDE 모델의 시간을 거꾸로 돌리는 방법에는 2가지가 있습니다. 하나는 BSDE 라고 하는 방법인데 생략하고, 다른 하나가 이 글에서 소개할 time-reversal 이라는 개념입니다. 아주 단순한 SDE 하나를 봅시다:
f(x) = -bx 이고 시그마는 그냥 상수인 경우입니다. 이 확률과정을 Ornstein-Uhlenbeck process, 줄여서 오-유 프로세스 라고 합니다. 앗 이 사이트의 이름이.. 암튼 이때 X(t) 의 확률밀도함수를 p_t 라 합시다.
이제 새로운 프로세스 Y를 Y(t) = X(T-t) 로 정의합시다. 이 말인즉슨, Y(0) = X(T) 에서 출발해서 Y(T) = X(0) 까지 시간을 돌려 거꾸로 쫒아가겠다는 거죠. 이 Y는 다음과 같은 식을 따라간다는 것이 알려져있습니다:
여기서 dW를 time-reversal of Brownian motion이라고 합니다. W(T)-W(T-t)에 해당하는데, 이녀석의 확률분포는 Brownian motion과 똑같습니다. 즉 X(T) 가 주어진 상태에서, 시간을 거슬러올라가 X(t)의 샘플을 얻으려면 그냥 W를 보통의 B.M. 이라고 생각하고 역방향으로 돌릴 수 있습니다.
이 오-유 프로세스는 아주 유용한 특징을 가지고 있습니다. T가 충분히 크고 적당한 가정을 하면 p_0에 관계없이 p_T 는 정규분포로 수렴합니다. 정규분포? 우리가 가장 잘 이해하고 있는 확률분포인데다가 샘플링하기도 쉽죠. 그렇다면 이런 논리를 생각해볼 수 있습니다.
1. 우리는 p_0 에서 샘플을 하나 뽑고싶다.
2. 그런데 p_0 는 뭔지 잘 모르겠지만 p_T는 정규분포에 매우 가깝다.
3. 정규분포에서 Y(0) 를 뽑은다음, 역방향으로 돌리면 Y(T) 는 (유사) p_0 에서 뽑은 샘플이다!
오 괜찮군요! 그런데 Y를 굴리려고보니 ∇log(p_(T-t)) 라는 함수가 우릴 가로막습니다. 어.. 이건 어떻게 하죠 선생님? 이럴 땐 데이터가 필요합니다. 상황을 이렇게 수정합시다.
1. 우리는 p_0 에서 뽑은 샘플이 잔뜩 있는데, 하나 더 뽑고 싶다. 그런데 지금 있는 샘플중에 하나 고르긴 싫다.
2. 샘플들을 X(0) 에 넣고 정방향으로 잔뜩 돌린다.
3. 돌린 데이터를 사용하여 ∇log(p_(T-t)) 를 근사한다.
4. 정규분포에서 Y(0) 를 뽑은다음, 역방향으로 돌리면 Y(T) 는 p_0 에서 뽑은 샘플이지만, 기존 샘플이랑은 다른 녀석이다!
최근에는 다른 방식들이 또 등장하고 있습니다만, 이것이 기본적으로 AI야 동탄해줘(?) 의 기본적인 원리가 됩니다. 수많은 그래픽 데이터는 사실 각 픽셀에 RGB 값이 저장된 숫자 벡터입니다. 우리가 만약에 대충 아무 숫자나 들어간 벡터 하나를 뽑아서 그림으로 출력하면 99.999% 는 그냥 이상한 노이즈처럼 보일거에요.
"말이 되는 그림" 에 해당하는 벡터는 극소수일겁니다. 위의 모델을 이용하면 수많은 그림들을 넣고 "정방향" 으로 돌리면서 그림을 노이즈로 만들어버리고, 그 데이터를 사용하여 역방향 dynamics 를 학습하죠. 그리고 거꾸로 아무 노이즈에서나 출발해서 "역방향" 을 돌리면 그림이 하나 튀어나오는 겁니다.
몇 년 전엔 GAN 이라는 모델이 핫했지요. 딥페이크 영상이란게 화제가 되기 시작했을 때인데, 위의 방법 (정방향-노이즈로 만들며 역방향 학습-역방향으로 샘플 생성)이 등장하고 싹 들어가 버렸습니다. 이 방식을 Score generative model 혹은 diffusion model 이라고 부릅니다. 다만 요새의 트렌드는 또 다른 방식을 쓴다고 하네요.