데이터과학 유망주의 매일 글쓰기 — 열 일곱 번째 일요일

배우는 자(Learner Of Life)
6 min readJan 3, 2021

--

Autoencoder

# Autoencoder, #Encoder, #Decoder

Autoencoder의 구조를 표현한 그림 (1)

오늘 한일:

이번 주에 배운 내용 중 가장 마지막 부분은 Autoencoder라는 개념이었다. 이미지를 내가 원하는 사이즈로 최대한 중요한 정보만 남기면서 줄이고, 다시 과정을 역으로 밟아 원본의 이미지를 최대한 구현하는 기법이다. 어떻게 보면, 이 기법 자체로 이미지가 성공적으로 압축되고 압축해제 되는지를 알 수 있는 것이다.

주로 비지도학습에서 사용되는 신경망의 예로써, 인코더(Encoder)와 디코더(Decoder)로 이루어져있다. 그렇다면 본격적으로 Autoencoder에 대해 알아보자.

오토인코더(Autoencoder)

목적

일반적으로 데이터 셋에 대한 잠재 의미(latent semantics) 등을 추출하기 위해 사용된다. 다른 기법들과 차이가 있다면, 차원 감소시 노이즈 즉 에러를 최소화하기 위해 모델이 훈련된다는 점이다. 그래서 일반화를 더 잘하기 위해 일부러 노이즈를 입력값에 입혀 학습을 하기도 한다.

인코더에서 데이터의 차원 축소가 이루어지고, 다시 역과정을 거처 입력된 이미지를 최대한 가깝게 구현하는 일을 하는 것이 디코더다. 쉽게 말하자면, 오토인코더는 입력값이 그대로 문제없이 출력으로 나오는지 체크할 수 있는 도구라고 볼 수 있다. 물론 가장 이상적인 것은 입력값과 출력값이 똑같이 나오는 것 이겠지만, 실질적으로 모든 시스템에 어느 정도의 오차가 있을 수 밖에 없다는 것을 감안하면, 약간의 에러를 감수할 수 밖에 없는 것이 사실이다. 그러므로 오토인코더에서도 다른 신경망과 마찬가지로 에러를 최소화하는 것이 중요하다. 그러므로, 이 기법에서도 경사하강법(gradient descent) 및 역전파(backpropagation)이 적용될 수 있다. 오토인코더는 GAN이라는 신경망 모델의 형태에서 널리 사용되는 기법이다.

구조

오토인코더를 한눈에 보여주는 그림 (2)

위 그림에서 보는 것처럼, 오토인코더는 인코더와 디코더로 이루어져있다. 입력된 이미지는 특정한 크기의 벡터로 축소한다. 이때 중요한 것은 인코딩시 최대한 중요한 정보만을 남겨야 한다는 것이다. 마치 데이터의 분산을 유지한 채 차원을 축소하는 PCA와 매우 비슷한 개념이라고 볼 수 있다. 지정한 Code Layer의 크기만큼 축소가 될 때까지 과정을 반복한다. 이후 디코더를 통해 같은 과정을 역순으로 밟아 다원본 이미지와 같은 크기로 확장될 때까지 과정을 반복한다.

그렇게해서 디코더의 출력값과 인코더의 입력 이미지가 얼마나 같게 나오는지 확한다. 이 둘 사이에 얼마나 차이가 있느냐 즉, 입력된 최초의 벡터 값이 출력된 벡터 값과 얼마나 차이가 있는지가 비용함수(에러)가 된다. 이 비용함수가 최소화되는 지점을 찾으면서 학습이 이루어지게된다. 위 그림에서는 입력 이미지에 노이즈가 있는 것을 볼 수 있는데, 출력 이미지에서는 노이즈가 상당부분 사라져 깨끗해진 것을 볼 수 있다. 이전에 언급했던 것처럼, 일부러 노이즈를 잘 제거할 수 있도록 학습시키기 위해 입력 이미지에 노이즈를 더해 학습을 시키기도 한다.

방법

오토인코더의 학습을 수식으로 나타낸 모습

