23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요.😊저희는 이번 SKT AI Fellowship 4기에서 "Language-Image Multi-modal AI" 연구과제를 수행중인 Team KEANU입니다.
어느덧 SKT FELLOWSHIP 4기의 종착역에 도착했습니다.
저희도 프로젝트의 추수를 해야 할 시기가 왔네요.
저희 주제가 너무 hot한 나머지 매일매일 성능이 개선되고 더 좋은 모델이 나오고 있어서 최선의 결과를 도출 하기 위해 계획이 계속 바뀌는 점 양해 부탁드립니다. 😂
사람이 그린 그림일까요? AI가 그린 그림일까요? 다음 세 장의 그림들 중에서 판단해보세요! 정답은 아래에 있습니다!
최근에 가장 뜨거운 감자가 바로 stable diffusion이죠. 최근 미국에서 열린 그림 대회에서 'Midjouerney' 모델이 그린 그림이 1등을 차지해 많은 논란이 있었습니다. 이제 AI가 사람을 뛰어 넘었다는 의견도 분분하고요.
이처럼 생성모델은 딥러닝 분야에서 현재 가장 많은 관심을 받고 이목을 집중시키고 있습니다.
엄청난 성능의 Stable Diffusion이 혜성처럼 등장했습니다. 기존의 DALL:E 2에 비해서 엄청난 임팩트도 지니고 있고요. 그렇다면 Stable Diffusion모델은 왜 인기가 많은 것일까요?
깃허브에서 코드를 내려받는다면 누구나 고성능의 생성 모델을 사용할 수 있게 되었습니다. 또한, 기존의 DALL:E 와 다르게 open source여서 많은 능력자들이 성능을 더더욱 끌어올리고, 입맛대로 커스텀 하고 있습니다.
저희도 해당 모델을 사용하여 SKT의 에이닷 서비스에 사용할 수 있도록 만들고 있습니다. 자, 그럼 stable diffusion에 대해 알아볼까요?
아 참, 위의 문제 의 정답은 '모두 AI가 그린 그림' 입니다. 다 맞추셨다구요? 대단합니다! 저는... 못맞췄거든요 🤣
간단하게 말씀 드리면, Text Prompt가 들어오면 Stable Diffusion 모델이 이미지를 생성하는 방식입니다.
(2) 저희는 해당 모델의 Fine-Tuning을 목표로 하고 있기 때문에 다음과 같은 방식으로 동작합니다.
(1)에서 학습되어 있는 Stable Diffusion 모델에 저희가 Target으로 하는 데이터를 사용하여 Target에 맞게 끔 파인 튜닝을 진행합니다.
저희는 에이닷 서비스에서 사용 할 목적이기 때문에 (2) 와 같은 방법으로 fine-tuning을 진행했으며, DreamBooth를 사용했습니다.
(Dreambooth 와 Textual Inversion은 추후 업로드 예정입니다.)
앞서 저희가 올린 글에 계속 나왔었지만! 처음 보시는 분들을 위해 Review를 준비해 봤습니다. 🤣
더 쉽게 말씀 드리면 Diffusion 모델 학습은 다음과 유사합니다.
물에 잉크를 한 방울 drip하면 어떻게 될까요? 퍼져나가겠죠? 그러나 우리는 잉크가 drip 되기의 전 상태를 알고 싶은 거죠.
즉, 이미지에 노이즈를 단계적으로 입히고 그 역 과정을 통해 원본 이미지를 복원하는 것을 학습하게 됩니다!
위의 그림은 이미지에 노이즈가 순차적으로 들어가는 과정을 나타내며, 수학적으로 표현을 어떻게 하는지 기술했습니다.
위의 그림은 노이즈에서 원본 이미지를 복원하는 과정이구요.
이정도만 알고 있으시면 뒤에 기술할 내용들에 대해 이해 하실 수 있습니다. 😃
자, 이제 좀 더 깊게 알아보록 합시다! 위에서 언급한 텍스트 인코더는 트랜스포머를 기반으로 한 CLIP 모델의 텍스트 인코더를 사용합니다.
Input Prompt로 들어오는 텍스트를 단어 및 토큰을 대표하는 벡터로 변환하게 됩니다. 그 다음, 해당 정보가 이미지 생성 모델로 전달되죠.
이때 이미지 생성 모델은 단일 모델이 아니라 여러 개의 구성 요소로 이루어져 있는데요, 한 번 살펴 봅시다.
기존의 DALL:E 나 IMAGEN 과 같은 모델들에 비해 더 좋은 성능을 내는 이유가 바로 이미지 생성 모델에 숨겨져 있습니다.😄
이 부분에서 이미지 생성 모델은 Text에 대응되는 이미지 정보를 생성하기 위해 여러 단계를 거칩니다.
Text에 대응되는 이미지 정보를 생성하는 이미지 생성 모델은 이미지의 정보 공간(Latent Space)에서 작동합니다.
기존의 Diffusion 모델들은 픽셀 공간에서 작동했었습니다. 즉, 1024 x 1024 x 3 일 경우 엄청난 계산량을 요구하죠.
이에 따라 속도가 느리다는 단점이 있었습니다.
그러나 이미지의 정보 공간으로 변환한다면 작은 계산량을 요구하여 속도를 훨씬 빠르게 할 수 있게 되었습니다.
즉, 품질과 빠른 결과 도출이 바로 Stable Diffusion의 장점인 것입니다.
Image Creator는 UNet 과 Scheduler로 구성 되어 있습니다.
UNet은 컴퓨터 비전을 공부해 보신 분들이라면 아시겠지만, 주로 Scale up 을 하여 저해상도를 고해상도로 변환해주는 역할을 합니다.
즉 이미지의 품질을 끌어 올리기 위함이죠. Scheduler의 역할은 이미지에 Noise를 넣어 줍니다.
이렇게 UNet과 Scheduler는 한 몸처럼 움직이고, 사용자가 지정한 횟수 만큼 LOOP를 하게 됩니다.
이러한 동작을 통해 최종적으로 이미지 디코더에서 고품질의 이미지가 생성되도록 합니다.😀
위의 그림을 보면서 설명 하겠습니다.
Stable Diffusion은 크게 텍스트 인코더, Image Creator, 이미지 디코더로 이루어져 있습니다.
텍스트 인코더는 입력으로 들어오는 Text Prompt를 통해 인코딩을 진행합니다. 이때 입력은 텍스트로 들어오며 출력은 토큰 임베딩 벡터가 됩니다.
Image Creator는 Text를 기반으로 만들어지는 이미지의 Latent Space상에서 점진적으로 이미지의 Scaling과 Diffusion역할을 하는 UNet과 Scheduler로 이루어져 있습니다.
이때 입력은 텍스트 인코더의 결과값인 텍스트 토큰 임베딩과 노이즈로 구성된 다차원의 텐서입니다. 출력은 정보 배열이 되죠.
이미지 디코더는 Image Creator에서 나온 정보 배열을 사용합니다. 이를 통해 텍스트 임베딩을 잘 반영하여 고품질의 이미지를 생성하죠. 이때 주의해야할 점은 Latent 정보가 아니라, Pixel 정보가 최종 결과물 입니다!
앞서 다른 Diffusion 모델들과 다르게 빠른 연산이 가능하다고 말씀 드렸습니다. 그럼 어떻게 가능한 일인지 알아보겠습니다. 😀
픽셀로 구성된 (width x height x RGB) 이미지 대신, 압축된 이미지 표현을 사용한다면 가능한 일입니다! 이렇게 되면 더 이상 픽셀 공간에서의 이미지나 일반적인 이미지를 굳이 사용하지 않아도 되는 것이죠.
이렇게 압축된 공간(Latent Space)에서 작업하면 데이터 크기가 훨씬 작기 때문에 더 효율적이고 빠른 모델을 만들 수 있을 뿐만 아니라 다양한 양식에서도 작업이 가능합니다.
Latent Space의 입력을 인코딩 하기 때문에 사용자들은 텍스트나 이미지 이외에도 어떤 종류의 데이터가 들어와도 모델에 적은 연산량을 요구하게 됩니다.
위의 그림은 'High-Resolution Image Synthesis with Latent Diffusion Models' (Robin. et al)에서 발췌한 구조도 입니다.
전체 모델은 위의 그림과 같습니다. 우선, X라는 initial 이미지가 입력으로 들어옵니다. 그 다음은 해당 이미지를 Latent Space 상의 (Z라 하겠습니다) 정보 밀도가 매우 높은 공간으로 인코딩 하는 과정을 거칩니다.
이때 사용되는 인코더는 일반적인 인코더가 아닌, AutoEncoder가 사용됩니다. 해당 인코더를 사용하여 이미지를 Latent 공간으로 압축한 뒤 디코더를 사용하여 압축된 정보만을 사용하여 재구성하게 되죠.
이러한 과정은 인코더 모델을 사용해 이미지를 가져와 Latent 공간에서 가장 관련성이 높은 정보를 추출하는 GAN 모델과 거의 비슷합니다.
해당 과정은 연산량을 줄이기 위한 작업이기 때문에 일종의 DownSampling 작업입니다.
즉 정보의 손실을 최소화하고 가능한 많은 정보를 유지하면서 크기를 줄이는 과정이죠.
해당 과정은 Diffusion 모델의 Forward Diffusion Process입니다. 해당 과정은 Latent Space상에서 동작하고, Noise들 또한 마찬가지 입니다! 따라서 Noise Predictor는 Latent Space 상에서 Noise들을 예측하도록 훈련됩니다.
자, 입력으로 들어오는 X는 이제 Latent 공간에 있습니다. 그 다음으로는 텍스트나 이미지에 대한 입력에 동일한 작업(Z로 변환)을 거치고 나서 Attention을 사용하여 이미지 representation과 병합하는 과정을 거칩니다.
여기서 Attention이 하는 역할이 매우 중요한데, Latent Space상에서의 입력과 또 다른 입력을 결합하는 가장 좋은 방법입니다!😁
이렇게 input들이 결합하는 과정을 거치고 나서 결합된 결과물은 Diffusion을 위한 initial noise가 됩니다.
이제 마지막 과정입니다! 인코더의 역 기능을 하는 것이 무엇일까요? 바로 디코더 입니다! 디코더를 사용하여 이미지를 재구성하게 됩니다.
Latent 공간에서 조건에 따라 조절되고 노이즈가 제거된 입력을 사용하여 최종적으로 UNet을 통해 고해상도 이미지를 구성하고 해당 결과를 Upsampling합니다.
생각보다 어렵지 않죠? 해당 과정을 거치고 나면 엄청나게 고해상도의 이미지, 혹은 결과물로 나온 이미지의 수정이 가능해집니다.
그러면 그림을 통해 Stable Diffusion이 어떻게 동작하는지 간단한 구조도를 보면서 살펴봅시다!
어떠신가요? 한눈에 보기 쉽게 만들어 봤습니다. 맨 처음에 랜덤 이미지 Tensor가 입력으로 들어옵니다. 그러나, 이때 Random 이미지 말고 Initial Image를 사용해도 무방합니다!
처음으로 들어오는 이미지 Tensor 데이터는 이미지 디코더를 통해 노이즈가 100%인 상태가 됩니다.
이후 Denoising과정을 거쳐 최종적으로 처리된 이미지 Tensor 단계에서 Pixel Space에 깔끔한 고해상도의 이미지를 얻게 되는 것이죠!
어떠신가요? 이제 누구나 나만의 화가를 가질 수 있게 되었습니다. 하루하루 발전해가는 AI기술이란 참 멋진것 같네요.
저희 글을 읽어 보시는 것도 좋지만, 직접 Stable Diffusion을 한번 사용해 보시는 걸 추천드립니다!
그럼, 다음에 또 좋은 글로 찾아뵐게요 😀
'High-Resolution Image Synthesis with Latent Diffusion Models' (Robin. et al)
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.