Computer Science는 2010년부터 Deep Learning 열풍이다.
DEEP LEARNING !!
나도 2013년에 IEEE International Symposium on Robot and Human Interactive Communication이라는 학회에 Deep Learning을 응용한 논문을 제출한 적이 있다.
(링크: http://cpslab.snu.ac.kr/publications/papers/2013_RO-MAN_behaviorDL.pdf)
그 뒤로는 이쪽은 건드리지도 않고, Gaussian process를 이용한 연구를 주로 했었다. 이렇게 연구 방향을 접은덴 여러 이유가 있겠지만, 그 중 가장 큰 이유는 학문적 contribution을 낼 자신이 없어서였다. 그렇다 하더라도 practitioner 관점에서 deep learning이 엄청나다는 것은 두말하면 잔소리라고 모두 여기고 있을 것이다. 그 뒤로 가끔씩 이것저것 Deep Learning을 이용한 수많은 논문을 보면서 이 분야를 계속 파봤으면 어땠을까 하는 아쉬움이 남긴 하지만, 그래도 그리 큰 후회는 없다.
이번 포스팅에선 지금까지 생각해왔던 Deep Learning이 무엇인지에 대해서 한번 써보겠다. 수식 이면에 있는 저자의 의도를 파악해보자. (물론 언어영역과 같이 내 독자적인 해석일 가능성이 매우 크다..)
Deep Learning의 정의에 있어서는 사람들마다 조금씩 다르게 생각하는 것 같다. Introduction to deep learning이라고 처보면 수백개의 논문이 나오고, 그 논문들마다 내리는 정의는 조금씩 다르다. 하지만 일반적으로 계층 구조를 이용한 학습 방법에 있어서는 동의하는 것 같다. 나 개인적으로는 Restricted Boltzmann Machine (RBM)을 계층으로 쌓은 Deep Learning 구조와, Convolutional Neural Network를 이용한 구조로 구분할 수 있다고 생각한다.
이 중에서 RBM을 stack한 구조에 대해서 생각해보자. 위키에 따르면 Boltzmann Machine이 처음 등장한 것은 1985년도이다. 그리고 그 개발자(?)는 그 유명한 Geoffrey Hinton과 Terry Sejnowski이다.
위의 그림이 Boltzmann Machine이다. 수학적으로 말하면 이는 stochastic recurrent neural network이다. 무슨 말인고 하니, 위의 그래프, 혹은 네트워크의 노드들은 확률적으로 정의가 되며, input과 output이 따로 있는 것이 아닌 모두 연결이 되서 순환한다는 의미로 recurrent라는 수식이 붙는다. 즉 어떤 한 노드는 다른 노드들로부터 영향을 받음과 동시에 영향을 주게 된다. 이름에 Boltzmann이 붙은 이유는 각 노드에 대한 확률이 Boltzmann distribution과 유사하기 때문이다.
위의 그림에서 v와 h가 있는데, v는 visible node, h는 hidden node이다. 즉 우리가 "볼 수 있는 것"은 v들이고, h들은 우리가 알 수 없는 어떤 값을 갖는다. 게다가 모든 것이 확률로 정의되므로, 우리는 각 h들이 1이될 확률를 알게 된다. 그리고 그 확률은 아래 Botzmann distribution으로 정의된다.
$$ F(state) \propto e^{-\frac{E}{kT}} $$
여기서 F는 확률을 나타내고, E는 에너지, k는 볼츠만 상수, T는 온도를 의미한다.
직관적으로 생각해서 어떤 물질의 에너지가 클 수록 해당 입자가 존재할 확률은 줄어들게 된다. 세상은 안정된 상태로 있길 원한다는 가정을 갖고 있는 것이다. T는 온도를 의미하고, T가 높을 수록 온도가 높은 물질이 더 잘 존재할 수 있게 된다.
Boltzmann distribution을 정의하기 위해선 "상태"에 대한 에너지를 정의해야한다. 여기서 한 가지 짚고 넘어가고 싶은 것은 에너지가 낮을 수록 좋다는 것이다!
Energy of a Boltzmann machine
$$ E = -(\sum_{i<j}w_{ij}s_is_j + \sum_{i}\theta_is_i) $$
앞서 말했듯이 에너지가 낮을 수록 해당 "상태"에 있을 확률이 높아지고, 위 식에서 괄호 앞에 -가 있으므로 괄호 안의 값이 높을 수록 확률이 높아질 것이다.
여기서 '$s_i$'는 i번째 node의 값이고, 0또는 1을 의미한다. '$\theta_i$'는 i번째 node의 bias 텀이다.
그런데 문제가 하나 있다. 앞서 말했듯이 우리는 오직 v node, 즉 visibile 노드 밖에 알 수 없다. h (hidden) node들은 어떻게 구할 것인가? 게다가 visibile node끼리도, hidden node끼리도 모두 연결되어 있기 때문에 서로의 dependency가 존재하고, 학습이 "매우 매우" 어려워진다. 그래서 등장한 것이 Restricted Boltzmann Machine이다.
위의 그림이 Restricted Boltzmann Machine을 나타낸 것이다. 생각보다 너무 간단하고 약간은 볼품없다. 이러한 간단한 구조가 요즘 잘나가는 구글, 페이스북, 마이크로소프트에서 모두 열심을 다해 연구한다니 몬가 허무하지 않는가? (물론 그렇지 않다.)
위의 RBM이 기존 BM과 다른 점은 Visibile unit들끼리, Hidden unit들끼리 edge가 없어졌다는 것이다. 다시 말해서 layer 구조로 쌓기 쉽게 inter-layer dependency를 없엔 것이다. 확률적으로 표현하면, 원래는 각 layer의 joint probability가 있었다면, 이제는 각 independent variable끼리 independency를 준 것이다.
모 각설하고, 이제 위의 구조의 에너지는 다음과 같이 정의된다.
Energy and Probabiltiy of a Restricted Boltzmann machine
$$ E(v, h) = -\sum_ia_iv_i - \sum_j b_jh_j - \sum_i\sum_j j_jw_{ij}v_i $$
$$ = -a^Tv - b^Th - h^Twv$$
변수 자체는 BM과 같으니 설명은 생략하겠다.
Botzmann distribution에 따라서 확률은 다음과 같이 정의된다.
$$ P(v,h) = \frac{1}{Z}e^{-E(v, h)}$$
에너지가 높을 수록 확률이 낮아진다는 의미이다.
여기서 부터가 중요하다. 위의 간단한 식이 무엇을 의미할까?
아래 생각의 흐름을 따라가보자.
1. 먼저 RBM에서 Visible layer는 입력 데이터라고 생각할 수 있고, Hidden layer는 latent variable, 혹은 extracted (dimension이 줄은) feature 라고 생각할 수 있다.
2. Boltzmann distribution에 따라 에너지가 낮을 수록 확률이 높아지게 된다.
3. 우리가 변경할 수 있는 것은 노드와 노드 사이의 weight이다. 즉 weight를 변경 시켜, 확률을 최대로, 에너지를 최소로 할 것이다.
4. 이제 에너지에 관련된 식을 보자. 에너지 식에서 앞의 두 term, '$-\sum_ia_iv_i - \sum_j b_jh_j$', 은 bias에 관련된 텀이다. 앞에 -가 붙어있으므로 '$\sum_ia_iv_i$'과 '$\sum_j b_jh_j$'를 키우는 것이 중요하고, 이는 개별 node가 자주 1이 될 수록 '$a_i$'와 '$b_j$'를 키우게 된다.
5. 진짜 중요한 term은 마지막 부분인 '$- \sum_i\sum_j j_jw_{ij}v_i $'이다. 이 부분 역시 앞에 -가 붙어 있으므로, '$\sum_i\sum_j j_jw_{ij}v_i$'를 키우는 것이 중요하다. 이 부분이 의미하는 것은 인접한 두 node (visible과 hidden)가 "동시에" activate될 수록 그 사이의 weight를 키워주려고 한다. 다시 말해서 RBM은 co-activating를 학습하는 효과가 있다.
6. 물론 우리는 Hidden layer의 값을 정할 수는 없다. 그래서 제대로 학습을 하려면 가능한 모든 hidden layer의 경우에 수에 대해서 몬가 처리를 해줘야 한다. 예를 들어 hidden node가 10개면, '$2^{10}$'의 경우의 수에 대해서 몬가 처리를 해야한다.
다시 말해서 RBM으로 학습을 한다는 것은 우리의 입력 중에 동시에 1이 되는 부분들과 hidden layer의 어떤 node와 연결되는 edge의 weight를 적적히 높여주는 효과를 갖는다. Computer vision에서 말하는 code book을 뽑아준다고도 생각할 수 있겠다. 사실 MNIST와 같은 간단한 데이터셋에 Deep learning을 이용해서 뽑은 weight의 모양과, K-SVD등을 이용해서 얻은 code북은 놀라우리만큼 비슷한 모양을 갖고 있다.
[1] MNIST를 가지고 KSVD로 만든 codebook: http://enginius.tistory.com/334
[2] MNIST를 가지고 학습된 RBM: http://enginius.tistory.com/315
나 개인적으로 내리는 Deep learning의 정의는 계층 구조를 통한 feature extractor이다.
'Enginius > Machine Learning' 카테고리의 다른 글
Fundamental Group (0) | 2014.09.03 |
---|---|
[NGP] Leveraged Kernel (0) | 2014.08.22 |
Sparse Kernel Methods (0) | 2014.07.31 |
Determinantal Point Process (DPP) (1) | 2014.07.28 |
Non-stationary Gaussian process regression (0) | 2014.07.25 |