안녕하세요~


이제부터는 CNN이 발전해왔던 과정을 여러 모델을 통해 알려드릴까해요. 그래서 이번장에서는 그 첫 번째 모델이라 할 수 있는 AlexNet에 대해서 소개시켜드릴려고 합니다!


AlexNet의 논문 제목은 아래와 같은데요. 여러분께서도 잘알고계신 (아니면 앞으로 잘 아실) 저자들이 등장했어요. 

<사진1>



<0. Abstract>


AlexNet Abstract에서는 해당논문에서 사용한 핵심적인 기술이나 전체적인 구조를 간단히 언급하고, 성능결과 또는 해당모델이 갖는 의의에 대해서 간단하게 언급해요. 아래 논문사진에서 나타내는 색은 제가 임의대로 아래와 같이 설정하고 표시를 했습니다. 


파랑: 용어

초록: 성능결과

빨강: 키워드

노란색: AlexNet 구조



먼저 AlexNet은 1.2 million high-resolution images에 대해서 classification 을 진행했어요. 아래 abstract에 파란색 부분을 보시면 resolution에 대해서 언급하고 있어요. 이 논문에서 언급한 resolution(해상도)는 "이미지의 넓이x높이= 이미지의 크기"를 의미해요. 대략 1200x1000 = 1,200,000 정도의 이미지들을 classification 했다고 하네요 (보통 training 시킬때 학습 이미지지의 화소가 너무 좋으면 일반화성능이 떨어질 가능성이 크다고 생각해요. 왜냐하면 나중에 CNN이 classification해야할 물체들은 낮은 화질(해상도)을 갖은 이미지들에 대해서도 classification해야 하기 때문이에요. 또한 학습이미지의 화질이 높으면 학습이미지상의 물체의 디테일한 특징을 잡을 수 있는데 이런 경우에 더 일반화성능이 떨어질 수 있을거에요. 이에 대한 설명은 여기 링크에서 '가위' 예시를 참고해주세요)




두 번째로 노란색 부분을 보시면 AlexNet의 모델의 기본구조가 나와있어요. 5개의 conv layer with max pooling (-> 5 conv layer, 5 pooling layer)와 마지막 단에 해당하는 3개의 fully connected layer와 다클래스 분류를 위한 softmax activation function을 사용하고 있네요. (Cost function은 안봐도 cross entropy겠죠? '1000개 이미지를 classification한다'라는것은 기본적으로 다클래스 분류에 대한 문제정의라고 볼 수 있기 때문이에요! 자세한 내용은 여기 링크에서 '다클래스 분류'편을 참고해주세요. 추가적으로 여기링크를 들어가시면 alexnet을 구현한 코드가 있는데 loss(cost function)을 구현한 부분을 보시면 cross_entropy라고 되어있을거에요~)


여기까지는 우리가 배워왔던 개념들이라 크게 이해하는데 어렵진 않았을거에요. 물론 위 논문에서는 최초의 CNN모델이라는 것에 큰 의미를 두고 있지만, 우리가 개별적으로 살펴봐야할 부분은 키워드에 해당하는 빨간색 부분이에요. "GPU, dropout" 이 두 가지 기법이 해당 논문의 originality를 더 높여 줄 수 있게 되었다고 봐도 무방할 것 같습니다. 그럼 이제부터 좀 더 자세하게 알아보도록 할까요?


-요약-

Abstract에서 알 수 있었던 사실

#AlexNet 성능  #차별화된 핵심기술 GPU, Dropout









<1. Introduction>  


AlexNet introduction에서는 기존에 갖고 있었던 문제들을 언급하면서 해당 논문에서 제시된 방식들이 해결책이 될 수 있다는 사실들을 나열합니다. 저는 여기서 핵심이 되는 문장을 5가지로 추려보았는데요.


1,2 문장은 기존에 갖고 있던 문제들에 대해서 지적하고 있네요. 


"기존의 simple한 객체(object; 물체)에 대한 recognition(classification)은 잘 되지만 현실세계에서 물체는 좀 더 다양한 특성성들이 포함 되어 있기 때문에 큰 이미지에 대해서도 학습하고 classification할 줄 알아야 합니다"


3,4,5 문장은 위에서 언급한 문제를 해결하기 위해 새로운 모델이 도입되었고 해당모델의 장점을 언급하고 있어요.


