[CNN] LeNet-5를 활용한 손글씨 인식 (Yann LeCun 1998 논문 리뷰)

2024. 2. 26. 17:22머신러닝&딥러닝/CNN

728x90

패턴 인식은 실용성이 아주 높은 분야이다. 손글씨 인식을 대표로 하는 OCR(Optical Character Recognition)기술, 얼굴 인식, 생체정보 인식 등의 기술은 현재 널리 사용된다. 이러한 기술에 커다란 발전을 가져왔다고 평가할 수 있는 논문이 있는데, 현 Meta의 수석 AI총괄 Yann LeCun이 1998년 작성한 CNN에 관한 논문(1)이다.  
 

Yann LeCun

 
CNN 모델이 처음 소개된 논문은 역시 LeCun이 1989 집필한 논문(2)이며, 본 논문에서 소개된 모델은 CNN의 "LeNet"에 관한 내용이다. 2024년 2월 23일 현재 62,701회 인용된 본 논문은, 한때 CNN의 SOTA로 이미지 인식 기술의 발전 과정 중 큰 영향을 미쳤던 논문 중 하나다. 


 

직접 디자인된 알고리즘보다 자동 학습이 패턴 인식에 더 우월하다.

 
본 논문을 한 줄로 요약하면 아래와 같다. 이번 포스팅에서는 이 논문을 리뷰하면서, CNN의 수학적 작동방식에 대해 공부해보고자 한다.
 
(1) Y. Lecun, et al., "Gradient-based learning applied to document recognition," in Proceedings of the IEEE, vol. 86, no. 11, pp. 2278-2324, Nov. 1998
(2) Y. LeCun, et al., "Backpropagation Applied to Handwritten Zip Code Recognition," in Neural Computation, vol. 1, no. 4, pp. 541-551, Dec. 1989


Introduction

인트로에서는 머신러닝에 접근하는 기존의 방법론들을 간단히 소개한다.

Learning from Data

 
학습 기계(learning machine)은 아래의 포맷을 따른다.

 
Z^p는 p번째 input pattern을 의미하며, W는 갱신 가능한 파라미터(가중치), Y^p는 Z^p라는 패턴에 대한 인식 라벨이라고 할 수 있다. 이때 p번째 연산에 대한 loss function E은 아래와 같이 정의된다.

 
D^p는 정답, 즉 "desired output"을 의미한다. 모델의 성능과도 직결되는 average loss function

 
은 각 p번째 연산 E^p의 평균값, 즉 아래의 training set의 각 데이터에 대한 loss function의 평균값으로 볼 수 있다.

 
따라서, 가장 간단한 학습 문제(learning problem)에서는, E_train(W)를 최소화시켜 W의 값을 찾아내는 것이 목적이다. 그렇다면 이러한 방식으로 학습된 기계의 성능을 우리는 어떻게 평가할 수 있을까? 이는 training set과 무관한, 새로운 test set을 잡아서 정답과 얼마나 일치하는지를 보면 된다. 몇몇 이론적/실험적 연구들은 training set에서의 error와 test set에서의 error 값의 차이를 수식화했다.

 
여기서 P는 training set의 데이터 수이고, h는 capacity, 혹은 머신의 복잡도이다. alpha는 0.5에서 1 사이의 값을 가지며, k는 상수이다.

P의 수, 즉 training set이 늘어나면 E_train이 작아지면서 gap도 줄어든다. 반면, h, 즉 머신의 복잡도가 올라가면 E_train은 줄어들지만 gap은 늘어난다. 따라서 h를 조정할 때에는 학습 에러와 테스트 에러 사이에 trade-off가 존재한다. 실제 모델에서는 이 gap과 E_train을 모두 줄이고자 하는데, 이를 Structural Risk Minimization이라고 하며 다음 식을 최소화하고자 한다.
 

 
H(W)는 regularization function이라 하며, 이 값을 줄여야 W값들이 너무 커지지 않아 학습 에러와 테스트 에러 사이의 trade-off를 줄일 수 있다. (이것은 overfitting 문제와도 관련이 있다고 한다)
 

Gradient Based Learning

 
이건 지난 번 포스팅에서 다루었으니 간략히 언급하고 지나가겠다.
https://cascade.tistory.com/36

 

Gradient descent & Backpropagation (Rumelhart 1986 논문 리뷰)

딥러닝 분야에는 다양한 아키텍처가 있다. CNN, RNN, Transformer 등으로 계보를 잇는 아키텍처들은 새로운 optimization 알고리즘이나 원리를 추가하면서 발전하지만, 모두 기본적인 학습 방식은 비슷하

