카테고리 없음

ch17.3 적층 오토인코더

유방울 2023. 11. 30. 16:04

적층 오토인코더 stacked autoencoder

심층 오토인코더 deep autoencoder

오토인코더도 여러 은닉층을 가짐

 

더 복잡한 코딩 학습 가능

but 너무 강력해지지 않도록 주의!

인코더가 너무 강력해서 각각의 입력 데이터를 임의의 숫자로 매핑하도록 학습 가정!

당연히 오토인코더는 훈련 데이터를 완벽하게 재구상

but 이 과정에서 유용한 데이터 표현을 학습하지 못할 것임!

 

적층 오토인코더의 구조

: 전형적으로 가운데 은닉층을 기준으로 대칭!

: 샌드위치 모양~

 

MNIST 위한 오토인코더라면

입력층 784개

뉴런 100개인 은닉층

뉴런 30개로 된 가운데 은닉층

뉴런 100개 은닉층

출력층 784개

 

17.3.1 케라스를 사용해 적층 오토인코더 구현하기

SELU 활성화 함수를 사용해 적층 오토인코더 만듦

인코더 28X28 픽셀의 흑백 이미지 받음

784 크기의 벡터로 표현하려고 펼침

 

 

17.3.2 재구성 시각화

오토인코더가 적절히 훈련되었는지 확인하는 방법

입출력 비교 !

즉, 입출력의 차이가 크지 않아야 함!

검증 세트에서 원본 이미지 몇 개를 재구성된 것과 그려보기~~

 

식별을 가능함 

but 정보를 조금 많이 잃음

-> 이 경우 모델을 더 오래 훈련 or 인코더 디코더의 층 늘리기 or 코딩의 크기 늘림

but 네트워크가 너무 강력하면 데이터에서 유의한 패턴 학습 못하고 완벽한 재구성 이미지를 만들 것

 

17.3.3 패션 MNIST 데이터셋 시각화

적층 오토인코더를 훈련 -> 이 모델로 데이터셋의 차원 축소 가능!

시각화 입장에서는 다른 차원 축소 알고리즘만큼 좋은 결과 x

but 샘플과 특성이 많은 대용량 데이터셋을 다룰 수 있는 장점!

따라서~ 오토인코더로 적절한 수준으로 차원 축소 -> 다른 차원 축소 알고리즘으로 시각화!

 

적층 오토인코더의 인코더 모델로 -> 30차원으로 줄임

t-SNE 알고리즘을 구현한 사이킷런 클래스로 시각화를 위해 -> 2차원 줄임

데이터셋을 그래프로 그릴 수 있음!!

 

t-SNE 알고리즘이 식별한 클러스터가 클래스와 잘 매칭됨

 

17.3.4 적층 오토인코더를 사용한 비지도 사전훈련

레이블된 훈련 데이터가 많지 않은 복잡한 지도 학습 문제를 다루려면 

-> 비슷한 문제를 학습한 신경망을 찾고 -> 하위층을 재사용!!

: 이는 저수준의 특성을 학습할 필요 X -> 적은 훈련 데이터를 사용해 고성능 모델 훈련 가능

=> 즉, 기존 네트워크에서 학습한 특성 감지 기능을 재사용

 

비슷하게 대부분 레이블되지 않은 대량의 데이터셋은

-> 먼저 전체 데이터를 사용해 적층 오토인코더 훈련

-> 오토인코더의 하위층을 재사용해 실제 문제를 해결하기 위한 신경망 만들기 

-> 레이블된 데이터를 사용해 훈련!!

 

구현에 특별한 것 X

1. 레이블 된 것 + 레이블되지 않은 것 = 모든 훈련 데이터로 오토인코더 훈련

2. 인코더 층 재사용해 새로운 신경망 만듦

 

 

17.3.5 가중치 묶기

오토인코더가 완벽하게 대칭일 때

디코더의 가중치와 인코더의 가중치를 묶는 것이 일반적인 방법

-> 이는 모델에 있는 가중치의 수를 절반으로 줄여서 훈련 속도 높이고 과대적합 위험 줄임

 

EX) N개의 층을 갖고 WL이 L번째 층의 가중치를 나타냄

1은 첫 번째 은닉층, N/2는 코딩 층, N은 출력층!

 

사용자 정의 층은 일반적인 Dense 층과 비슷

but 다른 Dense 층의 전치된 가중치를 사용

: transpose_b = True 로 지정하는 것이 두 번째 매개변수 전치하는 것과 동일

: but  matul() 연산에 동적으로 전치를 수행하므로 훨씬 효율적)

 

but  편향벡터는 독자적 사용!

-> 이전과 비슷하게 새로운 적층 오토인코더를 만듦

이 디코더의 Dense 층은 인코더의 Dense 층과 묶여 있음

 

17.3.6 한 번에 오토인코더 한 개씩 훈련하기

앞서 만들었던 것처럼 한 번에 전체 오토인코더를 훈련 < 오토인코더 하나를 훈련 -> 이를 쌓아올려서 한 개의 적층 오토인코더 만듦 

-> 요즘은 잘 사용 x '탐욕적 방식의 층별 훈련!', greedy layerwise training

 

훈련 1단계

첫 번재 오토인코더는 입력을 재구성하도록 학습

-> 이 오토인코더를 사용해 전체 훈련 세트를 인코딩해 새 훈련 세트 만듦

 

훈련 2단계

새로운 훈련 세트에서 두 번째 오토인코더를 훈련

 

훈련 3단계

모든 오토인코더를 사용해 전체 네트워크를 만듦 

즉, 각 오토인코더의 은닉층 먼저 샇고 -< 드 아음 출력층을 반대로 쌓음

 

 

2006 제프리 힌턴

탐욕적 층별 접근 방법을 사용해 심층 신경망을 비지도형태로 사전훈련된 수 있다고 발견함!

제한된 볼츠만 머신 restricted Boltzmann machine(RBM)을 사용함

 

2007 요슈아 벤지오

오토인코더에도 적용된다는 것 보임