닫기

테크노트

배너

라온피플의 머신러닝 아카데미 'LeNet, AlexNet (2)'

  • 등록 2018.11.08 16:16:15
URL복사
[마감임박!! 무료] 생성형AI, 디지털트원, 제조AI, SaaS, 클라우드로 생산성 높이고, 비용절감 방안 제시.. AI자율제조혁신포럼 개최 (3/27~29, 코엑스3층 컨퍼런스룸 317~318호)

머신비전산업에서 인공지능 기술(머신러닝, 딥러닝)이 빠르게 확산되고 있다. 인공지능 기술을 통해 기존의 컴퓨터비전 기술로는 어려웠던 검사가 가능해질 뿐만 아니라 ‘데이터의 자기 학습’으로 보다 빠르고 쉬우며 신뢰성과 유연성을 갖춘 머신비전 검사가 가능해졌다. 이에 따라 자연스럽게 인공지능 기술에 대한 관심이 높아지고 있다. 국내 대표적인 머신비전 전문업체인 라온피플은 ‘LAON PEOPLE’s 머신러닝 아카데미’를 통해 인공지능의 대표적인 기술인 머신러닝 기술에 대해 연재한다.


AlexNet 


AlexNet의 설계자가 성능 향상을 위해 좀 더 고려한 부분은 ReLU, overlapped pooling, response normalization, data augmentation, dropout 및 2개의 GPU 사용이라고 볼 수 있다. 이전 회차에서는 위항목들 중 ReLU에 대해서만 살펴보았다. 이번 회차에서는 나머지 부분에 대해 살펴볼 예정이다.


Overlapped Pooling 


CNN의 구조에서 일반적으로 pooling은 convolution을 통해 얻은 feature-map 영상의 크기를 줄이기 위한 용도로 사용하며, average pooling 또는 max pooling을 사용한다. average pooling은 pooling window 내에 있는 픽셀들의 평균을 취하는 방식이고, max pooling은 window에서 최대값을 갖는 픽셀을 선택한다. max pooling은 average pooling에 비해 최대값을 구해야 하기 때문에 연산량이 더 많지만, 최대 크기를 갖는 자극만 전달한다는 관점에서 보면, 생물학적인 특성과 좀 더 유사하고 볼 수 있다.  LeNet-5에서는 average pooling 방식을 사용했지만, AlexNet에서는 max pooling을 사용하였으며, 그림1의 화살표 영역이 pooling layer에 해당된다.


▲ 그림 1.


통상적으로 pooling을 할 때는 겹치는 부분이 없게 하는 것이 대부분이며, pooling window의 크기도 2x2를 주로 사용하고, 건너뛰기(stride)도 2를 사용하기 때문에 출력 영상의 크기가 가로/세로 각각 1/2로 줄어들게 된다. 하지만 AlexNet은 2x2 윈도우 대신 3x3 window를 선택하고, 건너 뛰기를 2로 하는 overlapped pooling 방식을 사용했다. 이 overlapped pooling 방식을 통해 top-1과 top-5 에러율을 각각 0.4%와 0.3% 줄일 수 있었으며, overfitting에 빠질 가능성도 더 줄일 수 있다고 주장을 하고 있다.


Local Response Normalization


활성함수로 sigmoid나 tanh를 쓰는 것보다 ReLU를 쓰게 되면, 학습속도를 줄일 수 있고,  back propagation이 간단해지는 이점에 대해서는 지난 class에서 설명하였다. sigmoid나 tanh의 경우는 saturation 되는 구간이 있기 때문에, overfitting을 피하기 위해 입력에 대한 정규화(normalization)을 수행한다. 하지만 ReLU를 사용했을 때, 덤으로 얻을 수 있는 효과가 하나 더 있는데, 이것은 입력의 normalization이 필요가 없다는 점이다. 


하지만, 출력은 ReLU 특성 곡선에도 알 수 있듯이 입력에 비례하여 그대로 증가가 된다. 여러 feature-map에서의 결과를 normalization을 시키면, 생물학적 뉴런에서의 lateral inhibition(강한 자극이 주변의 약한 자극이 전달되는 것을 막는 효과)과 같은 효과를 얻을 수 있기 때문에 generalization 관점에서는 훨씬 좋아지게 된다.


