Tuesday, January 16, 2018

논문 요약 - Spectral normalization for generative adversarial networks




ICLR 2018 제출 논문입니다 (링크). 최초로 단일 네트워크로 이미지넷 1000개 범주의 이미지를 생성한 방법입니다. Chainer 프레임워크를 사용했고 아마 일본에서 나온것으로 보입니다.아이디어도 실험도 좋고, 글쓰기도 모두 훌륭합니다. icrl리뷰에서는 7점과 8점을 하나씩 받았는데 저는 좀 박한 점수라는 생각이 드네요.

1 Introduction

이 논문은 Spectral normalization이라는 GAN 학습 방법을 소개합니다. 다른 방법 대비 두가지 장점이 있습니다. 
  • Lipschitz 상수만 튜닝하면 되고 이마저도 그렇게 열심히 튜닝 안해도 됨.
  • 구현이 간단하고 연산량이 낮음.

2 Method

식(1), (2): 일반적인 GAN 식입니다.

"The machine learning community has been point out.."
WGAN등 최근 GAN 학습 관련 연구를 보면 적절한 discriminator제안한 논문이 많습니다. 이를 자세히 보면 hyperparameter space에서 loss function의 gradient surface를 '부드럽게' 만들어주는 방향입니다. WGAN 논문에 나온 그림을 보면 쉽게 이해할 수 있습니다. 


좌측이 WGAN에서 제안한 방법입니다. $\theta$가 정답에서 멀어지면 그에 비례하는 loss를 갖습니다. 반면 우측은 그렇지 않죠. 이렇게 해야 최적 hyperparameter가 아닌곳에 있을 때 최적값으로 수렴하겠죠. 이를 수학적으로 표현한것이 Lipschitz continuity입니다. 쉽게 이야기하면 함수가 미분이 가능하고 미분값(의 절대값)의 범위가 어느정도 이하로 제한된다는 의미입니다(제가 딱 거기까지 알고있음). (Yehara 2016, Qi 2017, Gulrajani 2017) 등이 모두 여기에 주목한 논문입니다. 

"While input based regularization allow for relatively ..."
기존 연구는 학습 데이터의 내분점에서는 작동하지만 그 밖의 지점에서는 작동하지 않는다고 합니다. (왜일까요?) 하지만 spectral normalization은 그렇지 않음! 


2.0 잠깐 개념 정리!

(물론 논문엔 이런 섹션 없습니다.)

  • 행렬 ${A}$의 spectral norm: 행렬 ${A}$의 가장 큰 singular value, $\max_i(\lambda_i)$ 입니다. 즉 ${A}$를 SVD했을때 나오는 값 중 가장 큰 값이죠. 
  • 행렬의 singular value $\lambda_i$는 단위벡터 $u$를 행렬에 곱했을 때 이 단위벡터가 이런저런 방향으로 늘어나는데, 이 늘어나는 정도를 나타내는 값입니다. 위키피디아에 gif로 잘 나와있습니다.
    • Deep learning book 챕터 6.5를 보면 행렬의 singular value와 loss function의 Jacobian에 대해 자세히 나옵니다.
  • Supremum: 어떤 집합의 least upper bound입니다. 대애애애애애충 상한선으로 생각합시다. $\sup A$ 로 표기합니다.

2.1 Spectral normalization

