논문

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

Gradient-based learning applied to document recognition

[cite]10.1109/5.726791[/cite]

1. Introduction

최근 몇 년 사이 패턴 인식 시스템에서 중요한 역할로 활용되어왔다. 보통 패턴 인식 시스템은 자동 학습 테크닉과 hand-craft 알고리즘의 조합으로 만들어지곤 한다. 이를테면 특징 추출 모듈(feature extration module)과 학습가능한 분류 모듈(trainable classifier module), 2가지 모듈로 나뉘어 구성되곤 한다.

첫번째 모듈은 보통 feature extrator라고 불리는 것으로 입력 패턴을 받아 낮은 차원의 특징 벡터로 변환하는 역할을 한다. 낮은 차원의 이유는 후에 있을 분류 모듈에서 비교를 쉽게 하기 위함히기도 하다. 또한 이 특징 벡터는 입력 패턴의 변화나 왜곡에도 쉽게 변하지 않는 특징을 갖도록 설계된다. 이런 이유로 사람에 의해 인위적으로 만들어진 (hand crafted) 특징 추출 알고리즘은 최대한 사전 지식을 활용하고 그 목적에 최대한 맞게 만들어지곤 한다.

이에 반해 분류 모듈은 전용 알고리즘이 아닌 학습을 통하여 목적에 맞는 분류기를 만드는 보통 목적의 방법들이 사용된다.

이러한 방식의 문제점은 인식 정확도가 특징 추출 알고리즘에 아주 의존적이라는 것이다. 이것은 해결해야할 문제를 새로이 하게 되면 피쳐 또한 다시 설계되어야 함을 나타낸다.

최근 10여년간 세가지 큰 변화가 있었다.

  1. 컴퓨터의 가격이 싸지며 성능 또한 올라가 brutal-force적인 풀이법이 가능해진 점.
  2. 거대 데이터베이스가 생겨 손글씨 같은 실제에 가까운 데이터셋을 얻을 수 있게 된 점.
  3. 높은 차원을 다룰 수 있는 강력한 기계 학습 알고리즘들이 나와 복잡한 결정을 내릴 수 있게 된 점.

이러한 변화를 토대로 기존의 인위적인 알고리즘을 통해 특징 벡터를 생성하는 방법 대신, 픽셀 이미지를 직접 이용하는 학습 알고리즘을 이야기하고자 한다.

논문에서는 글자 인식 뿐만 아니라 이를 통해 문서 인식에 대한 내용까지 담고 있지만, 현재 공부하고자 하는 방향이 아니므로 생략하고자 한다.

A. Learning from Data

먼저 자동 학습을 시키는 방법 중 gradient-based learning으로 불리는 방법을 알아보자.

학습 기계는 간단히 이야기 하자면 p번째 입력 패턴 $ Z^p $ 으로부터 $ Y^p = F(Z^p, W) $ 을 계산하는 것과 같다. 이 때 W 는 시스템의 목적에 따라 달라지는 파라미터이다. 패턴 인식에서는 출력된 $ Y^p $ 를 인식된 클래스의 레이블이나 각 클래스일 확률로 사용하는 것이 보통이다. 에러 함수 $ E^p = D(D^p, F(W, Z^p)) $ 는 입력 패턴 $ Z^p $가 가져야 하는 출력 값 $ D^p $과 실제 함수로부터 나온 인식된 값 $ Y^p $ 사이의 오차를 계산한다. 따라서 우리가 풀어야 할 문제는 이 에러 함수를 최소로 하는 파라미터 W를 찾는 과정으로 이해 할 수 있다.

B. Gradient-Based Learning

이와 같은 특정 함수를 최소로 하는 파라미터를 찾는 문제는 사실 오래전부터 다루어온 일반적인 문제이다. 그리고 Gradient-Based Learning 함수가 연속이고 부드러운 특징을 가질 때, 쉽게 최소가 되는 지점을 잘 찾을 수 있는 방법으로, 흔히 Gradient descent나, Conjugate Gradient method 등이 알려져 있다.

C. Gradient Back-Propagation

Gradient-Based Learning 방법은 1950년대 후반부터 사용되었으나, 다음의 3가지 것들이 발견되고 난 후에는 널리 쓰이기 시작되었다.

  1. Boltzmann machine과 같은 비선형 방법을 이용하였을 때의 local minima는 큰 문제가 아님이 밝혀진 점.
  2. Rumelhart, Hinton, Williams에 의해 여러 층으로 구성된 효과적인 Back-propagation 방법을 제안한 것.
  3. Back-propagation 방법이 적용된 다층 신경망이 복잡한 문제를 풀 수 있음을 보인 것.

