인공지능의 불씨를 다시 한번 타오르게 해 줄까?
최근 이미지 생성모델에 대한 관심이 뜨겁습니다. 이미지 생성모델은 text를 넣으면 image를 만들어주는 모델인데, 최근에 큰 발전을 했고 무엇보다고 Stable Diffusion이 누구나 이를 사용할 수 있도록 하며 여러가지 서비스도 쏟아져 나오고 있습니다. 이미 국내에도 이를 다룬 뉴스도 많고, 이미지 생성모델 관련하여 정리해놓은 글도 많이 있긴 하지만, 제 생각에 Stable Diffusion은 중요한 변곡점 중에 하나라고 생각이 되어서 간단하게 정리해 보도록 하겠습니다.
Stable Diffusion은 여러 연구자들이 모여서 이미지 생성모델을 민주화하기 위한 목적으로 만들었습니다. 사실 모델 자체가 혁신적이라기보단, 학습한 모델을 공개했다는 점이 더 큰 관심을 불러일으켰다고 볼 수 있을 것입니다. 왜냐면 이러한 모델을 학습하기 위해서는 장 당 천만원이 넘는 최신형 GPU가 몇백장 필요한 경우가 많기 때문입니다. 이렇게 많은 돈을 들인 모델을 쉽게 공개하기는 어렵습니다. 하지만 Stability.ai 라는 곳에서 컴퓨팅 리소스를 기부받아서 학습한 후, 공개하였습니다. 이에 관한 이야기는 Stability.ai 창업자와의 인터뷰 영상을 참고하시면 좋습니다.
사실 이미지 생성 모델은 OpenAI 가 GPT-3 이후에 ImageGPT 라는 모델을 공개하며 그 가능성을 보여주었었습니다. 이때만 해도 성능은 굉장히 낮았는데, OpenAI의 DALLE는 꽤 신기한 결과를 보여주었습니다. 그리고 후속작인 DALLE2 (이름은 같지만 모델 구조는 DALLE 와 많이 다릅니다) 와 Google의 Imagen은 신기함을 넘어 놀라움을 주는 결과들을 보여주었습니다. 다만 이러한 것들은 모두 오픈소스로 공개가 되진 않았습니다. DALLE 계열의 경우 돈을 내고 사용할 수 있는 API로 만들어 놓기는 했으나 가격이 그렇게 저렴한 편도 아니었습니니다.
그러다가 Stable Diffusion이 공개되었는데, 현재 시점 기준 2개월 정도밖에 지나지 않았지만 엄청난 관심을 받고 있으며 이를 활용한 모델이나 서비스들이 쏟아져 나오고 있습니다. 그 이유는 크게 2가지 입니다.
1) 비싼 리소스를 들여 학습한 모델과 코드 뿐 아니라 사용한 데이터를 모으는 방법 등을 모두 공개하였습니다. 누구나 사용 가능하며, 이를 기반으로 다양한 연구나 서비스 개발을 할 수 있도록 만들었습니다.
2) 일반 GPU 1장으로도 충분히 inference 할 수 있을 정도로, 효율적이며 성능이 꽤 잘 나오는 모델입니다.
앞에서 이미 stable diffusion은 공개된 모델이라 누구나 사용 가능하다는 이야기는 했습니다. 또 한가지 중요한 것은 이 모델이 효율적이라는 점입니다.
머신러닝 모델이 실제로 사용이 되려면, 성능은 둘째 치고 모델의 효율성이 굉장히 중요합니다. Transformer 기반의 대규모 모델이며, 모델 크기가 곧 성능이라는 결과를 보여준 GPT3가 큰 인기를 얻은 지 시간이 꽤 지났고 더 좋은 성능을 내는 모델들이 많이 나왔지만, 아직도 현업 NLP 분야에서는 BERT 정도 규모 이상의 모델을 사용하기는 부담스러운 상태입니다. 모델의 크기가 너무 크고, inference 시간도 오래 걸리기 때문입니다. 이런 경우 서비스화 시키기도 어렵고, 서비스화 하더라도 비용 문제가 너무 커지기 때문에 가성비가 나오지 않는 문제가 있습니다.
DALLE나 Imagen 등은 매우 큰 규모의 모델이기 때문에 일반적인 GPU에서는 inference를 할 수가 없습니다. 일반적으로 머신러닝용 고성능 GPU 여러개가 필요합니다. 학습할 때도 수천장의 GPU 를 사용하고 inference할 때도 4~8개 정도 필요하다 보니 돈 많은 회사가 아니라면 손대기 힘든 수준입니다.
하지만 Stable Diffusion은 prompt engineering을 조금만 진행하면 GPU 1대만 있는 그리 높지 않은 성능의 서버에서도 꽤 준수한 결과가 나오게 되며, 그렇기 때문에 누구나 쉽게 사용하는게 가능해졌습니다. NLP쪽에서 BERT 이후로 수 많은 응용 모델과 서비스가 탄생한 것 처럼, 이는 큰 혁신의 시작일 수도 있어 보입니다.
저는 개인적으로 Stable Diffusion과 굉장히 유사한 모델인 구글의 Imagen을 설명한 글이 쉽게 잘 쓰여져 있다고 생각해서 해당 글을 기반으로 정리해 보겠습니다. 참고로 Stable Diffusion에 대해서 잘 설명된 글이 굉장히 많습니다. 이 글이 Stable Diffusion에 대해 쉽게 설명이 되어 있어서 참고할 만 합니다. 그리고 diffusion model에 관해 디테일하게 수식적으로 설명한 글도 있으니 관심있으신 분들은 원본을 읽어보시는 것이 좋을 것 같습니다.
아래는 Imagen의 기본적인 구조입니다. 사용자가 입력하는 caption은 text encoder로 들어가고 이것이 numerical representation으로 변경이 됩니다. 이 text encoding 값을 활용해서 Image generation model에서는 샘플 노이즈로부터 ouput 을 생성해 내게 되는데 이 때의 이미지의 크기는 아주 작습니다. 이걸 두 번의 Super resolution 을 거쳐서 최종적으로 1024x1024 크기의 이미지를 생성해 냅니다. 참고로 Super resolution과정 중에도 text encoding값을 활용하셔 성능을 향상시키는 형태입니다.
Transformer 기반이며 실제 Imagen이 학습하는 과정에서는 frozen된 상태로 유지됩니다. 즉, 단순히 text encoding을 생성하는 데만 사용된다는 것입니다. Imagen에서는 T5 모델을 사용했다고 합니다. 여기서 흥미로운 점이 있는데, DALLE2의 경우 text encoder를 학습할 때 image-caption pair를 가져다가 fine tuning이 되도록 학습과정에 포함을 하였는데, Imagen은 frozen하여 text encoding 출력값만 사용했다는 점입니다.
그 이유는 T5 자체가 매우 큰 모델이라 text-image pair 없이도 representation 성능이 좋고, image-text pair dataset보다 text only corpus가 훨씬 크기 때문에 큰 모델을 학습할 때 좀 더 유리한 면이 있어서라고 합니다. 이렇게 거대한 모델, 그리고 엄청나게 많은 데이터셋을 활용하면 text-image pair에 대해 fine-tuning 하지 않아도 trade-off를 어느정도 상쇄할 수 있다고 합니다.
Diffusion model 은 training dataset과 비슷한 데이터를 생성하는 방법입니다. 학습 과정에서 training data에 지속적으로 noise를 추가해서 데이터를 망가뜨리는데, 이걸 원상복구하는 과정을 학습하게 됩니다.
해당 내용을 살펴보면 예전에 많이 연구되던 denoising autoencoder와 매우 유사하다고 느껴집니다. 구조는 비슷한데 내부에 사용되는 모델 등이 좀 더 개선된 느낌입니다. 좀 더 자세한 내용은 여기를 참고해 주세요.
Diffusion model 을 위해서는 DDPM논문에 소개된 UNet architecture를 그대로 사용하였다고 합니다.
이 때 text encoding 값을 condition으로 주도록 하여 원하는 결과가 나오도록 합니다.
Image generator로 생성된 이미지는 64x64로 크기가 작기 때문에 Super resolution이 필요합니다. 예전에는 SR을 위해서 GAN 등을 많이 사용했었는데, 여기서는 diffusion model 을 사용했습니다.
아래 그림을 보면 image generation 과정과 유사합니다. 다만 완전한 noise가 아닌 image generator로부터 생성된 이미지와 text encoding값을 condition으로 주어서 해상도를 높이는 형태입니다.
모델 아키텍쳐 또한 UNet 을 사용했다고 합니다. 다만 속도 등의 개선을 위해 좀 더 최적화를 한 Efficient UNet 아키텍쳐를 사용했다고 합니다. Imagen에서는 두 개의 SR 모델이 있습니다. 64x64 에서 256x256으로 키우는 Small to medium과 256x256에서 1024x1024로 키우는 medium to large로 이뤄져 있습니다. 둘이 완전 같은 구조는 아니고 MTL 의 경우 text encoder (transformer)쪽에 self attention이 제거된 형태라고 합니다.
Denosing을 하는 각 timestep 에서 conditioning을 하기 위해서 Transformer 에서 기본적으로 많이 사용되는 positional encoding을 활용하였다고 합니다. 왜냐면 Transformer encoder는 set에 대해서 동작하기 때문에 word order를 상관하지 않기 때문입니다.
이 문제를 해결하기 위해서 position 값을 encoding 에 넣게 됩니다. 아래 이미지를 보면 2개의 really가 word embedding 값은 동일하지만 positional encoding 이 추가되어 최종 encoding 값은 결과적으로 다르게 나오는걸 볼 수 있습니다.
이를 각 timestep 별로 encoding이 생성되고 UNet의 서로 다른 resolution에 적용되게 됩니다. 아래 그림에서 처럼 적용되어서 image, time, text 가 모두 인코딩되어 conditioning 되게 됩니다.
모델의 이미지 생성 시 guidance weight 가 너무 높으면 saturated되어 생성이 제대로 안되거나 부자연스럽게 나올 수도 있었다고 하며, 그래서 static/dynamic thresholding 을 활용했다고 합니다.
static thresholding은 pixel value의 range를 [-1, 1] 사이로 clip하는 것인데 문제를 해결할 수는 있지만 이미지 디테일을 떨어트리는 문제가 있다고 합니다. dynamic thresholding은 특정 percentile의 pixel value가 선택이 되고 이 percentile을 넘어가면 s값으로 나누도록 하여 [-s, s] 사이에 위치하도록 하는 방법입니다.
이 외에도 몇가지 주요 포인트들도 있지만, 직접 읽어보는 것을 추천드립니다. 설명드린 구조는 Imagen 이지만 공개되어 있는 Stable Diffusion 모델도 굉장히 유사합니다. 다만 Imagen이 T5를 사용해서 text encoding을 하고 1024x1024의 꽤 큰 해상도 이미지를 생성하는 것에 비해서, Stable Diffusion은 text encoding을 위해서 CLIPText 를 사용하며 512x512 해상도의 이미지를 생성하는 점 등에서 차이가 있습니다. Stable Diffusion은 또한 CLIP을 사용하여 safety check 와 같은 기능도 제공하고 있습니다. (테스트 해 보니 완벽하진 않지만) Stable Diffusion은 코드, 모델, 학습 데이터 수집 방법 등이 모두 공개되어 있다 보니 관심있으신 분들은 직접 한번 분석해 보시면 좋을 것 같습니다.
Stable Diffusion을 직접 사용해 보고, 이를 활용해 개발하고 싶다면 공식 repository를 참고해도 되지만, 더 좋은 방법이 있습니다. HuggingFace에서 발빠르게 diffusers (우리가 방향제로 쓰는 디퓨저와 같은 철자 맞습니다....ㅎㅎ) 라는 라이브러리를 공개했고, 이걸 활용하면 더 쉽게 사용해 볼 수 있습니다.
Stable Diffusion을 공식적으로 지원하기도 하고, HuggingFace의 성공을 만들어 준 transformers 처럼 여러가지 diffusion model 들이 지원할 것이기 때문에 여러가지 모델을 시도해 보고 싶을 때도 사용하기 좋습니다. 현재는 종류가 많지 않지만, 앞으로 이미지 생성 뿐 아니라 오디오, 비디오 및 다양한 ML 모델 등 여러가지 분야 모델들이 추가될 것으로 보입니다.
패키지도 pip 한 줄로 설치 가능하고, 위와 같이 HuggingFace model id 만으로 실행이 가능합니다. (물론 모델을 다운로드 받아서 경로를 지정해도 됩니다.) GPU로 실행하는 것 뿐 아니라 CPU로 실행하는 것도 가능하도록 되어 있습니다. 직접 테스트를 해 보니 정말로 꽤 잘 동작했습니다. Stable Diffusion 최근모델 (v1.4)의 경우 fp16 기준으로 GPU RAM 10GB 정도로 5~6초 정도면 하나의 이미지를 생성할 정도로 성능이 꽤 좋았습니다. 이러한 리소스를 가지고 이정도 결과를 낸 다는 것이 꽤 충격이었습니다.
앞으로 이를 활용하여 엄청나게 많은 서비스들이 쏟아져 나올 것으로 예상됩니다. Transformers 때도 그랬지만, Diffusers 를 발빠르게 공개하여 이 부분을 미리 선점 해 버리는 HuggingFace가 새삼 대단하다고 느껴집니다.
생성모델의 경우 주로 GAN 계열 모델이 많이 사용되는 추세였습니다. 그리고 이게 Transformer와 같이 사용되며 여러가지 인상적이 결과가 있었습니다. 최근에는 Diffusion model 이 매우 많은 관심을 받고 있으며, 이를 활용하거나, 이와 관련된 연구가 굉장히 많이 나오고 있습니다. 저도 아직 자세히 살펴보지는 못한 것들이 많아서 간략하게 어떠한 연구인지에 대해서만 적어놓았습니다.
text를 넣으면 3D 이미지 렌더링을 출력해주는 연구입니다.
참고로 stable diffusion 기반으로 비슷한 프로젝트를 진행중인 것도 있습니다 : link
기존의 text에서 image 생성할 때, 몇개의 image로 fine-tuning하여 핵심 객체를 더 잘 나타내어 생성 성능을 높이는 연구입니다.
Google의 연구는 Imagen을 기반으로 하는데, Stable Diffusion 기반으로 하는 프로젝트도 있습니다 : link
기존 Imagen을 video 도메인으로 확장한 연구입니다.
위와 마찬가지로 Stable Diffusion 기반으로 비슷한 연구들이 여러 개 진행중입니다. 이렇게 Video 도메인 연구가 앞으로 많이 이뤄질 것 같습니다.
텔아비브 대학의 Human motion generation
text를 통해서 human motion을 생성하는 연구입니다.
Meta AI 의 Text guided audio generation
text를 넣으면 audio를 만들어주는 연구입니다. diffusion model 은 아니고 일반적인 transformer 를 활용한 autoregressive model 이긴 하지만, audio 도메인으로도 다양한 연구가 많이 쏟아져 나올 것으로 보입니다.
- text를 넣으면 video를 생성하는 Imagen Video와 유사한 연구입니다.
최근 나온 몇가지 연구만 뽑아봐도 이정도이고, 요즘 여러가지 연구들이 발표되는 걸 보면 따라가기 벅찰 정도입니다. AI의 전성기가 다시 시작되는 것 같다는 느낌을 많이 받습니다.
OpenAI에서 DALLE2를 공개했을 때 굉장히 놀라웠습니다. Google이 Imagen을 공개했을 때도 마찬가지였습니다. 하지만 Stable Diffusion은 그것들을 뛰어넘었습니다. 성능은 둘째 치고, 기존에 공개하지 않았던 모델까지 공개를 해서 누구나 이를 활용할 수 있도록 했기 때문입니다.
예전에 Google에서 BERT를 공개했을 때나, OpenAI 에서 CLIP을 공개했을 때 이를 활용해서도 많은 연구들이 이뤄지고, 서비스가 만들어졌습니다. 이번 Stable Diffusion의 공개는 앞으로 딥러닝 모델의 혁신을 더 가속화 시킬 수 있는 계기라고 생각이 됩니다.
몇 년간 많은 관심을 받던 AI가 한동안은 AI winter 이야기가 나올 정도로 성과가 부족하다는 말이 많았었습니다. AI가 투자한 비용만큼 성과를 내지 못한 이유는 많이 있었습니다. 그러던 것이 GPT3와 같은 초거대모델의 등장을 시작으로, 최근의 움직임을 보면 다시 한번 AI 시장이 불타오르고 있는 느낌입니다. 제 느낌만은 아닌 것이 세콰이어의 리포트에서도 비슷하게 이야기하고 있습니다.
앞으로 또 어떤 흥미진진한 연구들이 나올까요? 그리고 그걸 기반으로 어떤 유용한 서비스들이 출시될까요? 이런 것들이 우리의 삶을 얼마나 풍족하게 만들어 줄 지, 기대가 많이 됩니다!