[GAN study] CycleGAN (Playing magic with pictures)
Gan 학습 로드맵 네 번째 시간입니다!😁😁
오늘은 GAN의 퍼포먼스를 어떻게 측정하는지 알아보는 시간을 가지려고 합니다.
이 글은 Jonathan Hui의 포스팅을 참고해 정리한 내용입니다!
많은 GAN 연구들은 모델의 수렴과 모드의 붕괴에 초점을 맞추고 있습니다. 우리는 어떻게 해야 효율적으로 문제를 풀 수 있는지 모르는 게임 이론에 대해 다루려고 합니다.
GAN은 영역을 교차하는 점에서 재미있습니다. CycleGAN을 살펴보면, CycleGAN은 스타일을 이미지로 전송합니다.
당신은 세 세트의 그림을 수집했다고 해봅시다. 하나는 실제풍경, 하나는 모네그림, 마지막 하나는 반 고흐입니다. 실제 사진을 찍어서 모네나 반 고흐의 스타일로 바꿀 수 있나요? 아니면 반대로, 모네의 그림을 실제처럼 보이게 할 수 있나요?
그림을 여름에서 겨울로 바꿀 수 있나요?
게다가, 이 이미지들은 세트가 아닙니다. (모네의 그림에 나온 장소와 일치하는 실제 장소 이미지가 없다..!! 그렇다면 위 이미지의 실제 이미지는 그림을 실제처럼 생성한 가짜 장소라는 거네요?!)
이렇듯 CycleGAN은 모네의 그림들의 스타일을 전체로 학습하고, 다른 타입의 이미지에 적용합니다.
CycleGAN
GAN을 존재하는 디자인에 적용한다는 개념은 매우 간단합니다. 원본 문제를 간단한 이미지 구축으로 다룰 수 있습니다. 깊은 네트워크 G를 이용해 이미지 x를 이미지 y로 전환하게 됩니다.
그 다음엔 이 프로세스를 다른 깊은 네트워크 F를 이용해 똑같이 반대로 진행해 이미지를 재건축합니다. 그렇게 되면 Mean Square Error(MSE)를 이용해 G와 F를 학습하는 가이드로 사용합니다.
하지만, 우리는 이미지를 재구축하는 것이 아니라 특정 스타일과 유사한 이미지 y를 생성
하려고 합니다.
따라서, GAN에서는 기존의 네트워크 구조에 구분자(Discriminator) D를 추가해 생성자 네트워크가 성능을 더 잘 내도록 가이드 합니다. D는 학습 샘플(실제이미지)과 생성된 이미지 사이에서 비평가 역할을 합니다. 이 평가를 통해 판별자가 식별한 단점을 해결하는 이미지를 생성하도록 생성자를 수정하기 위해 역전파를 사용합니다.
이 문제에서, Y가 반고흐 그림과 유사하다고 구분자 D에게 소개하게 됩니다.
네트워크 구조
CycleGAN은 이미지를 한 영역에서 다른 영역으로 전이합니다. 이미지를 실제 이미지에서 반고흐 그림으로 변환하는 것이라고 생각하면 됩니다. 우리는 세개의 네트워크를 만들게 됩니다.
-
생성자 G (실제이미지를 반고흐 스타일 그림으로 바꾸는 네트워크)
-
생성자 F (반고흐 스타일 그림을 실제 이미지로 바꾸는 네트워크)
-
구분자 D (실제 이미지인지 생성된 반고흐 그림인지 판별하는 네트워크)
역방향에서, 단순히 데이터 흐름을 반대로 하고 구분자 Dx를 추가해 실제 이미지를 판별하도록 합니다.
Cost Function (비용함수)
GAN을 학습한다는 것은 GAN없이 구조를 학습하고 생성자와 구분자를 위한 adversary loss를 되돌려 놓는것과 같습니다.
*adversary loss
=> Generator로 하여금 진짜처럼 보일 정도로 사실적인 가짜 이미지를 생성하도록 학습 알고리즘
먼저, 재구축 비용을 결정합니다.
- 아래는 Cycle consistency loss로 실제이미지(x → y → 재구축된 x)와 모네 그림(y → x →재구축된 y)의 L1-norm 재구축 비용을 측정합니다.
$L_{cyc}(G,F)=~E_{X\sim P_{data}(x)}[\parallel F(G(x))-x \parallel_1]+ ~E_{y \sim p_{data}(y)}[ \parallel G(F(y))-y \parallel 1]$
그 다음엔 생성자와 구분자를 위해 adversary loss를 추가합니다.
- Adversary loss
$L_{GAN}(G,D,X,Y)$
$For ~G, ~minimize \quad E_{x\sim p_{data}(x)}[(D(G(x))-1)^2]$
$For ~D, ~minimize \quad E_{y\sim p_{data}(y)}[(D(y)-1)^2]+E_{x\sim p_{data}(x)}[D(G(x))^2]$
다음은 최종 함수 수식입니다.
$L_{GAN}(G,F,D_X,D_Y)=L_{GAN}(G,D_Y,X,Y)+L_{GAN}(F,D_X,Y,X)+\lambda L_{cyc}(G,F)$
CycleGAN은 구분자를 훈련하기 위해 마지막으로 생성된 50개의 이미지 이력을 유지합니다. 구분자와 생성자는 스스로 과적합되어 모드 붕괴로 이어지는 greedy optimization의 루프에 빠질 수 있습니다.
따라서, 구분자가 현재 생성자를 이기는데 지나치게 열성적이지 않도록 경험을 리플레이 합니다. (너무 이기려고 해도 모델이 생성되지 않겠죠?!) 결국엔, 보다 일반화된 솔루션을 만들기 위해 마지막 50개의 생성자를 이겨야 합니다. (마지막 50개만 이기는 정도로 만드는 걸까요? 모든 생성된 이미지를 판별해 버린다면 문제가 생기기 때문인것 같습니다.😓)
오늘은 CycleGan에 대해 알아보았는데, 생성자 2개를 사용해서 역방향으로도 학습을 시킨다니 발상의 전환이네요! 이런 발상이 더 좋은 네트워크 구조를 만드는 것 같습니다. 😺😺 항상 신선한 생각을 유지하도록..! 해야겠어요 ㅎㅎ 오늘도 화이팅~
댓글남기기