"CNN은 기존에 있던 모델들(16,11,13,18,15,22,26)을 통해 만들어 졌고, 기존 DNN 방식의 fully connection 방식보다 sparse connection 구조를 갖은 CNN 모델로 인해 더 적은 parameter로 효율적으로 학습시킬 수 있게 되었어요. 또한 CNN 모델은 GPU로 학습시키는게 효율적이기 때문에 CPU로 연산했던 무거(expensive)운 방식을 대체할 수 있었습니다."



저자는 아래와 같이 논문이 전개될 방향성에 대해서 언급하고 있는데요. 

1) 엄청 큰 CNN 모델인 AlexNet을 학습시켰다

2) 2D convolution 연산(filter)시 GPU를 사용했다

3) 성능향상과 학습시간 감소를 위한 기술들을 사용했다 -> section 3에서 언급할 예정

4) Overfitting을 방지하기 위한 기술들을 사용했다 -> section 4에서 언급할 예정

5) AlexNet은 5개의 convolution layer (with max pooling layer)와 3개의 FC layer로 구성되어 있다 (총 CNN의 깊이는 8(layer)).



추가적으로 GPU에 대해서 더 언급을 하고 있네요.

- CNN 구조 (layer가 8인 이유)는 GPU 메모리 성능(GTX 580 3GB) 때문이다.

- AlexNet은 더 빠른 GPU와 더 큰 dataset을 통해 성능이 향상될 여지가 있다.





-요약-

Introduction에서 알 수 있었던 사실

#이전의 모델들은 기존 간단한 recognition은 쉽게 해결했지만 다양한 물체에 대한 recognition이 어려워 CNN 출현  

#논문이 전개될 방향성(Overfitting-DataAugmentation, Dropout/Tech-convolutin operation with GPU, etc)   #CNN 구조(layer수, filter 크기)는 GPU성능에 제한되어 있다.









<2. Dataset>


AlexNet을 학습(training)시키기 위해 사용된 Dataset에 대한 정보가 나와 있네요. ImageNet에서 제공해주는 이미지는 22000개의 범주(categories)를 갖는 15million개의 이미지들인데요. 보통 CNN은 ILSVRC 대회에 참가를 하여 성능평가를 했기 때문에 ILSVRC에서 규정한 1000개의 범주에 속하는 이미지들을 학습시켰어요. 



AlexNet은 학습시 Data Preprocessing (데이터 전처리)를 위해 두 가지 작업을 진행했어요.

- 입력되는 이미지들은 다양한 해상도(크기=이미지의 넓이X높이)를 갖고 있기 때문에 최초의 CNN 입력시 동일한 크기(256X256)로 맞춰주었어야해요. 왜냐하면 나중에 FC layer에서 softmax activation function으로 fully(or dense) connection으로 만들어주기 위해서는 FC layer의 입력 크기가 고정되어있어야 하기 때문이에요. (Convolution layer가 5개로 고정되어있으니, 만약 입력 이미지 데이터의 크기가 다를때마다 FC layer에 입력되는 feature개수가 모두 다르겠죠?) --> 256X256으로 만들어 줄때에는 이미지의 넓이와 높이중 더 길이가 적은 쪽을 256으로 고정시키고 이에 따라 나머지 부분도 256으로 resize해줍니다. 그리고, resized image의 중앙(central) 부분을 crop 해주어 AlexNet의 첫 번째 convolution layer에 입력 데이터로 제공해줍니다.


<사진1>



<사진2>


- 일반화성능을 향상시키기 위해 조금 raw RGB pixel들을 학습시켰습니다. 이를 수행하기 위해 학습 이미지데이터들을 normalization 해주는 방법으로 전체 학습이미지 dataset의 픽셀 평균들을 빼주었어요. --> 학습이미지 - dataset 평균 = normalized 학습 이미지











<4. Reducing Overfitting>


사실 논문을 읽어본 후에 흐름상 5번에 해당하는 부분을 먼저 설명드리는게 좋을것 같아서 순서배치를 달리 했어요. 이 부분에서는 overfitting을 피하기위해 두 가지 방법을 언급했는데요. 



1) Data Augmentation

1-1) translation and horizontal reflection


Data Augmentation이란 현재 갖고 있는 데이터를 좀 더 다양하게 만들어 CNN 모델을 학습시키기 위해 만들어진 개념이에요. 이러한 기법은 적은 노력으로 다양한 데이터를 형성하게하여 overfitting을 피하게 만들어줘요. (더 자세한 개념은 여기 링크를 참고해주세요.)



