오토인코더 신경망(AutoEncoder)란 무엇인가?
비지도 학습 및 효율적인 코딩을 위한 인공 신경망이다.
소위 인코딩은 고차원 데이터에 대해 효율적인 특징 추출 및 특징 표현을 수행하는 것이다.
따라서 특징 차원 축소에 주로 사용된다.
즉, 원래 데이터를 데이터의 가장 중요한 측면으로 대체하는 방법에 연구의 초점을 맞추고 있다.
Autoencoder는 신경망 제품군의 구성원이지만 PCA(Principal Components Analysis)와도 밀접하게 관련되어 있다.
그 주요 특징은 다음과 같다.
1.PCA와 유사한 비지도 머신 러닝 알고리즘이다.
2.PCA와 동일한 목적 함수를 최소화해야 한다.
3.일종의 신경망이다.
4.이 신경망의 목표 출력은 입력이다.
오토인코더는 PCA와 매우 유사하지만 오토인코더는 PCA보다 훨씬 더 유연하다.
PCA는 선형 변환만 수행할 수 있기 때문이다.
이전에 공부한 CNN 및 RNN과 마찬가지로 인코딩 및 디코딩이라는 고유한 모듈도 있다.
여전히 구조에서 시작한다.
오토인코더 신경망의 구조
손실 함수는 다음과 같이 직접 주어진다.$$
f, g=\operatorname{argmin}_{f, g} Loss(z, f(g(z)))
$$
AutoEncoder는 최적화 과정에서 샘플의 레이블 값을 사용할 필요가 없음을 알 수 있다.
기본적으로 샘플의 입력은 신경망의 입력과 출력으로 동시에 사용되며,
샘플의 추상적인 특징 표현 L은 재구성 오류를 최소화하여 학습되기를 바란다.
이 비지도 최적화 방법은 모델의 다양성을 크게 향상시킨다.
신경망 기반 AutoEncoder 모델의 경우 인코더 부분은 계층별로 뉴런 수를 줄여 데이터를 압축하고,
디코더 부분은 데이터의 추상 표현을 기반으로 계층별로 뉴런 수를 늘리고 최종적으로 입력한 샘플의 재구성을 구현한다.
AutoEncoder는 신경망을 통해 각 샘플의 고유한 추상 표현을 학습하기 때문에 신경망의 매개변수가 어느 정도 복잡할 때 AutoEncoder는 과적합되기 쉽다.
기존 AutoEncoder가 과적합되기 쉬운 문제를 완화하기 위해 한 가지 방법은 입력 데이터에 임의의 노이즈를 추가하는 것이다.
예를 들어 아래 그림과 같다.
여기서 노이즈는 지저분한 것이 아니라 특정 분포를 따르는 무작위 노이즈이다.
또 다른 방법은 정규화의 개념을 결합하고 인코더가 간섭 방지의 추상적인 특징을 학습할 수 있도록 인코더의 야코비 행렬 패러다임을 목적 함수에 추가하여 인코더를 제한하는 것이다.
정규화 항(특정 제약 조건)을 추가하여 희소한 고차원 추상 특징 표현을 얻을 수 있는 것으로 이해할 수 있다.
희소성은 인코더의 각 레이어에 있는 뉴런의 일부만 활성화할 수 있으므로 샘플을 저차원 희소 특징 벡터에 매핑할 수 있다.
완전 연결 네트워크 기반 계산 프로세스
여기에서는 인코딩과 디코딩이 모두 완전히 연결된 신경망을 사용하여 수행된다고 가정한다.
사실 완전히 연결된 신경망은 모든 신경망의 조상이다.
이해하면 모든 네트워크를 이해할 수 있다.
다음 수학 공식은 이해를 돕기 위한 것이다. 어렵지 않다. 결과를 계산할 필요가 없다.
입력 데이터:$$
z^{(1)}=\left(z_{1}, z_{2}, \ldots, z_{n_{1}}\right)
$$
행당 선형변환한 결과:$$
y^{(1)}=\boldsymbol{W}^{(1)} z^{(1)}
$$
비선형변환한 결과(또 다음 층의 입력 데이터): $$
z^{(2)}=\sigma\left(y^{(1)} \right) =\sigma^{(1)}\left(\boldsymbol{W}^{(1)} z^{(1)}\right)
$$ $$\vdots $$
이 중첩 계산은 \(l\)번째 레벨까지 계속된다.
추출된 latent vector(또는 coding vector)라고 부르는 dimension reduction된 벡터 \(z^{(l)}\)를 가져온다:$$
z^{(l)}=g_{encoder}\left(z^{(1)}\right) $$
행렬 형식으로 작성하면 다음과 같다:$$
\left(\begin{array}{c}
z_{1}^{(l)} \\
z_{2}^{(l)} \\
\vdots \\
z_{n_{l}}^{(l)}
\end{array}\right)=\left(\begin{array}{c}
\sigma^{(l-1)}\left(W_{1}^{(l-1)} z_{1}^{(l-1)}\right) \\
\sigma^{(l-1)}\left(W_{2}^{(l-1)} z_{2}^{(l-1)}\right) \\
\vdots \\
\sigma^{(l-1)}\left(W_{n_{l}}^{(l-1)} z_{n_{l}}^{(l-1)}\right)
\end{array}\right)
$$
그런 다음 출력 레이어는 원래의 입력 값을 얻기 위해 최대한 '복원'하기 위해 얻은 특징 벡터를 증폭하고 채우는 것이다:$$
z^{(OUT)}=\hat{z}=z^{(2l-1)}=\tilde{z}^{(1)}=f_{\text {decoder}}\left(g_{\text {encoder}}\left(z^{(1)}\right)\right)$$
인코딩 부분을 담당하는 신경망과 디코딩 부분을 담당하는 신경망이 대칭일 필요는 없다는 점에 유의해야 한다.
즉, 레이어의 수와 각 레이어의 노드 수가 반드시 같을 필요는 없다.그리고 이 네트워크를 시작으로 기존의 NN 네트워크의 구조를 AutoEncoder에 도입하는 것이 사실 더 일반적인 아이디어라고 생각한다.
구현할 때 인코더와 디코더는 고정되어 있지 않다.
사용 가능한 옵션은 CNN/RNN/LSTM 등이며 필요에 따라 자유롭게 조합할 수 있다.
오토인코더의 예
이러한 다양한 오토인코더 중에서 '변이형 오토인코더'(Variational AutoEncoder)를 중점적으로 학습한다.
Comments