K 개발자
오토인코더와 GAN 본문
오토인코더autoencoder
오토인코더는 입력을 받아 효율적인 내부 표현(잠재 표현latent representation, 코딩coding)으로 바꾸고 (바라건대) 입력과 가장 가까운 어떤 것을 출력
오토인코더는 항상 두 부분으로 구성
입력을 내부 표현으로 바꾸는 인코더encoder(또는 인지 네트워크recognition network)와 내부 표현을 출력으로 바꾸는 디코더decoder(또는 생성 네트워크generative network)
출력층의 뉴런 수가 입력 개수와 동일하다는 것을 제외하면, 일반적으로 오토인코더는 다층 퍼셉트론(MLP)과 구조가 동일
오토인코더가 입력을 재구성하기 때문에 출력을 종종 재구성reconstruction이라고 부른다.
비용 함수는 재구성이 입력과 다를 때 모델에 벌점을 부과하는 재구성 손실reconstruction loss을 포함
과소완전undercomplete 오토인코더
내부의 표현이 입력 데이터보다 저차원인 오토인코더를 과소완전이라고 한다.
과소완전 오토인코더는 입력을 코딩으로 간단히 복사할 수 없으며, 입력과 똑같은 것을 출력하기 위한 다른 방법을 찾아야 한다.
이는 입력 데이터에서 가장 중요한 특성을 학습하도록 만든다. (그리고 중요하지 않은 것은 버린다.)
적층 오토인코더stacked autoencoder(심층 오토인코더deep autoencoder)
오토인코더도 은닉층을 여러 개 가질 수 있다. (층을 더 추가하면 오토인코더가 더 복잡한 코딩을 학습)
그러나 오토인코더가 너무 강력해지지 않도록 주의 (유용한 데이터 표현을 학습하지 못하고 새로운 샘플에 잘 일반화되지 않는다.)
적층 오토인코더의 구조는 전형적으로 가운데 은닉층(코딩 층)을 기준으로 대칭 (샌드위치 같은 모양)
적층 오토인코더를 사용한 비지도 사전훈련
대부분 레이블되지 않은 대량의 데이터셋이 있다면 먼저 전체 데이터를 사용해 적층 오토인코더를 훈련
그다음에 오토인코더의 하위층을 재사용해 실제 문제를 해결하기 위한 신경망을 만들고 레이블된 데이터를 사용해 훈련
분류기를 훈련할 때 레이블된 훈련 데이터가 많지 않으면 사전훈련된 층을 동결하는 것이 좋다. (적어도 가장 하위층 하나)
가중치 묶기
오토인코더가 완벽하게 대칭일 땐 디코더의 가중치와 인코더의 가중치를 묶는 것이 일반적인 방법 (모델에 있는 가중치의 수를 절반으로 줄여서 훈련 속도를 높이고 과대적합의 위험을 줄인다.)
어떤 오토인코더가 (입력층은 제외한) $N$개의 층을 갖고 $W_ {L}$이 $L$번째 층의 가중치를 나타낸다고 했을 때 (e.g. 1은 첫 번째 은닉층, $N/2$은 코딩 층, $N$은 출력층) 디코더 층의 가중치는 $W_ {N-L+1}={W_ {L}}^T$(여기서 $L=1,2,\cdots,N/2$)와 같이 간단하게 정의
한 번에 오토인코더 한 개씩 훈련하기
첫 번째 오토인코더는 입력을 재구성하도록 학습하고 이 오토인코더를 사용해 전체 훈련 세트를 인코딩하여 (압축된) 새 훈련 세트를 만든다.
이 새로운 훈련 세트에서 두 번째 오토인코더를 훈련
마지막으로 모든 오토인코더를 사용해 전체 네트워크를 만든다. (i.e. 각 오토인코더의 은닉층을 먼저 쌓고, 그다음 출력층을 반대로 쌓는다.)
이런 방식으로 더 많은 오토인코더를 훈련해 아주 깊은 적층 오토인코더를 만들 수 있다.
합성곱 오토인코더convolutional autoencoder
(비지도 사전훈련이나 차원 축소를 위해) 이미지에 대한 오토인코더를 만들려면 합성곱 신경망이 밀집 네트워크보다 훨씬 잘 맞다.
인코더는 합성곱 층과 풀링 층으로 구성된 일반적인 CNN
인코더는 전형적으로 입력에서 공간 방향의 차원(i.e. 높이와 너비)을 줄이고 깊이(i.e. 특성 맵의 개수)를 늘린다.
디코더는 거꾸로 동작 (이미지의 스케일을 늘리고 깊이를 원본 차원으로 되돌린다.)
이를 위해서 전치 합성곱 층을 사용 (또는 합성곱 층과 업샘플링 층을 연결)
순환 오토인코더recurrent autoencoder
(비지도 학습이나 차원 축소를 위해) 시계열이나 텍스트와 같은 시퀀스에 대한 오토인코더를 만들려면 순환 신경망이 밀집 네트워크보다 더 낫다.
인코더는 일반적으로 입력 시퀀스를 하나의 벡터로 압축하는 시퀀스-투-벡터 RNN이고 디코더는 반대로 벡터-투-시퀀스 RNN
잡음 제거 오토인코더stacked denoising autoencoder
오토인코더가 유용한 특성을 학습하도록 강제하는 다른 방법은 입력에 잡음을 추가하고, 잡음이 없는 원본 입력을 복원하도록 훈련하는 것
잡음은 입력에 추가된 순수한 가우시안Gaussian 잡음이거나 드롭아웃처럼 무작위로 입력을 꺼서 발생
잡음 제거 오토인코더를 데이터 시각화나 비지도 사전훈련을 위해 사용할 뿐만 아니라 간단하고 효율적으로 이미지에서 잡음을 제거하는 데 사용
희소 오토인코더
좋은 특성을 추출하도록 만드는 다른 제약의 방식은 희소sparsity
이는 비용 함수에 적절한 항을 추가하여 오토인코더가 코딩 층에서 활성화되는 뉴런 수를 감소시키도록 만든다.
이렇게 하면 오토인코더가 적은 수의 활성화된 뉴런을 조합하여 입력을 표현 (결국 코딩 층의 각 뉴런은 유용한 특성을 표현)
더 나은 결과를 종종 내는 또 다른 방법은 훈련 반복마다 코딩 층의 실제 희소 정도를 측정하고 측정된 희소 정도가 타깃 희소 정도와 다르면 모델에 벌칙을 부과하는 것
변이형 오토인코더variational autoencoder
- 훈련이 끝난 후에도 출력이 부분적으로 우연에 의해 결정되는 확률적 오토인코더probabilistic autoencoder (이와는 반대로 잡음 제거 오토인코더는 훈련 시에만 무작위성을 사용)
- 무엇보다도 생성 오토인코더generative autoencoder라는 점이 중요 (마치 훈련 세트에서 샘플링된 것 같은 새로운 샘플을 생성)
변이형 오토인코더는 효율적인 근사 베이즈 추론 방법인 변분 베이즈 추론variational Bayesian inference을 수행
주어진 입력에 대한 코딩을 바로 만드는 대신, 인코더는 평균 코딩mean coding $\mu$와 표준편차 $\sigma$를 만든다.
실제 코딩은 평균이 $\mu$이고 표준편차가 $\sigma$인 가우시안 분포에서 랜덤하게 샘플링
그 후 디코더가 샘플링된 코딩을 보통처럼 디코딩
변이형 오토인코더는 입력이 매우 복잡한 분포를 가지더라도 간단한 가우시안 분포에서 샘플링된 것처럼 보이는 코딩을 만드는 경향이 있다.
훈련하는 동안 비용 함수가 코딩을 가우시안 샘플들의 군집처럼 보이도록 코딩 공간coding space (또는 잠재 공간latent space) 안으로 점진적으로 이동
그러므로 변이형 오토인코더는 훈련이 끝난 뒤 새로운 샘플을 매우 쉽게 생성 (가우시안 분포에서 랜덤한 코딩을 샘플링해 디코딩)
생성적 적대 신경망generative adversarial networks(GAN)
이 아이디어는 신경망을 서로 겨루게 하고 경쟁을 통해 신경망을 향상하는 것을 기대 (신경망 두 개로 구성)
생성자generator
랜덤한 분포(일반적으로 가우시안 분포)를 입력으로 받고 이미지와 같은 데이터를 출력
랜덤한 입력은 생성할 이미지의 잠재 표현(i.e. 코딩)으로 생각
생성자는 변이형 오토인코더의 디코더와 같은 기능을 제공
같은 방식으로 새로운 이미지를 생성 (가우시안 잡음을 주입하여 완전히 새로운 이미지를 출력)
판별자discriminator
생성자에서 얻은 가짜 이미지나 훈련 세트에서 추출한 진짜 이미지를 입력으로 받아 입력된 이미지가 가짜인지 진짜인지 구분
훈련하는 동안 생성자와 판별자의 목표는 반대 (판별자는 진짜 이미지와 가짜 이미지를 구분하고 생성자는 판별자를 속일 만큼 진짜 같은 이미지를 만든다.)
각 훈련 반복은 두 단계로 이루어진다. (GAN은 다른 목표를 가진 두 네트워크로 구성되므로 일반적인 신경망처럼 훈련할 수 없다.)
- 첫 번째 단계에서 판별자를 훈련한다. 훈련 세트에서 실제 이미지 배치를 샘플링하고 생성자에서 생성한 동일한 수의 가짜 이미지를 합친다. 가짜 이미지의 레이블은 0으로 세팅하고 진짜 이미지는 1로 세팅한다. 판별자는 이진 크로스 엔트로피를 사용해 한 스텝 동안 이렇게 레이블된 배치로 훈련한다. 이 단계에서 역전파는 판별자의 가중치만 최적화한다.
- 두 번째 단계에서 생성자를 훈련한다. 먼저 생성자를 사용해 다른 가짜 이미지 배치를 만든다. 다시 판별자를 사용해 이미지가 진짜인지 가짜인지 판별한다. 이번에는 배치에 진짜 이미지를 추가하지 않고 레이블을 모두 1(진짜)로 세팅한다. 다른 말로 하면 생성자가 판별자가 진짜라고 (잘못) 믿을 이미지를 만들어야 한다. 이 단계 동안에는 판별자의 가중치를 동결하는 것이 중요하다. 따라서 역전파는 생성자의 가중치에만 영향을 미친다.
GAN 훈련의 어려움
가장 큰 어려움은 모드 붕괴mode collapse (생성자의 출력의 다양성이 줄어들 때)
또한 생성자와 판별자가 지속적으로 서로에게 영향을 주기 때문에 파라미터 변동이 크고 불안정해질 수 있다. (훈련이 안정적으로 시작되어도 특별한 이유 없이 갑자기 발산)
여러 요인이 이런 복잡한 역학 관계에 영향을 주어 GAN의 하이퍼파라미터는 매우 민감 (이런 하이퍼파라미터를 세부 튜닝하기 위해서는 많은 노력이 필요)
경험 재생experience replay이라 부르는 인기 있는 한 기법은 매 반복에서 생성자가 만든 이미지를 (오래된 이미지는 삭제하면서) 재생 버퍼에 저장하고 실제 이미지와 (현재 생성자가 만든 가짜 이미지가 아니라) 이 버퍼에서 뽑은 가짜 이미지를 더해서 판별자를 훈련 (이는 판별자가 생성자의 가장 최근 출력에 과대적합될 가능성을 줄인다.)
널리 사용하는 또 다른 기법은 미니배치 판별mini-batch discrimination로 배치 간에 얼마나 비슷한 이미지가 있는지 측정하여 이 통계를 판별자에게 제공
판별자는 다양성이 부족한 가짜 이미지 배치 전체를 쉽게 거부 (이는 생성자가 다양한 이미지를 생성하도록 유도하여 모드 붕괴의 위험을 줄인다.)
심층 합성곱 GANdeep convolutional GAN(DCGAN)
큰 이미지를 위해 깊은 합성곱 층을 기반으로 한 GAN을 만들기 위해 여러 가지 구조와 하이퍼파라미터를 실험하여 성공
ProGAN
훈련 초기에 작은 이미지를 생성하고 점진적으로 생성자와 판별자에 합성곱 층을 추가해 갈수록 큰 이미지를 만드는 방법
이 방법은 적층 오토인코더를 층별로 훈련하는 것과 비슷 (이전에 훈련된 층은 그대로 훈련 가능하도록 두고 생성자의 끝과 판별자의 시작 부분에 층을 추가)
StyleGAN
생성자에 스타일 트랜스퍼style transfer 기법을 사용해 생성된 이미지가 훈련된 이미지와 같은 다양한 크기의 국부적인 구조를 갖도록 만들었다. (이는 생성된 이미지의 품질을 크게 높인다.)
실습코드링크 : autoencoder and GAN
'인공지능 > 핸즈온 머신러닝' 카테고리의 다른 글
강화 학습 (0) | 2021.02.17 |
---|---|
순환 신경망과 어텐션 (0) | 2021.01.16 |
순환 신경망과 합성곱 신경망 (0) | 2021.01.07 |
합성곱 신경망 (0) | 2020.12.28 |
텐서플로 데이터 API (0) | 2020.12.19 |