티스토리 뷰

▶GAN(Generative Adversarial Networks)

지난 글 마지막에 Autoencoder의 성능이 좋지 못해 그 대안으로 나온 네트워크들이 있다고 했었습니다.

오늘은 그 중에서 GAN(Generative Adversarial Networks)에 대해 알아보겠습니다.

1. GAN 왜 나온건데?

 Autoencoder 복습

 

  • 차원 축소의 한 방법
  • Autoencoder는 차원 축소의 딥러닝 버전!
  • 네트워크 layer들을 점점 축소되는 형태로 인코딩, 다시 확대하는 형태로 디코딩
  • 이 과정에서 latent Code라고 하는 것으로부터 다시 원래 데이터로 충분히 잘 복원을 할 수 있다고 한다면
    • 결국 input의 데이터가 잘 축소된 것으로 볼 수 있음!

 

Discriminative Model (Discriminator) 와 Generative Model (Generator)

 

① Discriminative Model (Discirminator)

  • 이미지 데이터가 주어진다고 했을 때 관련된 feature들을 추출해서
    • 결국 분류를 하는 것을 목적으로 !
  • input  데이터를 받아서 관련된 weight 들을 학습
  • 최종적으로 분류 문제를 해결

Discriminator

 

② Generative Model (Generator)

  • latent code를 바탕으로 해서 layer들을 쌓아서 구성
  • 최종적으로 이미지를 만들어내는 것
  • 목적은 input 데이터의 분포와 비슷하게 학습하는 것
    • input 데이터에서 이미지A가 3장, 이미지B가 10장이었다면
    • Generator를 통한 이미지에 대해서도 이미지A가 3장, 이미지B가 10장 정도 발생해야 하는 것!

Generator

  • Probability Density Function(PDF)
    • 전체를 1이라고 했을 때
    • 각각의 이미지들이 구성하고 있는 확률로 나타낼 수 있음
Autoencoder의 Generative Modeling은 확률적 개념 활용 !

input 데이터의 PDF와 Generator model을 통해서 나온 이미지의 PDF가 거의 흡사해야 함!
→ \( min L(P_{model}, P_{data}) \)

위 내용들은 Autoencoder에서 디코딩 부분 즉 Generator modeling 부분의 설명이었습니다.

결과적으로는 성능이 충분히 좋지 못했고 그래서 나온 방법이 GNN 입니다.

 

2. Generative Adversarial Networks(GAN)

  • GAN은 확률적 개념 사용 X
  • 대신 두개의 네트워크를 활용
    • Generator & Discirminator

 

Generator network & Discriminator network

 

  • Generator network: 실제 이미지 같아 보이는 가짜 이미지를 생성
  • Discriminator network: 만들어진 가짜 이미지와 실제 이미지를 구분

 

갑자기..무슨 소리?

사실 Discriminator network는 Turing Test에서 기초 했습니다.

Turing Test

  • A는 machine이고, B는 human이라고 했을 때 
  • C가 어떤 질문을 하고 대답을 받았는데
    • 이 대답을 machine이 했는지 human이 했는지 모른다면
      • machine이 충분한 성능을 보이고 있음을 나타냄

 

따라서 Turing Test에 기반했을 때

Discriminator network가 Generator network에서 만들어진 fake 이미지와 real 이미지를 잘 구별 하지 못한다면

Generative model의 성능이 좋다고 말할 수 있겠습니다.

 

GAN에서 Generative model의 목적
Discriminator network의 성능을 떨어뜨리자 (= fake인지 real인지 잘 구분 못하게)

 

GAN 모델에 대한 구조

 

  1. 간단한 분포(정규분포/가우시안분포/...)를 통해서 만들어진 latent code
  2. latent code를 generator network에 입력 → fake 이미지 생성
  3. fake 이미지와 real 이미지를 discriminator network에 입력
  4. discriminator는 들어온 이미지가 fake인지 real인지 판단

→ generator가 fake 이미지를 정말 real처럼 잘 만든다면 (= latent code가 잘 구성되었다면)

→ discriminator가 이게 real인지 fake인지 잘 판단하지 못하게 됨

discriminator의 loss가 증가 (=generator의 목적!)

 

GAN 모델 구조

+ 학습을 한다고 했을 때 generator 부분의 네트워크와 discriminator의 네트워크 두 부분을 동시에 학습을 진행 X

→ 일반적으로는 discriminator는 고정을 시키고 generator를 업데이트

→ 이때 나오는 fake 이미지와 real 이미지를 discriminator에 넣고 그 다음 discriminator 네트워크 학습

→ 이처럼 번갈아가면서 학습을 진행

 