위 수식의 각 부분은 아래와 같다.

  • x: 최초 입력 값
  • f(x): 인코더의 출력 값
  • g(f(x)): 디코더의 출력 값
  • C(x): 디코더의 출력 값과 최초 입력 값의 차이 (비용함수)

위 수식은 상당히 직관적이다. 먼저 최초 입력 값(x)이 인코더(f(x))에 입력된다, 여기서 출력된 값은 곧바로 디코더에 전달되어 처리된다. 그 디코더의 출력 값(g(f(x))과 최초 입력 값의 차이를 계산하여 에러를 찾는다(C(x)). 여기서 에러 즉, 비용함수가 최소화 (dC/dx -> 0)되는 지점을 찾아 학습을 시키는 것이다. 대표적으로 차이를 측정하는 지표는 MSE(Mean Sqaured Error 등이 있다.)

앞으로 할일:

오늘은 오토인코더에 대해 리뷰해보았다. 오토인코더에서 가장 놀라웠던 점은 일부러 이미지에 노이즈를 입혀 노이즈를 없애도록 훈련한다는 다소 기발한 생각을 실현했다는 점이다. 마치 인간에게 무엇이 잘못 되었는지 구분하기 위해, 일부러 약간 틀린 전제를 주어, 특정한 답을 도출해 내도록 요구하는 것 같았다. 그렇게 하면 주어진 조건에서 최대한 필요한 답에 가까운 값을 도출하려 노력할 것이다. 그렇게 함으로써, 조금 더 어려운 조건에서 무엇이 더 필요한지, 어떠한 한계가 존재하는지 인식하고, 그안에서 최적화된 솔루션을 찾으러 노력하는 것이다. 딥러닝에서도 비슷한 논리가 활용될 수 있다는 것에, 이 분야의 기술이 많이 발전했구나라는 것을 느낀다.

무엇보다도 가장 기본적으로 인코딩(encoding)이란 “특정한 정보를 암호화"하는 개념이다. 디코딩(decoding)은 반대로 여기서 “암호화된 정보를 본래 형태로 해독하는 것"이라고 할 수 있다. 그렇게 생각한다면, 오토인코더는 단순히 특정한 방법으로 정보를 암호화하고, 다시 이것을 원래의 형태로 풀어내는 것이라고 좀 더 쉽게 이해할 수 있다. 모든 개념이든, 최대한 큰 그림에서 본다면 한 두 문장으로 간략하게 설명하는 것이 어렵지 않다고 생각되었다. 앞으로 이 사실을 명심하며 다른 개념들을 학습할 때에도 “이 기법의 가장 큰 목적이 무엇인가?”를 생각하면서 배워야겠다는 생각을 했다.

내일은 딥러닝 과정의 마지막 수업이다. 아무래도, 언급했던 GAN이라는 신경망에 대해 배울 것이라고 생각된다. 이 Autoencoder에 대한 개념을 확실히 잡았으니, 그렇게 어렵지 않을 것이라는 생각이 든다. 이번 한 달간은 딥러닝이라는 어떻게 보면 조금 어렵지 않을까 두렵게 생각했던 개념이, 훨씬 더 와닿고 많이 이해되는 시간이었다. 수업을 듣고 과제를 진행하면서 마지막 프로젝트 때 어떤 것을 해야할지 몇가지 아이디어가 생기기도 했다. 그렇게 복잡한 것을 구현할 수는 없을 수도 있지만, 최소한 신경망을 이용해 내가 해 볼 수 있는 것들이 생각나서, 이번에도 충분히 내가 배운것을 십분 활용해 볼 수 있는 흥미로운 기회가 될 것이라 생각한다. 다른 동료 학생들이 얼마나 또 흥미로운 프로젝트를 진행할지 기대된다. 내일까지 모두 힘내고, 무엇보다도 화요일에 있을 자가 점검의 시간을 잘 치를 수 있기를 응원한다.

화이팅!

참조:

(1) https://medium.com/@birla.deepak26/autoencoders-76bb49ae6a8f

(2) https://www.pyimagesearch.com/wp-content/uploads/2020/02/keras_denoising_autoencoder_header.png

--

--

배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.