from IPython.core.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
⛳ 나는 스케치를 너는 채색을..... ⛳¶
들어가며..¶
2014년 GAN(Generative Adversarial Networks)이 세상에 나타난 이후, Computer Vision 및 다양한 분야에서 많은 관심을 받아 활발하게 응용되면서 빠르게 발전해 왔다.
오늘은 이미지 생성 모델로 사용되는 일반적인 GAN에 조건을 부여하여 내가 원하는 유형의 이미지를 생성해 낼 수 있도록 하는 방법에 대해 알아보자.
오늘 진행할 내용에는 Tensorflow로 신경망을 구현하는 과정을 보고 이해하는 부분이 많다.
학습 전제¶
- Tensorflow의 Subclassing API로 레이어 및 모델을 구성하는 방법에 대해 대략적인 이해
- 신경망의 학습 방법에 대한 전반적인 절차
- CNN, GAN에 대한 기본적인 개념
- Tensorflow의 GradientTape API를 이용한 학습 코드를 보고 이해
- (중요) Tensorflow 내에서 잘 모르는 함수(또는 메서드)를 발견했을 때, 공식 문서에서 검색하고 이해해 보려는 의지
목차¶
조건 없는 생성 모델(Unconditional Generative Model), GAN
조건 있는 생성 모델(Conditional Generative Model), cGAN
1. 조건 없는 생성모델(Unconditional Generative Model), GAN¶
GAN을 이용해 MNIST, CIFAR-10 등의 데이터셋을 학습하고 생성하고 성공적으로 학습되었다면, 아래와 같이 학습에 사용한 실제 손글씨 이미지와 매우 유사한 손글씨 이미지를 생성이 가능하다.
여기서 한 가지 생각해보자.
예를 들어, "9"이라는 이미지를 만들고자 MNIST 데이터셋을 이용해 GAN을 열심히 학습시켰다.
학습이 완료된 모델을 이용해 "9"이라 쓰여있는 이미지를 얻기 위해 어떤 방법을 이용해야 할까?
여기서 할 수 있는 방법으로는 그저 다양한 노이즈를 계속 입력으로 넣어보고 "9"이라는 숫자 이미지가 생성되길 기다릴 뿐이다.
운이 좋다면 한 번에 만들 수 있겠지만 운이 없다면 100개가 넘는 이미지를 생성해도 9이 나오지 않을 수 있다.
또한 혹시라도 "9" 이미지를 수만 개 만들어야 한다면, 새로운 노이즈 입력을 몇 번이나 넣어야 할지 엄청난 노가다가 필요할 것이다.
잘 학습된 GAN을 이용해 실제 이미지를 생성할 때 조금 답답한 점이 하나 있다면, 바로 내가 원하는 종류의 이미지를 바로 생성해 내지 못한다는 것이다.
다시 말해서 일반적인 GAN과 같은 unconditioned generative model은 내가 생성하고자 하는 데이터에 대해 제어하기 힘들었다.
우리가 원하는 이미지를 바로바로 생성해 내기 위해서는 어떤 방법을 이용해야 할까?
GAN이라는 생성 모델에 내가 원하는 이미지를 만들기 위한 특정 조건을 줄 수는 없을까?
우리는 마냥 "9"이라 쓰인 이미지가 생성되길 기다릴 순 없다.
2. 조건 있는 생성모델(Conditional Generative Model), cGAN¶
Conditional Generative Adversarial Nets (cGAN) 은 내가 원하는 종류의 이미지를 생성하고자 할 때 GAN이 가진 생성 과정의 불편함을 해소하여, 내가 원하는 종류의 이미지를 생성할 수 있도록 고안된 방법이다.
만약 GAN을 잘 이해하고 있다면 이 방법(cGAN)은 전혀 어렵지 않을 것이다.
GAN의 목적 함수¶
먼저 GAN에 대해 간단히 복습해 보자. GAN 구조는 Generator 및 Discriminator라 불리는 두 신경망이 minimax game을 통해 서로 경쟁하며 발전한다.
이를 아래와 같은 식으로 나타낼 수 있으며 Generator는 이 식을 최소화하려, Discriminator는 이 식을 최대화하려 학습할 것이다.
$min_Gmax_DV(D,G)=$
$E_{x∼p_{data}(x)}[logD(x)+E_{z∼p_x(z)}[log(1-D(G(z)))]$
위 식에서 $z$는 임의 노이즈를, $D$와 $G$는 각각 Discriminator 및 Generator를 의미한다.
- 먼저 $D$의 입장에서 식을 보자.
실제 이미지를 1, 가짜 이미지를 0으로 두었을 때, $D$는 이 식을 최대화해야 하며, 우변의 + 를 기준으로 양쪽의 항 $(logD(x))$ 및 $log(1-D(G(z)))$ 이 모두 최대가 되게 해야 한다.
이를 위해서 두 개의 $log$가 1이 되게 해야한다.
$D(x)$는 1이 되도록, $D(G(z))$는 0이 되도록 해야 한다.
다시 말하면, 진짜 데이터 $(x)$를 진짜로, 가짜 데이터 $(G(z))$를 가짜로 정확히 예측하도록 학습한다는 뜻이다.
- $G$의 입장에서 식을 보자.
$D$와 반대로 $G$는 위 식을 최소화 해야하고 위 수식에서는 마지막 항 $log(1-D(G(z)))$만을 최소화하면 된다.(우변의 첫 번째 항은 $G$와 관련이 없다.)
이를 최소화한다는 것은 $log$ 내부가 0이 되도록 해야 함을 뜻하며, $D(G(z))$가 1이 되도록 한다는 말이다.
즉, $G$는 $z$를 입력받아 생성한 데이터 $G(z)$를 $D$가 진짜 데이터라고 예측할 만큼 진짜 같은 데이터를 만들도록 학습한다는 뜻이다.
$min_Gmax_DV(D,G)=$
$E_{x∼p_{data}(x)}[logD(x|y)]+E_{x∼p_x(z)}[log(1-D(G(z|y)))]$
$G$와 $D$의 입력에 특정 조건을 나타내는 정보인 $y$를 같이 입력한다는 것이다.
이외에는 GAN의 목적함수와 동일하므로 각각 $y$를 추가로 입력받아 $G$의 입장에서 식을 최소화하고, $D$의 입장에서 식을 최대화하도록 학습한다.
여기서 함께 입력하는 $y$는 어떠한 정보여도 상관없으며, MNIST 데이터셋을 학습시키는 경우 $y$는 0 ~ 9 까지의 label 정보가 된다.
Generator 가 어떠한 노이즈 $z$를 어떠한 이미지로 만들어야할지에 대한 방향을 제어할 수 있게 된다.
조금 다르게 표현하면 $y$가 임의의 노이즈 입력인 $z$의 가이드라고 할 수 있다.
GAN의 학습과정은 위 그림과 같다.
Generator
노이즈 $z$(파란색)가 입력되고 특정 representation(검정색)으로 변환된 후 가짜 데이터 $G(z)$ (빨간색)를 생성한다.Discriminator
실제 데이터 $x$와 Generator가 생성한 가짜 데이터 $G(z)$를 각각 입력받아 $D(x)$ 및 $D(G(z))$(보라색)를 계산하여 진짜와 가짜를 식별한다.
이전 목적함수에서 확인했듯이, cGAN에서 바뀐 부분은 $y$라는 정보가 함께 입력된다.
Generator 노이즈 $z$(파란색)와 추가 정보 $y$(녹색)을 함께 입력받아 Generator 내부에서 결합되어 representation(검정색)으로 변환되며 가짜 데이터 $G(z∣y)$를 생성한다. MNIST나 CIFAR-10 등의 데이터셋에 대해 학습시키는 경우 $y$는 레이블 정보이며, 일반적으로 one-hot 벡터를 입력으로 넣는다.
Discriminator 실제 데이터 $x$와 Generator가 생성한 가짜 데이터 $G(z∣y)$를 각각 입력받으며, 마찬가지로 $y$정보가 각각 함께 입력되어 진짜와 가짜를 식별한다. MNIST나 CIFAR-10 등의 데이터셋에 대해 학습시키는 경우 실제 데이터 $x$와 $y$는 알맞은 한 쌍("9"이라 쓰인 이미지의 경우 레이블도 9)을 이뤄야 하며, 마찬가지로 Generator에 입력된 $y$와 Discriminator에 입력되는 $y$는 동일한 레이블을 나타내야 한다.
다음 $STEP$에서는 Generator을 구성해보자.¶
'인공지능' 카테고리의 다른 글
[Part3]난 스케치 넌 채색을... |GAN-Pix2Pix (0) | 2022.03.18 |
---|---|
[Part2]난 스케치 넌 채색을... |TF2-GAN (0) | 2022.03.18 |
인공지능 퀴즈 풀기|KorQuAD_BERT (0) | 2022.02.25 |
트랜스포머로 만드는 대화형 챗봇|Transformer (0) | 2022.02.22 |
[Part 2]CIFAR-10 을 활용한 이미지 생성기 (0) | 2022.02.16 |