티스토리 뷰
▶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 들을 학습
- 최종적으로 분류 문제를 해결
② Generative Model (Generator)
- latent code를 바탕으로 해서 layer들을 쌓아서 구성
- 최종적으로 이미지를 만들어내는 것
- 목적은 input 데이터의 분포와 비슷하게 학습하는 것
- input 데이터에서 이미지A가 3장, 이미지B가 10장이었다면
- Generator를 통한 이미지에 대해서도 이미지A가 3장, 이미지B가 10장 정도 발생해야 하는 것!
- 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에서 기초 했습니다.
- A는 machine이고, B는 human이라고 했을 때
- C가 어떤 질문을 하고 대답을 받았는데
- 이 대답을 machine이 했는지 human이 했는지 모른다면
- machine이 충분한 성능을 보이고 있음을 나타냄
- 이 대답을 machine이 했는지 human이 했는지 모른다면
따라서 Turing Test에 기반했을 때
Discriminator network가 Generator network에서 만들어진 fake 이미지와 real 이미지를 잘 구별 하지 못한다면
Generative model의 성능이 좋다고 말할 수 있겠습니다.
GAN에서 Generative model의 목적
Discriminator network의 성능을 떨어뜨리자 (= fake인지 real인지 잘 구분 못하게)
GAN 모델에 대한 구조
- 간단한 분포(정규분포/가우시안분포/...)를 통해서 만들어진 latent code
- latent code를 generator network에 입력 → fake 이미지 생성
- fake 이미지와 real 이미지를 discriminator network에 입력
- discriminator는 들어온 이미지가 fake인지 real인지 판단
→ generator가 fake 이미지를 정말 real처럼 잘 만든다면 (= latent code가 잘 구성되었다면)
→ discriminator가 이게 real인지 fake인지 잘 판단하지 못하게 됨
→ discriminator의 loss가 증가 (=generator의 목적!)
+ 학습을 한다고 했을 때 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 \)
- Discriminator가 real 이미지를 real 이미지로 판단 (input: \( x \)
Loss Function
loss function을 살펴보기 전에 알고 넘어가야 할 것을 정리해 보겠습니다.
- Discriminator는 cross-entropy loss를 사용
- loss function을 계산할 때는 정답 label과 예측 label이 필요
- 따라서 밑에서 보게 될 식에서 \( y \)는 Generator에 들어온 이미지의 정답을 의미
- \(y=1\) : 정답은 real 이미지
- \(y=0\) : 정답은 fake 이미지
- Generator는 Discriminator의 loss가 커지길(max)되는 것을 목적으로 함
① Discriminator 입장에서
- real은 real로 fake는 fake로 최대한 잘 맞추어야 함
- loss를 최소화!
- 일단 위 식에서 \( 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가 굉장히 클 것!!
② Generator 입장에서
- generator 입장에서는 generator가 만든 fake 이미지를 discriminator가 real 이미지로 판단하도록
- \( y=0 \)일 때 \( D(G(z)) \approx 1 \)을 최대화 하기를 원함
③ 모두의 입장에서
- \( 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를 최대화하길 바람
'빅데이터 인공지능 > 딥러닝' 카테고리의 다른 글
[딥러닝] 자기지도학습(Self-supervied Learning) (2) | 2022.12.05 |
---|---|
[딥러닝] 오토인코더(Autoencoder) (0) | 2022.12.04 |
[딥러닝] 전이학습(Transfer Learning) (0) | 2022.12.03 |
[딥러닝] RNN을 위한 PyTorch 구현 (1) | 2022.11.30 |
[딥러닝] RNN(Recurrent Neural Network) (1) | 2022.11.30 |
- Total
- Today
- Yesterday
- JSP
- frontend
- 자바스크립트 기초
- testing
- jest
- HTML
- react-query
- react
- 자바스크립트
- TypeScript
- rtl
- 프론트엔드 기초
- CSS
- 딥러닝
- 리액트
- 디프만
- 프론트엔드 공부
- next.js
- 프론트엔드
- 스타일 컴포넌트 styled-components
- Python
- 자바
- 인프런
- 리액트 훅
- styled-components
- 타입스크립트
- 프로젝트 회고
- 머신러닝
- 파이썬
- 데이터분석
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |