본문 바로가기
딥러닝 모델 글로만 이해하기

GAN 쉬운 설명 (글로만 이해하기)

by bigpicture 2023. 11. 4.
반응형

GAN의 목적은 이미지를 생성하는 모델을 만드는 것입니다. GAN은 생성자와 판별자로 구성되어 있습니다. 결과적으로 사용되는 것은 생성자입니다. 판별자는 생성자를 학습시키는데 사용됩니다. 

 

생성자는 랜덤한 노이즈를 입력받아 신경망에 통과시키고 출력값으로 이미지를 생성합니다. 당연히 처음에는 말도 안되는 이미지가 생성됩니다. 이 말도 안되는 이미지를 판별자에 통과시켜 평가를 받습니다. 판별자는 이미지를 입력받아, 이 이미지가 생성자에서 생성된 가짜 이미지인지 아닌지를 판단합니다. 판별자의 출력값은 이미지가 진짜 이미지일 확률입니다. 

 

생성자를 학습시키는 방법은 생성자가 생성한 이미지를 판별자에 통과시키고 진짜 이미지라고 판단할 확률을 높이는 것입니다. 생성자가 생성한 이미지를 핀별자에 통과시켜서, 진짜 이미지일 확률이 0.8이 나왔다고 합시다. 우리는 이 값이 1이 되도록 만들고 싶습니다. 따라서 loss 를 아래와 같이 binary cross entropy 로 정의할 수 있습니다. 

 

$bce=-\left ( y\ln (x)+(1-y)\ln (1-x) \right )$

 

숫자를 대입해보면 아래와 같습니다. 

 

$bce=-\left ( 1*\ln (0.8)+0*\ln (1-0.8) \right )$

 

이 loss 를 줄여가는 방향으로 최적화를 진행합니다. 하지만 생성자만 학습했다고 다 된건 아닙니다. 판별자의 성능이 좋지 않다면 생성자의 이미지가 누가 봐도 fake 인데도 진짜 이미지로 분류할 수도 있습니다. 이런 상태라면 생성자의 성능을 좋게 만들 수가 없습니다. 생성자의 성능이 좋아지려면 판별자가 fake 와 real을 잘 판단할 수 있어야 합니다. 식별자 또한 학습을 시켜야 합니다. 판별자에는 fake 이미지 한장을 통과시켜 loss 를 구하고, real 이미지 한 장을 통과시켜 loss 를 구한 뒤에 두 loss 의 합 또는 평균으로 최종 loss 를 계산합니다. loss 는 binary cross entropy를 사용합니다. 

 

신경망을 만드는 과정을 본격적으로 설명하겠습니다. 유명한 손글씨 이미지인 MNIST 데이터를 이용한 예시입니다. 

 

1. 생성자 네트워크 생성

1) 노이즈의 차원을 128로 정의합니다.

2) 128차원을 입력받고, 256차원을 출력하는 레이어를 정의합니다. LeakyReLU(0.2) 를 적용합니다. 

3) 256차원을 입력받고, 512차원을 출력하는 레이어를 정의합니다. LeakyReLU(0.2) 를 적용합니다. 

4) 512차원을 입력받고, 1024차원을 출력하는 레이어를 정의합니다. LeakyReLU(0.2) 를 적용합니다. 

5) 1024차원을 입력받고, 784차원을 출력하는 레이어를 정의합니다. Tanh 를 적용합니다. 

6) 784차원을 레이어를 1x28x28 차원으로 변환합니다. 

 

2. 판별자 네트워크 생성

1) 784차원의 이미지를 입력받아 1024차원을 출력하는 레이어를 정의합니다. LeakyReLU(0.2)를 적용합니다. 

2) 1024차원의 이미지를 입력받아 512차원을 출력하는 레이어를 정의합니다. LeakyReLU(0.2)를 적용합니다. 

3) 512차원의 이미지를 입력받아 256차원을 출력하는 레이어를 정의합니다. LeakyReLU(0.2)를 적용합니다. 

4) 256차원의 이미지를 입력받아 1차원을 출력하는 레이어를 정의합니다. Sigmoid 를 적용합니다. 

 

3. 학습

1) 랜덤 노이즈를 생성하고 생성자로 fake 이미지를 생성합니다. 

2) 리얼 이미지도 하나 준비합니다. 

3) 둘다 판별자에 통과시켜 판별자 로스를 구합니다. 

4) 오차역전파를 하고 판별자 네트워크를 업데이트 합니다. (여기까지가 판별자 학습)

5) 랜넘 노이즈를 생성하고 생성자로 fake 이미지를 생성합니다. 

6) 판별자를 통과시키고 생성자 로스를 구합니다. 

7) 오차 역전파를 하고 생성자 네트워크를 업데이트 합니다. 

반응형

댓글