cascade.tistory.com

 
아래 식처럼 파라미터에 대한 loss function의 gradient 값에 비례하게 가중치를 조절하여, loss function의 극소를 찾는 알고리즘이다.

Gradient Back-Propagation

 
Gradient learning은 1950년대까지만 해도 선형적 시스템에서만 사용 가능했지만, 이후 비선형적인 activation function을 chain rule을 통해 계산하여 gradient learning을 적용할 수 있는 backpropagation 알고리즘이 마련되었다.
저자는 이러한 gradient descent 알고리즘이 머신 러닝에 활발하게 적용된 계기로 아래 세 가지를 꼽았다.

  1. "Local Minima"의 존재는 생각보다 중요한 이슈가 아닐 수도 있다!
  2. Rumelhart et al.의 backpropagation 개념 정립
  3. sigmoid 함수가 적용된 backpropagation 모델이 복잡한 학습에서 좋은 성능을 보이기 시작함

 

필기 인식 시스템

 
필기 인식 시스템에서 중요한 것은 크게 두 가지이다.

  1. Segmentation: 어디까지를 해당 글자로 볼 것인가?
  2. Recognization: "3"이라고 쓴 글씨를 8이 아니라 3이라고 알아볼 수 있는가?

이를 위해 필자는 본 논문에서 두 가지 솔루션을 제시한다.

  1. 철자 단위가 아니라, string 단위로 한꺼번에 분석을 진행하자. -> directed acyclic graphs + GTN
  2. 이미지의 가능한 모든 곳에 recognizer를 sweep하자.

 

Globally Traininable Systems

 
문서 인식을 위한 기존 시스템은 여러 개의 모듈로 구성되어 있어, 글자를 인식할 적절한 장소를 선택하고, segmentation 시킨 뒤 recognition시키는 다소 복잡한 과정을 따랐다. 이런 방식은 글자 인식 후 문맥을 파악하기 위해 다시 인식한 글자를 합치는 기능도 들어가야 한다. 이렇게 복잡하게 하지 말고, 문서 전체를 한 번에 인식하면 어떨까? 문서 전체에 해당하는 에러 E를 잡고, 이 E가 파라미터 W에 대해 미분가능해야 한다.

위와 같은 global loss function이 전체 시스템에서 미분가능하도록 하기 위해서는, 전체 시스템이 미분 가능한 모듈의 feed-forward network 형태로 만들어져야 한다. 즉, 어떤 n번째 모듈에 X_n-1이라는 input이 들어와 Xn이라는 output을 낸다고 생각했을 때, Xn은 아래 식과 같이 계산되며

 
역전파 방식에 따라 E^p의 편미분 값은 아래 식을 통해 거꾸로 계산된다.

 
전통적인 multi-layer neural network는 Xn, 즉 상태에 관한 정보가 고정된 크기의 벡터로 표시된다. 이 상태 정보는 그래프의 형식으로 가장 잘 표현할 수 있다. 그러면 이제, Xn을 순방향으로 연산하는 모듈들은 한 개 이상의 그래프를 받아 연산을 완료한 그래프를 출력하는 Graph Transformer 로 부를 수 있다. 본 논문에서는 GTN(Graph Transformer Network)의 개념을 수립하고, gradient-based learning이 여기에 적용될 수 있음을 보이고자 한다.
 

단일 문자 인식을 위한 CNN

기존 모델에서는 직접 설계된 feature extractor가 무의미한 정보를 직접 제거하고 필요한 정보만 뽑아 내어 문자의 분류를 수행한다. 본 모델에서는 fully-connected multi-layer neural network이 문자의 분류에 사용된다. 하지만 일반적인 fully connected feed-forward 형태를 쓰기에는 문제가 두 가지 있다.

  1. 첫째로, 이미지는 보통 용량이 무지 크다. 몇백 개의 픽셀은 기본으로 생각해야 하는데, 그러면 weight 개수는 몇천~몇만 개까지 늘어날 수 있다. 파라미터 수가 증가한다는 것은 더 큰 training set이 필요함을 말한다. 또한, 하드웨어 문제가 생기는데 연산에 적합하지 않을 정도로 작은 하드웨어에서는 작업을 수행하기 어려울 수 있다.
  2. 둘째로, 모든 layer를 fully connected 하게 만들 경우, 입력 데이터의 위치적인 요소가 깨질 수 있다. 이미지의 경우 비슷한 위치의 픽셀들은 같은 대상을 표현하고 있는 경우가 많은데, 이러한 요소를 fully connected 구조가 해칠 수 있다.

따라서, CNN architecture는 이러한 단점을 보완하기 위해 세 가지 구조를 넣었다.
 
