[소감]
개인적으로 선호하는 매닝 출판사의 in action 시리즈이다. 내용을 잘 모르는 사람도 따라하고 다시 생각하고 다시 따라하다 보면, 차근차근 내용을 이해할 수 있도록 구성되어 있다. 각 장의 내용 하나하나가 쉽게 넘어가지는 않고 조금 생각해야 알 수 있는 수준의 난이도 구성도 적절하다. 초급과 중급 사이의 그 어딘가라고 볼 수 있겠다. 물론 주제가 딥러닝의 구현 형태 중의 하나인 GAN이므로 파이썬과 머신러닝/딥러닝의 기초가 전혀 없는 사람은 읽기 어렵다.
내용은 각 장마다 이론적인 설명과 실습 코드가 이어서 구성되어 있다. 이론이 잘 이해가 가지 않아도, 충분한 주석이 달린 코드를 통해 실습 따라하기가 가능하다. 일단 타이핑 하다보면 모델 학습이 되고 결과가 나온다. 아무래도 결과를 눈으로 보게 되면 작은 성취감과 도전의식이 생긴다. 그랬을 때 이론을 다시 펴보면 더 잘 이해가 가는 경우가 많았다.
[편집/번역]
ㅇ 박해선님의 번역은 원문에 충실하며 꼼꼼하고 엄중하다.
- 그러면서도 적절한 윤문이 가미되어 부드럽고 읽기 쉽다.
- AI와 데이터 관련 책 중에는 박해선님의 이름이 저/역자에 있으면 뒤도 돌아보지 않고 일단 주문하는 편이다.
ㅇ 편집도 올컬러 인쇄에 매우 깔끔하다.
- 공부하다보니 이미지 생성을 다루는 내용이기 때문에 컬러가 아니면 결과물의 가독성이 매우 떨어졌을 것 같다.
- 독자 입장에서는 대단히 만족스럽다.
[1장: GAN 시작하기]
ㅇ GAN은 생성적 적대 신경망(Generative Adversarial Network)의 약자
- 두 네트워크 간의 경쟁을 이용해, 진짜 같은 데이터 샘플을 합성하는 딥러닝 기법
- 생성자(generator):가짜 데이터를 생성하도록 훈련됨
- 판별자(discriminator):실제 샘플과 가짜 샘플을 구분하도록 훈련됨
ㅇ 생성적(generative): 이 모델이 훈련 데이터를 통해 새로운 데이터를 생성하는데 목적이 있다는 의미
ㅇ 적대적(adversarial): 두 모델인 생성자와 판별자 사이의 게임 같은 경쟁구도
- 생성자는 훈련 데이터셋에 있는 실제 데이터와 유사한 샘플을 만들어냄
- 판별자는 생성자가 만든 가짜 데이터를 훈련 데이터셋에 있는 실제 데이터와 구별
ㅇ 판별자 훈련
- 훈련 데이터셋에서 랜덤하게 진짜 샘플 x를 선택
- 새 랜덤 잡음 벡터 z를 얻어서 생성자 네트워크를 이용해 가짜 샘플 x*을 합성
- 분류 오차를 계산하고 전체 오차를 역전파해서 판별자의 훈련 가능한 파라미터를 업데이트하고 분류 오차를 최소화
ㅇ 생성자 훈련
- 생성자 네트워크를 사용해 새로운 랜덤한 잡음 벡터 z에서 가짜 샘플 x*을 합성
- 판별자 네트워크를 이용해 x*을 분류
- 분류 오차를 계산하고 역전파해서 생성자의 훈련 가능한 파라미터를 업데이트하고 판별자의 오차를 최대화
ㅇ 훈련 목표
- 훈련 반복은 내시 균형에 도달할 때까지 진행됨
- 생성자가 훈련 데이터셋의 실제 데이터와 구별이 안 되는 데이터를 생성
- 판별자가 특정 샘플이 진짜인지 가짜인지 판단할 때 랜덤(50:50) 추측만 가능
[2장: 오토인코더와 생성 학습]
ㅇ 오토인코더는 인코더, 잠재 공간, 디코더로 구성됨
- 재구성된 데이터와 원본 데이터 사이의 거리를 측정하는 목표 함수를 사용해 훈련
ㅇ 오토인코더는 많은 앱이 있으며 생성모델로 사용할 수 있음
- GAN보다 떨어지는 성능으로 생성모델로 주로 사용되지는 않음
- KERAS를 이용해 MNIST 손글씨 숫자 생성 예제 수행
ㅇ 변이형 오토인코더는 보다 안전한 중간지대의 픽셀을 선택하기 때문에 결과물의 경계가 흐릿함
[3장: 첫 번째 GAN 구현하기]
ㅇ 생성자의 목적은 훈련 데이터셋의 데이터 분포를 흉내 내는 샘플을 생성하는 것
- 객체 인식 모델: 이미지 컨텐츠를 이해하기 위해, 이미지에 있는 패턴을 학습
ㅇ GAN은 생성자(G)와 판별자(D) 두 개의 네트워크로 구성됨
ㅇ 훈련하는 동안 생성자와 판별자는 자신의 파라미터는 세타(G)와 세타(D)만 조정 가능
ㅇ GAN은 게임 같은 방식으로 동시에 훈련됨
- 생성자는 판별자의 거짓 양성 분류가 최대가 되게 함
- 판별자는 거짓 양성과 거짓 음성 분류를 최소화하려고 함
ㅇ 생성자 구현 시 은닉층은 LeakyReLU 활성화 함수 사용
- 음수 입력을 모두 0으로 만드는 일반적인 ReLU함수와 달리, 작은 기울기 사용
- 훈련 중에 그레디언트가 사라지는 것을 방지해서 결과를 향상시킴
ㅇ 생성자 구현 시 출력층은 tanh 활성화 함수 사용
- 출력값을 [-1, 1] 범위로 조정
- 0~1로 조정하는 시그모이드 함수보다 조금 더 또렷한 이미지 생성 가능
ㅇ 판별자 구현 시 시그모이드 활성화 함수 적용
- 출력 값을 0~1사이로 만들기 때문에 판별자가 입력을 진짜로 생각하는 확률로 해석
ㅇ 손실함수는 이진 교차 엔트로피 사용
- 두 개의 클래스만 있는 예측에서 계산된 확률과 진짜 확률 사이의 차이 측정
ㅇ 네트워크 최적화를 위해 Adam 최적화 알고리즈 ㅁ사용
- 고급 경사 하강법 기반의 옵티마이저
- Adam은 뛰어난 성능으로 대부분 GAN 구현의 기본 옵티마이저
- 훈련 시 원-핫 인코딩 사용: 1이 진짜 이미지, 0이 가짜 이미지
- 미니배치 사용
(이하 생략)
[예제 소스]
https://github.com/rickiepark/gans-in-action
[정오표]
https://tensorflow.blog/gan-in-action/
[목차]
- CHAPTER 1 GAN 시작하기
- CHAPTER 2 오토인코더와 생성 학습
- CHAPTER 3 첫 번째 GAN 구현하기
- CHAPTER 4 DCGAN
- CHAPTER 5 GAN 훈련의 어려움과 노하우
- CHAPTER 6 ProGAN
- CHAPTER 7 SGAN
- CHAPTER 8 CGAN
- CHAPTER 9 CycleGAN
- CHAPTER 10 적대 샘플
- CHAPTER 11 실용적인 GAN 애플리케이션
- CHAPTER 12 향후 전망