논문에서는 첫번째와 두번째 convolution을 거친 결과에 대하여 ReLU를 수행하고, max pooling을 수행하기에 앞서 response normalization을 수행하였다. 이를 통해 top-1과 top-5 에러율을 각각 1.4%와 1.2%를 개선하였다.


▲ 그림 2.


Overfitting에 대한 해결책


AlexNet의 free parameter의 개수는 6000만개 수준이기 때문에 엄청나며, 이렇게 많은 free parameter를 처리하다 보면, overfitting 문제로 고생을 할 수가 있다. 이 문제에 대한 해결책으로 학습 영상의 수를 늘리기 위한 data augmentation과 망의 일부를 생략하면서 학습을 진행하는 dropout 방법을 사용하였다.


▲ 그림 3.


Overfitting에 대한 해결책 – Data Augmentation


Overfitting 문제에 대한 대표적인 해결책 중 하나가, 학습에 사용할 데이터의 양을 늘리는 것이다. 그러나 학습 데이터를 늘리는 것이 쉽지 않으며, 학습 데이터가 늘어나면 학습 시간이 길어지기 때문에 효율성을 반드시 고려해야 한다.

 

AlexNet에서는 작은 연산만으로 학습 데이터를 늘리는 2가지 방법을 적용하였다. 특히 GPU가 이전 이미지(학습 데이터)를 이용하여 학습하고 있는 동안에, CPU에서는 이미지를 늘리기 때문에 디스크에 저장할 필요가 없도록 하였다.


첫번째 방법은 ILSVRC의 256x256 크기의 원영상으로부터 무작위로 224x224 크기의 영상을 취하는 것이다. 이렇게 되면, 1장의 학습 영상으로부터 2048개의 다른 영상을 얻을 수 있게 되었다. test를 할 때는 5개의 224x224 영상(상하좌우 코너 및 중앙으로부터)과 그것들을 수평으로 반전한 이미지 5개,총 10개로부터의 softmax 출력을 평균하는 방법으로 택하였다.


두번째 방법은 각 학습 영상으로부터 RGB 채널의 값을 변화시키는 방법을 택하였다. 


이를 위하여 학습 이미지의 RGB 픽셀 값에 대한 주성분 분석(PCA)를 수행하였으며, 거기에 평균은 0, 표준편차는 0.1 크기를 갖는 랜덤 변수를 곱하고 그것을 원래 픽셀 값에 더해주는 방식으로 컬러 채널의 값을 바꾸어 다양한 영상을 얻게 되었다. 


이렇게 data augmentation을 통하여 overfitting을 줄이고, top-1 error에 대하여 1% 이상 에러율을 줄일 수 있게 되었다.



Overfitting에 대한 해결책 – Dropout

Dropout에 대한 논문이 발표된 이래, 요즘 대부분의 CNN 구조에서는 Dropout을 적용하여 학습시간을 단축시키고 overfitting의 문제도 해결한다. Dropout은 voting 효과 및 co-adaptation을 피하는 효과를 얻을 수 있기 때문이다. Krizhevsky와 공동 저자인 Hinton이 첫번째 저자로 발표한 2012년의 논문 'Improving neural networks by preventing co-adaptation of feature detectors' 논문도 한번 살펴보면 좋을 것 같다.


그림4는 Hinton의 논문에서 dropout을 hidden layer에 대해서만 적용할 때와 입력단과  hidden layer 양쪽에 dropout을 적용했을 때를 비교한 것이다.


Dropout은 그 성격상 fully-connected layer에 대하여 행하기 때문에 AlexNet에서는 fully connected layer의 처음 2개 layer에 대해서만 적용을 하였다. 또한 dropout의 비율은 50%를 사용하였다.


▲ 그림 4.


AlexNet의 성공과 GPU에 대한 관심 증가


2012년 AlexNet의 성공은 CNN/DNN 연구자들의 관심을 GPU 쪽으로 돌리는 계기가 되었다. 그리고 이는 대량 연산이 필요한 범용 프로세서를(GPGPU) 확산시키고자 하는 GPU 설계 업체, 특히 엔비디아에게는 아주 반가운 소식이 된다. 