첫째로, local receptive field이다. 각 unit은 이전 layer로부터 input을 받을 때, 위치가 비슷한 데이터에서 받아온다. (이것을 kernel 혹은 filter 등으로 부른다) 이러한 방식으로, 이미지를 fully connected 하게 받아오면서 간과되는 위치적 정보들을 받아올 수 있다. 이를테면 사물의 경계, 꼭지점 등과 같은 국소적인 요소들 말이다. Kernel이 input 으로 들어온 이미지를 쓸고 지나가면서 연산하는 것이 바로 convolution이다.
 
둘째로, shared weights이다. 한 개의 kernel로 입력받는 unit들의 출력값들은 평면 안에 놓이는데, 같은 평면에 들어가는 unit들은 모두 같은 가중치와 bias를 공유한다. 이 평면을 feature map이라고도 하는데, 하나의 kernel은 하나의 국소적인 요소를발견하는 역할을 하기 때문이다. 이 과정은 weight replication이라고도 한다. 하나의 convolutional layer는 여러 개의 feature map으로 구성되는데, 이는 다양한 국소적인 요소들을 발견하기 위한 과정이다.
 
셋째로, sub-sampling이다. 어떤 문자가 "7"임을 알기 위해서는, 위쪽에 수평선이 있고 수평선의 오른쪽 끝과 연결되어 왼쪽 아래로 내려가는 대각선이 있다는 추상적인 정보가 필요하다. 각 위치에 있는 선의 정확한 각도나 두께 등의 구체적인 정보는 그 문자가 "7"임을 구별하는 데 아무런 도움을 주지 못한다. 따라서 이러한 불필요한 정보를 없애기 위해, 공간적 해상도(spatial resolution)을 낮출 필요가 있다. 이를 sub-sampling, 혹은 pooling이라고 한다.
 
본 논문에서 소개된 LeNet-5의 아키텍처를 살펴보면서 위 세 가지 구조가 어떻게 들어가 있는지 살펴 보자.

 
LeNet-5는 32x32짜리 이미지를 input으로 받아, 문자를 인식하는 데 사용되는 CNN이다. LeNet-5는 입력층을 제외하고 총 7개의 layer로 이루어져 있다. 7개의 layer 각각을 살펴보자.

  • Layer C1: 32x32짜리 이미지 input data를 5x5 짜리 kernel을 이용하여 6개의 feature map으로 구성한다. 이때 feature map의 크기는 28x28인데, 32x32짜리가 왜 28x28로 줄어들었는지는 조금 생각해보면 쉽게 알 수 있다. C1에는 156개의 trainable parameter와 122,304개의 연결이 있다.
  • Layer S2: C1을 sub-sampling하였다. layer C1의 각 feature map의 2x2짜리 픽셀을 1x1로 줄여 해상도(정보량)를 1/4로 줄여 놓은 것이다. 이때 사용한 pooling의 방법은 average pooling이다. 평균된 데이터를 x라고 한다면, 학습 가능한 파라미터 a, b와 선형 결합(ax+b) 되어 각 map에 위차하게 된다. S2에는 12개의 parameter와 5,880개의 연결이 있다.
    Average Pooling (출처: GeeksforGeeks)
  • Layer C3: 5x5짜리 kernel을 이용하여 16개의 feature map을 만드는 두 번째 convolution layer이다. 이때 feature map은 14x14에서 10x10으로 크기가 줄어들었다. layer의 S2의 모든 feature map이 layer C3의 unit과 연결된 것은 아닌데, 아래와 같은 방법으로 연결이 이루어졌다. 왜 모두 연결하지 않았을까? 저자는 논문에서 두 가지 이유를 제시하였다.
    첫째, connection이 너무 많으면 안 좋다. 적당한 선에서 connection의 수를 유지할 필요가 있다. 둘째, 더 중요한 이유로 대칭성을 깨줄 필요가 있다. 서로 다른 feature map은 서로 다른 요소를 추출해 주어야 하기 때문이다.

    아래 그림을 보면, layer C3의 0~5번 map은 S2에서 연속한 3개의 map 정보를 가져온다. 6~11번 map은 연속한 4개의 map 정보를 가져오며, 12~14번 map은 두개/두개로 나뉜 4개의 map 정보를, 15번 map은 모든 map에서 정보를 받아온다. 이를 종합하면, 이 layer에는 총 1,516개의 파라미터와 151,600개의 연결이 생긴다. (각 파라미터는 shared weights 규칙에 의해 100번씩 쓰인다)

  • Layer S4: C3을 마찬가지 방법으로 sub-sampling하여 5x5짜리 크기의 feature map 16개를 만들었다. 여기에는 32개의 parameter와 2,000개의 연결이 들어간다.
  • Layer C5: 이제, kernel의 크기와 이전 층(S4)의 feature map의 크기가 같아졌다. 따라서, C5의 feature map 크기는 1x1이다. C5는 120개의 feature map이 있는데, 이는 모든 S4와 연결된 fully connected layer이다. 저자는 이 층을 fully connected layer가 아닌 convolution layer로 표기한 이유로, input이 커진다면 여기서 feature map의 크기가 1x1보다 커질 수도 있기 때문이라고 설명하였다. 여기에는 48,120개의 파라미터가 들어간다.
  • Layer F6: 84개 unit을 가진 fully connected layer로, 10,164개의 파라미터를 가진다.
  • Output layer: F6에서 84개의 input을 받아, Euclidean Radial Basis Function unit (RBF)를 적용하여 출력한다. 이는 input으로 들어오는 vector와 parameter 사이의 거리를 측정하는 함수다. Loss function은, 정답에 해당하는 RBF의 parameter vector와 가능한 한 가까운 input이 들어왔을 때 작아지는 함수로 설정해야 한다. 이 층에서의 parameter는 학습되는 것이 아니며, 수동으로 조정된다. 파라미터는 총 10개이고 +1 혹은 -1의 값을 갖는데, 총 2^10 개의 output을 표시 가능하여 ASCII code를 모두 커버할 수 있다.