앞서 입력이미지를 256X256로 resize and crop을 한다고 했었죠? 그런데 256X256 크기의 이미지가 AlexNet의 학습이미지로 활용되지는 않아요. 256X256 이미지에서 random하게 crop을 진행하게 되는데요. 아래 사진3과 같이 random crop을 하게 되면 조금씩 다른 위치의 이미지 데이터들이 만들어질거에요. 또한 매우 간단한 작업이기 때문에 GPU로도 충분히 parallel(병렬)처리가 가능합니다.


<사진3>



아! 추가적으로 더 설명하자면 논문에서 종종 'label-preserving transformation이라는 개념이 나오는데요. Data augmentation 기법중에 상하반전같은 기법을 쓸때, 아래와 같이 의미가 완전히 바뀌게 될 수 있어요.




그런데 우리는 원본데이터(label)의 특성을 그대로 보존(preserving)하면서 augmentation(transformation)한 데이터를 써야하는데 이때 우리는 'We use dataset using label-preserving transformation'라고 한답니다.





1-2) PCA on RGB pixel values


PCA는 선형대수에서 배울 수 있는 개념이에요. 좀 더 자세한 내용은 여기 링크를 참고해주세요. (나중에 '딥러닝 수학' chapter에서 PCA에 대해 좀 더 자세한 글을 올리도록 할게요.)


PCA가 RGB에 적용되어 어떻게 data augmentation을 가능하게 하는지 설명해볼게요 (자세한 설명은 여기 링크를 참고해주세요). 


빛의 3원색에 따라 우리 컬러 이미지는 각 pixel 위치에 따라 RGB값들을 갖고 있어요. 그리고 이미지 전체에 대한 pixel값들을 '사진5'의 우측하단 처럼 3D map으로 visualization해서 볼 수 있어요.


      

<사진4>                                               <사진5>


그리고 이러한 pixel 값들의 (3X3) covariance matrix를 통해 PCA 분석을 하면 eigenvector, eigenvalue를 찾을 수 있게 되요. 


          

                        

            <사진6>                                     <사진7>                                     <사진8>                   


예시를 통해서 살펴보면, 아래 original 이미지의 covariance matrix 통해서 eigenvector, eigenvalue를 구할 수 있어요.          


       

<사진9>



위의 사진8의 e 부분이 사진10의 p 부분 즉, eigenvector 부분이라고 보면되는데, 아래와 같은 식을 통해 원본이미지를 바꿔주게되면 PCA를 RGB에 적용 (PCA on RGB)하여 data augmentation을 이루어 냈다고 할 수 있습니다.

        

         

<사진10>


<사진11. PCA on RGB 적용 예시>


실제로는 eigentvector에 평균 0, 표준편차 0.1의 Gaussian(Normal) distribution으로부터 랜덤한 변수 알파를 곱해줍니다. 이때 해당변수는 고정값이 아니라 학습중에 일정단계에서 값이 변경이 된다고 하네요.





2) Dropout


Dropout이라는 개념은 추후에 따로 DNN chapter에서 설명하도록 하겠습니다 (DNN 챕터에서 dropout 설명한다는걸 깜빡했네요;;;ㅎㅎ).


Dropout을 통해서 training 시간도줄이고, overfitting도 피할 수 있게 되었다고 설명하고 있는데요. 


실제로 dropout이 적용된 부분은 아래 사진에서 빨간색으로 표시된 부분이라고 하네요. 



 

-요약-

Reducing Overfitting에서 알 수 있었던 사실

#Data augmentation - 256x256 -> 224x224로 바꾸는 이유(translation and horizontal flip), PCA on RGB

#Dropout - 첫 두 FC layer에 적용




 






<3. The Architecture>


AlexNet은 이전 CNN 구조에서 사용했던 activation function을 ReLU로 바꿔주었어요. 그리고 기존에 사용하던 pooling 방식과 조금다른 overpooling 방식을 사용했습니다. 가장 중요한 부분은 GPU를 통해 CNN을 학습시키는것을 가능하게 만들었다는 점이고, 추가적으로 local response normalization이라는 방버을 사용했네요.



1) ReLU


DNN 챕터의 activation function 파트 (여기 링크)에서 ReLU가 나타난 이유가 여기 논문에서 언급되고 있네요. 결과적으로 우측 Figure1을 보면 ReLU가 있을 때의 solid line과 ReLU가 아닌 tanh를 activation function으로 사용했을 때의 dashed line을 보면 학습시간과 error rate의 차이가 얼마나 나는지 쉽게 파악하실 수 있으실 거에요.


 