D. Learning in Real handwriting Recognition Systems

글자로 분리된 손글씨를 인식하는 문제는 오래전부터 연구되어온 문제이며 신경망으로 잘 풀었던 문제이기도 하다.

논문에서는 분리된 글자가 아닌, 문자열에서 문자를 분리해서 인식하는 문제 또한 어떻게 해결할지 제안하고 있다.

E. Globally Trainable Systems

이전까지의 패턴 인식 시스템은 여러 모듈로 구성되어있었다. 문서 인식 시스템을 예로 들자면, 입력으로 들어온 그림 중 글자가 들어있을 것 같은 관심 영역을 추출하는 모듈, 추출한 관심영역을 다시 각 글자로 나누는 모듈, 각 글자가 무슨 글자인지 인식하늠 모듈, 인식된 글자를 토대로 문맥을 파악하는 모듈, 그 후 문법을 검사는 모듈 등의 형식으로 말이다. 이러한 경우 모듈과 모듈이 연결되어있고 별도로 동작하며 한 모듈의 출력이 다음 모듈의 입력으로 사용된다. 때문에 각 모듈은 별도로 최적화 되어있고, 훈련되어있으며, 전체 맥락에서 벗어나 있을 수밖에 없다.

이런 구조보다 더 나은 방법으로 전체 시스템을 한꺼번에 훈련시켜 최적화 시키는 방법을 생각할 수 있다. 이 때에는 문서 차원에서의 잘못된 인식을 에러 함수로 사용하여 사용하여 모든 모듈에 해당하는 최적 파라미터들을 찾아야 한다. 이 에러 함수 E가 시스템 파라미터 W에 대해 미분 가능하다면, 이 또한 앞에서 언급했던 Gradient-Based Learning 방법으로 해결이 가능하다고 볼 수 있다.

에러 함수 $ E^p (Z^p, W) $ 를 미분 가능하도록 만들기 위하여, 전체 시스템을 미분 가능한 feed-forward network를 이용하여 구성하도록 하자. 이 때, 각 모듈에서 사용되는 함수들은 입력으로 들어올 수 있는 값과 파라미터에 대하여 연속이어야 하고 미분 가능하여야 한다. 그리고 에러 함수의 gradient를 계산하기 위하여 잘 알려진 back-propagation 알고리즘을 적용하면 다음과 같은 형태로 나타낼 수 있다.

$$\frac{\partial E^p}{\partial W_n} = \frac{\partial F}{\partial W} (W_n, X_{n-1}) \frac{\partial E^p}{\partial W_n}$$

$$\frac{\partial E^p}{\partial X_{n-1}} = \frac{\partial F}{\partial X} (W_n, X_{n-1}) \frac{\partial E^p}{\partial X_n}$$

첫번째 식은 에러 함수 $ E^p $ 의 gradient, 두번째 식은 back-propagation의 backward recurrence 값으로 사용된다.

기존의 다층 신경망만 사용한 방법과는 달리 각 모듈을 그래프로 표현한 Graph Transfomer Networks (GTN) 을 논문에서 소개하고 있으나 관심 밖의 주제이므로 생략하고자 한다. 자세한 내용은 논문 참고하도록 하자.

앞에서 설명한 Gradient-based 다층 신경망을 이용한 방법은 흥미롭게도 기존의 개별 모듈이 하던 특징 추출을 그 스스로 하게 된다는 점이다.

2. Convolutional Neural Networks for Isolated Character Recognition

다층 신경망에서의 문자 인식 및 이미지처리는 이미지 그 자체를 입력으로 하게 되는 경우가 많다. 하지만 기존 다층 신경망 구성 방법을 이용하여 이미지의 모든 픽셀을 입력으로 출력 유닛까지 완전 연결(fully-connected)로 망을 구성하더라도 몇가지가 문제가 됩니다.

  1. 데이터 차원의 문제 ; 은닉 층이 하나 늘어날 수록 이미지 픽셀 수의 거듭제곱으로 연결이 늘어나고 연결의 수 만큼 훈련시켜야 하는 가중치 변수 또한 늘어난다.
  2. 이미지 변화 처리 문제 ; 인쇄된 것이 아닌 사람이 직접 쓴 글자이기 때문에 사람마다 글자체, 위치, 방향이 다를 뿐만 아니라 손상되어있기도 하다. 이러한 변화에 대응하기 힘들다.
  3. 이미지 특성의 반영 문제 ; 이미지는 2차원 정보로 주변 픽셀과 서로 높은 연광성을 가지지만 단순한 벡터 형식의 연결 방법은 유용한 공간 정보를 반영하지 못한다.