Output layer에서 적용되는 parameter는 다음 분류를 사용하였다.

 
다른 neural network에서와 마찬가지로, LeNet-5의 각 unit에 들어온 input vector는 파라미터 벡터와 내적된 후 bias를 더해 활성함수(activation function)를 통과한다. 이 모델에서는 활성함수로 scaled hyperbolic tangent(tanh)를 사용하였다.

y = tanh(x)

 
정확히는 다음과 같 A = 1.7159인 tanh 함수를 썼다.

Loss Function

 
본 모델에서 사용한 Loss Function은 MSE(Mean Sqarred Error)를 기반으로 하며 아래와 같다.

 
기본적인 MSE 함수에서 뒤쪽의 로그 항이 왜 붙었는지는 아직 이해하지 못했다. 이해를 완료하고 다시 업데이트 하겠다.
 

Results

본 모델을 학습시키는 데 사용한 데이터는 NIST의 SD-3, SD-1이다. (special database라는 뜻, 손글씨에 대한 binary image data) SD-3은 미국 인구조사국 출신 사람들이 쓴 글씨, SD-1은 미국 고등학생들이 쓴 글씨여서 SD-1이 더욱 불규칙했으며, 이 데이터를 우선 포함하여 학습을 진행했다. SD-1에는 500명의 사람이 쓴 58,527개의 손글씨 이미지가 있는데, 이를 글씨를 쓴 사람에 따라 두 그룹으로 나누어 약 60,000개씩의 데이터셋을 확보했다. (모자란 데이터는 SD-3에서 가져왔다) 첫 그룹을 training set, 둘째 그룹을 test set으로 만들어 놓았다.
 
실제 실험에서는 training에서는 60,000개의 데이터를 모두 썼고, test는 모아놓은 데이터의 부분집합인 10,000개만 사용하였다. 이 새로운 데이터베이스를 MNIST라고 하였다.

 
이 training set 마다 20회의 iteration을 진행했는데, 각 학습마다 learning rate를 조금씩 줄여 나갔다.
 

 
먼저 training set iteration이 점점 늘어날수록 test와 training set의 error rate 가 점점 감소하였다. 충분한 수의 학습이 이루어졌을 때는 test가 training보다 error가 높았다.

또한 training set의 크기가 증가할수록 error는 위와 같이 변하였다. (test error는 줄어들었지만 training error는 증가) Training set의 크기가 증가할수록 test error가 줄어든다는 가설을 검증하기 위해, 일부 데이터를 아래와 같이 distortion하여 학습을 시켰더니 test error가 줄어들었다.

 
아래는 LeNet-5가 잘못 분류한 82개의 test pattern들이다. (이건 원래 못 쓴 거 아닌가....)

다른 모델들과 비교했을 때 LeNet-5의 성능은 상당히 훌륭하였다. 비교에 사용된 모델들은 다음과 같다.

  • Linear/Pairwise linear classifier
  • Baseline nearest neighbor classifier
  • PCA(Principal Component Analysis), Polynomial classifier
  • Radial Basis Function Network
  • One-hidden layer fully connected multilayer neural network
  • Two-hidden layer fully connected multilayer neural network
  • LeNet-1 (small CNN)
  • LeNet-4
  • boosted LeNet-4
  • TDC(Tangent Distance Classifier)
  • SVM(Support Vector Machine)

반응형