This Will Change the Way You Look at GANs - 리뷰

2020. 1. 7. 22:47관심있는 주제/GAN

이 글에서는 GAN에 대해서 2차원적 데이터 분포를 사용하여서 나오는 현상에 대해서 잘 설명된 글이라서 번역하고자 한다. 


GAN 기술의 기본 전제는 간단하다. 
2가지 네티워크 (generator , discriminator)는 나란히 훈련시킨다. 
discriminator는 training data로부터 진짜 샘플과 generator로부터 만들어진 가짜 데이터를 보여준다. 
그리고 가짜와 진짜를 분리하는 일을 맡는다.
generator는 동시에 가짜 데이터를 만들면서, discriminator가 이 가짜 데이터를 진짜로 믿게 만드는 것이다.
generator는 다양한 결과물을 만들 수 있다. 왜냐하면 인풋이 random noise로부터 만들어지기 때문이다.
통상적으로 100차원의 정규 분포를 이용한다.

이러한 관점에서 generator는 몇몇의 latent space에서 샘플 space르 mapping 하는 관점으로 볼 수 있다.
그리고 discriminator는 실제 분포와 생성된 분포 사이의 샘플 공간 사이의 divergence를 측정하는 도구로 불 수 있다.

그러나 GAN은 악명 높게도 훈련하기 어렵다.
mode collapse, failure to converge, cycling, and many other issues 사이에서 GANs는 많은 고장 위험이 있고, 매우 까다롭기로 유명하다.

GAN 훈련의 핵심 아이디어는 generator는 진짜 같은 샘플을 만들고 discriminator는 generator가 문제가 있다고 말하는 것이다. generator를 잘 학습시키기 위해서, discriminator는 표본 영역의 각 점을 실제 표본이 될 확률에 매핑할 수 있어야 한다.

이것은 꽤 간단해 보이지만, 그것은 학습에 있어서 매우 복잡하다.
GAN 학습의 복잡성을 설명하기 위해서 매우 간단한 문제의 훈련 과정을 시각화해줬다 (굳)

왼쪽 INPUT SPACE , 오른쪽 TARGET Function

input space는 latent space로 일컬어진다. output space는 sample space로 불린다.

그래서 당면한 과제는 이 나선형 분포에서 점을 발생시킬 수 있는 GAN을 훈련시키는 것이다. 원래 함수의 자유도는 2도이므로, GAN에는 2D 랜덤 노이즈를 입력으로 부여한다.


The Solution?

600 steps을 훈련시켰다. 각 step에 대해서 시각화하였다. 
generator와 discriminator 둘 다 fully connected에 leaky relu로 하였다고 한다. 둘 다  learning 은 0.001 
둘 다 adam , default parameter 

Top Left: Accuracy and

Loss

두 loss 다 log(0.5) = 0.69 정도를 가진다. 이것은 discriminator가 확신을 못한다 의미이다.
generator는 얼마나 discriminator를 멍청하게 했느냐에 대한 정확도는 100% , 100%로 다시 돌아오기 전에 때때로 0%로 떨어진다.

Top Right: Real and Fake Samples

모든 training step 후에 실제 분포(파란색)와 생성된 분포(빨간색)를 시각화했다. 
보듯이, 대부분의 스텝에서 generator 결과물은 사정거리 주위에서 춤추는 아주 작은 지역으로 줄어들었다.
특히 red output 작은 덩어리는 generator 정확도가 감소하거나 loss가 커질 때까지 꽤 머무는 것을 알 수 있다.
이때 적색 출력 덩어리는 해당 범위의 다른 부분으로 날아가게 된다.

Bottom Left: Latent Space Discriminator Output

latent space에서 각 포인트의 discriminator output을 나타낸다. 
진한 블루는 discriminator 가 명확히 진짜라고 간주하는 것을 의미하고,  진한 레드는 명확히 가짜라고 간주한다.
그리고 하얀색은 discriminator는 잘 모르겠다는 것을 나타낸다. 
다시 말하자면, 해당 공간에서 각 포인트는 genetor를 거치고 그 후에 discriminator로 거친 값이다.
그래서 패널은 generaotr는 latent space의 각 부분을 실제 출력에 매핑하는데 얼마나 효과적인지를 보여준다.

Bottom Right: Sample Space Discriminator Output

이 패널은 left panel과 매우 유사한다. 대신 이것은 latent space가 아니라 sample space에서 시각화한 것이다.
색깔은 discriminator의 진짜라고 신뢰하는 정도를 의미한다. 


So What’s Going on Here?

위의 Gif에서 볼 수 있는 것은 간단히 말해서 mode collapse이다.
generator 결과물은 샘플들의 아주 작은 영역으로 집중되어 있고, 이 표본들은 그 discriminator가 진짜일 가능성이 높다고 생각한다.
discriminator가 이 영역에서 대부분의 점들을 가짜라고 인식할 때, generator는 discriminator가 진짜라고 생각하는 영역인 다른 영역으로 이동해버린다. 이것은 bottom right panel에서 알 수 있다. 파란 영역들은 discriminator가 진짜라고 생각하는 영역이다. 
결과적으로 generator는 그 영역에 대해서 샘플들을 생성하게 된다.
위의 bottom right panel에서 가장 진한 파란 영역으로 커서를 움직여보라. 너의 커서와 
red blob in the top right panel가 같은 trajectory를 따르는 것을 알 수 있다.

