2020. 12. 8. 06:14ㆍML&DL
순천향대학교 빅데이터공학과 김정현 교수님의 강의를 바탕으로 정리한 글이며 수업 자료의 저작권 문제로 인해 수업 자료를 직접 이용하지 않았음을 먼저 밝힙니다. 문제가 될 시 바로 삭제하겠습니다.
이번 글은 입력 데이터를 압축하기도 하고 입력 데이터로부터 새로운 데이터를 생성하기도 하는 AutoEncoder에 관한 글입니다.
순서
1. Autoencoder
1.1 활용사례
2. PCA vs. AutoEncoder
3. Stacked AutoEncoder
4. Denoising AutoEncoder
5. Variational AutoEncoder
1. Autoencoder
Autoencoder는 입력 데이터를 작은 단위의 대푯값들만 남겨 압축시킨 후 다시 확장시켜 출력 데이터를 입력 데이터와 동일하게 하는 뉴럴 네트워크 모델입니다. 입력 데이터를 정답 데이터로 사용하기 때문에 self-supervised learning이라고도 부르고 정답이 없기 때문에 unsupervised learning 방법이라고도 합니다. 최소한의 차원만 가지고 특징을 표현할 수 있다는 것이 포인트로 입력 데이터의 의미 있는 속성들을 추출합니다.
Auto Encoder는 위 그림처럼 3개의 구조로 이루어져있습니다. 입력 데이터의 대푯값들을 찾아 압축하여 차원을 줄이는 Encode, 압축된 데이터를 입력으로 Decoder에게 어디로 넘길지 결정하는 Code, 추출된 특징을 기반으로 입력 데이터의 차원만큼 차원을 늘리는 Decoder 부분입니다. 학습 시에는 Encoder와 Decoder 모두 필요하고 Code에서 압축이 일어나기 때문에 압축 Data가 필요하면 Code에서 값을 출력하도록 만들어야 합니다. 상황에 따라 Encoder와 Decoder 둘 중 하나의 파라미터를 고정시키고 나머지 부분만 학습시킬 수도 있습니다. 입력 레이어와 출력 레이어의 뉴런 수가 동일하다는 것만 제외하면 일반적인 MLP와 다를 게 없는 구조입니다. 이때 손실 함수는 입력 데이터와 출력 데이터의 차이를 최소화하는 것을 목표로 학습합니다.
1.1 활용사례
AutoEncoder는 매우 다양하게 사용되고 있습니다.
어떤 사진이고 어떤 색(RGB, LAB 등)을 넣어야하는지 알려준다는 가정 하에 흑백 이미지에 색을 추가하는 데 사용할 수 있습니다.
입력 데이터를 학습하여 필요한 feature들은 추출하고 필요 없는 노이즈 부분들을 지우면서 출력 데이터를 생성할 수 있습니다. 또한 차원을 축소하여 입력 이미지와 비슷한 이미지를 생성할 수 있습니다. 픽셀 값은 감소하였지만 입력 데이터와 비슷한 이미지를 출력해내는 것으로 무손 상 압축과 비슷한 역할을 합니다. 뿐만 아니라 워터마크를 제거하는데 사용되기도 합니다.
2. PCA vs. AutoEncoder
Autoencoder는 최소한의 차원만 가지고 특징을 표현한다는 점에서 PCA와 비슷하지만 PCA는 선형적으로 차원을 줄이고 Autoencoder는 비선형 활성 함수와 다수의 레이어를 이용하여 비선형 데이터에서도 쉽게 차원을 축소할 수 있습니다. 물론 Autoencoder의 파라미터를 조절하여 선형 데이터에 대한 차원을 축소하는 것도 가능하지만 PCA보다 오래 걸리기 때문에 비효율적입니다. 데이터와 상황에 맞게 효율적인 방법을 사용해야 합니다. AutoEncoder를 이용하여 차원을 축소할 때는 반드시 2차원에서 표현이 가능한 데이터이어야만 합니다.
3. Stacked AutoEncoder
Stacked AutoEncoder는 특징을 뽑아낼 때 주로 사용하는 방법입니다. 원한다면 데이터를 출력할 때 Decoder를 이용하여 다시 차원을 늘리지 않아도 되지만 일반적으로 대칭적으로 만드는 것이 특징입니다. 차원을 감소하는 과정인 Encoder에서 행렬 곱을 통해 출력 데이터의 차원이 작아지도록 만듭니다. 이를 위해서는 역행렬이 존재해야하는데 역행렬이 존재하지 않아 대칭 구조를 만들지 못한다면 acivation function과 같은 다른 요소를 이용하여 조정할 수 있습니다.
분류가 목표일 때 입력 데이터의 특징을 잘 뽑아야 분류에 사용할 수 있기 때문에 AutoEncoder를 이용하여 특징을 추출한 후 정답이 있는 supervised learning 모델에 사용할 수 있습니다. 입력 데이터와 출력 데이터가 비슷하다는 것은 특징을 잘 추출해낸 것이므로 정답이 없는 데이터에 Autoencoder를 적용하여 뽑아낸 파라미터들을 정답이 있는 데이터에 적용할 모형에 동일한 파라미터를 사용하여 학습시킵니다. 활성화 함수는 적절히 사용하여 비선형 구조도 학습하도록 만들 수 있습니다.
4. Denoising AutoEncoder
입력 데이터에 랜덤하게 노이즈가 있을 때 노이즈를 제거하거나 노이즈를 일부러 추가하여 중요한 특징을 추출해낼 때때 Denoising AutoEncoder를 사용합니다. 일반적으로 노이즈가 특성을 가지고 있지 않다고 가정한 뒤 학습할 때부터 가우시안 분포에서 샘플링한 임의의 노이즈를 넣어주며 학습하거나 Dropout을 이용하여 랜덤 하게 입력 노드를 꺼서 노이즈를 발생시키는 방법입니다. 깨끗한 이미지에 노이즈를 일부러 추가하는 이유는 실제 데이터는 노이즈가 첨가되어 있는 데이터일 수도 있기 때문에 잡음에 상관없이 특징을 추출하기 위해서입니다. 노이즈를 추가하지 않고 깨끗한 데이터들로만 모델을 학습시켰다면 노이즈가 있는 데이터가 입력으로 들어왔을 때 제대로 복구시키지 못하고 오버 피팅이 발생할 수도 있습니다. 이를 방지하기 위해 가우시안 분포에서 샘플링하여 임의로 노이즈를 추가하거나 Dropout을 이용하여 입력 노드를 꺼서 노이즈를 추가하여 모델을 일반화시키는 것입니다. 실제 사물을 인식하거나 vision을 연구하는 분야에서는 일부러 노이즈를 추가하고 추가된 노이즐르 토대로 학습된 데이터에서 나오는 결과가 노이즈를 삽입하기 전의 깨끗한 입력값인지 확인하는 경우도 있습니다.
5. Variational AutoEncoder
실제 데이터와 비슷한 데이터를 생성하는 GAN(Generative Adversarial Network)과 비슷한 방법으로 실제 데이터가 있으면 그 데이터의 특성을 반영하는 여러 임의의 데이터를 만들 때 Variational AutoEncoder를 사용합니다. Variational AutoEncoder는 Denoising AutoEncoder와 달리 입력 데이터에서 특징을 추출하고 난 후 특징의 분포를 보고 샘플링을 취한 후 노이즈를 추가합니다. 왜 일까요? Denoising AutoEncoder처럼 입력 데이터에 노이즈를 추가하게 된다면 정말 필요한 특징들로만 데이터를 생성해내고 싶은데 노이즈로 인해 특징이 묻히게 될 수도 있어 특징을 추출하고 난 후 노이즈를 추가하여 차원을 확장시킵니다. 그렇다면 왜 노이즈를 추가해야 하는 걸까요? 모든 AutoEncoder는 Decoder에서 차원을 확장시키며 데이터를 복구하는 과정에서 노이즈가 약해지기 때문에 기본적으로 noise를 제거하는 기능을 갖고 있습니다. 오버 피팅이 될 수 있기 때문에 한 번 샘플 된 데이터에 노이즈를 추가하고 샘플링을 통해 추출된 데이터의 특성과 노이즈가 섞인 데이터의 특성을 더해가며 학습하는 과정을 거쳐 출력 데이터를 만들어냅니다. 즉, 히든 레이어에서 특징을 잘 나타낼 수 있는 대표값이 반복적인 학습을 통해 도출됩니다. VAE는 손실함수는 두 부분으로 구성되어 있습니다. 첫 번째는 AutoEncoder가 입력 데이터를 재구성하도록 만드는 일반적인 reconstruction loss, 두 번째는 가우시안 분포를 기준으로 중간에 새로운 데이터를 만들어내고 그 값이 출력이 되므로 이것을 보상하기 위한 손실 함수인 latent loss입니다.
위 방법들을 이용하여 AutoEncoder는 이상 탐지, 추천 시스템, 인코딩 등에도 사용됩니다. 이상 탐지와 추천 시스템을 AutoEncoder를 이용한다니 신기하네요! 다음은 어떻게 응용되는지에 관한 내용도 다뤄볼까 합니다. 관련 글을 후에 확인해봐야겠어요.
참고
[2] Autoencoders vs PCA: when to use ?
[3] https://www.researchgate.net/figure/Structure-of-Stacked-Autoencoders_fig2_325025951
'ML&DL' 카테고리의 다른 글
심층 신경망 훈련하기 - Gradient 소실과 폭주 문제 해결 방법 (0) | 2020.12.29 |
---|---|
[DL] 06. 새로운 데이터를 생성하는 법, GAN? (0) | 2020.12.08 |
[DL] 음성 신호 모델링하는 방법, Wavenet 알아보기 - A Generative Model for Raw Audio (0) | 2020.11.13 |
[ML] 수식과 함께 SVM 이론 파헤치기 (0) | 2020.11.12 |
[ML] 하나의 class만 학습시켜서 불균형 데이터 예측하기 (0) | 2020.11.12 |