여러가지 구조의 Autoencoders

2019. 6. 13. 21:03관심있는 주제/Dimension Reduction

728x90

일반적인 AutoEncoder는 feed forward NN 구조인데, 이 구조에서는 인풋을 hidden으로 만들고 다시 인풋으로 만드는데, 이 hidden을 잘 학습을 하는 것이 목적이라고 할 수 있다.

 

이 포스트에서는 여러 가지 AutoEncoder 구조에 대해서 설명을 한다.

만약 우리가 수백만장의 이미지가 있고 각 이미지는 약 2MB를 차지하는데, 우리는 1MB만 제공할 수 있다.

이처럼 데이터 차원을 잘 줄여야 할 때 어떻게 해야 할까?

 

이미지를 잘 보다 보면, 정보와 무관한 것이 많이 있을 때가 있다. 예를 들어 배경 같은 것은 사실 이미지랑 관계없지 않은가! 그래서 이렇게 쓸모없는 정보를 줄일 수만 있다면 우리는 1MB짜리로 줄일 수 있을 것이다.

 

그래서 결국 Hidden으로 저장해서 많은 공간을 절약할 수 있는데?

단순히 간단한 압축만 하는 것일까?!

다른 예로는 만약 초록색을 가지고 있는데, 그것을 조합했을 때 생산한 색깔에 알고 싶다고 해보자.

이러한 부분에 대해서도 AutoEncoder는 사용이 가능하다!

왜냐하면 그것은 종종 인풋은 untagle 즉 풀어서 쓸 수도 있기 때문이다!

파란색과 노란색은 입력의 숨겨진 표현으로 떠오를 수 있는데, 왜냐하면 우리는 이 두 가지 색을 사용하여 녹색을 재현할 수 있기 때문이다.

> 그래서 오토 인코더는 종종 entagled input(복잡하게 섞인 인풋)을 풀어서 쓸 때 사용할 수 있다. 아니면 우리가 인식할 수는 없지만 인풋들 간에 더 유용한 관계를 제시할 수도 있다!!

 

원래 기존에 위에 것 밖에 몰랐는데 밑에 것도 새로 알게 돼서 신선했다!

 

그래서 이러한 것을 나타내는 아키텍처는 다음과 같다!

 

Undercomplete Autoencoders

 

일단 우리가 잘 알고 있는 구조이다 hidden이 인풋보다 작은 경우

이것이 실제로 나타내는 것은 무엇일까?!

이렇게 축소하다 보면 저 hidden에 더 추상적이고 의미 있는 정보를 강요하는 구조가 된다. 

즉 hidden representation은 인풋보다 작기 때문에 간결하고 압축된 것을 저장하다 보니, 관련된 정보만 전달하게 되는 구조가 되어버린다!

마치 이런 구조는 우리가 알고 있는 PCA와 간다. 하지만 PCA와의 차이점은 PCA는 선형성이고 AutoEncoder는 비선형이다!

 

만약에 km , m , feet, cm 측정이 포함된 인풋이 있을 때 hidden representation은 오로지 1 node만 포함하게 된다! 

무엇을 배우도록 강요된 것일까?! 측정 사이에서 흥미로운 관계를 찾았을 것이다. 결국 변환만 해주면 되는 구조기 때문이다. 

그래서 왜 그렇게 많은 숫자를 저장하고, 우리를 변환하는 데 도움이 될 수 있는 변수들을 배워보는 것이 어떨까? 그리고 그것이 undercomplete autoencoder가 하는 일이고,

그것은 무관한 정보를 없애고 입력과 중복된 정보들 사이의 흥미로운 관계를 발견한다.

 

Overcomplete Autoencoders

undercomplete autoencoder와는 달리 이제는 hidden이 input 보다 더 큰 구조이다 

우리의 목적은 hidden representation으로부터 Input을 복원하는 일이다.

만약 우리가 숨겨진 표현에 더 많은 노드를 가지고 있다면, 우리의 신경 네트워크는 단순히 모든 입력 노드를 은닉 노드에 복사하여 출력물에 붙여 넣는 법을 배울 수 있다고 생각할 수 있지 않을까라고 한다.

아무 조치도 안 한다면 그러한 현상은 가능할 것이다

 

그러나 왜 우리는 이렇게 데이터 압축하는 것으로 목적을 하던 것을 오히려 더 늘리는 구조가 필요하게 된 것일까?

보통 우리는 이런 데이터 공간에 대해서 걱정을 하지만, 때 때로 그 안에 제시된 정보 아래에서 더 많은 정보를 찾고 싶어 하는 것이 이유이다!

 