이러한 문제를 해결하기 위해 CNN (Convolitional Neural Networks) 을 이용하여보자.

A. Convolutional Networks

CNN (Convolitional Neural Networks)의 각 층들은 local receptive field, shared weight, sub-sampling의 세가지 아이디어가 적용되었다.

local receptive fields ; CNN의 한 유닛은 완전 연결 구조에서처럼 이전 층의 모든 영역에서 입력을 받는 구조가 아닌, 이전 층에서의 지역적으로 이웃하고 있는 일부 유닛들에게서만 입력을 받도록 되어있다. 이것은 Hubel과 Wiesel의 신경망 모델과 일맥상통하는 것이다. 이 방법으로 이미지의 에지나 선의 끝, 코너 등 2차원 적인 특징을 잘 반영하게 되는 효과가 있다.

shared weight ; 앞에서 설명한 local receptive field에 따라 CNN은 2차원 적인 구조를 가지고 되는데 이렇게 생성된 2차원 구조의 유닛들의 집합을 feature map이라고 하자. 한 feature map에서 다음 층의 feature map으로 입력이 이루어질 때 사용되는 가중치들은 입력 유닛과 대상 유닛의 위치만 달라질 뿐 local receptive fields내에서의 가중치들은 같은 값을 사용하도록 한다. 따라서 한 feature map에서 각 유닛의 계산은 위치만 다를 뿐 같은 계산식을 갖게 되고 이는 이미지 처리에서의 convolution과 정확히 같은 계산이다. 이러한 계산의 특징으로서 입력 글자의 위치가 변하더라도 feature map의 계산 결과 또한 그 값이 변하지 않고 다른 위치에 그대로 나타나게 된다.

sub-sampling ; 위치 변화에 따라 특징 값은 변하지 않도록 고려하였으나 그 위치 정보 또한 여전히 민감하게 작용하는 부분이다. 글자에서 코너나 선 끝 부분은 어떤 글자인지 판단하는데 아주 중요한 특징인 것을 쉽게 생각해볼 수 있다. 또한 이미지의 노이즈나 왜곡도 고려되어야 한다. 따라서 feature map의 해상도를 줄이는 방법을 사용한다.

CNN에서 사용되는 층은 그 feature map을 생성하는 방법에 따라 Convolutional layer, Subsampling layer로 크게 2가지로 나눌 수 있다.

Convolutional layer는 앞에서 설명한 local receptive fields와 shared weight의 조합으로 Convolution 계산을 하는 층이다. 이 층은 이전 층을 토대로 feature map을 생성하게 되는데, 하나가 아닌 여러 개의 feature map을 생성하여 구성된다. 또한 입력으로 받는 이전 층의 유닛에 대해서도 하나 이상의 feature map에게서 연결된다. 다시 이야기하자면, 한 층은 여러개의 feature map으로 구성되며 각 feature map은 이전 층의 1개 이상의 feature map으로부터 영향받고 자신 또한 다음 층의 여러 feature map에 영향을 준다. Shared weight에 의하여, 각 feature map 내에서는 같은 가중치를 사용하여 Convolution을 한 다음 bias 값을 더하여 활성함수를 통과시켜 출력한다.

Subsampling layer는 Convolutional layer와 달리 이전 층의 한 feature map에게서만 영향을 받는다. 따라서 이전 층과 같은 수의 feature map을 갖게 된다. 이전 층의 일정 영역을 평균한 가중치를 곱하고 bias 값을 더한다. 이 때, Convolutional layer와는 다르게 계산에 사용하는 영역은 서로 겹치지 않도록 배치하므로 영역의 크기에 반비례하게 feature map의 크기가 작아지게 된다.

이렇게 구성된 각 층의 feature map은 back propagation을 통하여 서로 다른 가중치를 갖도록 학습되므로, 이들은 각자가 서로 다른 특징을 추출하게끔 하는 특징 추출기라고 볼 수 있을 것이다.

이제 이 두가지 종류의 층을 이용하여 글자 인식을 위한 신경망인 LeNET-5을 구성하여보자.

B. LeNet-5

LeNET-5는 총 7개의 층으로 이루어져 있으며, 각 층은 앞에서 설이야기한 Convolutional layer와 Subsampling layer으로 구성되어있다.

이제 입력단 부터 각 층으로 하나씩 따라가며 살펴보도록 하자.

먼저 입력 글자 이미지는 크기를 32*32로 모두 같도록 하고, 글자가 가운데 위차하도록 정렬된 상태로 미리 처리해 놓는다. 각 픽셀의 값은, 흰색(배경)은 -1.0으로, 검은색(글자)은 1.175로 정규화시키도록 한다.