중간에 saturating nonlinearities라는 용어는 vanishing gradient 유발할 수 있는 nonlinear activation function을 의미하는데요. 예를 들어, f(x)라는 함수가 있을 때 x라는 정의역이 무한대로 증가(+)되거나 무한대로 감소(-)되면 f(x)값이 1 or 0으로 포화(물리적인 뜻 참고링크) 되기 때문이에 붙여진 이름이랍니다.


<사진12>





2) Overpooling


아래논문에서 s는 2이를 의미하는 것이고, z는 pooling 결과 나오는 feature map 사이즈를 의미해요. 



예를들어, 4X4 feature map 을 pooling 한다고 했을 때, stride(=s)를 2라고 설정하고, pooling을 통해 얻어지는 feature size(=z)를 3x3라고 설정하게 되면 overlapping해서 pooling하게 됩니다. 논문에서는 이러한 연산을 통해 top-1, top-5의 error rate을 0.4%까지 줄였다고 하네요.



<사진13>







3) Training on Multiple GPUs


이 논문에서는 GPU를 두 개로 나누어 사용한다고만 설명하고 있습니다. 왜 이렇게 사용했는지에 대한 구체적인 언급은 없었어요.



단지 CNN연산들을 GPU로 계산함으로써 학습속도도 좀더 빠르고 error rate를 줄일 수 있다고 표현했는데요. 기본적으로 GPU는 전체 conv filter(kernel)들을 반으로 나누어서 계산하게 하는데요. 예를들어, 90개의 filter가 있다고 하면 45개의 filter를 A파트로 할당하고, 남은 45개의 filter를 B파트로 할당해서 서로 독립적으로 연산할 수 있겠금 설정했어요. 그런데, 조금 특이한 부분은 2번째 conv layer를 지나 3번째 conv layer로 넘어가면서 연산할때에는 kernel을 반으로 나누되 서로 뒤섞여서(communication)쓰일 수 있게 해놓았어요. 


(이것의 기본 철학에 대해서는 저도 이해가 안되는 부분이라.. 아시는분 있으시면 댓글달아주시면 감사하겠습니다~)




4) Local Response Normalization


이 부분은 크게 세 part로 나누어서 설명드릴게요.


첫 번째 부분은 Local Response Normalization을 사용한 이유에 대해서 언급하고 있어요. ReLU는 앞서 언급한 것 처럼 saturating 현상을 피하게 해주는 activation function이에요. Sigmoid function 같은 경우는 input data의 속성(ex; x1, x2)이 서로 편차가 심하면 saturating되는 현상이 심해져 나중에 vanishing gradient를 유발할 수 있게 됩니다. 하지만, ReLU를 사용하게 되면 이러한 현상은 피할 수 있게 되는거죠. 하지만, 이 논문에서는 생물학적 현상인 lateral inhibition 개념을 언급하면서 local response normalization의 필요성을 언급하고 있어요. Lateral inhibition은 강한 자극이 주변의 약한자극을 전달하는 것을 막는 효과를 일컫는데요. 이 부분은 수식을 보면서 좀 더 자세히 언급해보도록 할게요.



위의 수식을 정리하면 아래와 같이 표현할 수 있는데요. 아래식에서 a는 이미지상의 특정x,y위치에 있는 i번째 conv filter가 적용된 결과값을 의미합니다. 아래의 식을 예를들어 설명해 볼게요. n=5, i=5라고 설정했다는 것은 5번째conv filter 결과값은 3,4,5,6,7 번째 conv filter의 결과값을 이용해 정규화 한다는거에요.

여기서 중요한 변수는 n인데, local response normalization이라는 것은 강한 자극이 주변의 약한자극을 전달하는 것을 막는 효과라고 말씀드린바있죠? 만약 3,4,5,6,7번째 conv filter의 결과값이 매우 높다면 i번째 conv filter가 적용된 결과값도 매우 작아질거에요. 반면, 5번째 conv filter 결과값이 3,4,6,7번째 conv filter값 결과보다 매우 높다면 상대적으로 3,4,6,7번째 conv filter 결과값은 작아질거에요. 이것을 통해서 강한 자극(5번째)이 주변의 약한자극(3,4,6,7번째 뉴런)의 세기를 죽이게 되는 결과를 얻게 됩니다.


   

      <사진14>                                              <사진15>


그외 hyperparameter들은 validation dataset을 통해 경험적으로 최적의 값들을 얻었다고 하네요 (베이지안 추론을 이용한건지 아닌지는 잘 모르겠네요;;ㅎㅎ).