종종 얽힌 데이터에서 관계를 찾을 필요가 있다는 것이고, 만약 압축만 하거나 그대로 사용한다면 그 의미를 알기는 어려울 것이다. 이전에 말한 초록색 같은 경우에도 블루와 엘로우 관점에서 초록색을 포현하려면 압축이 아닌, 더 많은 정보를 만들어야 하는 상황인 것이다!

그러한 구조를 만들려면 직관적으로 생각할 수 있듯이 인풋보다는 더 많은 hidden이 필요한 이유이다!

 

한 가지 더 예시로는 BMI가 있다. 우리는 이 정보로 병에 걸릴지 여부를 알고 싶다고 해보자.

이것을 NN에 학습을 시키는데 특이한 경우로 BMI는 같은데 한 사람은 병에 걸리고 한 사람은 병에 걸리지 않았다고 하자. 그리고 다른 사람은 한 사람보다 키가 더 크다고 하자. BMI와 함께 중요하고 어쩌면 몸무게가 중요한 것일 수도 있다. 

하지만 어떻게 몸무게나 키를 얻을 수 있을까?

앞에서 언급한 대로 어떤 AutoEncoder는 얽힌 데이터를 잘 풀어서 사용할 수 있게 하는 것이 있다.

BMI가 우리가 알고 있듯이 키와 몸무게로 만든 수치다.  그런데 여기서 hidden에서 더 높은 차원으로 하면 키와 몸무게로 풀어서 사용될 수 있다는 것이다!

 

하지만 문제는 오토 인코더가 입력 내용을 복사하는 것을 어떻게 막을 것인가 하는 겁니다.

단순히 복사하는 대신에 유용한 표현을 추출하는 것이 어떻겠냐는 겁니다. 그것을 어떻게 구현해야 하는가?

 

여기서는 Regularization을 통해서 그러한 것을 막겠다고 합니다!

 

Regularisation

우리가 알듯이 Regularization을 통해 실제 더 강건한 모델을 만들면서, 일반화의 오류도 최소한으로 하려는 기법입니다.

 

  • L2-Regularisation
  • Denoising Autoencoders
  • Sparse Autoencoders
  • Contractive Autoencoders

L2-Regularisation

이것은 우리의 일반화 오류를 줄이기 위해 손실 기능에 추가될 수 있는 가장 간단한 규칙화 유형이다. 이러한 규칙화는 때때로 weight 감소 방법이라고도 한다.

 

 

이러한 가중치는 어떤 가치도 취할 수 있다. 즉, 많은 자유가 주어지며, 이는 결국 대용량을 야기할 수 있고, 손실이 감소하더라도 우리의 일반화 오류는 증가할 것이다. 이것은 좋은 방법은 아닌 것 같다. 그래서 이렇게 weight의 자유도를 줄일 필요가 있다. L2-Regularizetion을 통해 weight를 자유도를 줄여서 오버 피팅을 줄인다. 

 

또 다른 트릭으로는 Encoder와 Decoder의 Weight를 묶는 방법이다

이것을 통해 실제 파라미터의 수를 줄일 뿐만 아니라, 네트워크가 그러한 가중치를 학습하도록 강제할 뿐 아니라 결국 신기하게 W* W X = X 가 되게 하는 신기한... 머 그런 거 

 

Denoising Autoencoders

만약 엄청 흐린 데이터가 있어서 얼굴의 특징이 안 보이는 것이 있다. 여기서 무엇을 할 수 있을까?

아마 얼굴의 특징인 코 눈 귀 입술 같은 중요한 부분에 대해서 찾으려고 할 것이다.

그럴 때 우리는 열심히 찾으려고 노력을 해서 뇌를 많이 쓰겠지만, 깨끗한 이미지에 대해서는 그렇게 머리를 많이 쓰지 않을 것이다

 

그래서 여기서 직관을 얻어서 Network가 더 학습을 잘하게 만들기 위해서 일부러 확률적 프로세스를 활용하여, 인풋에 노이즈로 손상을 입힙니다.  즉, 어느 정도 확률 q로 입력의 특정 부분을 0으로 만들고 확률 1 – q를 사용하여 그대로 둔다.

 

왜 이러한 구조가 도움을 줄까요??!!

자 이제 우리의 네트워크는 손상된 이미지를 줘서 깨끗한 이미지로 만들어야 하는 일을 해야 합니다.

그러므로 만약 단순히 카피만 한다면, Loss는 상당히 높게 나올 것입니다. 그래서 인풋에서 더 중요한 정보를 배우기 위해서 더 많이 노력할 것이라는 이야기죠!

 

 

 

 

Sparse Autoencoders

sparse autoencoder의 직관은 대부분의 시간 동안 뉴런들이 활동하지 못하게 하는 것입니다.

학습하기도 바쁜데, 왜 이러한 행동을 해야 할까요?!