엄청난 연산량을 충족하기 위해 GPU와 같이 대량 연산 장치를 갖고 있어야 하고, parallelism을 절대적으로 필요로 하는 application이 만들어졌고, 그것도 아주 매혹적인 분야에서 놀랄 만한 연구 결과가 나왔기 때문에, GPU를 이용한 DNN(Deep Neural Network)에 대한 연구가 불붙게 된다.


엔비디아가 중심이 되어 DNN 분야에서 GPU를 효율적으로 사용하기 위한 cuDNN(CUDA Deep Neural Network) 라이브러리를 발표하였으며, 많은 연구자들을 포럼으로 끌어들였다. 그림5는 cuDNN 블로그 사이트에 있는 그림으로, 이것을 보면 CNN 분야의 연구 동향을 알 수가 있다.


▲ 그림 5.


Why GPU ?


그런데 왜 GPU가 필요한 것일까? 답은 연산량 때문이다. CNN을 이용하여 좋은 결과를 내려면, 엄청난 학습 데이터를 필요로 한다. ILSVRC에 있는 수천만장의 영상을 학습하려면, 엄청난 연산 능력이 필수적이다.


이세돌과 바둑 대결을 펼친 알파고가 엄청나게 많은 碁譜(기보)를 학습하고 빠른 연산을 위해 1920개의 CPU와 280개의 GPU를 쓰는 이유도 그것 때문이다. AlexNet의 주 개발자인 Krizhevsky는 토론토 대학을 졸업하고 구글에 입사하였으며, 그가 2014년에 발표한 'One weird trick for parallelizing convolutional neural networks' 논문을 보면, 요즘의 Deep CNN은 크게 2개로 구성이 되었다고 볼 수 있다.


○ 전체 연산량의 90~95%를 차지하지만, free parameter의 개수는 5% 정도인 convolutional layer


○ 전체 연산량의 5~10%를 차지하지만, free parameter의 개수는 95% 정도인 fully connected layer


여기서, convolutional layer는 앞선 class에서도 살펴보았듯이, 입력 이미지에 대해서 픽셀의 위치를 옮겨가면서 반복적으로 matrix multiplication이 필요하며, 여러 개의 입력 feature-map으로부터 동일한 parameter를 갖는 filter 연산을 해야 되기 때문에 구조적으로 아주 좋은 병렬적인 특징(parallelism)을 갖는다.


또한 fully-connected network는 data 관점에서의 병렬성은 아니지만, model 관점에서의 병렬성이 좋다. 서로 다른 연산 유닛이 다른 모델을 수행할 수 있다는 뜻이다. 그래서 CNN의 layer에 따른 병렬성을 구별하면 그림6과 같다.


▲ 그림 6.


Convolutional layer에서는 여러 개의 입력 feature-map으로부터 여러 개의 filter 연산을 수행하기 때문에 높은 수준의 data parallelism 이 존재하며, filter 연산 하나만 놓고 보더라도 행렬 곱(matrix multiplication)을 해야 하는데, 이 때 행렬의 여러 component들은 연산 장치만 충분히 있다면 동시에 개별 곱을 구하면 연산을 더 효과적으로 할 수 있다. 즉, low-level 연산 parallelism도 존재하며, 입력 데이터의 크기가 커지거나 convolution kernel의 크기가 커지면, 연산의 수는 기하급수적으로 증가하게 된다.


CPU vs GPU ?


그림7은 엔비디아가 발표한 자료에 있는 내용으로, CPU와 GPU를 사용할 때의 극명한 성능 차이를 보여준다.


▲ 그림 7.


최근 사용되는 GPU 들은 대부분 Shader 기반 구조를 갖고 있고, 엄청난 수의 병렬 연산 유닛을 갖고 있으며, floating point 연산 장치도 훌륭하고, 특히 메모리 억세스의 BW도 높고 속도도 엄청 빠르기 때문에 이런 low-level parallel 연산은 범용 CPU와 비교했을 때는 엄청난 성능 차이를 보이게 된다.