이렇게 만든 입력은 첫번째 C1 층과 연결된다. C1 층은 convolutional layer이며, 6개의 feature map으로 구성된다. 입력 이미지의 5*5 영역이 각 feature map의 한 유닛으로 연결되도록 한다. Convolution 계산 시 경계를 고려하여 각 feature map은 28*28 크기를 갖는다.

두번째 층은 S2로 subsampling layer이다. C1 층의 각 feature map 상 2*2 영역을 입력으로 하여 Subsampling 과정을 거치면 14*14로 크기가 줄어든 6개의 feature map을 생성된다.

다음은 C3 층은 다시 convolutional layer을 사용하나 앞의 C1과는 다르게 S2의 여러 feature map들을 한꺼번에 참조하여 C3의 한 유닛으로 연결된다. 다시 말하면 마치 3차원 convolution을 하는 것과 같은 계산이다. 참조하는 feature map은 미리 정해놓은 규칙에 따라 S2 층의 3~5 개 feature map들에서 5*5 영역을 이용한다. 마찬가지로 경계를 고려하여 C3 층의 크기는 10*10으로 줄어들게 된다.

이어서 S2 층과 괕은 방법으로 S4층을 생성한다. 5*5 크기의 16개 feature map을 갖는다.

다음 C5 층은 convolutional layer로 120개의 feature map으로 구성되는데, 55 영역을 사용하므로 이전 층의 크기를 생각하면 각 feature map은 1\1 크기를 갖게 된다. 각 유닛들은 S4층의 모든 feature map에서 입력 받도록 구성하여 fully connected graph 형태를 갖도록 한다.

F6 층은 C5 층과 완전히 연결된(fully connected) 84개의 유닛으로, 마지막으로 10개의 유닛들이 F6 층과 완전히 연결된 출력 층을 만들어 신경망 구성을 마무리한다.

F6 까지는 기존의 신경망과 같이 가중치 합에 bias를 더한 뒤 이를 활성함수에 통과시켜 출력값으로 사용한다. 이 때, 사용된 함수는 아래와 같다.

$$f(a) = A \tanh (Sa)$$

이 때, A는 1.7159, a는 가중치 합에 bias를 더한 입력 값이고, S는 원점에서의 기울기를 결정하는 파라미터이다.

마지막 출력 층은 Radial Basis Function (RBF)을 적용하여 한 유닛은,

$$y_i = \sum_{j}{(x_i - w_{ij})^2}$$

과 같이 계산된다. 이 때 사용되는 가중치 벡터 w는 논문에 나와있는 7*12 크기의 ASCII 비트맵 이미지를 참고하여 -1, +1 로 구성한다.

C. Loss Function

이제 학습을 위한 loss function이 필요할 때다. 가장 단순한 함수로 아래와 같이 함수를 사용할 수 있다.

$$E(W) = \frac{1}{P} \sum^{P}_{p=1}{y_{D^p}(Z^p, W)}$$

여기서 $ y_{D^p} $ 는 한 입력 샘플 p이 속하는 클래스 $ D^p $의 RBF 유닛이다. 앞의 RBF 유닛의 식을 살펴보면 가장 이상적인 경우 이 값은 0이 되므로 E(W)이 작을수록 잘 훈련된 상태로 볼 수 있다. 여기에 변별력을 높이기 위하여 0이 나오면 안되는 다른 RBF유닛들에 대한 페널티 항을 넣어보자.

$$E(W) = \frac{1}{P} \sum^{P}_{p=1}{(y_{D^p}(Z^p, W)} + log(e^{-j} + \sum_{i}{e^{-y_i (Z^p, W)}}))$$

j는 상수로 log의 값이 너무 작아지는 것을 방지하는 역할을 한다. 따라서 결과적으로 페널티는 $ e^{-j} $$ e^{-j} + \sum_{i}{e^{-y_i (Z^p, W)}} $ 사이의 비율로 결정된다.

위의 loss function을 사용하여 모든 층의 가중치들을 back-propagation을 이용하여 훈련시킨다. 각 feature map마다 가중치를 공유하여 사용하기 때문에 약간의 트릭을 이용하여 계산을 효율적으로 할 수 있다. 논문의 Appendix를 참고하도록 하자.

Appendices

활성함수에서 A는 1.7159, S는 2/3 를 사용하였다.

학습하기 전에 각 가중치들은 $ \pm2.4 / F_i $ 범위 내에서 균등 분포를 이용하여 랜덤 값을 사용하여 초기화 하였다. $ F_i $는 입력에 사용되는 유닛의 수이다.


Add a Comment Trackback