GAN 파생 기술
- DCGAN
GAN은 생성자와 판별자가 서로 대결하면서 학습하는 구조이기 때문에 학습이 매우 불안정하다.
생성자와 판별자 중 한쪽으로 치우친 훈련이 발생하면 성능에 문제가 생겨 정상적인 분류(진짜 혹은 가짜 분류)가 불가능하다.
이러한 제약을 해결한 모델이 DCGAN(Deep Convolutional GAN)입니다. DCGAN은 GAN 학습에 CNN(합성곱 신경망) 을 사용하는 것.
GAN과 DCGAN이 가짜 이미지 생성을 위해 임의의 노이즈 값을 사용했다면 cGAN(convolutional GAN)은 출력에 어떤 조건을 주어 변형하는 모델이다.
즉, GAN이 임의의 노이즈로 무작위 이미지를 출력한다면, cGAN은 시드 역할을 하는 임의의 노이즈와 함께 어떤 조건이 추가됩니다.
조건이 추가되고 데이터 훈련 과정에서 인간이 통제할 수 있게 되면서 실제 이미지와 가깝거나 원래 이미지에 없던 문자열 태그 등도 넣는 것이 가능해졌습니다.
* 참고 CNN(convolutional neural network, 합성곱 신경망) : 5-1 , 5-2
● 생성자 네트워크
생성자는 임의의 입력을 받아들여 판별자에서 사용할 수 있는 이미지 데이터를 생성하며, 출력은 64×64가 됩니다.
임의의 입력으로 주어지는 노이즈 데이터는 ‘가로×세로’ 형태가 아니기 때문에 입력 형태를 ‘가로×세로’로 변경(reshape) 해야 한다.
형태가 변경된 입력은 합성곱층으로 넘겨진 후 이미지 형태의 출력을 위해 분수-스트라이드 합성곱(fractional-strided convolution)을 사용하여 출력 값을 키웁니다.
◆ 생성자 네트워크 특징
풀링층을 모두 없애고, 분수-스트라이드 합성곱을 사용한다.
배치 정규화(batch normalization)를 이용하여 네트워크의 층이 많아도 안정적으로 기울기를 계산할 수 있도록 했다.
단 배치 정규화를 모든 계층마다 추가할 경우 안정성이 떨어지는 문제가 있으므로 최종 출력층에서는 사용하지 않는다.
활성화 함수는 렐루(ReLU)를 사용하며, 최종 출력층에서는 하이퍼볼릭 탄젠트(tanh)를 사용한다.
● 판별자 네트워크
판별자 네트워크는 64×64 크기의 이미지를 입력받아 진짜 혹은 가짜의 1차원 결과를 출력합니다.
활성화 함수로 리키렐루(LeakyReLU)를 사용하며, 최종 출력층에서는 시그모이드 함수를 사용하여 0~1의 값을 출력합니다.
◆ 판별자 네트워크 특징
풀링층을 모두 없애고, 스트라이드 합성곱을 사용합니다.
배치 정규화를 이용하여 네트워크의 층이 많아도 안정적으로 기울기를 계산할 수 있도록 했습니다.
단 생성자 네트워크와 마찬가지로 배치 정규화를 모든 계층마다 추가하면 안정성이 떨어지는 문제가 있으므로 최초 입력층에서는 사용하지 않았습니다.
활성화 함수는 리키렐루를 사용하며, 최종 출력층에서는 시그모이드를 사용합니다.
● 스트라이드 합성곱, 분수-스트라이드 합성곱
판별자 네트워크에서 사용하는 스트라이드 합성곱은 합성곱에 단순히 스트라이드를 적용한 것이라고 생각하면 된다.
이때 스트라이드(stride) 값을 1 이상의 정수로 사용하면 풀링과 마찬가지로 출력 크기를 줄일 수 있다.
예를 들어 다음 그림과 같이 스트라이드 합성곱을 이용하여 2×2 크기의 특성 맵을 추출할 수 있다.
생성자 네트워크에서 쓰는 분수-스트라이드 합성곱은 스트라이드 값을 1보다 작은 분수를 사용하여 출력 크기를 키운다.
예를 들어 특성 맵의 크기를 키우려면 2×2 크기의 특성 맵(다음 그림의 빨간색 박스 안의 파란색 부분)의 각 원소 사이와 바깥 부분에 모두 패딩(0)을 넣어 준 상태에서 3×3 필터로 합성곱을 수행하면 된다.
그럼 왜 생성자 네트워크에서는 분수-스트라이드 합성곱을 사용하고, 판별자 네트워크에서는 스트라이드 합성곱을 사용할까?
생성자 네트워크에서는 노이즈를 입력으로 받아 훈련 데이터셋의 이미지와 같은 공간 해상도를 갖는 이미지를 생성해야 하기 때문에 공간을 확장시켜야 하는 분수-스트라이드 합성곱이 필요하다.
반면 판별자 네트워크는 실제 이미지와 생성자가 생성한 이미지 사이에서 어떤 이미지가 진짜인지 판별해야 하기 때문에 각 이미지의 특성을 추출할 수 있는 합성곱 연산을 수행한다.
그리고 이때 스트라이드 합성곱을 사용하면 특성을 잘 추출할 수 있다.
- cGAN
cGAN은 GAN의 출력에 조건을 주어 통제하려는 시도에서 만들어졌다.
기존 GAN은 노이즈 벡터를 받아들여서 출력을 만들어 내는데, 이때 사람이 통제할 수 있는 부분이 없다.
그렇다면 통제는 왜 필요할까?
GAN을 이용하면 입력 이미지와 유사한 출력 이미지가 생성된다.
그런데 입력 이미지에 새로운 객체를 추가하거나 이미지에 자동으로 문자열 태그를 붙이고 싶다면 어떻게 해야 할까?
cGAN을 이용하여 조건을 변경한다면 이 모든 것이 가능하다.
cGAN 원리를 좀 더 자세히 살펴보자.
기본적으로 GAN 원리와 비슷하지만, 다음 그림과 같이 생성자와 판별자에 조건을 입력하는 부분에서 차이가 있다.
예를 들어 MNIST 데이터셋을 사용하여 데이터를 훈련시킨 후 숫자 1을 출력한다고 하자.
이때 생성자에 노이즈 벡터와 더불어 그것을 뜻하는 조건 C(Condition)(예 [0,0,1])를 넣어 준다.
물론 판별자에도 조건 C([0,0,1])가 추가되어야 한다.
이런 식으로 생성자와 판별자에 조건이 추가되면서 이미지에 대한 변형(기존 이미지에서 변형된 이미지를 생성)이 가능하게 된다.