그럼 CPU만으로는 CNN을 구현할 수 없는 것일까? 그렇지는 않다. 굳이 GPU를 사용하지 않더라도, 학습 시간이나 연산시간이 그리 길지 않은 작은 모델인 경우는 CPU를 써도 무방하다. 하지만, 학습 데이터의 수가 증가하게 된다면, 최적의 학습 결과 도출에 걸리는 시간상의 문제로 인해 GPU를 사용하는 것이 바람직하다. 위 그림을 보면 GPU로 하루 걸리는 일이 CPU로 14일이 걸릴 수도 있으며, 만약에 GPU로 일주일이 걸린다면, CPU로는 3개월 이상이 걸릴 수도 있다. 앞서 study 했듯이, CNN에서의 최적의 구조 결정을 위한 hyper-parameter가 매우 많다는 점을 고려하면, 대용량 데이터를 CPU만으로 최적의 학습 결과를 낸다는 것은 기대하기 어려울 것 같다.


AlexNet에서의 GPU 활용


AlexNet은 2개의 GPU를 사용하였다. 당시는 GTX580 GPU를 사용했는데, 지금은 더 고성능의 GPU들이 더 많이 나와있으며, 8개 이상의 GPU를 사용하는 연구들도 많이 볼 수 있다. AlexNet 개발 당시 사용한 GTX580은 3GB의 메모리를 갖고 있었기 때문에 모델의 구조에 제약이 있을 수밖에 없어 보인다. 이는 그때 당시 학교에서 진행하는 연구였기 때문에 쉽게 구할 수 있는 플랫폼을 선택했을 것으로 추정하며, 2개의 GPU를 사용하는 구조를 설계하면서 많은 고민이 있었을 것으로 보인다. 또한 제한된 플랫폼이기 때문에 GPU를 위/아래로 나눠쓰는 방식을 취했지만, 이후 연구들에서는 이런 식의 구조를 취한 사례가 별로 없다. 이는 더 고사양의 플랫폼을 쓰면 되기 때문인 것으로 추정된다. 그림8은 AlexNet의 구조를 GPU 사용의 관점에서 본 것이다.


▲ 그림 8.


GPU의 개수나 GPU에 있는 메모리 크기를 고려하지 않고 구조를 결정한다면 첫번째 convolutional layer에서 1개의 GPU에는 color와 무관한 48개의 feature-map을 추출하고, 다른 GPU에서는 color와 관련된 48개의 feature-map을 추출하는 등의 제한을 두지는 않았을 것이다. 


또한 inter-GPU와 intra-GPU connection 역시 크게 신경을 쓰지 않았을 것으로 보이며, resource를 고려하지 않은 구조 설계를 했다면, 더 좋은 결과가 나왔으리라고 추정이 된다. 실제로 이후 연구들이 여러 개의 GPU를 사용하거나 더 高仕樣의 GPU를 사용하여 성능을 크게 개선시킨 논문이 뒤에 발표가 되었다. AlexNet 연구자들은 2개의 GPU를 사용하여, 1개의 GPU를 사용했을 때보다 top-1과 top-5에러를 각각 1.7%와 1.2% 절감할 수 있었다고 주장을 하고 있다.


AlexNet - 결과


AlexNet의 실험 결과를 보면, 아래 그림처럼, 상당히 결과가 괜찮은 것을 알 수가 있다. 그림9에서 올바른 결과는 그림 바로 밑에 적혀 있고, 그 밑에 있는 5개의 후보는 AlexNet이 추정한 것이다. Mite(진드기)는 한쪽으로 치우쳐 있어도 잘 구별을 하는 것을 알 수가 있으며, leopard에 대한 추정 5개도 거의 비슷하게 보이는 것들이기 때문에 엉터리는 아니다. 또한 추정이 틀린 경우에도 중앙에 있는 것들을 어떻게 볼 것인지에 따라 충분히 추정이 가능한 답을 했음을 알 수 있다. 


▲ 그림 9.


이런 결과가 SIFT(Scale Invariant Feature Transform)와 같은 feature extractor를 사용하지 않고, CNN 학습을 통해서 얻어진 결과라는 점이 더욱 고무적이다. 2012년의 대회에서 실제로 SIFT 등을 사용한 다른 참가자들의 경우, 성능이 떨어졌다. 이는 CNN을 아주 복잡한 일반 영상에 대해서도, 학습의 양이 충분하다면, 그리고 좋은 CNN 구조를 갖는다면, 충분히 좋은 결과를 낼 수 있다는 가능성을 보여줬다는 점에서 매우 큰 의미를 갖는 것 같다. 


(주)라온피플



















주요파트너/추천기업