LeNet는 이미지 분류용 CNN 중에 조상격으로 CNN초기에 CNN의 기본 구조를 잘 정립하였다. LeNet의 다양한 버전들(LeNet-1, LeNet-2,...)이 있으나 최종 버전은 LeNet-5이다.
LeNet은 CNN을 처음으로 개발한 얀 르쿤(Yann Lecun) 연구팀이 1998년에 개발한 CNN 알고리즘의 이름이다. original 논문 제목은 "Gradient-based learning applied to document recognition"이다. 우선 LeNet-5의 구조를 살펴보자.
그림에서 볼 수 있듯이 LeNet-5는 인풋(Input) 레이어, 3개의 컨볼루션 레이어(C1, C3, C5), 2개의 서브샘플링 레이어(Subsampling layer or Pooling layer)(S2, S4), 1층의 full-connected 레이어(F6), 아웃풋(Output) 레이어로 구성되어 있다. 참고로 C1부터 F6까지 활성화 함수로 tanh(hypobolic tangent)을 사용한다.
입력 영상(여기서는 32 x 32 사이즈의 이미지)을 6개(6채널)의 5 x 5 필터와 컨볼루션 연산을 해준다. 그 결과 6장의 28 x 28 특성 맵(Feature map)을 얻게 된다.
훈련해야할 파라미터 개수: (가중치 * 입력맵 개수 + 바이어스) * 특성맵 개수 = (5*5 *1 + 1)*6 = 156
(가중치가 커널(필터) 사이즈 5X5를 말한다.)
6장의 28 x 28 특성 맵에 대해 서브샘플링(subsampling, pooling)을 진행한다. 결과적으로 28 x 28 사이즈의 특성 맵이 6장의 14 x 14 사이즈의 특성맵으로 축소된다. 2 x 2 필터를 stride 2로 설정해서 서브샘플링해주기 때문이다. 사용하는 서브샘플링 방법은 평균 풀링(average pooling)이다.
훈련해야할 파라미터 개수: (가중치 + 바이어스) * 특성맵개수 = (1+1)*6 = 12
평균풀링인데 왜 훈련해야할 파라미터가 필요한지 의아할 수 있는데, original 논문에 의하면 평균을 낸 후에 한 개의 훈련가능한 가중치(trainable weight)를 곱해주고 또 한 개의 훈련가능한 바이어스(trainable bias)를 더해준다고 한다. 그 값이 시그모이드 함수를 통해 활성화된다. 참고로 그 가중치와 바이어스는 시그모이드의 비활성도를 조절해준다고 한다.
(단순 풀링만 하는 것이 아니라 여기에 뭔가 더 추가해서 학습을 하는 거 같다.)
6장의 14x14 특성맵에 5X5 커널의 컨볼루션 연산을 수행해서 16장의 10x10 특성맵을 산출해낸다. 이것 이해하는데 한참 걸렸다. 6장 -> 16장이 나오게 되는 과정을 맨 위의 그림만 봐서는 알 수가 없다.
다음 그림을 보자.
1) 6장의 14 x 14 특성맵에서 연속된 3장씩을 모아서 5 x 5 x 3 사이즈의 필터와 컨볼루션 해준다(그림에서 열0-5). 6장의 10 x 10 특성맵이 산출된다.
2) 6장의 14 x 14 특성맵에서 연속된 4장씩을 모아서 5 x 5 x 4 사이즈의 필터와 컨볼루션 해준다(그림에서 열6-11). 6장의 10 x 10 특성맵이 산출된다.
3) 6장의 14 x 14 특성맵에서 불연속한 4장씩을 모아서 5 x 5 x 4 사이즈의 필터와 컨볼루션 해준다(그림에서 열12-14). 3장의 10 x 10 특성맵이 산출된다.
4) 마지막으로 6장의 14 x 14 특성맵 모두를 가지고 5 x 5 x 6 사이즈의 필터와 컨볼루션 해준다(그림2에서 열15). 1장의 10 x 10 특성맵이 산출된다.
결과적으로 16장(6 + 6 + 3 + 1)의 10 x 10 특성맵을 얻게 되었다.
(입력에서 연속된 3장, 4장이나 불연속된 4장의 hyper parameter값은 논문에서 작성자가 임의로 선택한 값이라고 하였다.)
훈련해야할 파라미터 개수:
첫번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*3 + 1)*6 = 456
두번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*4 + 1)*6 = 606
세번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*4 + 1)*3 = 303
네번째그룹=> (가중치*입력맵개수+바이어스)*특성맵 개수 = (5*5*6 + 1)*1 = 151
456 + 606 + 303 + 151 = 1516
16장의 10 x 10 특성 맵에 대해서 서브샘플링을 진행해 16장의 5 x 5 특성 맵으로 축소시킨다.(2 x 2 필터, stride 2)
훈련해야할 파라미터 개수: (가중치 + 바이어스)*특성맵개수 = (1 + 1)*16 = 32
16장의 5 x 5 특성맵을 120개의 5 x 5 x 16 사이즈의 필터와 컨볼루션 해준다. 결과적으로 120개의 1 x 1 특성맵이 산출된다.
훈련해야할 파라미터 개수: (가중치*입력맵개수 + 바이어스)*특성맵 개수 = (5*5*16 + 1)*120 = 48120
84개의 유닛을 가진 피드포워드 신경망이다. C5의 결과를 84개의 유닛에 연결시킨다.
LeNet에서는 아직 Backpropagation을 사용하지 않는다.
훈련해야할 파라미터 개수: 연결개수 = (입력개수 + 바이어스)*출력개수 = (120 + 1)*84 = 10164
10개의 Euclidean radial basis function(RBF) 유닛들로 구성되어있다. 각각 F6의 84개 유닛으로부터 인풋을 받는다. 최종적으로 이미지가 속한 클래스를 알려준다. 10개의 출력에서 각각이 특정 이미지일 확률을 나타낸다.
RBF에서는 학습할 때 역전파(Backpropagation)를 사용한다.
LeNet-5를 제대로 가동하기 위해 훈련해야할 파라미터는 총 156 + 12 + 1516 + 32 + 48120 + 10164 = 60000개다.