본 리뷰는 GAN에 대해서 공부하는 과정입니다.
GAN은 생성자 VS 판별자 형식의 매우 특이한 알고리즘으로 고성능을 기록한 생성형 모델로 알고있는데, GAN은 아무것도 없는 노이즈 상태에서 무언가를 생성하려는 시도로 또한 볼 수 있다. (비모수적 추정)
생성자 G 와 판별자 D 의 동시학습(Simultaneously Train)이 GAN의 핵심 아이디어
생성자 G
원본 데이터의 분포를 모방함
판별자 D
생성자 G가 생성한 데이터에 대한 진위 판별
G의 목표는 , 원본 데이터의 분포를 매우 잘 학습하여 D의 판별능력이 50%가 되도록 (찍어서 맞추는 것과 동일하게) 하는 것!
GAN 이전의 딥러닝 기반 생성 모델은, 최대우도추정법(Maximum Likelihood Estimation)과 같은 방식으로 계산하기 어려운 확률적인 문제들 때문에 당시에 복잡한 문제들을 쉽게 대응할 수 있게 만들어준 piecewise linear unit 들을 사용하기 어려웠다.
Piecewise linear unit
-> Activation function의 일종으로, 일반적인 ReLu와 같은 Function들 처럼 하나의 지점을 기준으로 가르는게 아니라, 여러 구간에서 복합적인 함수를 적용하게 함으로써 네트워크가 복잡한 함수를 모델링하고 더 복잡한 데이터 패턴을 학습할 수 있게 하는 것.
이전의 VAE만 봐도, 상당히 어려운 방식과 말도 안되는 계산적 트릭을 활용해서 억지로 원본 데이터 분포를 추정하는 것을 알 수 있다 .
본 논문의 저자들은 Adversarial net(적대적 학습 네트워크) 이라는 프레임워크를 제안한다.
이 Adversarial net 은 모두 다중 퍼셉트론 구조로 되어있기 때문에, back prop 과 optimization, dropout 또한 쉽게 적용할 수 있다.
적대적 네트워크의 구조는 위와 같다.
Generator 로는 랜덤한 노이즈(p_z)가 인풋으로 들어간다. 그리고 MLP 구조인 Generator 는 해당 노이즈를 G(for Generator) 라는 공간으로 맵핑시킨다. (이때 이 공간은 학습가능한 파라미터를 가지고 있다.)
또한 Descriminator 를 학습시키는데, discriminator 는 G에서 나오는
데이터를 인풋으로 받아 어떤 스칼라 값을 뱉는다.
해당 스칼라 값은 그 데이터가 실제 원본 데이터에서 왔는지, Generator 로부터 왔는지를 판단하는 수치이다. (1~0)
Generator 는 log(1-D(G(z)) 를 최소화 하는 방향 으로 학습된다.
To Minimize " log(1-D(G(Z)) "
-> 1-D(G(z)) 가 0 에 가깝도록 == D의 output scalar 가 1에 가깝도록
==>> 즉, D가 생성한 데이터를 진짜 데이터처럼 생각할 수 있도록
그래서, GAN의 목적함수는 다음과 같다.
V stands for value
G의 최소화, D의 최대화를 동시에 이룬다.
앞 항
x 를 원본 데이터에서 뽑는다고 했을 때, Descriminator 의 scalar값의 기댓값
뒤 항
노이즈로부터 샘플링하여 얻은 Generator 가 얼마나 잘 속였는지에 대한 기댓값
여기에서, 저자들은 D를 완전히 최적화 시키는 것은 오버피팅의 문제가 있고 계산적으로 비효율적이기 때문에 D와 G를 순차적으로 최적화 시키는 과정을 밟아 D는 최대치에 근사하게 유지되게 하고 G가 천천히 나아질 수 있도록 한다.
검은 점선은 데이터, 파란 선은 D, 초록색 선은 G
그래서 결과론적으로 위와 같은 과정을 밟게된다.
z라는 노이즈에서 주는 값들을 기반으로 Generator 는 분포를 형성하고 초반에는 discriminator 가 잘 판별을 하지만, 점점 갈수록 1/2에 값이 근사하며 판별하지 못하는 것을 볼 수 있다.
GAN은 비모수적인 방법으로, 원본 데이터의 분포를 모델링 할 수 있다. 이 말은 즉슨, 원본 데이터에 대한 통계적인 가정을 하지 않고, 분포를 찾아간다는 말이다.
비모수적 방법을 사용하면 파라미터의 수를 고정해놓지 않고 학습을 진행하기 때문에, 계산 효율성이 데이터에 따라 많이 떨어질수도 있지만, 복잡한 데이터의 분포를 모델링하기에 보다 적합하다.
GAN 논문의 저자들은, 위에서 보인 목적함수와 함께 GAN이 이론적으로 어떻게 Generator 의 생성이 원본 데이터와의 분포차이를 줄일 수 있는지를 보여준다.
1 -> 최적화 과정을 통해 generator 분포의 전역 최소값이 data 실제 분포의 전역 최소값에 근사하게 됨
2 -> GAN에서 제시하는 알고리즘으로 최소값에 다다를 수 있는지 (효과적인지에 대한 증명)
G가 고정된 상태를 가정하고, 아래의 목적함수를 보자.
여기에서 기댓값을 적분으로 표현하면 다음과 같다.
이때, 이 Z 도메인에서 샘플링된 노이즈 벡터 z를 Generator에 넣어서 데이터 x를 만들어낼 수 있기 때문에 위와 같이 표현된다.
이때 위의 식은 아래의 법칙을 따르기 때문에,
value가 최대가 되는 값은 아래의 값이 된다.
그 다음, 저 V의 값을 최대로 만드는 D에 대한 V의 함수를 가정한다. 특정하게 고정된 (위에서 가정) G에 대해서 global optimal을 가지고 있는 D에 대한 V이다.
해당 함수를 풀어서 위에서 말한 D의 최댓값을 대입하여 정리하면,
KLdivergence 의 식으로 정리되어 분포의 차이로 정의될 수 있다.
(JSD는 두 분포의 차이를 거리로 표현하는 식이다 - distance metric이기 때문에 최솟값이 0)
global optimal은 즉 p_data == p_g 일때로 정의된다. (두 분포의 JSD값이 0일때)
V(G,D) = U(P_g,D)
: 목적함수를 G를 거친 데이터들의 집합(분포)에 대한 목적함수로 새롭게 정의
: 수학적으로는 동일함
: 목적함수 U는 p_g에 대해 convex 하므로, p_g의 정의역에서 전역 최솟값을 가짐
: 고차원 데이터를 다루고 있기 때문에, 상한 부도함수(subderivatives, 해당 함수 모든 점에서의 최대 기울기 집합, 볼록함수는 모든 점에서 증가하기 때문에 상한 부도함수중 하나가 볼록함수의 도함수가 될 수 있음)를 사용
-> 이는 결국, p를 최적화 하는 과정이 목적함수 U(p_g,D)를 최적화 하는 것과 같은 과정임을 알 수 있음
https://jamjamzo.tistory.com/77
https://www.youtube.com/watch?v=AVvlDmhHgC4&t=190s
https://velog.io/@jiyeong3141592/GAN-%EA%B8%B0%EC%B4%88
https://tobigs.gitbook.io/tobigs/deep-learning/computer-vision/gan-generative-adversarial-network