만약 학습 시에 뉴런들에게 한 가지를 적용하라고 노력을 하는데, 만약에  활성화가 됐을 경우에 

우리가 예측하는 주요 임무에 사용될 수 있는 중요한 무언가가 있어야 한다.

우리는 기본적으로 뉴런으로부터 자유를 빼앗고 그들에게 차별적인 힘을 주고 있다.

 

이를 확인하는 한 가지 방법은 ρ로 정의된 Sparsity 파라미터를 사용하는 것이다.

우리는 ρ이 0이 되기를 원한다.

뉴런이 몇 번이나 활성화된 지를 어떻게 측정할 수 있는가? 다음 방정식을 통해 계산할 수 있다.

 

만약 activation_function(x)가 양수라면 활성화가 된 것이다.

그것에 대해서 모든 뉴런들을 합칠 수 있다. 그리고 그들의 평균을 얻은 것을  ρl이라고 한다.

우리는 이 양이 ρ에 의해 주어진 sparsity 매개 변수와 최대한 같기를 원한다.

 

어떻게 하면 손실 함수에 Ω(ρl)만 추가하고 w.r.t W, W* 및 ρl. Ω(ρl)이다음과 같이 주어지는 것을 최소화할 수 있을까?

 

Contractive Autoencoders

overcomplete autoencoder에서 identity function으르 단순히 copy 하고 paste을 방지하려면 어떻게 해야 할까?

 

 

전체적인 목표는 자코비안의 각 개인을 최소화하는 것을 의미하는 Ω(θ)을 최소화하는 것이다.

자코비안의 한 요소를 어떻게 최소화할지에 대해서 생각해봅시다

 

우리가 알고 있듯이 매트릭스는 입력 뉴런을 가진 각각의 숨겨진 표현에 대한 부분적 파생물로 구성된다.

그러면 미분 값은 언제 0일까?

미적분학에서 말하기를 미분하려는 함숫값이 0일 때 zero derivative라고 한다고 한다.

따라서 우리의 Ω(θ)은 매트릭스의 모든 요소가 0인 경우에만 최소가 될 것이며, 숨겨진 표현이 입력에 의존하지 않는다는 것을 의미하는 상수 함수일 때만 가능하다.

하지만 잠깐, 이런 행동이 손실 함수를 높이게 될 것이다.

왜냐하면 우리는 지속적인 기능에서 입력을 재구성할 수 없기 때문이다.

그러므로 여기서 손실과 정규화 사이에서 trade off가 생기게 된다

2개의 모순적인 목적함수를 넣음으로써  이 두 가지 모순적인 목표를 서로 배치함으로써 우리는 우리의 숨겨진 표현이 훈련 데이터에서 관찰된 매우 중요한 변화에만 민감하다는 것을 보장한다.

 

 

사실 이 포스트를 본 이유는 어쩌면 overcomplete라는 부분 때문에 보게 된 것 같다.

인풋들이 entagled 한 경우에 이 것을 untangle 한다는 아이디어 즉 새로운 유의미한 파생변수?를 만드는 느낌을 주기 때문에 굉장히 유용하다 생각하고, 실제로 autoencoder에서 anomaly detection을 할 때도 이러한 구조가 더 효과가 있는 것을 보고 관심을 가지게 됐다! 

 

암튼 다양한 AutoEncoder 구조를 공부하게 돼서 재밌었다.

 

 

- 끝 - 

 

https://www.youtube.com/watch?v=ZWiF1T-wVjU

 

 

 

https://thekishankumar.com/2018/12/23/autoencoder/

 

Autoencoders

Autoencoders are a kind of feed forward neural network, whose main task is to learn the hidden representation of the input and then using that hidden representation to generate the input back. Now some of you might be thinking why the hell do we need such

thekishankumar.com

http://www.icml-2011.org/papers/455_icmlpaper.pdf

불러오는 중입니다...

https://wiseodd.github.io/techblog/2016/12/05/contractive-autoencoder/

 

Deriving Contractive Autoencoder and Implementing it in Keras - Agustinus Kristiadi's Blog

Contractive Autoencoder is more sophisticated kind of Autoencoder compared to the last post. Here, we will dissect the loss function of Contractive Autoencoder and derive it so that we could implement it in Keras.

wiseodd.github.io

http://machinelearninguru.com/deep_learning/tensorflow/neural_networks/autoencoder/autoencoder.html

 

Autoencoders and their implimentations in TensorFlow

Autoencoders and their implementations in TensorFlow In this post, you will learn the concept behind Autoencoders as well how to implement an autoencoder in TensorFlow. Sections Introduction Autoencoders are a type of neural networks which copy its input t

machinelearninguru.com

 

728x90