딥페이크 라는 단어를 들어보신 적 있으신가요? 딥페이크는 영상 속 사람 위치에 임의의 다른 인물을 합성하는 가짜 영상을 말합니다.
위의 영상은 딩고 뮤직 배경에 일론 머스크의 얼굴을 합성하고, SG워너비 살다가 음악을 임의의 음성으로 변형한 대표적인 딥페이크 영상입니다. 이러한 가짜 영상을 생성해내는 모델들 중 하나가 이번에 소개드릴 GAN이라는 모델입니다. 간단하게 GAN이 무엇인지, 어떻게 동작하는지, 어떠한 한계점이 있는지에 대해 설명해보겠습니다.
GAN 이란
GAN은 겐
또는 간
으로 불리며, 주로 겐
으로 읽는다고 합니다. 제 주변에서는 둘 다 많이 읽히고 있습니다.
Generative
GAN의 첫 글자인 G는 Generative의 줄임말입니다. 이 단어에서 알 수 있듯이 GAN은 무언가를 생성하는 것을 목표로 하는 모델입니다. 다시 정리해보면 그럴듯한 가짜를 생성해내는 모델이라고 볼 수 있습니다.
위의 도G워너비 뿐만 아니라 인물 사진을 디즈니 화풍으로 변경해주는 분야, 음성 합성 등 다양한 생성 관련 분야에서 GAN이 사용되고 있습니다.
Adversarial
GAN의 두번째 글자는 A입니다. 이는 Adversarial의 줄임말인데, 적대적 또는 경쟁적이라는 의미를 가지고 있습니다. 그렇다면 이 모델의 중간 단어가 이러한 의미를 가지고 있는 이유는 무엇일까요? 이는 GAN을 2014년에 최초 발표한 이안 굿펠로우(Ian Goodfellow)의 지폐 위조범 예시로 쉽게 설명할 수 있습니다.
위조 지폐를 만드는 지폐 위조범을 Generator(G)라고 하고, 이를 판별하는 경찰을 Discriminator(D)라고 하면, G는 최대한 경찰을 속이려, D는 위조 지폐를 최대한 감별하고자 노력하게 됩니다.
이 경쟁 속에서 두 그룹 모두 서로의 능력이 발전하게 되고, 결과적으로는 진짜 지폐와 위조 지폐를 구별할 수 없을 정도에 이르게 됩니다.
즉 이 모델은 생성자와 구분자라는 두 모델을 서로 경쟁적으로 학습시키는 모델입니다. 이렇게 학습하는 과정에서 Generator는 실제 데이터의 분포를 학습하게 됩니다.
Networks
GAN의 마지막 단어는 Networks입니다. 이는 이 모델이 신경망으로 구성되어 있다는 얘기로, 쉽게 말해 딥러닝으로 만들어졌다는 의미입니다.
정리하면, 생성적 적대 신경망(GAN)은 데이터를 만들어내는 Generator와 만들어진 데이터를 평가하는 Discriminator가 서로 적대적으로 대립하며(Adversarial) 학습해서 성능을 개선하는 아이디어로 만들어진 신경망(Network)을 말합니다.
GAN의 학습
GAN은 생성자(Generator), 구분자(Discriminator)라는 두 모델로 구성되어 있습니다.
참고로 Generator(G)의 input값은 noise이며, output값은 data(위의 사진에서 이미지)입니다.
Discriminator(D)의 input값은 data이고 output 값은 확률입니다.
Discriminator의 경우 실제 데이터를 정답, 가짜 데이터를 오답이라고 인식하게끔 학습을 수행해야 합니다.
Generator의 경우 가짜 데이터를 Discriminator가 실제라고 믿게끔 학습을 수행해야 합니다.
Loss Function
위의 내용처럼 GAN은 두 개의 모델이 서로의 목표에 맞춰 경쟁하는 알고리즘이라고 할 수 있습니다. 이러한 Generator와 Discriminator의 문제를 minimax problem
이라고 하며, 이 문제를 손실 함수로 정의하면 다음과 같은 식이 나올 수 있습니다. 이 손실 함수를 minimax loss
라고 부르며, GAN의 가장 기본적인 손실 함수입니다.
GAN은 Discriminator, Generator에 대해 손실 함수를 사용하여 학습합니다. 여기서 x는 실제 데이터, z는 가짜 데이터를 의미합니다.
D의 경우에는 D(x) 가 1 실제 데이터가 1임을 잘 예측
, D(G(z))가 0 가짜 데이터가 0임을 잘 예측
일 때가 가장 잘 훈련된 결과라고 할 수 있습니다. 이때 얻을 수 있는 결과값은 0으로 나머지 결과는 이보다 작을 수 밖에 없습니다. 다시말해 최선의 결과가 최대값이므로 최대한 loss가 max 되게끔 훈련해야 합니다.
G의 경우에는 D(x)쪽 수식은 무시하고, D(G(z))가 1 가짜 데이터가 1이게 잘 속임
일 때가 가장 G가 잘 훈련된 결과라고 할 수 있습니다. 이때 얻을 수 있는 값이 -inf값
이므로 최소값이 되게끔 훈련해야 합니다.
Discriminator의 학습
Discriminator의 경우에는 D(x) 가 1 실제 데이터가 1임을 잘 예측
, D(G(z))가 0 가짜 데이터가 0임을 잘 예측
이게끔 gradient descent를 합니다.
Generator의 학습
G의 경우에는 D(G(z))가 1 가짜 데이터가 1이게 잘 속임
이게끔 gradient descent를 해야 합니다. 다만 Generator의 경우 feed forward를 유심히 봐야 합니다.
위의 그림에서 볼 수 있듯이 이 feed forward 과정에는 Generator 뿐만이 아니라, Discriminator까지 포함되어 있습니다. 그렇기 때문에 back propagation 과정에 대해 한번 더 생각해봐야 합니다. 역전파의 처음은 Discriminator 부분이지만 Discriminator는 별개이기에 이 부분의 가중치를 Generator와 함께 작업할 수는 없습니다. 그렇기 때문에 Discriminator쪽 weight를 업데이트하지 않게 Freezing 해야 합니다.
즉 위의 빨간 글씨처럼 Discriminator 부분을 Freeze하고, 앞의 Generator 부분만 가중치를 업데이트해야 합니다.
GAN의 학습 문제
GAN의 경우 두 모델이 순서대로 학습이 됩니다. 병렬로 학습되지 않기 때문에 Generator, Discriminator 가 서로 비슷하게 발전하는 것이 중요한데, 이렇게 학습하게 만드는 것이 상당히 어렵다는 단점이 있습니다. 대표적인 한계점이 모드붕괴(Mode Collapse)입니다.
Mode Collapse
생성자가 다양한 이미지를 만들어내지 못하고 비슷한 이미지만 계속해서 생성하는 경우를 뜻합니다. 예를 들어보겠습니다. MNIST 1~9 까지의 숫자 데이터를 학습한다고 했을 때 우리가 원하는 목표는 모든 숫자를 골고루 잘 생성해내는 것이라고 정의할 수 있습니다. 다만 모델의 입장에서는 굳이 모든 숫자를 골고루 생성해 낼 필요가 없습니다.
위에서 본 Loss를 다시 한번 확인해보겠습니다. 우리가 풀고자 하는 Loss는 1
이지만 실제로는 G,D를 한 번만 학습하는 것이 아닌, 번갈아가며 여러번 학습하기 때문에 모델 입장에서는 2
와 크게 차이가 없게 됩니다. 이렇게 되는 경우 먼저 풀고자 하는 문제가 min V(G)가 되는 것 처럼 보이는 상황이 생기게 됩니다. 만약 Discriminator가 모든 숫자에 대해 균등하게 Loss를 가진 것이 아닌, 8을 조금 더 헷갈려한다면 Generator 입장에서 는 해당 샘플만 계속 생성해내면 자신의 Loss를 줄일 수 있게 되고, 해당 샘플만을 생성하게끔 학습하게 되는 상황이 생기게 됩니다.
이렇게 모든 값들을 찾아내는 것이 아닌 하나의 값에 함몰되어 버리는 것을 모드 붕괴(Mode Collapse)라고 합니다.
이외의 문제
이외에도 Loss 함수가 두 가지 변수로 이루어져 있기 때문에 이러한 Loss의 최적해를 어떻게 찾을 수 있는지에 대한 문제나, Generator로 생성한 이미지를 어떻게 평가할건지 등, GAN을 학습하기가 상당히 어렵다고 알려져 있습니다.
참고자료
https://arxiv.org/pdf/1703.10593.pdf
딥러닝 GAN 튜토리얼 - 시작부터 최신 트렌드까지 GAN 논문 순서 | mocha's machine learning