일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- iTerm2
- Peephole Connection
- Inception Module
- classification
- python
- Generative
- version
- Gated Skip Connection
- DL
- cnn
- Inception V1
- Vanilla RNN
- Regression
- ResNet
- AI
- Bottleneck Layer
- sigmoid
- GoogLeNet
- virtualenv
- vim-plug
- Skip Connectioin
- Residual Connection
- GCN
- RNN
- Skip Connection
- jupyter
- Optimizer
- DCGAN
- Manager
- Linear
- Today
- Total
IT Repository
(1) AutoEncoder 본문
For What is AutoEncoder Used?¶
AutoEncoder는 Dimensionality Reduction을 위해서 딥러닝에서 사용하는 차원 축소 모델 구조입니다.
차원 축소 개념은 Sparse한 정보를 담은 벡터를 좀 더 유용한 정보만으로 채워진 Dense한 벡터로 만들기 위함입니다.
우리는 이미 GoogLeNet에서 사용한 Bottleneck Layer에서도 차원 축소 테크닉을 사용해서 파라미터의 수를 줄였던 경험이 있었죠.
차원 축소 개념이 와닿지 않으실 분들을 위해 예시를 하나 들어보겠습니다.
스프링 운동은 1차원 운동으로 "위치" 라는 1차원의 데이터만 있다면 속도, 가속도 등의 모든 정보를 표현할 수 있습니다.
그러나 스프링 운동을 각기 다른 위치의 10개의 위치에서 촬영했다고 가정합시다.
그러면 이는 각 촬영위치에서 기록된 10차원의 데이터로 표현될 것입니다.
하지만 앞서 말했듯이 스프링 운동은 1차원 데이터만으로 모든 정보를 표현할 수 있습니다.
그러면 이 10차원의 데이터는 실제적으로는 불필요한 정보들이 더 많은 Sparse한 데이터입니다.
따라서 필요한 정보만을 가진 1차원의 데이터로 차원을 축소해도 여전히 스프링 운동을 잘 나타낼 수 있습니다.
이와 같이 진짜 데이터가 내포되어 있는 고밀도의 저차원으로 축소하는 것이 Dimensionality Reduction 입니다.
통계학에서는 PCA 등의 방법으로 데이터를 잘 표현하는 몇개의 Feature를 뽑아내어 차원을 축소합니다.
그리고 AutoEncoder는 어떤 정보가 중요한 정보이고 중요하지 않은 정보인지를 딥러닝 모델이 스스로 학습해서 필요한 정보만을 저차원 벡터에 나타내는 모델입니다.
(Dimensionality Reduction을 사용하는 또다른 이유는 "차원의 저주" 가 있습니다. 이 내용은 이 곳에서 확인해주세요.)
Structure¶
AutoEncoder는 아래와 같은 구조로 설계됩니다.
$\text{input } (x) \rightarrow \text{Encoder network} \rightarrow \text{Latent vector } (z)$
인풋 x가 들어왔을 때에 Encoder Network에 통과시켜서 Feature 벡터 z로 축소하는 것입니다.
Encoder
초기의 인코더 구조는 Linear 레이어에 Sigmoid 함수를 사용하여 Non-linearity를 확보하는 방법으로 Latent vector z에 매핑했습니다.
그러나 최근에는 MLP를 사용해서 더 깊은 층의 Encoder 구조나 ReLU CNN 등을 깊게 쌓아서 더 넓고 깊은 층으로 인코더 네트워크를 구성합니다.
Latent vector (z)
z는 일반적으로 x보다 더 작은 차원을 갖게 됩니다. (Dimensionality reduction)
어찌보면 당연하게 다양한(Sparse) 정보에서 의미있는(Dense) 정보만을 포착하는 것이 목표이기 때문입니다.
아래 사진은 AutoEncoder의 Encoder 구조의 예시입니다.
How To Learn¶
그러면 인코더 네트워크를 어떻게 학습시켜야지 인풋 x에 대해 의미있는 정보만을 담는 저차원의 벡터를 출력하도록 만들수 있을까요?
아래 순서도를 먼저 보겠습니다.
$\array{ \text{input } (x) &\rightarrow& \text{Encoder network} \rightarrow \text{Latent vector } (z) & \\ &\rightarrow& \text{Latent vector } (z) \rightarrow \text{Decoder network} &\rightarrow& \text{reconstructed }(\hat x)} $
인코더 네트워크를 학습시키기 위해서 디코더 네트워크를 붙입니다.
즉, 인코더가 의미있는 정보로 압축하면, 그것을 다시 원본 데이터로 복원하는 디코더 네트워크를 만드는 것입니다.
인코더가 인풋 x를 잘 나타내는 정보로 Latent z를 표현할 수록 원본 데이터로 복원이 잘 되겠죠.
구체적으로는 $x$와 $\hat x$를 각각 true, pred로 하여 손실값을 구하고 최적화함으로써 input x를 가장 잘 표현하는 latent vector z를 찾습니다.
Decoder
인코더와 마찬가지로 디코더 역시 초기에는 Linear 레이어에 Sigmoid 함수를 사용하여 Non-linearity를 확보하는 방법으로 Latent vector z를 Reconstructed 데이터에 매핑했습니다.
최근에는 MLP를 사용해서 더 깊은 층의 Encoder 구조나 ReLU Transposed CNN 등을 깊게 쌓아서 더 넓고 깊게 디코더 네트워크를 구성합니다.
(Transposed Conv 레이어는 Conv 레이어의 역연산을 통해 이미지를 복원하는 레이어입니다.)
Use¶
AutoEncoder의 학습이 어느정도 수렴하면 디코더 네트워크는 떼어버리고 인코더 네트워크만 사용합니다.
앞서 정의하였듯이 우리가 목표로 했던 고밀도의 압축된 정보를 출력하는 네트워크가 인코더이기 때문입니다.
AutoEncoder는 실제에서는 독립적으로는 거의 사용되지 않습니다.
다른 딥러닝 구조와 함께 사용함으로써 학습 자체를 돕거나 학습의 수렴을 돕게 됩니다.
예를 들어, Classification 문제에서 Label이 있는 Data는 적고, Label이 없는 Data는 많은 경우에 아래와 같이 AutoEncoder를 활용할 수 있습니다.
- 다수의 Label이 없는 Data로 Encoder를 학습 (의미있는 feature 추출)
- Encoder에 소수의 Label이 있는 Data를 넣어서 Classification