안녕하세요. 6월 정보융합탐구로 돌아왔습니다.
이번에는 이공계체험학습 글에서 작성했듯, 특강에서 들었던 Diffusion Model이 뭔지, 개념적인 이해를 해보고 이를 GAN과 비교해보도록 하겠습니다. 또한 번외로, 파이썬 라이브러리에서 제공되는 Stable Diffusion Model을 통해 간단한 이미지를 생성하는 법도 알아보도록 하겠습니다.
01. Diffusion Model
우선 Diffusion Model의 의미와 작동 원리에 대해서 개념적인 이해를 해보겠습니다.
( 저도 쉽게 이해하고, 여러분도 쉽게 이해하기 위해서 어려운 수학적인 개념은 제외하였습니다. )
Diffusion Model이란 데이터를 생성해내는 Generative Model의 일종입니다. 그 중에서도 Diffusion Model은 다양하고 방대한 데이터와 오랜 학습시간을 요구하는 Deep Generative Model이죠.
Diffusion Model이 이미지를 생성하는 과정은 크게 두 개의 과정으로 나뉩니다.
- Forward Process ( Diffusion Process ) - Forward Propagation
- Reverse Process - BackPropagation
첫번째로 Forward Process는, 데이터로부터 noise라고 불리는 랜덤 색상의 점을 추가해가면서 그 데이터를 완전한 노이즈 덩어리로 만드는 과정입니다.
여기서 $X_{0}$는 우리가 입력한 실제 데이터, $X_{T}$는 최종적으로 생성된 완전한 noise를 의미하고, 그 사이의 $X_{t}$는 데이터에 노이즈가 조금씩 더해지는 상태인 Latent Variable을 의미합니다.
두번째로는 Diffusion Model의 핵심이 되는 단계인, Reverse Process에 대해 알아보겠습니다.
Reverse Process는 최종적으로 완성된 노이즈 덩어리에서, 노이즈를 조금씩 제거하며 복원하면서 원래 데이터를 추정하는 과정을 말합니다. Diffusion Model은 이 Reverse Process를 학습하며, 그렇게 함으로써 노이즈 덩어리인 $X_{T}$로부터 보다 정확한 데이터 $X_{0}$를 추정할 수 있는 것이죠.
이 Reverse Process를 활용하여 랜덤한 노이즈들로부터 우리가 원하는 이미지를 뽑아낼 수 있는 것입니다.
따라서 이 Reverse Process를 어떻게 학습하느냐에 따라서, 같은 데이터를 주더라도 결과물이 전혀 달라질 수 있습니다.
예시로, 아래의 샘플 이미지를 사용하여 다르게 학습한 두 Diffusion Model인 Novel AI와 DALL-E를 돌려보면 어떻게 될까요?
이것을 먼저 Novel AI에 입력한 결과라고 합니다. ( 유료 서비스를 사용하지 못해 인터넷 데이터 이용 )
저 샘플 이미지를 가져다가 제가 직접 DALL-E에 넣고, Human Girl이라는 키워드와 함께 돌려보았습니다.
둘의 이미지 느낌이 사뭇 다른 것을 확인할 수 있습니다.
이렇게 2가지 과정을 거쳐 이미지를 생성하는 Diffusion Model은 GAN, Autoencorder에 비해서 빠른 속도와 높은 정확도를 가지는 모델입니다. 그러나 이러한 Diffusion Model에도 단점이 있는데요, 바로 학습 시간입니다.
단순히 생각해도 이미지 데이터를 입력으로 주었을 때, 그 많은 픽셀을 전부 노이즈로 바꾸고, 그것을 복원하는 과정은 쉽지 않을 것입니다. 따라서 Diffusion Model은 높은 컴퓨터의 사양과 더불어 긴 학습 시간이 요구됩니다.
최근에는 이를 복원한 Latent Diffusion Model도 나왔다고 하네요.
2. GAN
앞서 Diffusion Model은 두 가지 과정을 거쳐 이미지를 노이즈로 만들고, 그것을 복원하는 모델이라고 하였습니다.
그렇다면 또 다른 생성 모델인 GAN은 어떠한 과정을 거쳐 학습하고, 이미지를 생성하는 것일까요?
이를 이해하기 전, GAN이 어떻게 고안되었는지를 알아보면 GAN의 내용을 더 이해하기 쉽습니다.
GAN을 처음 고안한 사람인 Ian Goodfellow는 경찰과 위조지폐범 사이의 대결을 생각했다고 합니다. 위조지폐범은 최대한 진짜 같은 화폐를 만들어 경찰을 속이려고 하고, 경찰은 이 화폐가 진짜인지 가짜인지 완벽히 판별하여 위조지폐범을 검거하는 것을 목표로 합니다. 이 과정에서 위조지폐범은 더 진짜같은 지폐를 만들려고 계속 노력하고, 경찰은 이를 판별하려고 계속 노력합니다. 이러한 경쟁이 계속되다 보면, 결국 위조지폐범은 완벽한 위조지폐를 만들 수 있게 되는 것입니다.
GAN도 이와 같은 원리입니다. 위조지폐범을 생성모델, 경찰을 분류모델이라고 생각하고 이해할 수 있습니다.
GAN에서는 분류 모델을 먼저 학습시키고, 이를 바탕으로 생성모델을 학습시키는 과정을 계속 주고받습니다.
분류 모델을 학습시키는 과정은 크게 2가지로 나뉘는데, 첫째로는 진짜 데이터를 입력해서 분류 모델이 이것을 진짜 데이터로 분류하게 하는 것입니다. 다음으로는 생성 모델이 생성한 가짜 데이터를 입력으로 전달해 이를 가짜라고 분류하도록 학습시킵니다. 그렇게 되면 분류 모델은 진짜 데이터는 진짜로 분류하고, 가짜 데이터는 가짜로 분류합니다. 이때, 이를 바탕으로 생성모델은 분류모델이 이를 분류하지 못하도록 진짜 데이터와 유사하게 이미지를 생성하도록 학습합니다.
+ Stable Diffusion Model
이렇게 Diffusion Model과 GAN을 개념적으로 이해하고 둘의 차이를 비교해보았습니다.
다음으로는 직접 Diffusion 모델을 이용하여 이미지를 넣어보겠습니다.
저희가 이용할 모델은 Stable Diffusion이라는 모델입니다.
Stable Diffusion Model은 Stablilty.ai에서 훈련시킨 Diffusion Model로, 일반 Diffusion Model에 비해 시간이 적게 걸리는 Latent Diffusion Model과 고품질 이미지 데이터셋인 LAION을 활용하여 학습시켰다고 합니다.
이 Stable Diffusion Model은 오픈 소스로 공개하여 상업적으로도 이용 가능하다고 합니다.
저희는 이 Stable Diffusion Model을 이용하여 이미지를 생성해보겠습니다.
저희는 코랩 ( Google Colab ) 환경에서 이를 실행해볼 것이며, Diffusion Model의 단점이 긴 학습시간과 높은 사양이므로, 이번에 직접 학습시키진 않을 것입니다. 파이썬 라이브러리에 있는 것을 불러와 돌려보는 것으로 하겠습니다.
우선 구글 코랩에 접속하신 뒤 런타임 유형 변경을 GPU로 해주세요.
그 후 코랩창에 다음과 같은 코드를 입력해주세요.
( https://github.com/huggingface/diffusers 이 곳에서 Diffusion Model을 이용하였습니다 )
# 위 깃허브 링크에서 Diffusion Model 다운로드
!pip install --upgrade -qq git+https://github.com/huggingface/diffusers.git transformers accelerate
# 미리 훈련된 Diffusion Model을 pipe에 저장하고, 그래픽카드로 작동함을 설정
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", revision="fp16", torch_dtype=torch.float16)
pipe = pipe.to("cuda")
그리고 코드창을 나누어 다음의 코드를 입력합니다.
prompt = str(input()) # 영어로 글을 입력하는 부분
# 이미지를 생성하기 위한 코드
image = pipe(prompt).images[0]
# 이미지 저장
image.save(f"image1.png")
# 이미지 띄우기
image
직접 한번 실행해보겠습니다.
저는 " Bear with Apple pie "를 넣고 실행해볼게요.
기대했던 이미지랑은 매우 다르지만, Bear와 Apple이 들어가 있는 모습을 확인할 수 있습니다.
이렇게 이번시간에는 Diffusion Model과 GAN의 차이에 대해 비교해보고, Stable Diffusion을 직접 깃허브에서 가져와 실행해보았습니다.
여러분도 심심할 때 이미지를 어떻게 하면 잘 생성할 수 있을지, 텍스트를 입력하며 고민해보는 것도 좋은 것 같습니다.
이상으로 마치겠습니다. 감사합니다.
< 참고한 자료 >
https://danbi-ncsoft.github.io/works/2021/10/01/Generator.html
생성모델(Generation Model)이란 무엇인가?
danbi-ncsoft.github.io
https://github.com/huggingface/diffusers
GitHub - huggingface/diffusers: 🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch
🤗 Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch - GitHub - huggingface/diffusers: 🤗 Diffusers: State-of-the-art diffusion models for image and audio generat...
github.com
https://www.samsungsds.com/kr/insights/generative-adversarial-network-ai-2.html
https://process-mining.tistory.com/182
'정보융합탐구' 카테고리의 다른 글
[ Unity VR & 정보융합탐구 ] 06. Distance Grab (2) | 2023.07.12 |
---|---|
[ Unity VR & 정보융합탐구 ] 05. 오브젝트의 물리적 상호작용 - (2) (3) | 2023.06.06 |
[ Unity VR & 정보융합탐구 ] 05. 오브젝트의 물리적 상호작용 - (1) (1) | 2023.05.27 |
정융탐 ] 3. 이공계체험학습 내용 정리 및 후기 (4) | 2023.05.16 |
정융탐 ] 2. 행렬곱 ( Matrix Multiplication ) (0) | 2023.05.11 |