볼츠만 머신(Boltzmann Machine)은 딥러닝이 한창 입에 오르내리기 전, 표현 학습(Representation Learning)의 선조격 역할을 한 확률 모형입니다. 이 확률 모델의 이름은 볼츠만 분포(Boltzmann Distribution)라는 열역학에서 주로 등장하는 개념에서 비롯되었습니다.
80년대 인공지능이 막 연구되는 시기, 머신러닝/딥러닝은 독자적인 분야라기보다 다른 이론학문들과 접목되는 사례가 꽤 있었습니다. 볼츠만 머신(Boltzmann Machine)이 그 중 하나이며, 당시 Terry Sejnowski 교수가 에너지/엔트로피 개념을 비지도학습과 융합하여 탄생시킨 결과물이기도 합니다. 그로부터 20년 정도 지난 2006년에 Geoffrey Hinton 교수는 볼츠만 머신을 한 단계 더 발전시켜 Restricted Boltzmann Machine (RBM)이라는 모델을 제안하였고, 이 RBM이라는 모델은 또 나중에 원래 구조에서 layer depth를 늘린 형태인 Deep Belief Network(DBN)로 맥이 이어집니다. 딥러닝 역사 관점에서 볼츠만 머신은 나름의 뼈대 있는 알고리즘이며 모델이 갖고 있는 통계/수학적인 의미도 상당합니다.
1. 볼츠만 머신의 쓰임새
앞에서 볼츠만 머신을 확률 모형이라 소개하였고, 이는 일반적인 분류/회귀 모델과는 쓰임새가 다름을 의미합니다. 상기 분류/회귀 모델은 추론 결과와 이미 알려져 있는 정답간의 차이를 줄이는 데 목표를 두지만, 볼츠만 머신은 생성 모델(Generative Model)의 일종으로, 정답에 대한 확률 분포를 추정하는 비지도학습 모델입니다.
확률 분포를 추정한다는 말은, 현실적으로 그럴싸한(즉, 확률적으로 일리 있는) output을 만들어 내겠다는 의미입니다. 가령 인물 생성 모델이 그러하듯이, 전 세계인의 각기 다른 입술/코/귀/눈 모양을 조합하여 실존 인물같은 얼굴 이미지를 재현하는 작업도 학습된 확률 분포에 근거하는 셈이죠. 얼굴 데이터셋에서 사각턱보다 계란형턱의 비중이 높으면 생성된 사람 이미지 역시 계란형턱을 가질 확률이 높을테고, 동양인의 이미지가 생성되었을 때는 검은 생머리나 작고 가는 눈이 표현되는 것이 일반적이리라 예상 가능하실겁니다.
볼츠만 머신은 생성 모델의 기초적인 틀을 나타내고 있으며, 비록 최신 딥러닝 생성모델에 밀려서 실제 활용률은 저조하겠지만 당시 이론적으로는 많은 관심을 받은 인공신경망입니다.
2. 볼츠만 머신의 구조
볼츠만 머신의 일반적인 형태는 모든 신경망 노드들이 서로 빠짐없이 연결되어 있는 완전그래프 구조입니다. 원래 우리가 알법한 인공신경망의 계층화된 구조와는 많이 다르게 생겼죠. 볼츠만 머신은 두 종류의 neuron이 존재하고 각각의 기능은 다음과 같습니다.
Visible neuron: 기존에 주어진 (input) 특징 데이터를 나타내는 노드, '$v$'Hidden neuron: 추정하고자 하는 확률 분포를 나타내는 노드, '$h$'
여기서 각 노드가 가질 수 있는 값을 state라고 표현하는데요. 사람 얼굴 생성 모델을 예로 들면, 사람 코의 형태가 매부리코는 0, 오똑한코는 1, 들창코는 2라는 state로 나타낼수 있습니다. 각 노드 사이의 간선에는 weight가 부여되어 다른 노드의 state 확률 분포를 계산하는 데 사용됩니다.
볼츠만 머신은 각 Visible/Hidden neuron이 가질수 있는 state 조합의 확률분포, $P(h, v)$를 계산하는데요. 이 $P(h, v)$를 식으로 표현하기 위해 물리학의 에너지(Energy) 개념을 차용합니다. 구하고자 하는 확률분포와 에너지의 관계는 아래와 같이 정의할 수 있습니다.
$$E(h, v) = - \sum_{i}{\ b_is_i} - \sum_{i<j}{\ s_iw_{i,j}s_j}$$
$v$: visible 노드 집합 $v = \{v_1, v_2, ..., v_n\}$$h$: hidden 노드 집합 $h = \{h_1, h_2, ..., h_m\}$$s$: 각 노드(Visible/Hidden 모두 포함)의 state $(s = v \cup h)$$w$: weight matrix$b$: bias term
$$P(v,h) = \frac{exp(-E(h, v))}{Z}\qquad \text{where}\quad Z = \Sigma_{h',v'}{\ exp(-E(h',v'))}$$
그러나, 위와 같이 완전 그래프 형태의 볼츠만 머신은 모델링이 상당히 까다롭습니다. 일단 노드가 늘어날수록 생겨나는 간선과 그에 따른 학습 파라미터 수가 급증하는 것은 둘째치고, 같은 유형의 노드끼리도 내부적인 관계성이 존재해버리면 상기 결합 확률 $P(v,h)$을 계산하는 과정이 매우 복잡해지기에 여러모로 한계가 있습니다.
3. 제한된 볼츠만 머신 (Restricted Boltzmann Machine, RBM)
앞서 언급한 볼츠만 머신의 비효율성을 개선하고자 제안된 알고리즘이 “제한된 볼츠만 머신”(Restricted Boltzmann Machine, RBM)입니다. 이름에서 유추할 수 있듯이, RBM은 일반 볼츠만 머신에 일부 제약 사항을 걸어둔 모델입니다.
그 제약사항이란 건 바로 같은 유형의 노드끼리는 간선으로 연결하지 않는다는 규칙인데요. 이는 주어진 특성(Visible node)간의 확률적 독립성을 부여하여 추정하고자 하는 확률 분포를 조건부확률을 통해 좀 더 쉽게 계산하게끔 도와줍니다.
$$P(h|v) = \prod_{i}^{m}{P(h_i|v)}$$
따라서 RBM의 구조는 상기 이미지와 같이 이분 그래프(Bipartite graph) 형태가 되며, 서로 다른 유형의 노드들이 ‘Layer’ 형태로 엄격히 구분됩니다. 이러한 구조로 인해 RBM은 일반적으로 알려진 Deep Neural Network와 유사하게 동작할 수 있습니다.
RBM에서의 에너지 함수는 아래와 같이 정의할 수 있습니다.
$$E(h, v) = - \sum_{i}{\ a_iv_i} - \sum_{j}{\ b_jh_j} - \sum_{i}\sum_{j}{\ v_iw_{i,j}h_j}$$
$v$: Visible node$h$: Hidden node$w$: weight matrix$a, b$: bias term
이를 행렬식으로 표기하면,
$E(h, v) = -a^{\text{T}}v -b^{\text{T}}h - v^{\text{T}}Wh$
이제 어떤 visible 특성 값(input data) $v$가 주어졌다고 해봅시다. 이 상황에서, 위의 에너지 함수를 이용하여 hidden layer가 어떤 state 값 $h$(hypothesis)를 가질 확률을 아래와 같이 표현할 수 있습니다.
$$\begin{align*}
P(h|v) &= \prod_{j}^{m}{P(h_j|v)} = \prod_{j}^{m}{\frac{P(h_j, v)}{P(v)}} = \prod_{j}^{m}{\frac{P(h_j, v)}{\sum_{h'}{P(h', v)}}}
\\\\&= \prod_{j}^{m}\frac{\frac{1}{Z}\ exp(-E(h_j,v))}{\sum_{h'}{\frac{1}{Z}\ exp(-E(h',v))}}
\\\\&= \prod_{j}^{m}\frac{exp(a^{\text{T}}v +b^{\text{T}}_jh_j + (v^{\text{T}}W)_jh_j)}{\sum_{h'}{exp(a^{\text{T}}v +b^{\text{T}}h' + v^{\text{T}}Wh'})}
\\\\&= \prod_{j}^{m}\frac{exp(a^{\text{T}}v)\times exp(b^{\text{T}}_jh_j + (v^{\text{T}}W)_jh_j)}{exp(a^{\text{T}}v)\times\sum_{h'}{exp(b^{\text{T}}h' + v^{\text{T}}Wh')}}
\\\\&= \prod_{j}^{m}\frac{exp(b^{\text{T}}_jh_j + (v^{\text{T}}W)_jh_j)}{\sum_{h'}{exp(b^{\text{T}}h' + v^{\text{T}}Wh')}}
\end{align*}$$
편의상 $\tilde{P}$를 다음과 같이 정의해 두겠습니다.
$$\tilde{P}(h_j|v) = exp(b^{\text{T}}_jh_j + (v^{\text{T}}W)_jh_j) $$
수식으로만 설명하면 복잡하니 한 번 예시를 들어볼까요. Bernoulli RBM이라는 모델은 hidden state로 ${0, 1}$ 둘 중 하나의 값만 가질 수 있습니다. $j$번째 hidden node의 값이 1이 될 확률은 다음과 같은 식으로 도출됩니다. 여기서 $\sigma$는 sigmoid 함수입니다.
$$\begin{align*}
P(h_j = 1 | v) &= \frac{\tilde{P}(h_j = 1|v)}{\tilde{P}(h_j = 0|v) + \tilde{P}(h_j = 1|v)}
\\\\&= \frac{exp(b^{\text{T}}_j + (v^{\text{T}}W)_j)}{1 + exp(b^{\text{T}}_j + (v^{\text{T}}W)_j)}
\\\\&= \sigma(b^{\text{T}}_j + (v^{\text{T}}W)_j)
\end{align*}$$
그 반대의 경우로 hidden state가 0으로 샘플링될 확률도 계산을 해본다면,
$$P(h_j = 0 | v) = 1- \sigma(b^{\text{T}}_j + (v^{\text{T}}W)_j)$$
또한, 다음과 같은 성질도 성립합니다.
$$P(v_i = 1 | h) = \sigma(a^{\text{T}}_i + (Wh)_i)$$
4. RBM의 학습 방법
앞의 목차에서는 hidden layer가 이러이러한 값을 가질 확률이 어느정도 되는지 계산해보는 과정을 설명했습니다. 그렇다면 이제는 이 RBM이 무엇을 기준으로 어떻게 가중치를 학습시키는지 알아야겠죠. 즉 cost function이 무엇이냐는 본질적인 질문을 할 차례가 온 것입니다.
RBM은 생성 모델입니다. 생성 모델의 학습이 잘 되었다의 의미는 주어진 학습 데이터를 완벽히 이해하고 있고, 학습 데이터를 재현(Representation)하는 데 어려움이 없다는 것을 뜻합니다. 다시 말해, RBM의 학습은 hidden layer를 거친 중간산물로 input data와 유사한 샘플을 만들어냈을때 이 샘플 데이터와 실제 input data간의 오차가 줄어드는 방향으로 진행되어야 합니다. Auto-encoder의 학습 방법과 거의 유사하다고 볼 수 있겠네요.
RBM의 cost function은 input 데이터를 Reconstruction을 시켰을 때 그대로 $v$라는 output이 나타날 likelihood로 정의되며, 이를 최대화하는 학습 파라미터 집합 $\theta = {W, a, b}$을 찾는게 RBM의 목표입니다.
위 내용을 수식으로 표현하면 아래와 같습니다.
$$\begin{align*}
l(\theta) &= \sum_{v^{(t)} \in V}{\log{P(v^{(t)})}} = \sum_{v^{(t)} \in V}{\log{\sum_{h'}{P(v^{(t)}, h')}}}
\\\\&= \sum_{v^{(t)} \in V}{\log{\sum_{h'}{exp(-E(h', v^{(t)}))}}} - N \cdot \sum_{h',v'}{\ exp(-E(h',v'))} \quad\text{where}\quad N = |V|
\end{align*}$$
이 cost function의 gradient를 이어 계산하면 다음과 같은 식이 나오며, 여기서 $\langle{\cdot}\rangle_{P(x)}$는 확률 분포 $P(x)$에 대한 기댓값을 의미합니다.
$$\begin{align*}
\nabla_{\theta}\ l(\theta) &= \sum_{v^{(t)} \in V}{\frac{\sum_{h'}{e^{-E(h', v^{(t)})}\ \nabla_{\theta}(-E(h', v^{(t)}))}}{\sum_{h'}{e^{-E(h', v^{(t)})}}}} - N \cdot \frac{\sum_{h',v'}{\ e^{-E(h', v')}}\ \nabla_{\theta}(-E(h',v'))}{\sum_{h',v'}{\ e^{-E(h', v')}}}
\\\\&= \sum_{v^{(t)} \in V} \langle{\nabla_{\theta}(-E(h, v^{(t)}))}\rangle_{P(h|v^{(t)})} - N \cdot \langle{\nabla_{\theta}(-E(h, v))}\rangle_{P(h, v)}
\end{align*}$$
이제 각 학습 파라미터 $W, a, b$에 대한 gradient는,
$$\begin{align*}
\nabla_{w}\ l(\theta) = \frac{1}{N} \sum_{v^{(t)} \in V}{\langle{v^{(t)} \cdot h^{(t)}}\rangle_{P(h|v^{(t)})}}\ - \langle{v \cdot h}\rangle_{P(h, v)}
\\\\ \nabla_{a}\ l(\theta) = \frac{1}{N} \sum_{v^{(t)} \in V}{\langle{v^{(t)}}\rangle_{P(h|v^{(t)})}}\ - \langle{v}\rangle_{P(h, v)}
\\\\ \nabla_{b}\ l(\theta) = \frac{1}{N} \sum_{v^{(t)} \in V}{\langle{h^{(t)}}\rangle_{P(h|v^{(t)})}}\ - \langle{h}\rangle_{P(h, v)}
\end{align*}$$
각 파라미터별 gradient와, 학습을 위해 선택한 learning rate ‘$\epsilon$’으로 학습 파라미터가 아래와 같이 업데이트 될 것입니다. 이 업데이트 과정이 반복됨에 따라 RBM은 기존 데이터의 distribution을 모방하는 가공의 feature distribution을 재현할 수 있게 됩니다.
$$\theta^{new} = \theta^{old} \ \ + \epsilon\ \cdot \nabla_{\theta}\ l(\theta)$$