생성을 위한 파괴: Diffusion Model
최근 다양한 분야에서 AI 기술이 무서울 정도로 빨리 발전하고 있습니다. 이미 특정한 물체의 위치나 분류를 파악하는 Detection/Classification은 인간의 수준을 뛰어 넘은지 오래되었고 사람과 같은 동일한 분류의 다른 신원을 구별해주는 Recognition 또한 굉장히 발전했습니다. 이미 너무나도 성능과 속도가 발전해 버렸기 때문에 관심사는 다른 쪽으로 옮겨지게 되었는데요, 바로 생성 모델입니다. 생성 모델은 기초 이미지들을 바탕으로 이전에 없었던 새로운 이미지나 텍스트 등을 생성합니다.
생성 모델은 크게 GAN(Generative Adverserial Network) 과 Diffusion 모델로 분류될 수 있습니다. GAN은 이미지를 생성하는 모델과 생성된 이미지가 실제 이미지인지 판별하는 모델 두 개가 서로 경쟁을 반복하며 전자의 모델이 더욱 실제 같은 이미지를 생성해 내게 하는 원리인데요, 반면 Diffusion은 GAN과는 전혀 다른 방식으로 새로운 이미지를 생성해 냅니다. 이미 두 생성 모델 빠른 속도로 발전하여 성능과 효율이 모두 좋아졌지만, 본 글에서는 Diffusion의 기초적인 컨셉을 소개하고자 합니다.
“Diffusion”을 직역하면 “확산”이라는 뜻을 가지고 있는데요, 주로 향수와 같은 공기 입자들이 퍼지는 현상을 표현할 때 사용합니다. AI 생성 모델과 전혀 관련 없어 보이는 이 단어가 어떠한 연관성이 있을까요?
공기 중에 입자들이 퍼지는 현상과 모델에서 이미지가 학습을 위해 노이즈가 더해지는 현상이 유사해 보이기 때문에 Diffusion이라는 이름이 붙여졌습니다.
공기 중의 입자는 시간이 지나면 지날수록 전체적으로 골고루 퍼지는데요. 예를 들어, 방안에 향수를 뿌리면 처음에는 향수 입구 부분에 향수 입자들이 모여 있겠지만, 시간이 지나면서 방 전체적으로 향수들이 퍼지게 됩니다. 이가 의미하는 것은 방안 어디에서 향수를 뿌려도 결국 시간이 지나면 방 전체에 향수 입자들이 골고루 퍼진다는 것 입니다. 그렇기 때문에 이미 시간이 지나 퍼진 향수들의 입자들 만으로는 이 입자들의 출처를 알아내기 힘듭니다.
그러나 이를 시간별로 천천히 바라보면 어떨까요? 예를 들어 향수를 뿌린 직후의 입자들의 위치를 기억한 뒤 그 다음 1분 뒤, 10분 뒤 입자들의 위치 변화 등등.. 이런 식으로 시작 위치가 같은 향수 입자들의 움직임을 기록하는 것을 여러 번의 실험을 반복하여 기록해 놓는 것입니다. 모아진 기록들을 종합하여 정리하여 보면, 처음 향수가 뿌려진 위치를 유추해 낼 수 있겠죠.
이를 Diffusion model에 적용하여 생각해 보면, 향수 입자의 초기 위치를 생성하고 싶은 이미지 종류, 입자들의 움직임을 이미지에 적용된 노이즈라고 생각하시면 됩니다. 대신 향수는 자동적으로 입자들이 확산되는 것과 달리 Diffusion 모델에서는 고의로 이미지에게 여러 번의 일정한 노이즈를 부여해 알 수 없는 형태로 만들어 냅니다. 그 뒤 향수에서 시간에 따른 입자들의 움직임을 기록했던 것처럼 이미지에 노이즈들이 적용 될 때마다 변화하는 과정을 기록한 뒤 다시 되돌리는 과정을 모델에 학습시킵니다. 그렇게 되면 모델은 노이즈가 많이 적용된 이미지로부터 사람이 식별 가능한 정도의 이미지까지 변환 시킬 수 있게 되는 것 입니다.
예를 들어, 다양한 종류의 고양이 이미지에서 노이즈가 수없이 적용되어 형태를 알아볼 수 없는 이미지로 변환시키고 해당 과정으로 거꾸로 돌려 노이즈 이미지에서 고양이 이미지로 돌리는 과정을 모델이 학습하게 합니다. 많은 양의 데이터로 충분히 학습이 된 모델은 이제 노이즈 이미지만으로도 현실과 같은 고양이 이미지를 생성할수있는것이죠.
Diffusion 모델은 다른 딥러닝 모델들과 달리 추가적인 수식이 꽤 있는데요. 이 중 필수적인 개념들만 정리하여 설명하도록 하겠습니다.
먼저 이미지에 노이지를 주는 수식입니다. 이를 Foward process라고 칭하며 위에서도 언급했듯이 기존 이미지에 노이즈를 넣어야 하는데요. 이때 우리는 원본 이미지 x_0 의 픽셀들의 분포를 아래와 같이 정의한 뒤 T만큼의 step 동안 조금씩 노이즈를 추가합니다. 이를 각각 아래와 같이 나타내 보겠습니다. 노이즈를 더하면서 바뀌는 이미지는 x_t 라고 정의합니다.
이때 노이즈는 항상 동일하게 Gaussian Noise를 적용하는데 variance를 step size에 따라서 천천히 증가시킬 것입니다. 따라서 variance scheduler를 정의한 뒤, 0 부터 1까지 증가하는 variance $\beta$를 통해 이미지에게 노이즈를 부여하겠습니다. 예를 들어 T= 1000, 즉 1000번의 step 동안 noise를 적용시킨다고 할 때, variance를 일정하게 증가시킨다면 variance scheduler는 다음과 같습니다.
이를 정리하면 t-1 에서 t 로 진행되는 foward processs는 아래의 식과 같습니다.
이때 random noise (epsilon)은 다음과 같이 적용됩니다.
Forward process는 결국 기존 이미지에 대부분의 양은 유지하며, 루트베타 값 만큼은 random noise (epsilon)가 적용되어 더해진다고 생각하시면 됩니다. 따라서 원본 이미지로부터 첫 번째 노이즈를 부여하는 식(t=0 → t=1) 은 아래와 같습니다.
결국 이 과정을 T(1000)번 반복한 최종 식은 아래와 같습니다.
원래라면 이전 step에서 다음 step에 노이즈를 부여하는 계산을 1,000번 해야 하는 것인데 이렇게 되면 학습 이미지 한 장마다 굉장한 시간이 소요될 텐데요, Gaussian의 더해지는 성질을 이용하여 수식을 간단히 바꿔버리면 1,000번의 계산을 한번에 계산할 수 있습니다.
위와 같이 alpha 를 정의하게 되면, 임의 time = T에 대해서 다음과 같이 정리됩니다.
이렇게 하나의 식으로 정리가 가능합니다. 따라서 원하는 step (1 ~ T)까지의 alpha의 값을 아래와 같이 미리 저장한다면,
원하는 time step까지의 cumulative product of alpha 를 구하면 한번의 계산으로도 그 step의 noise와 image를 알 수 있게 됩니다.
위의 방법을 통해 이제 순간의 step 마다 단일 수식만으로 noise화된 이미지를 알 수 있게 되었습니다. 이제 노이즈 이미지로부터 일반 이미지까지 생성하는 과정은 딥러닝 모델을 통해 학습하게 됩니다. 현재는 변형된 많은 다른 모델들이 사용되지만, Diffusion이 개발된 초기 단계에서는 주로 U-Net을 사용하였습니다. U-Net은 이름 그대로 U자 형태를 띈 input과 output 사이에 큰 step 사이에 skip connection을 적용시켜 low resolution부터 high resolution까지 여러 구간에서 학습하기 좋은 모델입니다.
이때 input은 t timestep의 노이즈 이미지, output은 t-1의 노이즈라고 생각하시면 됩니다. 또한 **step (1 ~ T)**의 모든 구간에서 모든 parameter들이 공유되기 때문에 현재 학습하는 데이터가 전체적인 time의 어디쯤인지 모델에게 알려주어야 합니다. 이때 사용되는 것이 positional embedding인데, 순서를 고려해야 하는 데이터들을 학습 시킬 때, time step값을 모델에게 전달해 현재 데이터가 전체의 흐름에 어느 구간에 있다라는 내용을 포함하여 학습시키게 하는 것입니다. 따라서 같은 모델 전체적으로 동일한 parameter를 공유하더라도 모델이 구간별로 차별성을 두고 학습을 할 수 있습니다.
동일한 클래스의 대량의 데이터와 여러 가지 time step에 대해 노이즈를 제거하는 학습을 진행하게 되면 위와 같이 학습된 데이터에 따라 noise로부터 사실과 같은 이미지를 생성할 수 있게 합니다.
Diffusion model 자체에는 다른 모델들과 달리 여러 가지 수학 개념을 많이 필요로 합니다. 본 글에서는 어려움을 최소화시키기 위해 Diffusion 모델이 어떻게 새로운 이미지를 생성하는지에 대한 기초적인 내용만 포함하고 있습니다. 설명하지 않은 Loss 와 optimization, Diffusion 모델에 대한 자세한 부분은 Markov-Chain 이나 KL-divergence을 검토하시고 하기 참조한 paper를 읽어보시기를 추천 드립니다.
오늘날 생성 모델들의 퀄리티와 효율이 무서운 속도로 발전하고 있으며, 최신 모델들은 경이로운 수준의 이미지를 생성하고 있습니다. 인간의 창작 영역을 상회하며, 인간이 생성해낸 이미지와 구별하기 어려운 상황입니다. 이러한 기술의 발전이 긍정적인 영향만 끼쳤으면 좋겠지만, 이로 인해 페이스피싱이나 얼굴 관련 보안 해킹 등 많은 부정적인 영향까지 끼치고 있다는 점이 참 안타까운 일입니다. 이러한 문제들이 잘 해결되길 바라며 이상 글을 마치겠습니다.
Papers
(1) Ho, Jonathan, Ajay Jain, and Pieter Abbeel. "Denoising diffusion probabilistic models." Advances in neural information processing systems 33 (2020): 6840-6851.
(2) Austin, Jacob, et al. "Structured denoising diffusion models in discrete state-spaces." Advances in Neural Information Processing Systems 34 (2021): 17981-17993.
(3) Ronneberger, Olaf, Philipp Fischer, and Thomas Brox. "U-net: Convolutional networks for biomedical image segmentation." Medical Image Computing and Computer-Assisted Intervention–MICCAI 2015: 18th International Conference, Munich, Germany, October 5-9, 2015, Proceedings, Part III 18. Springer International Publishing, 2015.
Images
https://developer.nvidia.com/blog/improving-diffusion-models-as-an-alternative-to-gans-part-1/
https://blog.openart.ai/2023/02/13/the-most-complete-guide-to-stable-diffusion-parameters/