논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

UFLDL Tutorial 16. Unsupervised Learning – Autoencoders

Autoencoders

지금까지 레이블을 가지는 트레이닝 샘플에서의 지도 학습(supervised learning)을 위한 신경망의 한 응용을 살펴보았습니다. 이제부터는 레이블이 없는 트레이닝 샘플들 $\{ x^{(1)}, x^{(2)}, x^{(3)}, \cdots \}, \text{where} x^{(i)} \in \mathfrak{R}^n$을 가지고 있는 경우를 생각해보고자 합니다. 오토엔코더(autoencoder) 신경망은 역전파 알고리즘을 이용한 비지도학습(unsupervised learning) 알고리즘으로, 신경망의 잆력 값과 동일한 출력을 내는 것을 목표로 합니다. 다시 말해 $y^{(i)} = x^{(i)}$으로 사용합니다.

아래 그림이 오토엔코더입니다.

autoencoder

오토엔코더는 $ h_{W,b}(x) \approx x$와 같은 함수를 학습시키는 것이 목표입니다. 다시 말하면 입력 $x$가 주어졌을 때, 이와 유사한 $\hat{x}$을 출력으로 하는 identity function을 근사하는 함수를 배우려고 하는 것입니다. Identity function은 학습하기가 쉬운 함수인 것처럼 보이나 여기에서는 은닉 유닛의 수를 제한하는 등의 제한 조건을 걸고 있습니다. 때문에 데이터에 대해 흥미로운 구조를 발견할 수 있습니다. 간단한 예제를 보면, $ 10 \times 10 $ 크기의 100픽셀짜리 이미지에서 픽셀 값을 입력 $x$로 사용하고, 따라서 $n=100$이고, 층 $L_2$에 $s_2 = 50$ 개의 은닉 유닛이 있다고 생각해봅시다. 따라서 출력은 $y \in \mathfrak{R}^{100}$가 될 것입니다. 은닉 유닛이 50개밖에 없기 때문에 망은 입력의 "압축된(compressed)" 표현을 학습하도록 유도됩니다. 다시 말하면, 은닉 활성화 값 $a^{(2)} \in \mathfrak{R}^{(50)}$이 주어지면, 이 신경망은 100 픽셀의 입력 $x$를 "복원(reconstruct)"하려고 할 것입니다. 만약 입력이 완벽하게 랜덤이라면, 즉, $x_i$가 IID Gaussian로부터 만들어져서 다른 요소들과 전혀 관련이 없이 독립적이라면 이 압축 작업은 아주 어려운 작업일 것입니다. 하지만 데이터에 어떤 구조를 가지고 있다면, 예를 들어 입력 특징의 일부가 서로 관련(correlated)되어있다면, 이 알고리즘은 그 관련성을 찾을 수 있을 것입니다. 실제로, 이 간단한 오토엔코더는 PCA의 그것과 매우 비슷한 낮은 차원의 표현을 학습하는 것으로 마무리됩니다.

은닉 유닛 $s_2$의 수에 대한 논쟁거리는 별로 없습니다. 하지만 은닉 유닛의 수가 많아지더라도, 심지어 입력 픽셀의 수보다 많아지더라도, 또 다른 제한조건을 줌으로써 여전히 재미있는 구조를 발견할 수 있습니다. 특별히 은닉 유닛에 희박성(sparsity)을 부여한다면, 오토엔코더는 은닉 유닛이 수가 많더라도 흥미로운 구조를 보여줄 것입니다.

편의상, 이제부터는 출력이 뉴런의 출력이 1에 가까워지면 뉴런이 "활성화(active)" 혹은 "발화(firing)"한다고 이야기하고자 합니다. 반대로 0에 가까워지면 "비활성화(inactive)"이라고 할 것입니다. 희박성을 위해서 뉴런들이 대부분의 시간 동안 비활성화하도록 제한을 두고자 합니다. 이 때에 활성함수는 시그모이드 함수를 사용합니다. 만약 tanh 함수를 사용하려 한다면 뉴런은 -1에 가까운 값을 가질 때 비활성화된다고 생각하면 됩니다.

오토엔코더에서의 은닉 유닛 $j$의 활성값을 $a_j^{(2)}$라고 표시하였습니다. 하지만 이 활성을 이끌어내는 입력 $x$가 무엇인지 표시가 되어있지 않기 때문에 $x$를 붙여서 $a_j^{(2)}(x)$라고 표시하도록 하겠습니다.

모든 트레이닝 셋에 대한 은닉 유닛 $j$의 평균 활성값을 계산하면 아래와 같이 구할 수 있습니다.

