GAN/이론

2. GAN 개념

jwjwvison 2021. 10. 31. 21:22
  • 이미지 생성하기

 기본적으로 신경망은 정보를 감소하고 정제하고 축약하는 데에 사용된다. MNIST 분류기가 좋은 예이다. 784개 값을 입력으로 받아서 10개의 출력으로 변환하는 것이니, 처음보다 정보량이 감소했다. 이 네트워크를 그러면 반대로 뒤집으면, 이는 값을 감소시키는 행위가 아니라 좀 더 사이즈가 큰 데이터로 변환하는 것이나 마찬가지일 것이다. 이 경우, 레이블을 주면 신경망을 통해 이미지가 생성되는 것이다.

백쿼리(역질의) 라고 부른다.

 이 백쿼리를 통해서 만들어진 이미지는 다음과 같은 특성을 가졌다.

 

 1. 같은 원핫 인코딩 벡터면 같은 결과를 출력한다.

 2. 그 레이블을 나타내는 모든 훈련 데이터의 뭔가 평균적인 이미지가 나온다.

 

  • 적대적 훈련

 2014년 이언 굿펠로는 뭔가 다른 종류의 네트워크 구조를 발표했다. 

 

 진짜 고양이 사진인지 아니면 손으로 그린 만화 고양이인지 분류하는 경우를 생각해 보자.

 신경망은 종류가 서로 다른 두 이미지를 분류하도록 훈련될 것이다. 이 분류기를 일종의 '탐정'이라고 생각해도 된다. 훈련을 하기 전에는 이 탐정은 주어진 이미지가 진짜 고양이인지 가짜 고양이인지 정확히 가려낼 수 없다. 그렇지만 훈련을 거듭하면 점점 더 실제 고양이와 가짜 고양이를 잘 구별하게 된다.

 

 다음 단계에서는 가짜 이미지들을 잔뜩 만들어 준비하는 대신, 가짜 이미지를 생성해주는 장치가 있다고 상상해보자.

 이렇게 하면 가짜 이미지들을 잔뜩 준비하는 과정이 필요 없어진다. 코드로 생성해버리면 된다. 

 

 다음 단계는 상당히 중요하다.

 

 대충 아무 이미지나 만드는 생성기가 아니라, 진짜 그럴듯한 이미지를 생성하는 신경망을 한번 상상해보자. 이를 생성기(generator)라고 부른다. 그리고 분류기는 판별기(discriminator)라고 부르기로 한다.

 

 판별기를 무사히 속이면 생성기에 보상을 준다.

 

 판별기에 잡히면 생성기에 벌을 준다.

 

 판별기와 생성기는 서로 적대적 관계로 경쟁을 하게 되며, 서로를 뛰어넘으려고 노력하기 때문에 결과적으로는 둘 다 성능이 좋아지게 된다. 이러한 구조가 바로 생성적 적대 신경망(generative adversarial network), 즉 GAN이다.

 

  • GAN 훈련

GAN은 생성기와 판별기를 모두 훈련한다. 하지 말아야 할 미련한 방법은 둘중 하나만 먼저 훈련하고 같은 데이터로 다시 한번 다른 모델을 훈련하는 것이다. 제대로 훈련하기 위해서는 둘 모두 동시에 훈련시키면서 양쪽 모두 비슷한 수준으로 훈련이 이루어지도록 유도해야 한다.

 

 이를 위해 다음과 같이 3단계로 시도한다.

 

 1단계: 판별기에 실제 데이터를 보여주고 1.0이라는 값이어야 한다고 알려준다

 

 2단계: 판별기에 생성기로부터 만들어진 가짜 데이터를 보여주고 0.0이어야 한다고 알려준다

 

 3단계: 판별기에 생성기의 결과를 보여주고, 생성기에 결과가 1.0이어야 한다고 알려준다.

 

 이것이 바로 GAN 핵심 훈련 방법이다.

 

1단계
2단계

 2단계는 판별기를 훈련하지만, 이번에는 생성기로부터 나온 이미지를 보여준다. 결과는 0.0이어야 한다. 그리고 오차를 통해 판별기만을 업데이트 한다. 현 단계에서 생성기를 업데이트 하지 않도록 조심해야 한다.

 

3단계

 3단계에서는 생성기를 훈련한다. 생성기는 판별기가 분류할 이미지를 생성하는 역할을 하며, 목적은 만든 이미지에 대해 판별기의 결과가 1.0이 되도록 하는 것이다. 즉 생성기가 판별기를 속여서 진짜처럼 분류하게 하는 것이다.

 오차는 생성기만을 업데이트하는 데 사용된다. 이 단계에서는 판별기를 업데이트하지 않는다. 판별기가 잘못하게끔 장려하고 싶지 않기 때문이다. 

'GAN > 이론' 카테고리의 다른 글

4. 손으로 쓴 숫자 훈련 (1)  (0) 2021.11.03
3. 단순한 1010 패턴  (0) 2021.10.31
1. CUDA 기초  (0) 2021.10.31
=====================================================  (0) 2021.10.31
14. CycleGAN- 구현  (0) 2021.07.02