당신은 아마 generator가 target function을 학습하기 위한 capacity를 제대로 학습하지 않았다고 생각할 수 있다.

또한 당신은 discriminator가 target function을 학습하는데 capacity를 제대로 학습하지 못했다고 생각할 수 있다.

그러나 여기 그림 3의 하단 오른쪽 패널과 유사한 목표 기능과 균일한 소음 사이의 의사결정 경계를 학습하는 차별자의 시각화가 있다.

Figure 5: An animation of the discriminator learning the relative probabilities of a point being produced by the target function (blue) or merely uniform noise (red) through supervised classification.

마지막으로 너는 GAN이 해결을 위해 수렴하는 시간이 단지 필요하다고 생각할 수도 있다.

안타깝게도, 몇천 번의 훈련 뒤에도 GAN은 정확히 600 steps과 같은 행동을 하고 있다.

Figure 6: a GAN in the throes of mode collapse (artist’s impression, source:  Giphy )


핵심 문제는 discriminator의 현상에 대한 오해이다.

GAN 논쟁에 있어서,
discriminator는 전형적으로 주어진 샘플이 가짜 또는 진짜 인가로 예측하는 것이라고 설명된다.
실제로 discriminator가 하는 일은 주어진 실제 데이터셋으로부터 온 것인지  generator로부터 생성된 것인지를 예측하는 것이다.

차이가 모호할 수 있는데, 아래 그림을 보면 도움이 될 것이다.

Figure 7: the target distribution (blue, both) vs uniform noise (red, left) and generator output (red, right)

왼쪽, 

2가지 classes를 볼 수 있다. 실제 샘플 (파란색) 랜덤 노이즈 (빨간색) 
각 지점에서 각 클래스의 상대적 확률을 파악하면 매우 좋은 discriminator가 된다.
(실제로 이것은 figure 5에서 훈련된 discriminator다)

오른쪽

2가지 클래스가 있다. 실제 샘플(파란색) 생성물(빨간색) 이 데이테에서 훈련된 discriminator은 쓸모없다. 
그것은 작은 적색 영역 내의 어떤 샘플도 geneator에 의해 생산될 가능성이 있는 반면,
그 지역 이외의 어떤 샘플도 실제 샘플이 될 가능성이 있다고 결론 내릴 것이다.

이것에 의해서 추정한다면, discriminator는 그 영역에서 샘플을 본 적이 없음에도 불구하고 범위의 모서리에 있는 점들도 아마도 실제 표본일 것이라고 결정한다. 이것은 generator를 극단적인 영역들로 생성하게 만든다.
결국, 이 discriminator는 이 새로운 지역이 대부분 가짜였다는 사실을 깨닫지 못한 채 모든 가짜 포인트가 될 수 있다는 것을 알게 된다. 왜냐하면 가짜 포인트는 더 이상 거기서 만들어지지 않기 때문이다.


A Better Solution

mode collapse 문제에 대해서 많은 연구가 있었고, 그것을 한 가지 기사에 모두 넣을 방법이 없다.
몇 가지 학습 성능에 도움이 되는 트릭을 말하려고 한다.

decreasing the generator learning rate and the β1 parameter of the Adam optimizer.

In the original training procedure (figure 3), I used a learning rate of 0.001 for the generator.
------> I repeated the process using a learning rate of 0.0002 and reducing β1 from 0.9 to 0.5

generator는 샘플 space를 더 많이 탐험할 수 있게 되었다. 그래서 discriminator를 더 유익하게 만들게 한다.
만약 600번 학습 대신에 600000번 학습하면 다음과 같다.

당신도 봤듯이,  the discriminator (bottom right panel)는 figure3보다 훨씬 더 유용한 상대적인 분포를 학습할 수 있게 된다. 그리고 더 효과적인 생성기를 만들게 된다. (top right panel)
bottom left panel에서는 latent space에서 generator가 discriminator를 멍청하게 하는 샘플로 맵핑하게 하는 것을 실패하는 것과 진한 빨간 수직선들(generator가 spiral 음의 영역들에 대해서 mapping 되는 점) 2개의 영역을 볼 수 있다. 


애니메이션은 그림 2의 매끄러운 함수와 달리 이 두 지역에서 매끄러운 latent space가 잘려 있음을 분명히 보여주고 있다. latent 공간에서는 서로 가깝지만 선의 반대편에 있는 점들은 표본 공간에서 서로 매우 멀리 떨어져 있다.
라인의 점들은 그 사이의 어딘가에서, 대부분 목표 분포의 바깥쪽으로 떨어진다.
가장 간단한 해결책은 하나의 치수가 나선형(길이)을 따라 위치와 일치하고 다른 치수는 나선형(폭) 내의 측면 위치인 반면, GAN은 대신 극단적인 등고선을 포함하는 일부 국소적 최소치 안에 갇혔다.
이것은 GANs와 공통적인 문제인데, 우리가 유사하다고 생각하는 특징들은 잠재된 공간과 그 반대의 영역 들일 수 있다.

GAN.compile(Adam(learning_rate=0.0002, beta_1=0.5),
                        loss='binary_crossentropy',
                        metrics=['accuracy'])
D.compile(Adam(learning_rate=0.001, beta_1=0.5),
                        loss='binary_crossentropy',
                        metrics=['accuracy'])

 

https://towardsdatascience.com/this-will-change-the-way-you-look-at-gans-9992af250454

https://github.com/ConorLazarou/medium/blob/master/12019/visualizing_gan_spiral/main.py

 

 

728x90