제안하는 방법은 말그대로 discriminator $f$의 레이어 $g$의 spectral norm을 조절합니다. 우선 위에서 Lipschitz에 대해 간단히 설명했는데, Lipschitz norm $||g||_{Lip}$은 $g$의 그라디언트의 spectral norm입니다. 즉 hyperparameter space에서 그라디언트의 방향 (즉, 어떤 점 $\theta'$에서 gradient descent를 수행하면 일어나는 변화 중 가장 변화가 큰 방향)입니다. 이걸 수식으로 쓰면 식 (6)입니다.  각 레이어에서는 행렬곱과 activation이 일어나죠? 여기에서 행렬곱만 보면 ($g(\mathbf{h})=W\mathbf{h}$) Lipschitz의 정의와 식(6)에 의해 $|| g ||_{Lip} = ... \sigma{W} $가 성립합니다. 다시 말해 각 레이어에서 행렬곱부분의 Lipschitz norm은 각 레이어의 행렬 $W$의 spectral norm (=제일 큰 singular value)입니다.

그리고 (각주 1 참고) ReLU, LReLU등 activation 함수의 Lipschitz norm은 1이구요.

그리고 합성함수의 Lipschitz norm은 각 함수의 Liptschitz norm의 곱보다 작다는 부등식이 성립한다고 합니다. Lipschitzs norm을 '기울기의 최대값'으로 생각하시면 직관적으로 이해가 가능합니다. (..아마도요.)

따라서 식 (7)이 성립합니다. 식 7은 뉴럴넷 $f$의 전체 Lipschitz norm이 각 레이어의 행렬 $W^l$의 spectral norm의 곱보다 작다는 (upper bounded by) 의미입니다.


제안하는 방법은 각 행렬 $W$를 $\sigma{W}$ (spectral norm)으로 나누자는 말이구요 (식 8). 이렇게 하면 전체 뉴럴넷의 Liptschitz norm이 1보다 작아지겠죠?

마지막 문단에서는 Yoshida & Miyato (2017)의 방법보다 이 방법이 좋은 점을 설명하고 있습니다. (제가 비교 논문을 정확히 알지 못해 생략합니다. 대략 제안하는 방법이 더 직접적으로/명시적으로 spectral norm을 조절해준다는 내용입니다.)

2.2 Fast approximation of the spectral norm

각 행렬을 SVD를 돌리는건 너무 느리구요, 그래서 'power iteration method'라는걸 써서 구합니다. 부록 A와 알고리즘 1에 정리되어있습니다. (세부내용 생략)

식 (9, 10)을 거쳐 (11, 12)로 넘어옵니다. 자세히는 안봤..아니 못봤..습니다. 식 (12)가 결론인데, 여기에서 두번째 항 $-\lambda \mathbf{u}_1 \mathbf{v}_1^T$가 조절 전 행렬 W의 singular value를 $\lambda$만큼 빼는 연산입니다. $ \mathbf{u}_1 \mathbf{v}_1^T$은 원래 행렬에서 첫번째 singular vector(즉, 가장 scaling이 크게 일어나는 방향)를 나타내는 행렬이 되는데 이걸 보정해주는거죠. 따라서 레이어에서 일어나는 연산이 너무 한가지 방향으로만 급격하게 변하는것을 막아줍니다.

3 Spectral normalization vs Other regularization techniques

일단, 여기에서 주로 비교하는 기존 알고리즘을 제가 잘 몰라서 본문의 텍스트에 의존해 다소 피상적으로 설명하겠습니다.


  • vs Weight Normalization (WN), Salimans & Kingma (2016): $W$의 각 행을 $l_2$-normalization한다. (라고 써있는데 식을 보면 각 행의 제곱의 합을 normalize하는거에 더 가까운것 같기도?)  
    • ==> singular value $\lambda_i$의 제곱이 행의 개수와 같아지게 하는 효과
      ==> 전체 행렬의 Frobenius norm을 1로 만드는거랑 같다 (1이 아니라 다른 상수일 뿐)
      ==> 의도한것 이상의 부작용이 존재한다
      ==> (제가 정확히 파악못한 모종의 효과에 의해) 첫번째 singular value 벡터빼고 나머지의 크기가 0에 가깝게 수렴하게 된다
      ==> (각 레이어의) 입력 중 1개만 이용한다 ($W$의 rank가 1이 됨)
    • 위의 문제는 WGAN에서 weight clipping에서도 존재함.
    • Spectral normalization엔 그런 문제 없음 (데헷)
  • vs Orthonormalization regularization, Brock 2016
    • 식 (14)를 최소화하도록 함
      ==> $W^T$와 $W^{-1}$이 비슷해지도록
      <==> $W$가 orthonormal해지도록 (위키 참고)
    • 이렇게하면 모든 singular value가 0이 됨
      ==> 즉, $W$가 아예 다른 행렬이 되어버림.
  • vs Gradient Penalty, GP (Gulrajani 2017)
    • 일단 제일 괜찮은 방법임!
    • 가장 직접적으로 Lipschitz constant를 조절함
    • 단점: 연산량이 많음, ? (+"an obvious weakness of being.." --> 이해 못함)

4 Experiment

일단, 이 뒤로는 설명 생략합니다. 

Inception score로 평가했습니다. pre-trained classification model에 GAN이 만든 이미지를 입력해서 나온 결과(10개 혹은 1000개 클래스의 확률분포)와 (라벨링이 된) 원래 이미지를 넣었을때 나온 결과(=역시 확률분포)의 유사도를 KLD로 측정하는 방법입니다.

위에서 말한대로 특정 클래스에 치우치는 문제가 덜 발생했고, 그 결과 이미지넷 1000개 클래스에 전부 유의미한 이미지를 만들어냈습니다. 

- 끝 -




No comments:

Post a Comment