$$ \hat\rho_j = \frac{1}{m} \sum_{i=1}^m \left[ a^{(2)}_j(x^{(i)}) \right] $$

이제 이를 제한 조건을 강제하는 요소, 즉 희박성 파라미터(sparsity parameter)로 사용할 수 있습니다.

$$ \hat\rho_j = \rho $$

보통 이 값은 0에 매우 가까운, 예를 들면 $\rho = 0.05$정도의 값을 사용합니다. 바꿔 말하면 은닉 유닛의 평균 활성화 값이 0.05에 가까워야 한다는 것입니다. 이 제한 조건을 만족하기 위해서는 은닉 유닛의 활성화는 거의 항상 0에 가까워야 할 것입니다.

이를 달성하기 위해서 최적화 목표에 또 다른 패널티 항을 추가하고자 합니다. 이는 $\hat{\rho}_j$가 $\rho$로부터 떨어져 있지 않도록 합니다. 여러 종류의 페널티 항이 있으며, 이들 모두 좋은 결과를 내고 있습니다. 여기서는 다음의 식을 사용하도록 하겠습니다.

$$ \sum_{j=1}^{s_2} \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j} $$

여기서 $s_2$는 은닉 층 내의 뉴런의 수를 나타내어 $j$는 은닉 유닛에 대한 합을 만들어주도록 하고 있습니다. 아마 KL divergence 방식의 표현에 익숙하다면 페널티 항은 이에 따라 다음과 같이 표현할 수 있습니다.

$$ \sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j) = \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j} $$

이것은 평균 $\rho$와 $\hat{\rho}_j$를 갖는 두 베르누이 랜덤 변수(Bernoulli random variable)간의 Kullback-Libler (KL) divergence입니다. KL-divergence는 두개의 분포가 얼마나 다른지를 측정하는 표준적인 함수입니다. KL-divergence를 잘 모른다고 해도 걱정하지 않아도 됩니다. 강의를 이해하기에 필요한 내용은 노트에 모두 있습니다.

이 페널티 함수는 $\hat{\rho}_j = \rho$일때 $ \textstyle {\rm KL}(\rho || \hat\rho_j) = 0 $이고, 그렇지 않으면 그 값이 $\hat{\rho}_j$가 $\rho$에서 떨어질 수록 점점 증가하도록 되어있습니다. 아래 그림은 $\rho = 0.2$일 때 $\hat{\rho}_j$의 값에 따른 $\textstyle {\rm KL}(\rho || \hat\rho_j)$의 변화를 그린 것입니다.

KL

$\hat{\rho}_j = \rho$일때 KL-divergence가 최소 값인 0이 되는 것을 볼 수 있습니다. 또한 $\rho$가 0이나 1로 변화함에 따라 그 값이 점점 올라가는 것도 볼 수 있습니다. 따라서 이 페널티 항은 $\hat{\rho}_j$가 $\rho$에 가까이 가도록 하는 효과가 있습니다.

이제 전체 cost function은 다음과 같습니다.

$$
J{\rm sparse}(W,b) = J(W,b) + \beta \sum{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j) $$

$ \textstyle J(W,b)$는 이전에 정의한 것과 같고, $\beta$는 페널티 항의 가중치를 조절하는 항입니다. $\hat{\rho}_j$는 $W, b$에 의해 결정됩니다. 이는 $\hat{\rho}_j$가 은닉 유닛 $j$의 평균 활성도를 의미하는데, 이는 $W,b$에 의존적이기 때문입니다.

KL-divergence 항의 편미분 계산을 코드에 넣어야 하는데, 코드 수정을 적게 하기 위해서 간단한 트릭을 사용하고자 합니다. 이전의 두번째 층($l=2$)의 역전파를 위해서 다음을 계산하였을 것입니다.

$$ \delta^{(2)}_i = \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right) f'(z^{(2)}_i) $$

이제 이 대신에 다음의 식을 사용합니다.

$$ \delta^{(2)}_i = \left( \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right) + \beta \left( - \frac{\rho}{\hat\rho_i} + \frac{1-\rho}{1-\hat\rho_i} \right) \right) f'(z^{(2)}_i) $$

