Generative Adversarial Networks(GAN)
GAN은 Generative Adversarial Networks의 약자로 우리말로는 “적대적 생성 신경망”이라고 번역되는 딥러닝기술 중 하나이다. GAN은 실제에 가까운 이미지나 사람이 쓴 것과 같은 글 등 여러 가짜 데이터들을 생성하는 생성형모델이다. “적대적 생성 신경망”이라는 이름에서 알 수 있듯 GAN은 서로 다른 두 개의 네트워크를 적대적으로(adversarial) 학습시키며 실제 데이터와 비슷한 데이터를 생성(generative)해내는 모델이며 이렇게 생성된 데이터에 정해진 label값이 없기 때문에 비지도 학습 기반 생성모델로 분류된다.
GAN은 구글 브레인에서 머신러닝을 연구했던 Ian Goodfellow에 의해 2014년 처음으로 신경정보처리시스템학회(NIPS)에서 제안되었고 이후 이미지 생성, 영상 생성, 텍스트 생성 등에 다양하게 응용되고 있다.
개념
GAN은 Generator(생성모델/생성기)와 Discriminator(판별모델/판별기)라는 서로 다른 2개의 네트워크로 이루어져 있으며 이 두 네트워크를 적대적으로 학습시키며 목적을 달성한다. 생성모델의 목적은 진짜 분포에 가까운 가짜분포를 생성하는 것이고 판별모델의 목적은 표본이 가짜분포에 속하는지 진짜분포에 속하는지를 결정하는 것이다. 이 2가지 모델을 포함한 GAN의 궁극적인 목적은 “실제 데이터의 분포”에 가까운 데이터를 생성하는 것이며, 따라서 판별기가 진짜인지 가짜인지를 한 쪽으로 판단하지 못하는 경계에서 가짜 샘플과 실제 샘플을 구별할 수 없는 최적 솔루션으로 간주하게 된다. 제안자 Ian Goodfellow은 논문에서 다음과 같이 ‘경찰과 위조지폐범’을 예시로 들어 GAN 모델의 개념을 설명하고 있다.
위조지폐범인 생성모델은 계속해서 위조지폐를 만들고 경찰인 분류모델은 계속해서 위조지폐를 찾아낸다. 그러다가 생성모델의 성능이 임계점을 넘어서 더 이상 분류모델이 생성모델이 만든 가짜 생성물을 가짜라고 구분해내지 못하고 진짜라고 판단할때까지 서로 경쟁하며 적대적으로 학습이 진행되는 것이다. 이런식으로 생성모델을 학습시키고 해당 모델로 생성시킨 결과물은 인간이 보기에도 가짜로 판단하기 어려운 상태가 되어있을 것이라고 추정하고 이러한 모델을 제시하였다.
GAN의 아키텍쳐
우선 위에서 본 적대적 학습을 도식화 하면 아래와 같다.
생성기(G)는 실제 데이터와 비슷한 데이터를 만들어내도록 학습되며, 판별기(D)는 실제 데이터와 G가 생성한 가짜 데이터를 구별하도록 학습된다. GAN의 목적함수는 다음과 같은데, 이는 게임이론 타입의 목적함수로 G와 D 2명의 플레이어가 싸우면서 서로 균형점을 찾아가도록 하는 방식이다.
먼저 판별기의 관점에서 실제 데이터(x)를 입력하면 D(x)가 커지면서 log값이 커지면서 높은 확률값이 나오도록 하고, 가짜 데이터(G(z))를 입력하면 log값이 작아짐에 따라 낮은 확률값이 나오도록 학습된다. 다시 말해 판별기는 실제 데이터와 생성기가 만든 가짜 데이터를 잘 구분하도록 조금씩 업데이트되는 것이다. 이때 판별기는 실제 데이터인지 가짜 데이터인지 labeling이 되어있는 데이터를 이용하여 학습한다.
생성기에서는 Zero-Mean Gaussian 분포에서 노이즈 z를 멀티레이어 퍼셉트론에 통과시켜 샘플들을 생성하며 이 생성된 가짜 데이터 G(z)를 판별기에 input으로 넣었을 때 실제 데이터처럼 확률이 높게 나오도록 학습된다. 즉 D(G(z))값을 높도록, 그리고 전체 확률 값이 낮아지도록 하는 것이며 이는 다시 말해 생성기가 ‘판별기가 잘 구분하지 못하는’ 데이터를 생성하도록 조금씩 업데이트되는 것이다.
실제 학습을 진행할 때는 생성기와 판별기 두 네트워크를 동시에 학습시키지 않고 하나의 네트워크를 고정한 상태에서 다른 한 네트워크를 업데이트하는 방식으로 따로따로 업데이트한다.
cGAN
cGAN은 Conditional Generative Adversarial Networks의 약자로 생성기와 판별기가 훈련하는 동안 추가 정보를 사용해 조건이 붙는 생성적 적대 신경망이다. GAN과는 ‘샘플링을 어디서 해오는지’와 ‘데이터셋에 라벨이 있어야 하는지’, 2가지 측면에서 차이가 있다. cGAN을 이용하면 인위적으로 원하는 클래스의 데이터를 생성할 수 있으며 생성기와 판별기를 훈련하는 데에 label을 사용한다.
쉽게 말하면 생성기와 판별기에 특정 condition을 나타내는 정보 y를 추가해주는 것인데, 이 때 y는 형태가 정해진 것은 아니기 때문에 다양한 형태를 가질 수 있다. 예를 들어, 필기된 숫자를 인식하는 MNIST 데이터에서 원하는 숫자를 생성하고 싶다면 숫자의 class에 해당하는 label을 추가 정보 y로 입력해주는 것이다. 논문에서는 생성하고 싶은 숫자 class를 one-hot encoding 하였는데, MNIST 데이터셋에서는 이 class를 one-hot encoding하게 되면 10bit가 필요하기 때문에 정보 y는 10bit 크기를 가지게 된다. cGAN은 아래와 같은 함수에 때라 연산된다.
GAN과 구조상의 차이는 input에서 y가 들어와서 결과를 조건부로 낸다는 점이다.
Evaluation Metrics
GAN 창시자 Ian Goodfellow는 2014년 GAN을 소개한 이후 2016년에 학습(training)방식을 향상시키는 기술을 추가로 발표했는데 논문에서 저자들은 “GAN은 object function이 없으며 이는 서로 다른 모델들의 퍼포먼스를 비교하는 것을 어렵게 만드는 요인이다”라고 언급했다. 즉 주어진 GAN 모델에 대해 일반적으로 합의된 평가 방식이 없다는 것인데, 이는 학습(training)이 실행되고 있는 동안 최종적인 GAN 모델을 선택할 때, GAN 모델의 활용성을 증명하기 위해 생성된 이미지를 선택할 때, GAN 모델 아키텍처 간 비교할 때 등의 경우에 이슈가 되곤 한다.
GAN 모델의 강점과 한계점을 반영하는 가장 적절한 지표에 대해서는 아직도 의견의 일치가 이루어지지는 않았다. 그 이후인 2019년 Macquarie 대학교의 Hamed Alqahtani가 발표한 논문에서는 GAN 모델의 평가지표에 대한 연구를 통해 10여 개의 GAN 모델의 평가지표를 제시하였다. Hamed에 따르면 GAN의 평가지표는 크게 정성적인 지표와 정량적인 지표 2가지로 분류되며 일반적으로 정성적인 지표는 사람이 이미지를 평가하므로 비용이 많이 든다고 한다.
정성적인 지표에는 Nearest Neighbor, Rating and Preference Judgement, Rapid Scene Categorization이 있으며 정량적인 지표에는 FID(Freechet Inception Distance), IS(Inception Score), Mode Score, Maximum Mean Discrepancy 등이 있다. 우리는 아래에서 NVIDIA의 논문에 모델 비교시 핵심적으로 사용했던 IS와 자주 쓰이는 FID 2가지에 대해서 알아보자.
Inception Score (IS)
IS 지표는 클래스 label과 관련하여 특징적인 속성들을 잡아내기 위해 pre-trained 신경망을 사용한다. 아래는 IS 값을 도출하는 수식인데 샘플의 조건부 분포 p(y|x)와 모든 샘플에서 얻은 주변분포 p(y) 사이의 평균적인 KL 발산 정도(Average KL Divergence)를 측정하는 것이며 이 값이 높을수록 좋은 성능를 낸다고 해석할 수 있다. 하지만 IS에는 실제 샘플 대신 생성된 이미지를 사용해 계산하고 클래스 당 하나의 이미지만 생성하면 다양성이 부족하더라도 p(y)가 균등 분포에 가깝게 나오기 때문에 성능을 왜곡할 수 있다는 단점이 있다.
Frechet Inception Distance (FID)
FID는 생성되는 이미지의 퀄리티 일관성을 유지하기 위해 이용되는 지표입니다. 실제 데이터의 분포를 활용하지 않는 단점을 보완하여 실제 데이터와 생성된 데이터에서 얻은 feature의 평균과 공분산을 비교하는 방식이며 FID가 낮을수록 이미지의 퀄리티가 더 좋아지는데 이는 실제 이미지와 생성된 이미지의 유사도가 높아지는 것을 말합니다. 즉 쉽게 말해 FID는 생성된 샘플들의 통계와 실제 샘플들의 통계를 비교하는 것입니다.
'Drawing (AI) > DeepLearning' 카테고리의 다른 글
Udemy - 딥러닝의 모든 것(SOM)-(1) (0) | 2023.09.12 |
---|---|
Udemy - 딥러닝의 모든 것(CNN 구축하기) (0) | 2023.09.05 |
CNN for NLP (0) | 2023.07.22 |
딥러닝 직접 구현하기 - (신경망 학습) (0) | 2023.07.06 |
딥러닝 직접 구현하기 - (신경망) (0) | 2023.07.01 |