Generator의 역할
discriminator를 속일만한 real같은 fake 이미지를 만드는 것이 목적

Discriminator의 역할
데이터가 real인지 fake인지 판단

 

\( \approx 1 or 0 \)

 

  • Discriminator( \( D \) )에 들어가는 데이터 종류를 정리해 보면
    • real 이미지: \( x\)
    • fake 이미지: \( G(z) \)
  • \( D \)에 데이터를 통과시키고서 값
    • Discriminator가 real 이미지를 real 이미지로 판단 (input: \( x \)
      • \( D(x) \approx 1 \)
    • Discriminator가 real 이미지를 fake 이미지로 판단 (input: \( x \)
      • \( D(x) \approx 0 \)
    • Discriminator가 fake 이미지를 fake 이미지로 판단 (input: \( G(z) \)
      • \( D(G(z)) \approx 0 \)
    • Discriminator가 fake 이미지를 real 이미지로 판단(input: \( G(z) \)
      • \( D(G(z)) \approx 1 \)

 

Loss Function

 

loss function을 살펴보기 전에 알고 넘어가야 할 것을 정리해 보겠습니다.

  • Discriminatorcross-entropy loss를 사용
    • loss function을 계산할 때는 정답 label과 예측 label이 필요
    • 따라서 밑에서 보게 될 식에서 \( y \)는 Generator에 들어온 이미지의 정답을 의미
      • \(y=1\) : 정답은 real 이미지
      • \(y=0\) : 정답은 fake 이미지
  • Generator는 Discriminator의 loss가 커지길(max)되는 것을 목적으로 함

 

① Discriminator 입장에서

  • real은 real로 fake는 fake로 최대한 잘 맞추어야 함
    • loss를 최소화!

Discriminator의 loss function

  • 일단 위 식에서 \( x \)를 real 이미지라고 생각하지 말고 그냥 들어오는 데이터라고 생각!
  • 첫 번째 항: 정답이 real일 때를 고려
    • 정답이 real이라면 \( y=1 \)이 되면서
    • 두 번째 항은 0이 되어 지워지게 됨. 이제 첫 번째 항만 보게 되면
      • \( min \{-logD(x) \} \)
    • Discriminator 입장에서는 정답이 real이라면 예측도 real이 되도록 해야 함
    • 즉, \( D(x) \approx 1 \) 일수록 좋음 ( 값이 1에 가까울 수록 좋은 것!)
      • 만약 정말 잘 예측해서 \( D(x) \approx 0.99 \)라고 하면 loss가 0에 가까울 것 !!
      • 반대로 정말 잘 예측을 못해서  \( D(x) \approx 0.01 \) 라고 하면 loss가 굉장히 클 것!!
  • 두 번째 항: 정답이 fake일 때를 고려
    • 정답이 fake라면 \( y=0 \)이 되면서
    • 첫 번째 항은 0이 되어 지워지게 됨. 이제 두 번째 항만 보게 되면
      • \( min \{-log(1-D(x)) \} \)
    • Discriminator 입장에서는 정답이 fake라면 예측도 fake가 되도록 해야 함
    • 즉, \( D(x) \approx 0 \) 일수록 좋음 (값이 0에 가까울 수록 좋은 것!)
      • 만약 정말 잘 예측을 해서  \( D(x) \approx 0.01 \)라고 하면 loss가 0에 가까울 것!!
      • 반대로 정말 잘 예측을 못해서  \( D(x) \approx 0.99 \) 라고 하면 loss가 굉장히 클 것!!

파란색: -log(D(x), 빨간색: -log(1-D(x))

② Generator 입장에서

  • generator 입장에서는 generator가 만든 fake 이미지 discriminator가 real 이미지로 판단하도록
    • \( y=0 \)일 때 \( D(G(z)) \approx 1 \)을 최대화 하기를 원함

Generator의 loss function

 

③ 모두의 입장에서

  • \( D(x) \)는 real 이미지 데이터가 들어갔을 때의 Generator의 대답
  • \( D(G(z)) \)는 fake 이미지 데이터가 들어갔을 때의 Generator의 대답
  • 정답이 real 데이터라면 ← \( y=1 \) 일 때
    • Discriminator는 \(D(x) = 1 \) 해서 loss를 최소화
    • Generator는 \D(x) = 0 \) 해서 loss를 최대화 하기를 바람
  • 정답이 fake 데이터라면 ← \(y = 0 \) 일 때
    • Discriminator는 \( D(x) = 0 \) 해서 loss를 최소화 
    • Generator는 Discriminator가 \( D(G(z)) =1 \) 해서 loss를 최대화하길 바람

GAN의 loss function

 

728x90
LIST
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함