이 식을 계산하기 위해서는 $\hat{\rho}_i$를 알아야 합니다. 따라서 역전파 단계에 들어가기 전에, 평균 활성도를 계산하기 위해 모든 트레이닝 샘플의 전방 전파를 수행하여야 합니다. 트레이닝 샘플 셋이 컴퓨터의 메모리에 다 넣을 정도로 크기가 작다면 전방 전파를 모든 샘플에 대해 계산하여 그 활성도 계산 결과를 메모리에 보관하였다가 $\hat{\rho}_i$를 계산하면 됩니다. 그러면 미리 계산해둔 활성도를 역전파시에 사용할 수 있을 것입니다. 하지만 데이터가 너무 커서 메모리에 넣을 수 없다면 각 샘플의 전방 전파 시 활성도를 누적하여 더한 뒤 $\hat{\rho}_i$를 계산하고, 활성도 $a_i^{(2)}$를 계산한 후에는 전방 전파 결과는 버리는 식으로 진행하여야 합니다. $\hat{\rho}_i$를 얻은 후에는 역전파를 수행하기 위해서 각 샘플에 대해 전방 전파를 다시 실행하여야 합니다. 이러한 경우 전방 전파를 두번 실행하여야 하기 때문에, 계산이 비효율적이게 됩니다.

그래디언트 디센트 후의 결과를 모두 푸는 것은 이 노트의 영역을 벗어나는 것 같습니다. 역전파 알고리즘을 수정하여 오토엔코더를 구현해본다면, $J_{\text{sparse}} (W, b)$에 대한 그래디언트 디센스를 정확하게 수행할 수 있게 된 것입니다. 편미분 검사 방법을 통해서, 작성한 것들을 검증할 수 있습니다.

Visualizing a Trained Autoencoder

오토엔코더의 훈련을 마치고 알고리즘에 의해 어떤 것들이 학습되었는지 이해하기 위해 학습된 함수를 시각화하고자 합니다. 오토엔코더가 $10 \times 10$ 이미지에서 훈련되었다고 가정하면, $n=100$이 됩니다. 각 은닉 유닛 $i$는 입력에 대해서 다음과 같은 함수를 계산합니다.

$$ a^{(2)}_i = f\left(\sum_{j=1}^{100} W^{(1)}_{ij} x_j + b^{(1)}_i \right) $$

이제 i번째 은닉 유닛에 의해 계산되는 이 함수를 시각화할 것입니다. 이 은닉 유닛은 파라미터 $W_{ij}^{(1)}$ 에 의해 좌우됩니다. 특히 $a_i^{(2)}$를 입력 x에 대한 어떤 비선형적인 특징으로 생각합니다. 그렇다면 이렇게 자문할 수 있습니다. 어떤 입력 $x$가 주어진다면 $a_i^{(2)}$가 최대로 활성화될 것인가? 다시 말하면 은닉 유닛이 찾는 특징은 어떤것인지? 이 물음에 대한 답을 하려면 $x$에 제한 조건을 걸어야 합니다. 만약 입력이 $ \textstyle ||x||^2 = \sum_{i=1}^{100} x_i^2 \leq 1 $으로 norm 제한 조건을 가진다고 한다면 은닉 유닛 $i$을 최대로 활성화 하는 입력은 픽셀 $x_j$를 다음과 같은 값을 갖도록 하면 됩니다.

$$ x_j = \frac{W^{(1)}_{ij}}{\sqrt{\sum_{j=1}^{100} (W^{(1)}_{ij})^2}} $$

이렇게 결정된 값을 이미지로 하여 출력해보면 은닉 유닛 $i$가 어떤 특징을 찾고 있는지 이해할 수 있게 됩니다.

100개의 은닉 유닛을 갖는 오토엔코더를 가지고 있다면 시각화한 결과 또한 100개의 이미지를 가집니다. 그러한 100개의 이미지를 살펴봄으로써 은닉 유닛들의 조합이 어떻게 되어있는지 이해할 수 있습니다.

이에 따라 sparse 오토엔코더를 분석해보면 다음과 같은 결과를 얻을 수 있었습니다.

"filter"

그림의 각 사각형은 각 은닉 유닛을 최대로 활성화 시키는 입력 이미지 $x$를 나타냅니다. 각 은닉 유닛들이 각기 다른 위치와 방향을 갖는 에지를 검출하도록 학습된 것을 볼 수 있습니다.

이러한 특징들은 객체 인식이나 다른 비전 문제들에서 유용하게 사용되는 것들입니다. 이를 오디오와 같이 다른 입력 도메인에 적용한다면 그러한 도메인에서의 유용한 표현이나 특징을 얻을 수 있습니다.


학습된 특징은 "whitened" 이미지에서 훈련한 것입니다. Whitening은 전처리 과정으로 이미지에서 중복된 부분을 없앤 것입니다. 이는 인접한 픽셀들이 서로 관련성을 덜 갖도록 하기 위함입니다.


Tags:
Add a Comment Trackback