[Survey]Adversarial Autoencoders

8990 단어 DeepLearning
Adversarial Autoencoders
본고의 목적은 학습 방법을 제시하여 autoencoder의latentcodevector를 임의로 분포할 수 있도록 하는 것이다.
adversarial autoencoders에 관한 논문은 다음과 같은 3편이 유명하고 각 사이트에 설명이 있기 때문에 이번에는 상세한 설명을 생략하고 싶습니다.
  • Generative Adversarial Nets
  • Adversarial Autoencoders
  • Unsupervised Representation learning With Deep Convolutional Generative Adversarial Networks
  • 첫 번째 논문에 대해 아래 사이트는 매우 상세하고 Tensorflow의 실시도 실렸다.
    http://evjang.com/articles/genadv1

    Adversarial autoencoders


    다음 그림은 Adversarial autoencoders의 상자도와 학습 절차를 보여 줍니다.
    위쪽은 autoencoder입니다.자동encoder는 입력 데이터의 차원을 압축(encode)하고 복원 처리하며 원시 입력과 같은 권한을 최대한 학습합니다.학생들에게 autoencoder를 배워서 autoencoder의latentcodevector$z$의 분포 $q(z)$와 임의의 분포 $p(z)$를 같게 합니다. $q(z)$와 $p(z)$가 비슷한지 판단하는 것은 Discriminator의 역할입니다.autoencoder가 $q(z)$와 $p(z)$를 같게 하는 것을 배울 수 있다면, $p(z)$를 임의로 분포하여 생성한 $z$에서 Decoder를 입력하고, $x$를 입력하지 않아도 $x$와 비슷한 데이터를 생성할 수 있습니다.

    최적화 공식은 다음과 같다.
    여기 $D$는 Discriminator 모델, $G$는 Generator 모델, $p_{data}$는 임의로 분포되며, $p(z)$는Generator에서 생성한 $z$의 분포입니다.
    학습은 아래와 같이 진행한다.
    1. Discriminator를 학습하여true sample(분포된 모든 데이터)와fake sample(Generator에서 생성된 데이터)를 잘 분리할 수 있도록 합니다.다음 공식의 첫 번째 항목이 진sample일 때 1이라고 하면 값이 커집니다.두 번째 항목은fakesample($G(z)$)일 때 0을 말하면 값이 커집니다.합친 것을 최대 $D$로 하면 진짜 샘플과 가짜 샘플은 잘 분리될 수 있습니다.
    2. Generator는 Discriminator를 속이는 법을 배운다.Discriminator를 잘 속이면 $D(G)$1입니다.따라서 다음 공식을 $G$로 최소화하면 Discriminator를 잘 속일 수 있습니다.

    NIST 데이터를 실제로 학습할 때는 다음과 같은 구조를 사용합니다.기본적으로 변화가 없지만 Discriminator의 데이터는 0인지 1인지...9의 one hot vector라고 표시합니다.

    Result


    이미 많은 Adversarial autoencoders 코드를 공개했지만, 나 자신도tensorflow로 실현하고 학습해 보았다.(이미 몇 번 부칠지 모르겠어...)
    설치할 때 아래 코드와 사이트를 참고했습니다.
    http://musyoku.github.io/2016/02/22/adversarial-autoencoder/
    https://github.com/takerum/adversarial_autoencoder
    https://www.reddit.com/r/MachineLearning/comments/3ybj4d/151105644_adversarial_autoencoders/ ?

    implementation


    네트워크 구조와 학습 파라미터는 다음과 같다.
    ・ Encoder, Decoder, Discriminator 모두 3layer network
    ・ 모든 네트워크의 hidden layer 유닛 수 1000
    ・ Encoder는 first, second layer에서 ReLU를 사용하는데, last layer는 아무것도 없습니다.
    ・Decoder는first,secondlayer에서ReLU를 사용하고,lastlayer에서sigmoid를 사용합니다.
    · Discriminator는 first, second, last layer에서 ReLU를 사용합니다.
    · Latent code vector는 2차원
    ・100epoch
    ・batch size100
    · Batch 정규화, weight decay 없음
    Optimizer는 Adam입니다.
    · Learning rate, autoencoder와generator는 0.001, discriminator는 0.0002
    ・generator의 학습 횟수만 2배 증가했습니다.(autoencoder,discriminator,generator 순서대로 공부하면 공부가 잘 안 끝나서 autoencoder,discriminator,generator,generator로 느껴져요. 정말 이게 좋은지 모르겠어요...)
    · autoencoder가 먼저pre-training을 진행했습니다.
    실제 학습의 결과는 다음과 같다.

    10 2D Gaussian


    NIST의 0-9개 데이터를 10개의 2차원 고스 분포로 밀어넣습니다.

    모든 epoch의 $q (z) $의 분포를gifanimation으로 설정하려고 합니다.qitta의 이미지 크기가 1M 이상이면 압축되고gifanimation은 움직이지 않기 때문에 160x160으로 조정됩니다.너무 작아서 왠지 잘 모르겠어요.

    decoder에서 $p (z) $를 입력할 때의 모든 epoch의 출력 결과는gifanimation입니다.




    swiss roll


    NIST의 0-9개의 데이터를 2차원 swiss roll 분포에 밀어넣습니다.

    모든 epoch의 $q (z) $의 분포를gifanimation으로 설정하려고 합니다.

    decoder에서 $p (z) $를 입력할 때의 모든 epoch의 출력 결과는gifanimation입니다.




    마지막


    반복적인 실험을 거쳐 학습이 마침내 끝났다.나는 각양각색의 사람들의 설치를 참고하면서 만들었기 때문에 마침내 방법이 생겼다. 그러나 나는 처음에 이것을 설치한 사람이 매우 대단하다고 생각한다.실시 후의 소감으로는 잘 수렴하기 어렵다.세 개만 순서대로 공부하면 되는 게 아니라 세 개의 균형이 중요하다고 생각해요.방금 만들어서 코드가 엉망진창이라 정리하고 Github에게 주고 싶어요.
    code

    좋은 웹페이지 즐겨찾기