"A stylish woman walks down a Tokyo street filled with warm glowing neon and animated city ..."
.
.
.
"한 스타일리시한 여자가 따뜻하게 빛나는 네온으로 가득 찬 도쿄 거리를 걷는데, ..."
(원문 텍스트는 6개의 문장으로 이루어진 단락입니다.)
텍스트를 받아 이미지를 만들어주던 Stable Diffusion이 공개된지 아직 2년도 되지 않은 시점에, 이제 영상을 만들어주는 Sora가 등장했습니다.
본 포스트는 Sora 자체보다는, text-to-video 기술로서의 Sora를 소개하기 위한 많은 기술적 배경도 함께 담고 있습니다.
온전히 Sora에 대해서만 알고 싶으시다면 Sora 파트로 넘어가셔도 좋지만, OpenAI에서 직접적으로 공개한 정보는 매우 소량이므로 배경연구의 흐름을 이해하는 것이 큰 도움이 됩니다. 최대한 모두 읽어보시길 권장합니다!
그런데 이 포스트를 작성하는 사이에..
Stable Diffusion 3가 공개되었습니다. Sora보다도 공개된 정보가 없이 waitlist만 받겠다는 발표이지만, 연결고리가 있는 유의미한 사건이기에 함께 다뤄보려 합니다.
Stable Diffusion 3는 text-to-image로, Sora와 유사한 기술을 채택했지만 여전히 image에 적용하고 있다는 차이점만 있으므로 Sora를 중점으로 설명합니다.
AI의 발전이 정말 겁날 정도로 빠르지만, 그렇기에 그 거대한 파도를 타고 있다는 사실에 더욱 기쁠 수 있기도 한 것 같네요!
안녕하세요, Justin4AI입니다. 지난 VAE 포스트 이후로 곧바로 Diffusion Model의 원리에 대하여 작성하고 있었는데, 이를 잠시 중단하게 되었습니다.
애니메이션 제작 공부를 하고 있는 친구가 Sora 출시 직후 보낸 메세지입니다. 비전공자 친구로부터 이 얘기를 제일 처음 듣다니..
짧은 시간 사이에 AI가 대중들의 인식을 얼마나 바꿔놓았는지를 체감할 수 있어 기쁘기도 하면서, 한 편으론 참 무섭기도 했습니다.
OpenAI가 Sora에 대해서 공개한 유일한 자료인 technical report를 기반으로 작성되기 때문에, 아주 상세한 architecture를 다룰 수가 없습니다.
그러나, 단순히 tech report를 번역하는 것을 넘어 text-to-image 기술과 diffusion 관련 연구 배경을 끌어올 것이므로, 난이도가 조금 있을 수는 있습니다. 그래도 모두 deep dive를 할 준비가 되셨다고 믿고, 시작해보겠습니다.
비전공자 독자분들께서는, 1) Stable Diffusion(text-to-image)에서 Sora(text-to-video)로 transition이 일어나는 배경 및 과정, 2) Sora 구조의 큰 그림 3) 이 상황에서 Stable Diffusion 3의 등장의 의미 - 를 보시는 데에 집중하시길 추천드립니다!
사실 deep learning을 넘어서, diffusion model에 대한 이해까지 닿아있어야 Sora를 완벽히 이해할 수 있습니다.
그러나 Sora의 diffusion 부분은 정확하게 공개가 되진 않았으므로 걱정하지 않으셔도 됩니다. 다만 deep learning에 대해서는 잘 알고 있어야 text-to-video task를 이해할 수 있다고 보시면 됩니다.
만약 deep learning을 잘 모르신다면, 조금 가볍게 힘을 빼고 대략의 큰 그림만 이해하는 것을 목표로 읽으시길 추천드립니다!
영상은 이미지의 집합입니다. 따라서 text-to-image를 이해하지 못한다면, text-to-video를 이해할 수 없습니다.
본 포스트가 모든 방대한 submodules의 원리를 풀어 설명할 수는 없으므로, text-to-image를 제 Stable Diffusion의 원리 포스트의 내용을 표준으로 가정하고 작성하고자 합니다.
더불어, Stable Diffusion 3를 이해하시는 데에도 큰 도움이 됩니다.
미리 말씀드리자면, Sora는 diffusion transformer(!)입니다.
정확히는 NaViT와 ViViT를 사용할 것으로 생각되고, 이는 ViT(Vision Transformer)의 변형입니다. 따라서 ViT에 대하여 알고 계셔야 Sora의 원리를 이해할 수 있습니다.
혹시 몰라서 제가 녹화한 Transformer 설명이라는 영상을 유튜브에 올려두았으니, transformer 자체를 잘 모르시는 분들께 도움이 되길 바랍니다!
Gaussian noise를 점차 더해가는 forward process, 이 반대의 과정인 reverse process의 학습을 통해 noise image로부터 원하는 image를 거꾸로 얻어내는 diffusion의 수식을 대부분 이해하신다면, 단순히 Sora의 이해를 넘어 diffusion-based text-to-video SOTA 모델들에 대한 인사이트까지 얻으실 수 있습니다.
이번 포스트에서는 수식을 뜯진 않기 때문에 이렇게까지는 모르셔도 무방하지만, 개인적인 의견으로 이제 diffusion의 시대가 왔다고 생각하므로 다음 포스트를 기대해주시면 감사하겠습니다 :)
2024년 2월, OpenAI를 통해 Sora, Stability.AI를 통해 Stable Diffusion 3가 세상에 드러났습니다. Text-to-image인 Stable Diffusion이 등장한 2022년 9월 이후 고작 1년 반, 탑의 꼭대기에서는 어떤 일이 벌어지고 있었는지를 알 필요가 있습니다.
지금이 Stable Diffusion 출시 직후라고 가정했을 때, 어느 쪽이 더욱 가능성이 있어보이시나요?
고작 몇 초의 video조차 수십 장의 image로 이루어져있기 때문에, 이를 한 번에 생성해내는 것은 모델이 semantic information을 학습하기 매우 어려울 것이므로, 당시의 연구 수준에서 적합하진 않아보입니다.
실제로 후자에 대한 연구가 더욱 놀라운 결과를 내어왔고, generator를 통해 만든 각기 다른 image들이 모여 하나의 영상을 consistent하게 구성하도록 하기 위한 시도가 계속되었습니다. Text-to-Video 챕터에서 다루는 연구는 모두 이 방식을 사용합니다.
그런데, Sora가 이를 깨부셨습니다(사실 이게 제일 주목할 만한 점인데, 대부분이 모르시는 것 같네요).
Sora는 video 단위로 한 번에 generate합니다.
Sora 이전의 연구들(Text-to-Video)과 Sora가 이러한 차이를 가지고 있다는 점을 꼭 기억하셔야 합니다!
이제는 모두가 잘 알고 계실 Stable Diffusion의 architecture를 간단히 복습해보겠습니다.
Note : Pixel Space와 latent space가 나뉘는 이유는, Stable Diffusion은 LDM(Latent Diffusion Model)이기 때문입니다.
Diffusion의 forward/reverse process를 image level에서 진행한다면 연산량이 매우 크지만, encoder를 통해 lower dimensional space로 보낸 후 이 latent space에서 diffusion을 진행하면 매우 효과적인 연산이 가능합니다.
마지막에는 decoder를 두면 image level의 output을 얻을 수 있으므로, pixel space에는 (encoder)과 (decoder)를 두고, latent space에서는 diffusion process가 이루어지도록 한 것입니다.
아시다시피 이 diffusion의 reverse process의 각 step을 learnable한 denoising U-Net으로 구성하고, text의 embedding인 가 중간중간 끼어들어 조건 정보를 주는 것입니다.
위 그림은 학습이 끝난 후 generation 과정만 보여주고 있기 때문에 원본 이미지를 (encoder)로 압축하는 부분이 없는 것입니다.
이에 따라, Stable Diffusion에게 'A monkey eating a banana'라는 prompt를 주면 해당하는 이미지를 생성하는 것을 볼 수 있습니다.
Latent seed가 random sampling이므로, 같은 텍스트더라도 매번 조금씩 다른 결과를 내게 됩니다.
이러한 성질은 image generation에 있어서 diversity라는 장점으로 불리게 됩니다.
하지만 이 image들을 연속된 프레임으로 간주하여 영상으로 만들고 싶다면 어떨까요?
이러한 시도에 있어서는, 이제 diversity가 inconsistency라는 단점이 됩니다.
Stable Diffusion의 힘을 맛본 인간은, image에서 만족하지 않고 이제 video를 생성하길 원했습니다.
인간의 연구는 항상 완전히 새로운 것이 아닌, 기존의 것을 발전시키는 방향으로 이루어집니다.
어떻게 하면 LDM(Stable Diffusion)으로 video를 만들어낼 수 있을까?
하나의 text로부터 Stable Diffusion으로 여러 장의 이미지를 생성해서 붙인 것을 영상으로 사용할 순 없을까요?
단일 generation을 너무 훌륭히 해내는 Stable Diffusion(LDM)에서, diversity(=inconsistency)를 없애고 매끄러운 영상으로 이루어질 수 있도록 하는 VideoLDM이 고안되었습니다.
Temporal video fine-tuning이라는 과정을 통해, 각 프레임 간의 연속성을 만들어줍니다.
위의 알록달록한 그림은 전혀 새로운 것이 아닌, 그저 여러 image(=frame)들 각각에 대한 diffusion 과정을 spatial하게 이어붙이면서 생긴 3차원 그림일 뿐입니다.
단일 diffusion 과정만 쪼개어 2차원 그림으로 설명하겠습니다.
실제 image들은 독특한 데이터 분포 내에 각각 자리잡고 있을 것입니다. 그러나 forward process를 통해서, 결국 Gaussian distribution에 수렴하는 분포를 얻게 됩니다.
이 구조를 뒤집어서 random sampling된 Gaussian noise로부터 시작하면, 우리는 reverse process를 통해 '그럴싸한' image를 얻을 수 있게 됩니다.
다시, 이 그림은 이 diffusion 과정을 Batch/Video Frame Axis에 대해서 쌓았을 뿐이므로, 좌측과 같이 output들은 하나의 batch에 속하지만 서로 무관합니다.
이 image들은 본래 generation에서 서로 전혀 영향을 주고 받지 않습니다. 그러나, VideoLDM은 image 간의 temporal한 정보를 갖도록 하기 위해,
1) Stable Diffusion generator의 frozen layers에 learnable한 temporal layers를 붙입니다.
2) 2D가 아닌 3D convolution(=batch axis direction으로도 움직이는)을 사용한 discriminator를 이용해 소량의 고품질 video dataset에 fine-tune합니다.
이러한 temporal fine-tuning 기법을 통해, Stable Diffusion의 훌륭한 단일 image generation과 영상의 temporal information도 갖출 수 있게 되었습니다.
VideoLDM은 Stable Diffusion의 주인인 Stability.AI에서 낸 논문이 아니었으나, Stability사에서 Stable Video Diffusion이라는 이름의 논문에서 VideoLDM의 구조를 거의 동일하게 사용하면서 최고의 text-to-image model임을 인정받았습니다.
Technical report를 읽어보아도, 사실 더해진 것은 data curation 정도이므로 동일하다고 보셔도 됩니다.
Q. 그럼 Stable Video Diffusion은 약점이 없을까요?
A. 여러 장의 이미지들을 temporal axis의 방향으로 쌓은 후, 서로 consistent하도록 fine-tuning을 하는 방법은, 당연히 batch의 크기가 커질 수록 효과가 떨어지게 됩니다.
즉, 수백 수천의 frames로 구성될 video보다는, 하나의 batch 내에 적당한 양의 images가 있는 GIF 정도를 생성하는 데에 적합하다고 볼 수 있습니다.
제한된 정보로부터 많은 것을 끌어냈기 때문에, 이전 내용과 연결지어 생각해주시면 감사하겠습니다!
말씀드렸듯, Sora는 위와 같이 서로 다른 이미지에 consistency를 부여하는 방식으로 학습하는 방법의 한계를 부쉈습니다.
당장의 목표인 '텍스트로 고품질의 긴 영상을 생성하는 것'을 달성하기 위해, Sora는 AI의 가장 sensational한 기술 두 가지를 접목하였습니다.
NLP 분야에서 token을 input으로 받던 Transformer에서 영감을 얻어, ViT는 image를 patches로 나누어 그들이 시각 데이터의 representation으로 매우 효과적임을 입증했었습니다.
Sora는 image가 아닌 video를 통째로 patchify하는데, 이 때 단순히 slicing하는 것이 아닌 visual encoder를 통해서 patches를 만들어냅니다. 그렇게 되면, 기존처럼 spatial information만 담고 있던 patch가 아닌 temporal information 또한 담고 있게 됩니다.
이렇게 patch에 spatial-temporal information을 한 번에 담는 방식은 ViViT에서 착안했을 것으로 예상됩니다.
ViViT는 video classification을 위해 고안되어 encoder 부분의 design이 diffusion에 적합하진 않으므로, 해당 부분의 아이디어만 가져왔을 것으로 저는 추측합니다.
따라서, Stable Video Diffusion과는 비교할 수 없는 시간적 연속성을 학습할 수 있게 되므로, 더욱 긴 영상을 만들어낼 수 있게 됩니다.
Patches를 transformer backbone의 input으로 넣기 위해 선형적으로 배치하면, 이것들을 spacetime patches라고 부를 수 있게 됩니다.
※ Report에서 spacetime 'latent' patches라고 부른 이유는, 단순히 slice하여 patchify한 것이 아닌 encoder를 사용하여 만든 latent representations기 때문입니다.
OpenAI가 architecure에 대해 준 유일한 정보는 'Sora는 diffusion transforemer다'라는 것입니다. 이를 Background에서 끌어온 연구 배경을 통해 해석을 해보겠습니다.
현재 spacetime patches는 iamge level이 아닌 latent space에 있습니다. 이를 diffusion을 통해 generation한다는 것은, reverse process가 spacetime latent patches에 대해 이뤄진 후 decode하여 video를 얻는 LDM이라는 의미입니다.
그런데, backbone을 denoising U-Net이 아닌 transformer로 사용한다는 의미입니다. 어떤 Transformer인지 명시하진 않았으나, OpenAI는 힌트를 남겨두었습니다.
Native aspect ratios - 즉 기존의 전통처럼 저화질로 resize하고 시작할 필요가 없이, input 그대로의 resolution과 aspect ratio(종횡비)를 이용하여 만들 수 있습니다.
이를 가능케하기 위해 NaViT를 사용했을 것으로 예상됩니다.
NaViT는, data preprocessing 부분에서 Patch n' Pack이라는 기법을 사용합니다.
이는 NLP에서의 example packing(다양한 example들을 하나의 sequence에 묶어서 학습을 가속화)에서 착안된 것으로, 고정된 sequence length의 한계를 극복할 수 있습니다.
저희는 token이 아닌 patch를 사용하고 있으므로, 서로 다른 image(= example)로부터 온 patches를 하나의 packed sequence로 묶어준다는 뜻입니다. 이 paceked sequence 자료 구조에는 각 patch의 size에 대한 정보가 함께 담겨있으므로, 나머지는 zero padding을 해주면 됩니다.
이렇게 함으로써, 다양한 resolution에 대하여 학습됐기 때문에 sampling(=generation)시에 고품질 내에서도 선택적인 화질로 학습 및 생성이 가능해집니다.
하지만, 이러한 이점을 위해 Patch n' Pack 매커니즘만 빼내서 기존 denoising U-Net에 접목시키기엔 U-Net의 convolution 구조가 packed sequence 자료구조를 처리하기에 비효율적이며, 특징을 잘 잡아내지도 못할 것으로 예상됩니다.
Sora는 이를 해결하기 위해 Scalable Diffusion Models with Transformers, 일명 DiT architecture를 사용했을 것으로 예상됩니다.
두 가지 근거가 있습니다 - 사실 이 연결고리를 만들기 위해 제가 앞서 설명을 길게 한 것이기도 합니다.
1) Sora가 언급한 "Transformers have demonstrated remarkable scaling properties"라는 내용에 해당하는 구조를 지닙니다.
2) Conditioning이 adaLN layer를 통해 classifier-free guidance 방식으로 주입되는데, 이는 이전 연구인 Stable Video Diffusion에서 사용하는 방식과 동일합니다.
AdaLN은 StyleGAN에서 소개된 유명한 AdaIN(Adaptive Instance Normalization)이 instance에서 layer로만 바뀐 연산입니다.
Classifier guidance를 하게 되면, model의 output이 내가 원하는 condition에 부합하는지 별도의 classifier가 guide해줌으로써 학습해야 합니다.
하지만, classifier-free guidance는 time step t와 함께 condition 정보를 함께 주입하면서 학슴함으로써 생성 과정에서 원하는 condition의 image를 만들 수 있도록 지속적으로 지도하는 것입니다.
Stable Diffusion의 Denoising U-Net에서 (condition)이 cross attention module에 매번 섞여들어갔던 것 또한 classifier-free guidance이기 때문입니다.
해당 내용의 설명이 FFighting님의 블로그에 잘 설명되어있어 링크를 첨부해드리니 참고해주세요!
Transformer는 convolution layer에 비해 inductive bias가 약하다고 여겨져, 기존 diffusion의 backbone으로는 거의 쓰이지 않았습니다.
그런데, DiT 논문에서는 U-Net의 inductive bias가 diffusion model의 성능에 딱히 중요하지 않다고 이야기합니다.
즉, scalibility와 robustness(= weak inductive bias)라는 장점만 사용할 수 있다면 수많은 후속 연구를 통해 확장성까지 갖춘 transformer를 사용하지 않을 이유가 없다는 주장입니다.
Inductive bias의 효과를 평가하는 지표가 있는 것은 아니기 때문에 맹신할 수는 없으나, 설명력이 있는 새로운 시도이기 때문에 앞으로 후속 연구를 지켜볼 가치가 있다고 생각합니다.
Sora의 무서운 점은 text-to-video만 가능한 것이 아니라는 점입니다. 더욱 자세한 기능이 technical report에 서술되어 있으니 참고하시길 바랍니다.
Text에 더해 image를 추가로 input해주면 이를 video로 animating(영상화)이 가능합니다.
시점을 앞·뒤로 확장이 가능하므로, seamless infinite loop video를 만들 수 있습니다.
SDEdit를 통해, video를 추가로 input해주면 이를 style transfer시킬 수 있습니다.
두 영상의 seamless interpolation 영상을 만들 수 있습니다.
2048x2048까지 image generation도 가능합니다.
이외에도 정말 많지만, 이 포스트를 보신 분들이라면 지난 연구 역사가 떠오르실 ..
이 포스트를 한창 쓰고있는데 등장한 Stable Diffusion 3는 text-to-image입니다.
Stability사는 심지어 technical report에 architecture에 대한 내용은 아예 설명해놓지 않고 waitlist만 받고 있습니다.
하지만, 저희는 Sora 하나를 위해 지금까지 많은 것을 공부했기 때문에 다음 한 문장만 보아도 많은 것을 알 수 있습니다.
Scalability를 얻기 위해 diffusion transformer 구조를 사용했습니다.
Flow matching까지 다루기에는 글이 너무 길어질 것 같아 생략하지만, diffusion transformer를 주축으로 Sora와 Stable Diffusion 3가 어떻게 설계되었을지를 상상하실 수 있다면 충분하다고 생각합니다!
Sora가 공개한 report는 대중들이 읽는 데에 몇 분도 걸리지 않을 만큼 간단하지만, 이면에 수많은 연구가 담겨있다는 사실이 참 흥미로운 것 같습니다.
여러분이 생각하셨던 것처럼 흥미롭고 대단한 기술인가요? 아니면 괜히 복잡한 내용 말고 어서 완성되어서 API가 공개되길 기다리시나요?
저는 ViViT, NaViT, DiT 등등 하나의 포스트로 다루기도 어려운 모델들인데, 이런 것들로부터 인사이트 가져와서 하나로 융합해냈다는 점이 정말 멋있다고 생각합니다.
또 최근 많이 느끼게 된 점이, 오픈소스로 공개되는 SOTA는 실제 업계의 SOTA보다 6개월~1년 정도 뒤쳐져있다는 느낌을 받았습니다.
Diffusion과 transformer가 결합되는 아이디어가 나온지 1년 채 되지 않아 Sora와 Stable Diffusion 3가 개발되는 것은 불가능하다고 생각하고, 또 Sora 출시 직후 비슷한 원리의 SD3가 공개된 것 부터 AI의 최상단의 서로끼리는 이미 활발히 연구되고 있었음을 의심하게 됩니다.
결국 제가 생각하는 것은, 지금 Sora와 SD3를 이해하는 것이 기본이 되어야 AI 트렌드를 적당히 따라가는 것 정도일 것이라는 것입니다.
Diffusion도 '어쩌면' 이미 뒤쳐지기 시작했을 지도 모르겠습니다. 저를 포함한 많은 학습자들이 AI의 너무 빠른 발전 속도에 힘겨워하고 있지만, 여러분께서 이 포스트를 통해 diffusion-based SOTA에 더 많은 관심을 가지고 '상정 이상의 것'에 도전해주셨으면 합니다 ㅎㅎ
혹시 제 설명이 부족한 부분에 대해서는 댓글로 질문 주시면 꼭 답변해드릴게요! 다음은 정말로 diffusion model의 원리에 대한 포스트로 찾아뵙겠습니다.
긴 글 읽어주셔서 감사합니다!
이 포스트의 자료를 레퍼런스로 활용하실 때는 1) 포스트 링크 2) Justin4AI 키워드를 포함해주시면 감사하겠습니다 ⸜( ˙ ˘ ˙)⸝♡
사실 stable diffusion이 사라진다기 보단 기존 unet 구조의 stable diffusion이 사라지는 것이고 크게는 convolution 구조가 점점 transformer 구조로 대체된다고 느껴지네요
좋은 설명 감사합니다!