이러한 local response normalization을 통해서 2%의 error rate이 낮아졌다고 발표하고 있습니다.


이 기법이 왜 잘 됐는지는 아래 세 가지 point 요인으로 축약할 수 있지만, 사실 3가지 요인을 총체적으로 설명할 수 있는 말이 떠오르지가 않네요;; ㅎㅎ 

- 주변보다 강한 conv filter 결과는 더욱 돋보이게 해준다.

- 주변 conv filter 결과값이 모두 강하면 conv filter 결과는 낮아진다 -> overfitting 방지? regularization?

- 주변보다 약한 conv filter 결과는 더욱 약해진다 -> 극단적인 경우에는 결과 feature map이 sparse matrix를 형성하여 sparse connection or dropout 효과를 일으킬 수 있음


하지만 AlexNet 이후에는 local response normalization 기법대신 batch normalization 기법이 쓰인다고 하니 알아두시면 좋을것 같습니다!




5) Overall Architecture


3-5.Overall Architecture 부분과 5.Detail of Learning 부분을 한 눈에 요약한 사진으로 설명을 대체하도록 할게요!




아래 사진을 보면 위의 설명들이 한눈으로 파악하실 수 있어요!


<사진14>


(그림에서는 input이 224x224라고 나오는데 왼쪽 text로 되어 있는부분은 227x227이라고 나오죠?  논문에 설정된 stride와 padding을 고려했을때, 여러 레이어를 거쳐 13x13으로 도달하려면 227x227이 맞다고해요. 논문의 그림이 잘 못된거라고 합니다)




<6.Result>


왼쪽 테이블의 AlexNet의 결과를 보면 기존 recognition(classification) 모델은 'Sparse coding', 'SIFT+FVs' 보다 더 좋아진것을 볼 수 있었어요.


또한, 오른쪽 테이블을 보면 1 CNN은 해당 논문에서 언급한 모델들의 validation set, test set에 대한 error rate을 언급하고 있고, 5 CNN은 해당 논문에서 비슷한 모델들의 prediction(classification) 평균을 내어 error rate을 계산했어요. 그리고 asterisk * 표시가 되어 있는 1 CNN은 pre-training, fine tuning 기법들이 사용된 alexnet의 error rate이고, 7 CNN은 앞서 언급한 '5 CNN'과 2개의 유사한 구조를 같은 pre-trained and fine-tuned alexnet의 prediction 평균을 낸 error rate이에요.


       








AlexNet은 현재 CNN이라고 하면 떠올리는 뼈대가 되는 모델이에요. 그렇기 때문에 조금 자세하게 다루어봤어요. AlexNet 이후의 CNN 모델들은 AlexNet을 기반으로 모델의 부분수정과 업데이트과정을 반복하면서 발전해왔어요. 사실 순서대로라면 다음 글에서 ZF-Net을 설명해드리는것이 맞지만, ZF-Net은 AlexNet의 conv filter의 size만 변화한 모델이기 때문에 아래사진으로 대체하고 다음글은 VGGNet으로 찾아뵈려고합니다~


<사진15. ZFNet>


위의 이미지에서는 512, 1024, 512 conv filter가 사용된건지 알 수 없지만, ZF Net 논문에서는 3,4,5 layer를 수정한 결과가 굉장히 좋게 나왔다는걸 보여주고 있어요!









[논문 래퍼런스]

https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

ImageNet Classification with Deep Convolutional Neural Networks, Krizhevsky, Alex/ Sutskever, Ilya/ Hinton, Geoffrey E/ Advances in Neural Information Processing Systems 25/ 1097-1105 pp


[글 래퍼런스]

https://bskyvision.com/421

https://datascienceschool.net/view-notebook/d19e803640094f76b93f11b850b920a4/

https://laonple.blog.me/220662317927

https://taeguu.tistory.com/29


[사진래퍼런스]

사진1

https://adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/

사진2,3

https://mc.ai/alexnet-a-brief-review/

사진4,5

http://inside.mines.edu/~whoff/courses/EENG510/lectures/19-Color.pdf

사진6,7

https://darkpgmr.tistory.com/110

사진8,9,11

https://johnloomis.org/ece563/notes/covar/covar.html

사진10

https://laonple.blog.me/220662317927

사진12

https://wizardforcel.gitbooks.io/scikit-and-tensorflow-workbooks-bjpcjp/ch11-DNN-training.html

사진13

https://bskyvision.com/421

사진14,15

https://www.youtube.com/watch?v=fe2Vn0mwALI&t=170s

+ Recent posts