일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CuDNN
- sycl
- 클라우드
- dnn
- Qubit
- quantum_computing
- nvidia
- DRAM
- Semiconductor
- cloud
- convolution
- jhVM
- 딥러닝
- 양자역학의공준
- deep_learning
- SpMM
- 반도체기초
- C++
- stl
- Compression
- jhDNN
- kubernetes
- 쿠버네티스
- flash_memory
- FPGA
- HA
- POD
- CUDA
- GPU
- 반도체
- Today
- Total
Computing
MNIST Database와 LeNet 분석 (feat. Convolution Primitive) 본문
MNIST Database
MNIST 데이터베이스[2]는 얀 리쿤 교수가 만든 데이터베이스로, Fig 1.과 같이 0부터 9까지 손으로 쓴 숫자 사진으로 구성된 데이터베이스이다. MNIST는 Modified National Institute of Standards and Technology database의 약자로 미국 정부기관인 NIST이 만든 데이터셋을 re-mixing하여 만들어졌기에 MNIST라는 이름이 붙었다[1].
기존 NIST 데이터베이스의 training dataset은 미국의 인구조사국 직원들의 손글씨로 구성되었고, test dataset은 고등학생들의 손글씨로 구성되었다. MNIST 데이터베이스는 60000개의 training dataset과 10000개의 test dataset으로 구성된다. 이때 60000개의 MNIST training dataset 중 30000개는 NIST training dataset에서, 나머지 30000개는 NIST test dataset에서 취합하였다. 10000개의 MNIST test dataset 또한 5000개는 NIST training dataset에서, 나머지 5000개는 NIST test dataset에서 취합하였다.
Fig 2.와 같이 MNIST 데이터베이스의 한 이미지는 그레이 스케일을 가진 28*28 pixel 크기의 이미지이다. 각 pixel은 unsigned byte 데이터타입으로 0부터 255까지의 정수를 나타낸다. 0에 가까울수록 흰색, 255에 가까울수록 검은색이 된다. 이미지의 label은 마찬가지로 unsigned byte 데이터타입이며, 0부터 9까지의 숫자를 나타낸다.
MNIST 데이터베이스는 딥러닝 혹은 컴퓨터비전에서 가장 기본이 되는 문제 중 하나로, 손으로 쓰여진 숫자 이미지가 주어졌을 때 이것이 어떤 숫자인지를 맞추는 문제이다. 컴퓨터는 28*28개의 pixel값, 즉 총 784개의 숫자(=pixel값)를 입력받고, 그것을 분석하여 이것이 어떠한 숫자인지를 파악한다.
Fig 4.는 MNIST 문제를 풀기 위한 일반적인 딥러닝 네트워크 예시를 나타낸다. Fig 4.와 같이 CNN 네트워크가 가장 많이 사용되는데, 28*28 이미지를 CNN을 통해 분석하고, 그 결과 one-hot encode된 10개의 숫자를 결과로 출력한다. one-hot encoding은 숫자배열에서 1이 된 숫자의 index로 값을 표현하는 방식이다. 예를 들어 0은 [1,0,0,0,0,0,0,0,0,0]로, 2은 [0,0,1,0,0,0,0,0,0,0]로, 8은 [0,0,0,0,0,0,0,0,1,0]로 나타낸다.
LeNet
LeNet[2]은 MNIST 문제를 풀기 위해 얀 리쿤 교수가 1989년 제안한 convolutional neural network이다. 최초로 convolution layer가 도입된 연구 중 하나로(아마 최초일 것이다.), 처음 제안된 LeNet-1부터 시작하여 성능을 점차 개선해나가며 연구를 진행하였고 최종적으로 LeNet-5까지 발표하였다.
LeNet-5는 Fig 5.와 같이, 2개의 Convolution layer와 2개의 pooling layer, 3개의 fully connected layer로 구성되며, 총 trainable parameter들의 개수는 약 6만개이다. (지금 시점에서 보기에는 매우 작은 개수이지만, 컴퓨팅 파워가 매우 약했던 20세기에는 학습하기 어려웠을 것으로 생각된다. CUDA 또한 2007년에 처음 공개가 되었으니, 그 당시 학습을 어떻게 했는지 조사해 봐야 겠다.)
각 Layer 별 parameter의 개수는 다음과 같다. (bias가 없다고 가정하고 구한 결과로 bias가 들어가면 개수가 약간 변할 수 있다. Avg pooling layer에 2개의 trainable parameters가 추가될 수 있다.)
Fig 6.를 보면 convolution layer의 학습이 필요한 parameters의 개수가 fully connected layer에 비해 배우 작은 것을 알 수 있다. 이것에서 convolution layer의 파워풀함을 느낄 수 있다.
Convolution Primitive에 대한 고찰
Fig 6.에서 보듯이, convolution layer는 fully connected layer에 비해 매우 작은 개수의 parameter만 가지고도 이미지의 모든 부분을 분석할 수 있다. 이를 weight sharing 기법이라고 하는데, 말 그대로 이미지의 각 pixel의 특징을 추출하는 데 사용되는 parameters(=weights)를 공유하여 사용하여 총 parameters의 개수를 줄이는 방식이다. Fig 7.은 weight sharing을 잘 나타내는 예시이다.
Fig 7.를 보면 동일한 3*3 convolution parameters map를 가지고 이미지의 두 영역 특징을 추출한다. 이처럼 하나의 convolution map을 sliding window 방식으로 이미지의 전 영역을 훝으며 특징을 계산한다. Fully connect layer에서는 각 pixel 하나마다 다음 feature map의 모든 elements에 연결되는 weights가 존재하는데 비해, 이 방식은 parameter의 개수를 매우 줄일 수 있다.
하나의 convolution parameters map은 하나의 패턴을 찾도록 학습된다. Fig 7.에서는 X형태의 패턴을 추출하도록 학습되었기에 X 형태를 가진 이미지의 영역이 큰 값을 출력할 것이다. 이러한 parameters map을 통해 이미지 전체를 훓으며 이미지 전체에 해당 패턴이 얼마나 있는 지를 찾는다. 더 다양한 패턴을 찾기 위해서는 여러 장의 parameters map을 사용하는데, 각 map은 각자가 학습한 패턴에 따라 특징(=feature) 추출을 진행한다. 이때 몇장의 패턴을 학습할 지가 convolution layer의 output channel 크기가 된다. 그렇기에 convolution layer의 output feature map의 각 채널은 특정 패턴이 얼마만큼 있는 지를 점수화한 것이라고 생각해도 좋을 것이다. Fig 8.은 96개의 패턴을 학습한 3*11*11 convolution maps를 시각화하여 보여준다.
이처럼 convolution layer의 역할은 이미지에서 특정 패턴을 띄는 특징을 추출하는 것이다. 이러한 패턴을 잘 학습하는 것이 convolution layer의 목표다.
Convolution layer는 패턴이 이미지의 어디에 있는 지 상관없이 특징을 추출할 수 있는데 비해, 패턴의 크기가 달라지거나 패턴이 회전하게된다면 기존의 학습된 convolution layer만으로 특징을 잘 추출하기 어렵다. 이러한 convolution layer의 특징을 translation invariance(이동에는 불변), scale variance(크기에는 변함), rotation variance(방향에는 변함)이라고 한다. 같은 패턴을 이용해 이미지를 훓으며 특징을 추출하기에 이미지의 어디에 특징이 있더라도 특징을 잘 추출할 수 있다. 하지만 학습된 패턴은 어느정도 고정되기에 패턴의 크기가 변화거나 회전하면 전혀 찾을 수 없다. 이를 해결하기 위해서는, 학습 시 사진을 회전시키거나 scale을 조정하여 이러한 패턴의 변화까지도 학습하도록 해야 한다.
또한 일반적으로 convolution layer는 3*3, 5*5, 7*7 크기로, 이미지의 작은 영역의 특징을 추출하기에 global feature를 찾을 수가 없다. 256*256 이미지에서 3*3의 크기의 특징만을 추출하기에 한계가 존재한다. 이미지 내에 코가 있고, 눈이 있고, 털이 있고는 파악할 수 있지만 이것을 조합하여 개인지, 고양이인지는 파악하기 어렵다. 이는 눈 감고 코끼리를 만지는 격이다. 이를 해결 하기 위해 일반적으로 CNN은 pooling layer를 이용해 feature map의 사이즈를 줄여가며 convolution을 진행한다. 처음 128*128 이미지에서 3*3 convolution은 local feature만을 추출할 수 있지만, pooling layer를 통해 feature map을 4*4 크기까지로 줄인다면 3*3 convolution은 global feature까지 추출할 수 있다.
Reference
[1] https://ko.wikipedia.org/wiki/MNIST_데이터베이스
[2] Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. "Gradient-based learning applied to document recognition." Proceedings of the IEEE, 86(11):2278-2324, November 1998.
[3] https://sdc-james.gitbook.io/onebook/4.-and/5.1./5.1.3.-mnist-dataset
[4] Strategies to Improve the Accuracy of Memristor-Based Convolutional Neural Networks - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/LeNet-5-architecture-used-in-our-work-for-MNIST-data-set-recognition_fig1_338779793 [accessed 16 May, 2022]
[5] https://en.wikipedia.org/wiki/LeNet
[6] https://blog.naver.com/PostView.nhn?blogId=intelliz&logNo=221709190464
[7] https://cs231n.github.io/convolutional-networks/