안녕하세요 이번글에서는 CNN 모델을 평가하는 또 다른 지표인 F1 score에 대해서 알아보도록 할거에요.


앞서 "5.CNN 성능은 어떻게 평가하게 되나요?"라는 글에서 봤듯이 CNN은 accuracy 기반을 하여 CNN 성능을 평가한다고 말씀드렸어요.


하지만 어떠한 상황에서는 accuracy를 기반으로 하는 것 보다는 다른 성능지표를 사용하는것이 더 좋을 수 있어요. 그래서 이번글에서는 accuracy를 사용하면 좋지 않은 상황과 이런 상황에서 대안이되는 성과지표(measurement)를 알아보도록 할게요.


 


이번 글의 이미지와 모든 내용은 아래 유튜브 영상에서 참고하였으니 아래영상을 보시는걸 추천드립니다.






<1.Confusion Matrix>


로봇에게 A라는 글을 보여주고(input) 로봇이 A라고 답(answers)했을 때 아래 테이블 처럼 1이라는 표시를 해줍니다. 만약 B라는 글을 보여줬는데 D라고 답한다면 (B,D) 구역에 1이라고 표시를 해볼게요.

       


이러한 과정을 반복해서 최종적으로 아래와 같은 테이블을 얻었다고 해봅시다. 로봇A, 로봇B는 각기 다른 결과들을 보여주었어요 (아래와 같은 결과(Matrix)를 Confusion Matrix라고 합니다). 그렇다면 우리는 두 로봇의 Confusion Matrix를 봤을때 어떤 로봇모델을 쓰는것이 좋을까요? 



위에서 질문한 답을 하기 위해서 "Accuracy, Recall, Precision, F1 score"라는 성능평가 지표를 보고 어떤 로봇(모델)을 사용할지 결정하게 되는데, 이러한 개념을 이해하기 위해서는 먼저 TP, TN, FP, FN이라는 개념에 대해서 알아봐야해요. 





<2. TP(True Positive), TN(True Negative), FP(False Positive), FN(False Negative)>


특정 클래스를 잘 구분하는지 알아본다고 해볼게요.

만약 A라는 클래스를 잘 구분하는지 알아본다고 했을 때, 아래 두 가지 개념이 유용하게 사용돼요


Positive and Negative: 정답과 관계없이 A 클래스 입장에서 모델이 A라고 분류하면(+) A기준에서는 Positive하게 분류한것이고, A라고 분류하지 않으면(-) Negative 하게 분류한거에요.


True and False: 정답과 관련하여, 예측과 정답이 일치하면 True, 예측과 정답이 일치하지 않으면 False로 분류해요.



1-1) TP (True Positive)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, A클래스를 보여주고 A라고 (positive) 올바르게 (True) 예측하면 A에 대해서 True Positive하다고 할 수 있어요 (True Positive for A).





1-2) FP (False Positive for A)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, B,C,D 클래스를 보여줬을 때 A라고 (positive) 잘 못 판단(False) 한다면 A에 대해서 False Positive하다고 할 수 있어요 (False Positive for A).



1-3) FN (False Negative for A)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, A 클래스를 보여줬을 때, A가 아니(Negative)라고 잘 못 (False) 판단하는 경우를 A에 대해서 False Negative 하다고 해요 (False Negative for A).




1-4) TN (True Negative for A)


로봇이 A 클래스를 얼마나 잘 분류하는지 알아본다고 해볼게요 (A관점에서 positive, negative를 나눈다고 가정하겠습니다.)

예를들어, B,C,D 클래스를 보여줬을 때, A가 아니(Negative)라고 올바르게 판단(True) 하는 경우를 A에 대해서 True Negative 하다고 합니다 (True Negative for A).



<사진5>





<3. Accuracy>


위에서 언급한 개념들을 토대로 우리가 사용할 수 있는 첫 번째 성능지표는 Accuracy에요. Accuracy는 아래와 같은 수식을 통해 계산이되요



(아래영상은 TP로만 계산이 되었네요. 개념만 이해하시면 될 것 같습니다.)


이런 경우에는 Accuracy 지표를 이용하여 Model1, Model2를 평가하고 Model1을 사용하게되면 실제로 어떤 class(A,B,C,D)를 보여줘도 Model2보다 높은 확률로 정답을 도출해낼거에요.


하지만, 위와 같은 경우는 Model1, Model2 모두 실제 테스트 클래스(actual values)가 A=10, B=10, C=10, D=10 으로 각각 동일할 거에요. 이럴때 머신러닝이 학습하기 위한 데이터셋의 class가 balance하게 구성되어 있다고 이야기해요. 그렇다면 class가 imbalance한 구조에서도 accuracy라는 지표가 효율적일까요?


예를들어, 의학 이미지 데이터들을 보면 정상인(normal)에 해당하는 데이터셋은 굉장히 많이 있는 반면에, 병(변)이 있는 사람들의 데이터셋은 굉장히 적어요. 만약 정상인의 MRI 이미지가 1000개가 있고, 암환자의 MRI 이미지가 100개가 있는 경우에 accuracy 지표를 쓰면 어떤 문제가 일어날까요?





1) Accuracy 문제점


위에서 언급한 Accuracy measurement는 imbalanced dataset을 갖고 있는 상황에 따라서 그닥 효율적이지 않은 성능지표가 될 수 있어요. 만약 위의 예시처럼 모든 클래스의 데이터가 10개씩 balance하게 있지 않고 아래와 같이 A클래스에만 집중적으로 데이터가 몰려있다면 어떻게 될까요? A기준에서 봤을때는 아래 성능지표가 좋을 수 있지만, B,C,D 관점에서 보면 해당 모델을 평가하는데 accuracy가 좋은 measurement가 될 수 있을까요?


한 눈에 보더라도 모든 데이터가 A에 쏠려있기 때문에 accuracy가 B,C,D에도 적용이 되기에는 B,C,D에 대한 모집단이 부족한걸 보실 수 있으실 거에요.


아래 예시를 통해 살펴볼게요.

 



먼저 Model1을 오로지 A관점에서 보면 모델이 그닥 좋지 않을 수 있어요. 왜냐하면 100/(200=100+80+10+10) = 50%의 정확성을 보이기 때문이에요. 하지만, B,C,D 관점에서 보면 모두 80% 이상의 정확성을 보이기 때문에 Model1은 B,C,D 관점에서는 좋은 모델이고, A모델 관점에서는 좋지 않은 모델이되요.


Model2의 경우 A관점에서 보면 198/200 = 99%의 정확성을 보여 좋겠지만, B,C,D의 관점에서 보면 모두 10%의 정확성을 보이기 때문에 Model2가 좋은 모델이라 할 수 없어요.


이런 경우 Accuracy를 적용해 Model을 평가하게 되면 어떻게 될까요? 이런 상황에서는 특정 class의 샘플수와 해당 class의 정확성에 많이 의존해서 accuracy가 도출될 수 밖에 없게되요. 위에 있는 예시를 보더라도, Model1,2에 입력된 A클래스가 앞도적으로 많고, A클래스에 대한 accuracy에 따라서 전체 클래스(A,B,C,D)에 대한 accuracy 가 결정이돼요. 


우리가 의학적인 목적으로 머신러닝을 이용한다고 해볼게요. 1000명이 진료를 보러 왔는데 실제 990명이 정상인이고 나머지 10명이 병(변)이 있다고 해보겠습니다. 이 머신러닝 모델은 정상인들에 대해서는 100%의 정확성을 보였고, 실제 병(변)이 있는 분들에 대해서는 50%의 확률을 보였다고 할게요. 전체적으로 볼때 1000명의 환자중 995명을 제대로 판별했으니 99.5%의 정확성을 보인다고 할 수 있겠죠. 그럼, 이 병원을 신뢰하고 가야하는건가요? 실제로 병(변)이 있는 분들께서 이 병원을 찾았다가는 큰 낭패를 보시게 될 거에요. 


위와같이 데이터셋의 class가 imbalance하게 되어있다면 어떤 성능지표를 사용해야 하는걸까요? 이럴때 상용될 수 있는 기법이 F1 score를 계산하는거에요. 그럼 지금부터 F1 score 개념을 이해하기 위해 Precision, Recall 개념을 차례대로 살펴볼게요.





<4. Precision>


Given a class prediction from the classifier, how likely is it to be correct? 


각각의 클래스에 대해서 정확하게 분류됐는지를 알고 싶을 때, Precision이라는 개념을 사용해요. 아래 예시를 기준으로 A 상황에 대한 Precision을 보고자 한다면, 9/(9+1+5+0=15) 가 되겠네요.


일반화해서 보자면, 머신러닝 모델이 특정 클래스를 prediction할 때, 해당 클래스에 대한 prediction(예측) 얼마나 잘 맞을지를 보여주는 지표라고보시면돼요. 즉, 특정 클래스에 대해 prediction 했다는 것만 고려한다는 것에대한 숨어 있는 의미는 Negative 요소를 고려하지 않는다는 점이에요. 




<TP 예시>


<FP 예시>



Model1의 Average precision 결과를 보면 Accuracy와 비교해서 비교적 class A에 덜 의존적인 결과를 볼 수 있다는 것을 알 수 있어요.



Model2도 마찬가지네요.



결과적으로 보면 Accuracy는 imbalance한 dataset 상황에 있을 때, 특정 class의 accuracy에 지나치게 의존적일 수 있지만, Precision은 평균을 취함으로써 그 의존성을 줄여주게 됩니다. 즉, 다시말해 precision은 머신러닝 모델이 A or B or C or D를 prediction할 때, 평균적으로 얼마나 정확하게 prediction하는지 알려주는 성과지표라고 할 수 있겠어요.






<5. Recall>

Given a class, will the classifier detect it?

어떤 클래스가 주어졌을 때, 주어진 클래스를 다른 클래스들 중에서 잘 검출(detect)하는지 알고싶을 때 사용하는 개념이 recall이라는 개념입니다. 예를들어, 실제 A 클래스가 머신러닝 모델에 들어 왔을 때, 9번 정도 A라고 예측(prediction)했다면, "A,B,C,D 클래스"들 중에서 A 클래스를 90% 잘 검출해냈다고 할 수 있어요.



그래서 아래같와 같이 A에 대한 recall은 9/(9+1+0+0) 이 됩니다.



<TP 예시>


<FN 예시>



Recall 또한 각각의 클래스에 대한 recall의 평균을 취하기 때문에 한 class의 accuracy에 지나치게 의존하지 않게 됩니다.




Recall 또한 마찬가지로 imbalance한 dataset 상황에 있을 때, 각 클래스에 대한 평균을 취함으로써 특정 class의 의존성을 줄여주게 됩니다. 즉, 다시말해 recall은 머신러닝 모델이 특정 class에 대해 (특정 class가 test 입력으로 들어올때), 평균적으로 (전체 (A,B,C,D) 클래스들 중에서 정답이 되는 특정 클래스를) 얼마나 잘 detect(검출)하는지 알려주는 성과지표라고 할 수 있겠어요.





<6. F1-score>


앞선 글에서 봤듯이 클래스가 imbalance한 문제에서는 precision과 recall이 유용하게 사용될 수 있어요. 그렇다면 precision과 recall 지표를 동시에 잘 이용한다면 imbalance dataset이 주어진 상황에서 좀 더 좋은 모델을 선택할 수 있지 않을까요?


다시말해, 특정 class의 accuracy에 덜 의존하면서, precision(Given a class prediction from the classifier, how likely is it to be correct? )과 recall(Given a class, will the classifier detect it?)이 내재하고 있는 두 가지 상황(어떤 관점에서 모델을 판단할지)을 모두 고려하면, 좀 더 객관적이고 다양한 상황을 고려할 수 있는 평가지표가 될거에요.


일반적으로 어떤 두 개념을 동시에 고려할 때 도입되는 개념은 평균입니다. 그래서 Precision과 Recall 두 개념(속에 녹아있는 상황들)을 적절하게 고려해주기(나타내주기) 위해 Precision과 Recall의 평균을 취하게 되는거죠. 


<사진1>



평균을 내는 방식에도 종류가 여러가지인데, 일반적으로 산술평균을 내게 되면 precision과 recall 두 개념(상황)을 모두 고려할 때 문제가 발생할 수 있어요. 앞서 Precision과 Recall에서 얻었던 장점이 특정 클래스의 accuracy에 의존적이지 않다는 점이라면, Precision과 Recall을 개념을 혼합할 때도 조심해야하는 부분이 두 값의 평균(precision과 recall을 혼합했을 때)값이 precision 또는 recall 두 개념을 적절하게 고려할 수 있는 값을 의미하는가에요.


precision = (p(A)+p(B)+p(C)+p(D))/4 = p

recall = (r(A)+r(B)+r(C)+r(D))/4) = r

산술 평균값 = (p+r)/2


예를들어, 어떤 A라는 모델에서 precision 값이 0.9이고, recall 값이 0.1이라고 해볼게요. 이 결과 산술평균값은 0.5일거에요. B라는 다른 모델에서는 precision 값이 0.5이고, recall 값도 0.5라고 해볼게요. 이 결과 산술평균값도 0.5에요. 그런데, A라는 모델에서 얻은 0.5라는 값이 precision, recall을 동시에 잘표현해주나요? precision의 의미를 내포한다고 하기에는 너무 결과값(평균값)이 작은것 같고, recall을 표현하기에는 결과값이 너무 큰 것 같지 않나요? 


우리가 알고 싶은건 precision과 recall 이라는 두 개념을 동시에 잘 아울러서 보여줄 수 있는 결과값이 존재하는가에요. 즉, precision과 recall 값들의 차이가 나지 않아야 precision과 recall 모두 성능이 좋은지 아닌지를 이야기 할 수 있게 되는거에요. precision과 recall 두 값이 차이가 많이난다면 두 개념 중에 특정 값(precision or recall)에 의존적이게 됩니다. 


precision, recall 값이 차이가 많이 난다면 당연히 두 개념이 머신러닝 모델 성능에도 문제가 있다고 보는것이 합리적인 판단이에요. 그래서 precision과 recall 이라는 상황을 고려할 때, 두 상황을 "모두" 적절하게 고려했는지를 판단하려면 precision과 recall 값의 차이가 심하게 나면 안됩니다. 


그래서 precision과 recall 간에 차이가 급격하게 나는 것 보다, precision과 recall을 혼합한 결과가 두 값의 차이가 적을 때 높아야 두 상황(precision, recalll)을 적절하게 고려했다고 할 수 있을거에요. 


이러한 철학을 기반으로 도입된 개념이 '조화평균'이라는 개념이에요.



1) 조화평균(harmonic mean)


말을 그대로 풀어 쓰면, 어떤 두 값에 대한 평균을 낼때 두 값이 조화롭다면(두 값의 차이가 많이 나지 않는다면) 높은 값을, 두 값이 조화롭지 않다면 (두 값의 차이가 많이 난다면) 낮은 값을 도출해준다는 철학을 갖고 있어요.



예를들어, 어떤 모델이 precision = a = 0.9 라고 하고, recall = b = 0.1을 기록했다고 하고, 다른 모델이 precision = a = 0.5, recall = b = 0.5라고 했을 때의 조화평균을 구하면 아래와 같아요.


 


첫 번째 케이스는 precision과 recall의 차이가 너무 크기 때문에 결과값이 낮게 나왔어요. 이 경우에는 precision과 recall 값들 간의 차이가 크기때문에 두 값을 동시에 잘 보여줄수 (상징할수) 없기 때문에 그러한 의미로 낮은 값이 도출됩니다. 두 번째 케이스는 precision과 recall을 모두 잘 대변해주고 있네요.


이렇게 precision과 recall에 대한 조화평균의 철학을 도입한 성과지표를 F1 score라고 할 수 있겠어요.




###요약하자면###


위와 같이 precision, recall에 대한 조화평균 값이 낮다고 한다면 두 가지 경우를 생각해 볼 수 있어요.

첫 번째는 precision, recall 값이 서로 차이가 많이 나는 경우입니다. 이러한 경우에는 두 값을 "동시에" 고려할만한 지표로 사용하기에 적절치 않기 때문에 조화평균값이 낮게 나옵니다. 즉, imbalance dataset 상황상에서 사용하기 힘든모델이라는 결론을 내릴 수 있어요.

두 번째는 precision, recall 값이 서로 차이가 많이 나지는 않은 경우입니다. 이러한 경우에는 precision, recall 값 모두가 낮기 때문에 이 역시 imbalance dataset 상황에서 사용하기 힘든모델이라는 결론을 내릴 수 있어요.


Precision만 너무 높아도 안되고, Recall만 너무 높아도 안되고, 이 둘 간의 평균값이 높아야 모델에 대한 전반적인 성능이 좋다고 할 수 있습니다. 그런데, 일반적인 산술평균을 적용하면 Precision or Recall 둘 중에 엄청 높은 값에 해당하는 쪽으로 평균이 치우쳐질 수 있기 때문에 조화평균을 사용하게됩니다.


일반적으로 두 값(precision, recall)이 어느정도 비례해야 좋은건데, 어느 한 값이 너무 낮아버리면 성능에도 당연히 문제가 있다고 보는게 맞기 때문에 산술평균을 쓰는것보다 조화평균을 쓰는 F1 score라는 성과지표를 사용하는것이 더 좋습니다.



[사진 래퍼런스]

사진1

http://blog.naver.com/PostView.nhn?blogId=dalsapcho&logNo=20167498252

'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글

11. Transferlearning (Feat. fine-tuning)  (0) 2020.01.17
10. DensNet  (0) 2020.01.17
9. ResNet  (12) 2020.01.17
8.GoogLeNet (inception v1)  (2) 2020.01.17
7. VGGNet  (5) 2020.01.17

안녕하세요 이번 글에서는 Transfer learning에 대해서 설명해보려고 합니다.

 

먼저 transfer learning이 무엇인지 설명을 드리는것이 맞으나 이번 글에서는 transer learning을 적용할 때 고려해야할 상황에 대해서만 언급하겠습니다. (시간적인 여유가 있으면 transfer learning에 대한 설명을 추후 업데이트 하겠습니다)

 

 

아래 사이트의 설명을 빌리면 transfer learning을 적용할 때는 크게 4가지 상황을 고려하여 fine-tuning 정도를 결정해야 한다고 합니다. 그렇다면 4가지 상황에 따라 어떻게 fine-tuning 정도를 결정하는지 알아보도록 하겠습니다.

 

https://cs231n.github.io/transfer-learning/

 

CS231n Convolutional Neural Networks for Visual Recognition

(These notes are currently in draft form and under development) Table of Contents: Transfer Learning In practice, very few people train an entire Convolutional Network from scratch (with random initialization), because it is relatively rare to have a datas

cs231n.github.io

 

해당 글은 아래 링크를 설명들을 참고했습니다.

https://analysisbugs.tistory.com/103

 

[신경망] 17. Transfer Learning

안녕하세요. 이번 포스팅에서는 Transfer Learning 에 대해서 배워보도록 하겠습니다. ​ 기존의 기계학습 알고리즘에서는 2개의 훈련 데이터셋을 학습할 때, 비록 2개의 데이터셋이 비슷한 특징을

analysisbugs.tistory.com

 

 

 

1. Small dataset and similar to the pre-trained model`s dataset

  • 데이터가 적기 때문에, 전체 네트워크에 대하여 fine-tuning을 하면, over-fitting 문제가 발생합니다.
  • pre-trained model 학습에 사용된 데이터와 transfer learning을 적용시킬 학습 데이터가 유사합니다. 즉, pre-trained model의 conv filter들이 transfer learning에 적용할 데이터들의 특징들을 모두 잘 추출할 수 있다는 뜻이기도 합니다.
  • 위와 같은 이유로 인해, FC layer에 대해서만 Fine-tuning을 진행합니다. 다시말해, Conv layer의 학습을 막기 위해서 gradient 값을 통해 update를 하지 못하게 해야합니다. 
  • 보통 learning rate를 기존에 pre-trained 된 네트워크의 learning rate 1/10의 값으로 사용합니다. 왜냐하면, 높은 값의 learning rate를 사용하면, 기존에 있던 정보들은 새로운 데이터 셋에 맞춰서 급격히 업데이트 되기 때문입니다. 

그림1. 이미지 출처:  https://analysisbugs.tistory.com/103

 

 

 

 

2. Large dataset and similar to the pre-trained model`s dataset

  • 데이터가 충분하기 때문에 fine-tuning을 적용 시 over-fitting의 위험이 없습니다.
  • 하지만, pre-trained model 학습에 사용된 데이터와 transfer learning을 적용시킬 학습 데이터가 유사하기 때문에 초기 layer들을 학습할 필요가 없습니다. 왜냐하면, edge, texture 와 같은 특징들도 대부분 유사할 것이기 때문이죠.
    • 예를 들어, 축구공 종류를 classification 하기 위해 학습된 딥러닝 모델을 핸드볼공 종류를 classification 하는데 사용한다고 생각해보면 금방 이해가 되실 겁니다. 
  • 추가적으로 학습 시간도 줄여주기 위해 아래와 같이 freezing 정도를 설정해주어 학습시켜줍니다.

그림2. 이미지 출처:  https://analysisbugs.tistory.com/103

 

 

 

 

3. Large dataset and different from the pre-trained model`s dataset

  • Pre-trained model 학습에 사용된 데이터와 transfer learning을 적용시킬 학습 데이터가 다르기 때문에 pre-trained model의 conv filter들이 transfer learning에 적용할 데이터들의 특징들을 잘 추출해 줄 수 없습니다.
  • 그렇기 때문에 전체 네트워크를 학습 시켜야 합니다.
  • 데이터도 충분히 있으니 overfitting의 위험도 피할 수 있습니다.

그림3. 이미지 출처:  https://analysisbugs.tistory.com/103

 

 

 

4. Small dataset and different from the pre-trained model`s dataset

  • Pre-trained model 학습에 사용된 데이터와 transfer learning을 적용시킬 학습 데이터가 다르기 때문에 pre-trained model의 conv filter들이 transfer learning에 적용할 데이터들의 특징들을 잘 추출해 줄 수 없습니다.
  • 그래서 전체 네트워크를 학습시켜야 하는데, 데이터셋이 얼마 없기 때문에 네트워크 전체를 학습시키면 overfitting이 일어날 확률이 생깁니다.
  • 위와 같은 문제를 절충하기 위해 아래와 같이 freezing 정도를 설정해주어 fine-tuning을 적용해 줍니다.

 

그림2. 이미지 출처:  https://analysisbugs.tistory.com/103

 

 

 

 

'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글

12. Precision, Recall, F1 score (Feat. TP, FP, FN, TN)  (4) 2020.07.19
10. DensNet  (0) 2020.01.17
9. ResNet  (12) 2020.01.17
8.GoogLeNet (inception v1)  (2) 2020.01.17
7. VGGNet  (5) 2020.01.17

안녕하세요~


이전글에서 나온 ResNet을 끝으로 ILSVRC 대회는 막을 내리게 되었어요. 하지만 여전히 CNN 연구는 지속적으로 진행되어 왔답니다. 


Top-5 error rate은 굉장히 적은 수준이지만 여전히 top-1 error는 높은 수준에 해당해요. 그래서 CNN 연구는 앞으로도 지속될거라고 생각이 들어요.


원래 이번장에서는 ResNet 다음에 주목을 받은 DenseNet에 대해서 글을 쓸 계획이었으나, 현재 업무과 과중된 상태여서 아래영상으로 우선 대체하고 나중에 리뷰할 기회가 있으면 하려고해요.



해당 영상은 전 홍콩과기대 교수님이자 현재 Naver Clova AI의 수장을 맡고계신 김성훈 선생님께서 AlexNet 부터 DenseNet 까지 쉽게 요약하신글이니 참고하시면 좋을 것 같습니다!







  

안녕하세요. 이번시간에는 마지막 ILSVRC 대회인 ILSVRC 2015에서 나온 ResNet이란 모델에 대해서 설명드려볼게요. 지난글에는 Google에서 GoogLeNet이란 모델을 발표했죠? 그런데 대부분 전문가들은 GoogLeNet은 너무 구조가 복잡하기 이해하기 어렵다는게 중론이에요. 그래도 성능이 좋으니 GoogLeNet version2인 inception v2 or v3 모델을 종종 사용했는데요. Microsoft는 2015년에 CNN 구조도 간단하면서 inception v3보다도 성능이 좋은 ResNet을 발표하게됐어요. 그럼 지금부터 ResNet에 대해서 알아보도록 할게요.

 

<사진1>

 

 

 

 

 

<0. Abstract>

 

ResNet은 이전에 소개된 VGGNet, GoogLeNet과 같은 모델들 보다 훨씬 깊고 학습시키기도 더 쉬운 모델이라고 소개하고 있어요. 이러한 장점을 갖게한 핵심 기술은 residual function이에요. 입력 layer를 참조한다는건 입력 layer들을 다시 이용한다는 뜻인데 더 자세한건 뒤에서 설명드릴게요 (지금까지 CNN 모델은 한 번 layer를 거쳐가면 사용된 layer는 다시는 활용되지 않은걸 생각하시면 감이 오실거에요).

 

Microsoft에서는 깔끔하게 자신들이 어떤 이론을 세워서 결과를 냈다기 보다는 경험적으로 residual function 쓰니 결과가 좋게 나왔다고 인정하고 있어요 (incetion v2,v3 논문읽다가 계속 억지스러운 느낌을 받았었는데, 여기선 이렇게 깔끔하게 인정하니 논문읽기가 조금 수월한거 같더라구요. 제가 Google의 엄청난 기술을 이해못할 가능성이 더 크겠죠ㅎㅎ).

 

 

ResNet은 무려 152 layer까지 늘리고 3.57% (Top5)이라는 좋은 error rate을 기록하게 되었어요. 

 

 

 

 

 

 

 

 

 

<1. Introduction>

 

CNN 모델은 feature들이 depth가 깊어짐에 따라서 점점 추상화(abstract-level)되요. 그래서 depth가 깊어지면 사용되는 filter들이 표현하는 정도가 굉장히 다양해질거에요. 왜냐하면 100번째 layer에서도 dxd feature map에 대해서 3x3 conv를 사용하고, 101번째에서 같은 feature map size (dxd)에 대해서 3x3 conv를 사용하더라도, 100번째 layer에서의 feature map과 101번째에서 (100번째에서 3x3 conv가 적용되) feature map의 형태는 다르기 때문에 100번째 3x3 conv filter들과 101번째 3x3 conv filter들은 학습(backpropagation)에 따라 서로 다른 값들을 갖을거에요 (물론 애초에 초기값도 서로 다르게 설정되어 있으니 100번째 3x3 conv와 101번째 3x3 conv가 더더욱 같진 않겠죠!)

 

 

Microsoft 연구진들은 이전에 VGGNet 또는 다른 모델들의 추이를 보니 depth가 깊어질수록 좋은 성능을 낼거라는 가설(확신)을 세우게 되요.

 

 

depth의 중요성을 인식하고는 있었지만, layer를 그만큼 더 쌓을수록 쉽게 네트워크를 학습할 수 있는지에 대한 문제에 부딪혔어요. 그중에서 vanishing, exploding gradients는 가장 심각한 방해요소가 되었죠. 그래서 연구자들은 normalized initialization (ex: weight initialization; Xaiver, He)와 intermediate normalization layers (Batch Normalization) 방식들을 제안했어요. 그러자 10개의 layer정도는 학습이 그럭저럭 잘됐습니다.

 

 

보통 deeper CNN 모델의 성능이 최고수준으로 수렴(converging, saturation)되기 시작할때, deeper CNN 모델은 그 시점 이후로 급속하게 성능이 나빠져요. 보통 overfitting 때문이라고 예상하겠지만 Microsoft는 자신들의 실험에서 다른 요인이 있다고 언급했어요. 그 요인은 적절한 layer depth를 갖고 있는 CNN모델에 더 많은 layer를 추가시켜주면 성능이 더 나빠진다는 것이었어요. 아래 그림결과를 봤을때 test error만 보면 overfitting을 의심해볼 수 있지만, training error도 마찬가지로 deeper CNN이 더 나쁘기 때문에 overfitting이라고 볼 수 없는것이죠.

 

(그림을 보면 20 layer보다 depth가 더 깊은 56 layer의 training error 가 더 심하다는걸 볼 수 있어요)

 

 

위 그림에서 보여주는 degradation 현상은 all systems (deeper(56) or shallow layer(20))이 유사하게 최적화되지 않는다는걸 보여주고 있어요 (deeper가 shallow layer 만큼 최적화되는게 쉽진 않아보여요). 하지만, deeper model 조차도 construction(제한된 상황)에서 최적화될 수 있는 답이 존재하긴해요.  Construction 상황은 총 두 가지인데, 첫 번째는 추가된 layer가 identity mapping이어야하고, 두 번째는 추가되지 않은 layer들은 이미 shallower model에서 학습된 layer를 사용하는거에요. 이러한 construction 상황에서의 deeper model은 deeper 모델이 shallower model보다 결과가 더 좋아야한다는걸 내포하고 있어요. (Identity mapping은 뒤에서 좀 더 설명드리고, 대략적인 맥락을 설명하면 "construction된 상황에서는 그래도 deeper 모델이 shallower 모델보다 좋은 성능을 보일 수 있는데, construction된 상황말고도 microsoft가 deeper 모델이 최적화될 수 있을지를 추가적으로 실험했을 때 construction 된 상황에서의 deeper 모델보다 더 좋은 성능을 얻진 못했다"라고 요약할 수 있을거 같아요)

 

 

위와 같은 degradation 문제를 해결하기 위해서 이 논문에서는 deep residual learning 이라는 방법을 제시했어요. 전체 layer들 중에서 'each few stacked layers (전체 layer들을 몇몇 단위들로 묶은것)'이 직접 the desired underlying mapping (=H(x))을 학습 하게하는것 보단, residual mapping (= F(x) = H(x) - x)을 학습하게 하도록 하는것이 좋아요. (자세한건 아래 그림에서 다시 설명드릴게요) 

 

 

보통 CNN 모델은 아래 왼쪽 사진처럼 feature (=x)들이 입력되면 여러 layer를 거쳐 H(x)가 나오게되요. 그런데, residual learning 방식은 이전 layer에서 사용되었던(residual) feature(x= 2 layer이전의 feature들, F(x) = 바로 직전의 feature들)를 connection하여 H(x)를 다시 정의하게 됩니다 (H(x) = F(x)+x). 그리고 이러한 connection 방식을 논문에서는 short connection (few layers간의 connection)이라고 하고, 보편적으로는 skip connection (1 or 그 이상의 layer를 뛰어넘는 이미지를 생각) 이라고도 부르게 됩니다.  

 

         

       

 

위의 왼쪽그림이 기존 CNN 모델이라고 한다면, 기존 CNN 모델은 H(x)를 학습한다는 것이 feature를 잘 뽑아내는 목적으로 학습을 하게되는 것이지만, 오른쪽과 같은 residual 방식은 identity mapping 개념을 이용하게되는데요. 위의 왼쪽사진처럼 그냥 input feature (=x)를 이용해서 어떤 최적의 H(x)를 찾는것 보다, 오른쪽 사진처럼 identity mapping 개념과 skip connection 개념을 적용해 학습시키는것이 더 효율적이라고 본거에요.

 

위에서 언급한 이야기를 좀 더 자세히 설명드리면 아래 그림으로 표현할 수 있겠어요.

 

      

 

 

사실 H(x)는 x를 입력으로 했을때 target값 y로 mapping시키는 함수에요. 그래서 보통 H(x)-y를 최소화 시키는 방향으로 학습이 진행된답니다. 하지만 여기에서는 H(x)-x 를 0으로 만들어 주는 방향으로 학습이 되요. 왜냐하면 H(x) 자체가 identity function이라고 가정하고 위와 같은 수식들을 만들어 냈으니까요. 출력값 H(x)와 입력값 x 간의 잔차(residual)를 학습한다고 해서 residual learning이라는 이름이 붙게되는거에요.  

 

 

이렇게 수식을 만들어 놓으면 backprogation을 통해 학습을 할때 vanishing gradient문제를 피할 수 있게 도와 준답니다. 예를들어 기존 DNN 구조에서는 아래와 같이 곱으로 진행이 되기 때문에 입력 layer에 가까이 있을 수록 vanishing gradient를 유발하게 됩니다. 하지만 cost function과 가까운 layer는 chian rule이 적용되지 않기 때문에 vanishing gradient가 일어날 가능성이 희박하죠.

 

 

Resnet과 같이 가중치 업데이트식을 구성하게 되면 아래와 같이 vanishing gradient를 피할 수 있게 됩니다.

 

 

(음 introduction 설명하다 논문전체를 다 설명해버린거 같네요 ㅎㅎ;;;)

 

 

Microsoft는 그냥 일반적인 CNN 모델을 깊게 설정한 plain 모델과, plain 모델에 residual learning을 적용히킨 resnet 모델을 비교분석했어요. ImageNet, CIFAR-10 데이터셋에서 모두 resnet이 더 우수하게 나왔기 때문에 더욱 깊은 망을 구성하면서도 이전 모델들(VGGNet, GoogLeNet)보다 더 좋은 성능을 내게했어요. 그리고 여러 resnet 모델을 ensemble한 결과 3.57%라는 우수한 error rate을 기록하게 되었어요.

 

 

 

 

 

 

 

 

<3. Deep Residual Learning>

 

"3.1 Residual Learning ~ 3.2 Identity mapping by shortcut" 부분은 앞에서 다룬 내용들의 중복이니 따로 다루지 않겠습니다.

 

<3.3 Residual Learning>

 

이 논문은 두 가지의 모델 (Plain model&ResNet model)을 서로 비교대조하여 실험을 진행했어요.

 

 

먼저, Plain 모델을 요약하면 아래와 같아요

- Plain 모델은 VGG의 철학을 기반으로하여 모든 conv filter는 3x3으로 동일하게 적용한다.

- output feature map size가 같은 layer들에서 사용하는 conv ilter 수는 모두 동일하다.

- output feature map size가 줄어들때는 filter수를 2배로 늘려준다 (time complexity를 동일하게 유지하기 위해).

- output feature map size를 줄일때(downsampling)는 pooling이 아닌 conv filter에 stride를 2로만 두고 사용한다.

- VGG와는 다르게 마지막 GAP(Global Average Pooling)을 통해 softmax를 위한 1000개 뉴런을 갖는 하나의 FC layer만 갖는다 --> VGGNet은 FC layer (4096) 가 2개 더 추가되어 있기 때문에 연산량은 오히려 Plain 모델(32 layer)보다 더 많다)

 

 

 

Residual Network는 Plain 모델에 short connection을 적용시킨 버전이에요. Conv filter 수가 증가할 때 어떻게 short connection을 적용시켜주는지만 유의해서 보시면 되는데요. Short connection을 할때 H(x)=F(x)+x 식에서 F(x)와 x는 dimension이 같아야해요. 그런데, conv filter 수가 증가하게되면 F(x)의 차원이 더 높아지기 때문에 x의 차원을 증가시켜주어야해요. 차원을 증가시킬때는 단순히 zero padding을 해주거나, 1x1 conv filter로 증가시켜주는 방식이 있어요.

 

 

 

 

 

 

 

<3.4 Implementation>

 

여기에서는 ResNet이 training 어떻게 진행했는지 설명해 볼거에요 (data augmentation, hyperparameter, validation).

 

 

- Training input data: 입력 이미지 [256~480] 범위 내에서 랜덤하게 resizing = scale augmentation 

- resized input image에서 random하게 224x224 crop, 경우에 따라 crop한 이미지를 flip한다

- 실제 input image size는 224x224가 된다

- Conv fiter 연산 후, activation function 적용전 Batch Normalization을 적용한다

- Weight initialization: He

- Mini batch size: 256

- Learning rate: 0.1 -> error가 정체될때 10^-1을 곱해준다

- Weight decay (Regularization): 0.0001

- Optimizer: Momentum=0.9

- Validationi: AlexNet의 10-crops validation 방식을 택하고, validation시에는 [256~480]에서 random하게 resizing하는것이 아니라 multiple scale(224, 256, 384, 480,640)을 적용하여 평균 score를 내게된다.

- Training image dataset: 1.28 million, Validation image dataset: 50k, Test image dataset: 100K

 

 

 

 

 

 

 

<4. Experiments>

<4.1 ImageNet classification>

 

앞서 언급했던것처럼 이 논문에서는 두 가지 모델 (Plain, ResNet) 에 대해서 실험을 진행했어요. 

 

Plain 모델은 18, 34 layer를 각각 구성해서 실험을 진행했는데 결과적으로 34 layer에서 높은 training error가 나와 degradation problem을 목격하게 

 

<Plain 모델 결과>

 

 

저자들은 이러한 문제가 발생하는 이유가 vanishing gradients에서 오는건 아니라고 주장했어요. 그 이유는 Batch Normalization을 적용시키고 자신들이 직접 관찰했을 때 vanishing gradient가 발생하진 않는다고 했어요. 그래서 잠정적으로 결론 내런것이 deep plain model (34 layer) 같은 경우는 exponentially low convergence rate을 갖고 있을거라고 설명하고 있는데 이 부분은 자신들도 정확하게 모르기 때문에 나중에 연구를 할거라고 언급했네요.

 

 

   

<사진2. Exponentially converging 예시>

 

   

         <사진3. Averaged SGD의 converge rate이 더 exponential함>

 

 

(50 layer에서부터 사용되는 1x1 conv 개념은 뒤에서 'building block' 설명드리면서 다시 언급할게요~)

 

 

두 번째 실험모델은 ResNet이에요. ResNet 또한 28, 34 layer를 비교분석했는데요. 앞서 dimension이 증가할때 short connection을 하는 방법에 두 가지 옵션을 설명드렸는데, 그 중에서 zero padding해주는 방식을 추천했네요.

 

 

ResNet 실험에서 3가지 중요한 사실을 알게됐는데, 그 중 첫 번째가 ResNet에서는 degradation problem을 피할 수 있게 되었다는 점이에요. 그렇기 때문에 더 깊은 34 layer의 성능이 더 좋게 나왔다고 해요.

 

 

 

두 번째로 발견한 사실은 plain 모델과 비교해봄으로써 residual learning을 적용하면 더 깊게 망을 쌓고, 더 좋은 성능을 낼 수 있다는 점이에요. 

 

 

마지막으로 발견한 사실은 plain 모델과 resnet 모델을 비교했을 때, resnet 모델이 좀 더 빨리 최고 성능에 도달(convergence) 하게 된다는 사실이에요.

 

 

 

 

 

 

 

<Identity VS Projection Shortcuts>

 

앞서 언급한 identity shortcuts (short connection = skip connection) 으로 인해 성능이 좋아진것을 볼 수 있었어요. 앞선 identity shortcuts에서 dimension이 증가할 때 zero padding을 이용했는데요. 이번에는 zero padding 이외의 다른 옵션들을 시도해 볼 예정이에요.

 

먼저 A옵션은 이전 방식그대로 zero-padding shortcuts을 적용시켜주는거에요. 단순히 padding만 붙여주기 때문에 따로 weight(parameter) 필요없습니다. 그래서 ResNet이나 Plain 모델이나 parameter 차이는 없게 되는 것이죠.

 

B 옵션은 dimension이 증가할 때 project shortcuts을 적용시켜주는거에요. 이때는 차원을 늘려줘야 하기때문에 늘려주고 싶은 차원 수 만큼 1x1 conv filter 를 사용하게 되요. 그래서 plain 모델과 비교했을때 parameter는 약간 증가하게되요. 

 

C 옵션은 모든 shortcut (connection)이 진행되는 단계에서 projection을 적용시켜주는거에요. 이렇게 되면 파라미터수가 많이 증가하게 되겠죠? 

 

 

결과로만 봤을 때, A<B<C 성능을 보였지만 사실 성능차이가 미비해서 어떤 옵션을 고르는지에 대해서는 성능관점에서 크게 중요하지 않다고 해요. 하지만, parameter 수 차원에서 C옵션은 피했다고 합니다.

 

 

 

 

 

<Deeper Bottleneck Architecture>

 

Training 하는데 걸리는 시간을 고려해서 기존의 building block을 bottleneck design으로 변경했어요.

 

 

좀 더 자세히 말하자면 아래와 같은 그림으로 표현할 수 있을것 같습니다.

 

 

 

한 가지 궁금한 부분은 어떻게 7x7 conv filter 64개와 3x3 stride =2을 통해 얻은 56x56x64 output feature map이 bottleneck 구조에서 갑자기 56x56x256이 되었는지 모르겠네요. 

 

제 생각엔 위의 질문은 아래 문단을보고 조금 예측할 수 있지 않나싶어요. Identity shortcut with zero padding 옵션과 같이 56x56x64 output feature map에서 64를 256으로 만들어 줄때 zero padding을 이용한게 아닌가 싶습니다. 그럼 연산량도 증가하진 않을테니까요. 만약 projection을 하게된다면 상당히 많은 연산들이 필요해지겠네요 ㅎ

 

 

아래 최종 결과 테이블 보시면 ResNet 152가 제일 좋은걸 알 수 있고, ensemble 기법을 적용하면 3.57이라는 놀라운 top-5 err 를 기록하게 됩니다.

 

 

 

 

 

 

 

 

 

 

<5. 그외 여러 실험들>

 

Microsoft는 "Deep Residual Learning for Image Recognition"라는 논문을 통해 처음 ResNet을 발표하고, "Identity Mappings in Deep Residual Network"라는 논문을 통해 처음 발표한 ResNet의 성능을 뒷받침하는 이론들을 강화하면서, 추가적으로 다양한 실험들을 진행했어요.

 

첫 번째로는 short connection을 굉장히 다양하게 구성하면서 실험을 진행했어요. 작성중...........

 

 

 

 

두 번째로는 Activation function을 어느 위치에다 두는지에 따라서 여러 모델을 구성해보고 실험을 진행했어요.

 

 

작성중...........

 

B: addition 결과를 BN으로 설정하고 ReLU를 적용하면 ReLU가 적용되는 부분이 제한되기 때문에 representation 능력이 떨어질 수 있음 (ex: sigmoid activation 을 쓰면 linearity 모델이 나올가능성 농후, DNN chapter Batch Noramlization 참고)

C: ReLU를 addition 직전에 두기 때문에 항상 non-negative 값이 나오며 이로인해 모델의 representation 능력이 떨어짐

D:

 

 

 

(↓↓↓Pytorch로 구현한 Code 설명 글↓↓↓)

https://89douner.tistory.com/288

 

3. CNN 구현

안녕하세요. 이번 글에서는 pytorch를 이용해서 대표적인 CNN 모델인 ResNet을 implementation 하는데 필요한 코드를 line by line으로 설명해보려고 합니다. ResNet을 구현할 줄 아시면 전통적인 CNN 모델들

89douner.tistory.com

 

 

 

 

 

[논문 래퍼런스]

"Deep Residual Learning for Image Recognition"/ Kamming. H. et al/ 2015/ https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf

"Identity Mappings in Deep Residual Network"/ Kamming. H. et al/ 2016/ https://arxiv.org/pdf/1603.05027.pdf

 

[글 래퍼런스]

https://sike6054.github.io/blog/paper/first-post/

 

[사진 래퍼런스]

사진1

https://medium.com/analytics-vidhya/cnns-architectures-lenet-alexnet-vgg-googlenet-resnet-and-more-666091488df5

사진2

https://slideplayer.com/slide/15080479/

사진3

http://proceedings.mlr.press/v89/nitanda19a/nitanda19a.pdf

 

'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글

11. Transferlearning (Feat. fine-tuning)  (0) 2020.01.17
10. DensNet  (0) 2020.01.17
8.GoogLeNet (inception v1)  (2) 2020.01.17
7. VGGNet  (5) 2020.01.17
6. AlexNet  (4) 2020.01.17

안녕하세요~


이번에는 지난시간에 이어 ILSVRC 2014 대회에서 VGGNet을 뛰어넘은 GoogLeNet에 대해서 설명해드리도록 할거에요


저자의 대부분이 Google 팀원들이었기 때문에 해당 논문에서 제시한 CNN 모델 이름을 GoogLeNet이라 명명했어요. (그래서 이 블로그에서는 이 논문을 쓴 저자를 그냥 통칭해서 Google이라고 간주하고 글을 작성했어요)







<0. Abstract>


이번 abstract에서는 특이하게 밑에서부터 읽어 올라가 볼게요. 저자는 ILSVRC 2014에 진출한 CNN 모델을 GoogLeNet이라고 이름지었어요. GoogLeNet은 22 depth layers를 갖고 있고 hebbian과 multi-scale processing을 적용했다고 하네요 (뒤에서 자세히 언급하겠죠?ㅎㅎ). 그리고 보통 CNN 모델이 깊이를 늘리면서 연산량도 늘어나게 되는데, GoogLeNet에서는 길이(CNN depth)를 늘리면서도 연산량은 유지하고 있다고 언급하고 있네요 (=improved utilization of the computing resources). 그리고, 이러한 GoogLeNet 구조의 codename을 inception이라고 부르고 있어요 ㅎㅎㅎ. 아마 inception이라는 개념이 GoogLeNet에서 중요한 역할을 할거 같다는 생각이 드네요.










<1. Introduction>


(여기서도 중간중간 object detection관련 개념들이 나오는데 설명은 하지 않도록 할게요. 나중에 Object detection 챕터를 개설하면 그곳에서 좀 더 자세히 언급하도록 하겠습니다)


역시 software corporation 답게 google이 주목하고 있는 부분은 hardware보다는 software(new ideas, algorithms and improved network architectures)영역이었어요. 그 중에서 alexnet보다 12배나 적은 가중치로도 더 좋은 성능을 내었다는것을 첫 문단에서 이야기하고 있어요. (어떻게 줄이게 되었는지는 뒤에서 나오겠죠? 앞에서 언급한 inception(codename) 개념과 관련있으려나요?ㅎㅎ)



<사진1>



역시 google답게 CNN모델이 academic한 관점(academic curiosity)뿐만이 아니라 이것이 우리 현실(real world)에서도 사용되야 한다고 생각했어요. 그래서 CNN을 구성할때 엄격하게 고정된 architecture 구조를 사용하는것보다 CNN 모델이 mobile or embedded computing 등 다양한 곳에서 자유롭게 사용될 수 잇는 유연한 구조를 갖고 있어야 된다고 주장하고 있어요.



Inception이라는 이름을 붙인 이유는 "Network in network (NIN)" 논문에서 유래가 되었는데요. 좀 더 정확하게는 inception이라는 용어가  "we need to go deeper"라는 의미를 지니고 있는 internet 용어라고해요. Inception 모듈을 통해 AlexNet보다 더 깊은 CNN network를 구성할 수 있었기 때문에 inception이라는 이름을 붙인듯해요. 하지만 theoretical work 측면에서는 Arora 논문을 통해 inception module이 고안되었다고 하는게 맞다고 할 수 있겠어요.






<2. Related Work>


Related Work chapter는 저자가 논문을 쓸때 차용한 개념들이 어떤 논문에서 비롯된건지 간략하게 설명하는 성격의 chapter에요. Google은 이전 CNN 모델들에 대한 언급을 하고 있는데요. 이 중에서 단락하나를 이용해서 설명하고 있는 논문이 Network in network(NIN)라는 논문이에요. 


NIN의 motivation을 한 문장으로 요약하자면 "conv filter를 이용하여 feature를 추출할 때, non-linear feature를 더 잘 추출하기 위해서 conv filter를 추출하는 중간에 MLP를 더해주어 CNN 모델이 non-linear representation (non-linear한 성격을 잘 표현)해준다"라고 할 수 있어요.




NIN에서 독창적으로 사용했던 연산이 Cascaded Cross Channel (Parametric) Pooling (CCCP)라는 기법이에요. 


먼저 Cross Channel Pooling에 대해서 설명드릴게요. 아래 '사진2'를 보시면 8개의 channel수가 나와 있어요. 그런데 이것이 cross channel pooling을 거치면 2개의 channel수로 줄어들어요. 보통 우리가 아는 pooling은 하나의 feature map에 대해서 수행되는 것이지만 아래 '사진2'의 연산은 몇 개의 channel을 직렬(cascade) 묶음(=가로질러서; cross)으로 해서 해당위치(빨간색,노란색 등)간에 pooling을 하기 때문에 cross channel pooling이라고 불려요. 이러한 cross channel pooling연산의 특징은 feature map size는 그대로고 channel 수만 줄어들게 해주어요. 그래서 이러한 연산을 적용하면 'channel reduction'효과가 일어난다고 이야기해요.


             


                             <사진2>                              <사진3. cross channel pooling(max pooling)>


그런데 자세히보면 Cross channel pooling과 1x1 conv filter가 연산하는 방식과 효과(channel reduction)가 닮았다는 것을 알 수 있을거에요. 그래서 NIN 논문 저자는 다음과 같은 표현 "The cross channel parametric pooling layer is also equivalent to a convolution layer with 1x1 convolution kernel. "을 했는데요. Google은 이러한 1x1 conv filter를 inception module에 적용하려고 했습니다.


               


                                                                                    <사진4>          


그런데 cascaded cross channel pooling 방식이 아래 그림에서 어떻게 적용된다는건지 잘 모르겠네요;; 그림과 수식을 번갈아 보고는 있지만 뭔가 조금 직관적으로 이해가 안되는거 같습니다;; (이 부분은 나중에 공부를 더하고 다시 정리해서 올리도록 할게요~) 



중요한건 논문에서 아래와같이 설명한 것처럼 1x1 conv filter를 이용해 channel(dimension) reduction을 얻을 수 있었고, 이 효과를 통해 CNN depth와 width(CNN size)를 늘릴 수 있게 되었다는 점이에요.










<3. Motivation and High level considerations>


이제부터 GoogLeNet이 탄생하게된 이유에 대해서 자세히 설명해드리도록 할게요. Google은 CNN 모델의 depth와 size(width; the number of parameter)를 증가시키는 것이 중요하다고 봤어요. 하지만 depth와 size를 증가시키면 두 가지 문제가 생기게 되는데요.



첫 번째는 size(the number of parameters)가 증가하게 되면 overfitting이 증가된다는 점이에요. 만약 training data개수가 제한적(적다는 의미로 이해하시면 될거 같아요)이고, training data가 high quality(high resolution)이면 연산시 tricky하고 expensive할 수 있어서 overfitting을 일으킬 소지가 커지게 된다는 뜻이에요 (물론 input data가 preprocessing을 통해 size가 rescaling되거나 crop되겠지만 기본적으로 higher resolution and fewer training dataset 이면 overfitting을 일으킬 소지가 커지겠죠?



아래용어에서 언급하고 있는 quadratic increase는 quadratic growth(참고링크)를 의미하는것 같아요. 예를들어, conv layer가 2개 연결(3X3 conv filter C1개 -> 3X3XC1 conv filter C2개) 되어있다라고 하면 연산은 "3x3xC1->3x3xC1XC2"가 될거에요. 이때 C1, C2 (filter 개수에) 따라 최종결과(3X3XC1XC2)에 대한 함수식을 f(C)=3X3XC^2 라고 할 수 있어요 (C1, C2은 개념적으로 filter 개수라는 동일한 개념으로 quadratic increase(growth) 관점에서는 C1,C2를 따로 분리하고 생각하지 않는거죠). 어쨌든 이렇게 quadratic 증가하게 되는 weights가 대부분 zero값을 갖는다면 computation이 낭비된다고 볼 수 있을거에요. 



그래서 이러한 낭비를 줄이기 위해서 sparse connection이란 아이디어를 언급하는데요. Arora 논문에서 제기된 주장 다음과 같아요. "Fully connection을 갖는 Deep Neural Network 구조에서 노드나 layer가 증가하게되면 이 문제는 optimization 측면(DNN을 커다란 함수로 보는 측면)에서 NP hard문제로 귀결되지만, CNN 같은 구조를 갖고 있을 때는 sparse connection을 통해 충분히 polynomial 문제로 귀결시킬 수 있다는 주장이에요.  



예를들어, 본래 Fully connted 된 Neural Network 구조에서 입력 layer (아래 사진의 빨간색 테두리 부분)에서 output layer로 나가는 layer간의 관계를 통계적(statistics)으로 분석한 후, 연관관계(correlation)가 강한 것들끼리만 연결시켜주어 sparse connection 구조의 Neural Network를 만드는 방식이에요. 그리고 이러한 개념은 생물학적 원리인 Hebbian principle에서 아이디어를 얻었다고 합니다.


<사진5>


그런데 이러한 sparse connection을 적용시키는데 현실적으로 문제가 되는경우가 많았어요. 사실 Dense connection 같은경우는 행렬연산(dense matrix multiplication)으로 생각하여 GPU(computing infrastructure; cuDNN or numpy)로 병렬처리할 수 있는데요. 반면에 Sparse connection은 dense connection 연산에 비해 까다롭기 때문에 이와 관련된 연산식 연구가 발전되지 않았어요. 



사실 CNN같은 경우에도 LeNet에서는 아래 테이블처럼 conv filter를 sparse하게 사용했는데요. 아래 테이블로 예를들면, 6개의 모든 필터를 16 feature map에 적용하는게 아니고 sparse하게 적용하도록 만들었어요.


<사진6>

 

하지만 AlexNet으로 넘어가면서 mini batch, uniform한 성격의 conv filter 등 dense calculation 하기 편한방식으로 CNN 모델이 발전하게 되었어요.


Google은 미래에 위와 같은 sparse connection을 다음과 같은 방식으로 적용될 수 있다고 했어요. Arora의 주장(the theory)을 통해 filter 단계에서 sparsity를 사용하는 구조를 이용하되 현재 dense matrices를 연산하기 최적화 되어 있는 hardware를 이용하고, sparse matrices들 상대적으로 sub-dense matrices로 만들어주어 기존 dense matrices 연산을 적용할거라고 하네요 (제 생각에는 입,출력 노드들 끼리의 correlation을 분석해 sparse구조를 clustering하여 dense하게 만들어주는거 같아요). Google은 이러한 연구모델을 non-uniform deep-learning architectures라고 언급하고 있네요 (아마 기존 deep learning 모델들은 node, filter 들이 전부 일정하게(uniform or dense or fully connected)연산되는데 반해서 sparse connection 개념은 상대적으로 규칙성없이 non-uniform 하게 연산되기 때문에 'non-uniform deep-learning architectures'라고 부른거 같아요. 



Google은 Inception 구조를 통해 sparse (connection) structure를 어느정도 유사하게 구현해냈다고 하는데요. 그외에도 learning rate, hyperparameters, CNN 학습 방법과 같은 것들에 대해 신경을 쓰면서 GoogLeNet(or Inception) 모델이 특히 object detection 영역에서 좀 더 좋은 효과를 불러일으켰다고 주장하고 있어요 (object detection 영역에 얼마나 파장을 일으켰는지는 object detection 영역에서 살펴볼게요 ㅎㅎ. 논문에서는 이렇게 설명했어도 실제 object detection분야에서는 어떻게 생각했는지 모르는거니까요 ㅎ)



결국 Motivation 부분을 요약하자면 다음과 같아요.


"수학적(or algorithm)으로 sparse 구조가 더 좋은건 알겠는데 hardware 적으로는  dense 구조가 더 efficient 하기 때문에 이론(sparse connection)과 현실(hardware)을 잘 조합하면 좋은 모델이 나오지 않겠느냐"







<4. Architectural Details>


결국 local sparse structure를 어떻게 구성해 줄것인지를 고민하다가 inception module을 만들어내게 되었는데요. Conv filter라는 구조 자체가 input image의 일정부분(ex; 3x3)에 이전 units (conv filter's weights)들이 반응(operation; correspond)하는거라고 볼 수 있는데요.  



lower layer들은 굉장히 적은 범위 지역에 correlated units 들이 집중되어있다고 설명했어요. 이것이 무엇을 의미하냐면, conv filter와 input image의 일정부분(conv filter size와 대응(correlated)되는부분(local regions))의 conv filter를 적용(conv operation; correlated)한 값이 높다(concentrate)라는 뜻이에요. 



Input image와 같이 큰 feature map에서는 5x5와 같은 큰 filter size를 갖는것 보단 3x3과 같은 클 filter size가 더 correlated units이 local region에 concentrate하게 분포하고 있어요 (저는 이 개념을 한 filter에 낭비(=0값)되는 부분이 없는 것이라고 이해했어요). 하지만 몇몇 위치에서는 좀 더 넓은 영역의 conv filter (larger patches)가 더 correlated units 비율이 높을 수 있어요. 하지만 이런 경우는 상대적으로 드물긴 (a smaller of more spatially spread out clusters) 하겠죠?).


                  


위와 같은 상황들을 범용적으로 잘 대처하기 위해서 inception 모듈에 1x1, 3x3, 5x5 filter를 병렬적으로 사용하기로 결정했어요. (alternative parallel pooing 부분은 뒤에서 설명드릴게요)



         


<사진7>                                                               <사진8>    




이렇게 병렬적으로 사용하는 개념을 sparse connection을 했다라고 이해하기가 힘들어서 나름대로 아래와 같이 정리해봤어요.


"아래와 같은 inception 모듈로 구성되어 있을 때, input image의 A라는 구역은 1x1 conv와 5x5 conv filter를 적용시켰을 때, correlated units이 굉장히 많을 수 있어 결과적으로 두 filters가 output(filter concatenation)에 sparse하게 correlated(clustering)되어 있을 수 있다고 보는것이다. 하지만 conv filter의 모든 연산은 dense하게 처리한다."


  



1x1, 3x3, 5x5 conv filter들의 개수는 망이 깊어짐에 따라서 달라진다고 하네요.



처음에는 inception module이 아래와 같이 형성되었습니다. 3x3 max pooling은 좀 더 다양한 resolution을 학습하기 위해서 추가시켜준것이라고 하더군요 (논문에서 언급하길 이 부분은 higher resolution에 갈 수록 더 효과가 크기 때문에 GoogLeNet 구조의 앞단 부분은 일반적으로 사용되던 CNN 모델구조를 사용했다고 언급했어요. 자세한건 GoogLeNet 그림을 보시면 이해가 쉬울거에요). 그런데 아래와 같은 구조에서는 문제가 있어요. 일단 그냥 일반적으로 사용했던 3x3 conv filter만 사용한 것보다 5x5 conv filter가 사용되기 때문에 연산량이 많아진다는 점이에요. 특히 입력 feautre map의 크기가 크거나 5x5 conv filter 개수가 많아지면 연산량은 더욱 증가하게 될거에요. 




위와 같은 연산량의 문제를 해결하기 위해서 1x1 conv filter를 통해 channel수를 조절하게 되요. 1x1 conv filter를 통해 channel reduction의 효과를 볼 수 있고, 추가적으로 conv 연산후에 추가되는 ReLU activation function을 통해 non-linearity 성격을 더 추가해줄 수 있게 되었어요.



실제, 위의 inception module이 아래와 같이 연산된다고 보시면 되요.


<테이블1>


결국 이런 inception module을 통해 Google은 좀더 깊고(deeper) 큰(wider) CNN 모델이 GoogLeNet을 발표할 수 있게 되었어요. 


 









<5. GoogLeNet>


GoogLeNet이라는 이름은 LeNet에서 기인했다고해요. 그리고 GoogLeNet을 inception 구조의 성체라고 표현하네요.



GoogLeNet의 구조는 아래와 같이 구성되어 있어요. 대부분 Inception module로 구성되어 있지만 좀 더 디테일하게 만들기 위해서 4개의 파트로 나누어 설명드리려고 해요


<사진9>


Part1

GoogLeNet 이전 모델이 AlexNet이어서 그런지 몰라도 AlexNet의 처음 부분을 그대로 사용했어요. 물론 1x1 conv를 해서 channel reduction을 꾀하긴 했지만 기본적인 구조는 AlexNet을 연상시켜요. 논문에서 Google은 아래와 같은 언급을 하면서 inception module을 처음부터 사용하지 않은 이유를 설명했어요. 아마 이론적인 이유를 밝히긴 힘들었던것 같고 경험적으로 아래와 같은 결론을 내린게 아닌가 싶어요. 


" it seemed beneficial to start using Inception modules only at higher layers while keeping the lower layers in traditional convolutional fashion." 


추가적으로 'Conv 7X7+2(S)'라는 표기에서 S는 stride라는 의미로 conv 7X7의 stride가 2라는 뜻이에요. 그런데 표현을 왜 덧셈 연산으로 했는지 모르겠네요. V라는 표현식의 의미도 잘 모르겠네요;; 


       


Part2

이부분은 inception module이 그대로 적용된 부분이에요. 연산이 어떻게 진행되는지는 위의 table1 부분을 참고하시면 될거에요. Padding이나 3x3, 5x5 conv filter를 적용할 때에는 모두 output feature map size가 동일하도록 padding을 알맞게 적용해준답니다.



   


Part3

모델 중간중간에 보면 softmax와 관련된 layer가 추가가 되는데요. 이 부분은 auxiliary classifier (layer)라고 해요. GoogLeNet에서도 ReLU를 쓴다고는 하지만 워낙 layer가 깊다보니 vanishing gradient문제를 고려해야만 했어요. 그래서 중간중간에 classifier를 추가해주어 추가적인 Backpropagation을 통해 가중치가 수월하게 업데이트 될 수 있도록 보조할 수 있는 layer를 추가시켜주었다고 합니다. 이러한 아이디어는 “Deeply supervised nets (by C.Y.Lee, S. Xie )”“Training Deeper Convolutional Networks with Deep SuperVision (by Liwei Wang, Chen-Yu Lee)) 와 같은 논문 아이디어에서 기인했다고 해요.



Part4

마지막으로는 GoogLeNet의 최종 classifier 부분이에요. 아래 그림에서 Average Pool이라는 용어는 실제로 Globa Average Pooling (GAP)을 의미해요. 사실 GAP를 둔건 classification의 성능을 높여주기 위함은 아니었고, 보통 CNN 구조가 FC layer로 연결될때 1x1 (뉴런) n개의 구조로 이루어져야 하기 때문에 GAP를 추가해주었다고해요 (더 자세한건 바로 아래에 설명이 되어있어요). 이렇게 GAP를 추가하여 classifier 부분을 기존 CNN 구조와 비슷하게 만들어주면 나중에 fine tuning해서 쓰기도 더 수월해지겠죠?



       


아래 테이블과 위의 그림을 자세히 보면 연산이 어떤방식으로 진행되는지 알 수 있을거에요. GAP를 통해 1024개의 7x7 feature map을 1x1 feautre map 1024개로 만들고 이를 1024개의 노드(뉴런)를 갖고 있는 FC layer로 연결시켜요. 그리고나서 softmax로 연결시켜 최종적으로 classifiation을 하게 된답니다.


<테이블2>







<6. Training Methodology>


먼저, GoogLeNet에서 사용된 하이퍼파라미터는 아래와 같이 요약할 수 있어요.


Optimizer: momentum(=0.9)

Learning rate: 4% decrease every 8 epochs



GoogLeNet은 영상의 <가로:세로> ratio<3:4>, <4:3> 의 범위를 유지하면서 원 영상의 8%~100% 까지 포함할 수 있도록 다양한 크기의 patch를 학습에 사용하였어요. 또한 photometric distortion 을 통해 학습 데이터를 늘렸습니다. 그외 다양한 방법들이 학습방법에 사용되었다고는 하지만 이러한 방법들이 실제로 도움이 되었는지는 몰랐다고하네요. 









<7. ILSVRC 2014 Classification Challenge Setup and Results>


GoogLeNet은 dataset을 아래와 같이 구성했어요.



그리고 GoogLeNet을 조금씩 다르게 구성하여 7가지 version으로 validation을 진행했다고 합니다. 



Validation 방식은 multi-crop 방식을 택했는데요. GoogLeNet의 경우에는 test 영상을 256x256 1개의 scale만 사용하는 것이 아니라, 256, 288, 320, 352 로 총 4개의 scale로 만들고(scale을 변형시키는 방법 AlexNet과 동일해요) 각각의 scale로부터 3장의 정사각형 이미지를 선택하고다시 선택된 이미지로부터 4개의 코너 및 센터 2개를 취해 총 6장의 224x224 크기의 영상을 취하고각각을 좌우반전 시키면 4x3x6x2 총 144개의 test 영상을 만들어 냅니다





그리고 144개를 모두 validation 했을 때, 각각의 validation 결과값 (softmax를 거친 확률값)을 모두 더한것을 평균을 내어 최종 결과값(확률값)을 얻게 되요. (본인들이 다른 방법으로 validation을 시도해보긴 했는데 잘 안됐었나봐요)



아래 결과표를 보시면 multi-crop을 통해 validation을 수행했을 때가 더 좋은 성능을 보였어요. 그리고 이전에 7개의 모델을 사용했다고 했는데, 7개의 모델에 대해서 앙상블 기법을 적용시켰을때 더 좋은 성능을 보여줬네요.




그리고 ILSVRC 대회에서 얻은 최종결과를 보여주고 있습니다.


<사진10>






이렇게 inception Version1이라고 할 수 있는 GoogLeNet에 대한 설명을 마무리하게 되었어요. Inception Version2,3를 다룬 논문에 대한 글도 쓰긴했는데요. 아직까진 제 수준에서 쉽게 이해시켜드릴 수 있도록 설명하지 못하는것 같아 비공개로 설정했어요. 나중에 혹시 요약글을 쓰게되면 짧게 다루도록 해볼게요. 그럼 다음글은 resnet에 대해 설명해드리도록 하겠습니다~!







[논문 래퍼런스]

"Going deeper with convolutions"/ Szegedy. C et al/ 2014/ https://arxiv.org/abs/1409.4842


[글 래퍼런스]

https://www.youtube.com/watch?v=V0dLhyg5_Dw


[사진 래퍼런스]

사진1

https://m.blog.naver.com/PostView.nhn?blogId=laonple&logNo=220686328027&proxyReferer=https%3A%2F%2Fwww.google.com%2F

사진2

https://www.mdpi.com/2072-4292/12/2/219/htm

사진3

https://light-tree.tistory.com/147

사진4

https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215

사진5

https://www.youtube.com/watch?v=V0dLhyg5_Dw

사진6

https://world4jason.gitbooks.io/research-log/content/deepLearning/CNN/Model%20&%20ImgNet/lenet.html

사진7

https://www.slideshare.net/JaewookKang1/180624-mobile-visionnetbaeksuconjwkangpub

사진8

https://www.youtube.com/watch?v=cwBdAQXpDZM

사진9

https://kangbk0120.github.io/articles/2018-01/inception-googlenet-review

사진10

https://medium.com/coinmonks/paper-review-of-googlenet-inception-v1-winner-of-ilsvlc-2014-image-classification-c2b3565a64e7

'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글

10. DensNet  (0) 2020.01.17
9. ResNet  (12) 2020.01.17
7. VGGNet  (5) 2020.01.17
6. AlexNet  (4) 2020.01.17
5. CNN 성능은 어떻게 평가하게 되나요?  (0) 2020.01.17

안녕하세요~


이번시간에는 VGGNet이라는 CNN모델에 대해서 설명드릴거에요~


이전에 설명드린 AlexNet의 등장으로 image classification 분야에서 CNN 모델이 주목을 받기 시작했어요. 그리고 이후 연구자들은 AlexNet의 구조를 바탕으로 자신들 만의 연구를 진행하게 되었죠. 후발 연구자들이 연구를 진행하던 중 2014년에 VGG 모델과 GoogLeNet 모델이 ILSVRC 대회에 출현하게 되었는데요. 이 두 모델은 AlexNet보다 더 깊은 layer를 쌓으면서 뛰어난 performance(성능)를 보여주기 시작했죠. 또한 향후 CNN을 개발할때 보편적으로 사용되는 기법들이 VGG 모델과 GoogLeNet 모델을 통해 소개되었어요.


<사진1>


이번글에서는 ILSVRC 2014에 나왔던 두 모델 (VGG or GooLeNet) 중 아쉽게도 GoogLeNet에 이어 2위를 차지한 VGG 모델에 대해서 알아보도록 하겠습니다~










<0. Abstract>


Abstract를 통해 저자가 강조하는 키워드는 'large scale image recognition', '3x3 convolution filter', 'increasing depth'로 볼 수 있을거 같네요. 한 문장으로 요약하면 "3x3 conv filter를 통해 기존 CNN 모델의 layer의 갯수를 (deep하게) 늘렸고 (increasing depth), 이것이 large-scale image recognition에서도 좋은 결과를 얻게 만들었다" 정도가 될거 같아요. 













<1. Introduction>


Introduction에서는 앞서 abstract에서 언급한 내용을 반복해서 말하고 있어요. CNN layer의 Depth를 중점적으로 보고 연구를 진행했다고 설명하고 있네요. 이전에는 conv filter size가 조금씩 다르긴 했는데, 여기에서는 모든 layer에 3x3 conv filter를 동일하게 적용하고 있다고 설명하고 있어요.



저자는 이 논문의 방향성을 아래와 같이 제시하고 있어요. Section2에서 VGGNet의 구조(configuration)에 대해서 설명하고, Section3에서 VGGNet 모델의 training 방식과 classification test 작업을 어떻게 진행했는진에 대해서 설명한다고 하네요. 그리고 마지막으로 저자가 앞서 언급한 내용들에 대해서 종합적인 결론 내려고 하는것 같습니다.


















<2. ConvNet Configuration>


2-1) Architecture


VGGNet의 기본설정에 대해서 언급하고 있어요.


Input image

- Input image size는 224x224로 고정한다.

- Input image (Training dataset)에 대한 Preprocessing은 RGB mean value를 빼주는것만 적용한다. (RGB mean value란 이미지 상에 pixel들이 갖고 있는 R,G,B 각각의 값들의 평균을 의미해요)


Conv layer

- 여기서는 3x3 conv filter를 사용한다. (3x3이 left, right, up, down을 고려할 수 있는 최소한의 receptive filed이기 때문이다)

- 하지만 1x1 conv filter도 사용한다. (이 부분만 읽고는 어떤 용도로 사용되었는지 파악이 힘들어요~)

- conv filter의 stride는 1이고, 연산시 padding이 적용된다.




Pooling layer

- max pooling은 conv layer 다음에 적용되고 총 5개의 max pooling layer로 구성된다. pooling연산은 2x2 size&stride=2로 구성된다.


FC(Fully-Connected) layer

- 처음 두 FC layer는 총 4096 channel로 이루어 져있다.


그외

- 모든 hidden layer에는 ReLU activation function이 적용된다.

- AlexNet에서 사용된 LRN 기법은 VGGNet 저자가 실험했을때 성능 향상도 없는데다가 메모리 소모 및 연산량을 늘리기 때문에 사용하지 않았다.




2-2) Configuration


Configuration에서는 depth에 따라 VGG 모델을 조금씩 변형시켜 연구를 진행했다고 언급하고 있어요. 모델명은 A~E라고 정의했고, 각각 layer가 16~19를 이루고 있다고 설명하고 있어요. 



<Table1>



<사진2. Table1의 VGG E모델>


추가적으로 depth가 늘어나도 parameter가 줄어들었다는 것을 보여주고 있습니다.



<Table2>


<사진3>





2-3) Discussion


저자는 Discussion에서 small size filter인 3x3 conv filter를 사용한 이유를 설명하고 있어요. 간단하게는 3x3 conv filter 2개를 사용하는 것이 하나의 5x5 conv filter를 사용하는 것과 같은 효과를 불러온다고 설명하고 있는데요. 예를들어, 입력 feature map ‘A’라고 가정할게요. Feature map ‘A’에 첫 번째 3x3 conv filter를 통해 나온 feature map ‘B’에 두 번째 3x3 conv filter를 적용한 것이, 애초에 feature map ‘A’5x5 conv filter를 적용하는 것과 같은 receptive field 효과를 불러 일으킨다는 뜻이에요. 그래서 5x5 conv filter를 3x3 conv 2개로 나누어(factorizing) 사용한다고 설명하고 있네요.



좀더 자세한 내용은 아래 글에서 설명하고 있어요. 여기서는 3개의 3x3 conv filter와 1개의 7x7 conv filter를 비교하면서 설명하고 있어요. 먼저 각각의 conv filter를 하게 되면 ReLU라는 activation function을 거치게 되요. 그렇게 되면 non-linear한 문제를 좀 더 잘 풀 수 있게 되요 (이에 대한 이유는 여기 링크를 참고해주세요). 그래서 더 많은 conv filter를 사용하게 되면 여러개의 non linear function인 ReLU를 더 많이 사용할 수 있다는 장점이 있어요.


<사진4>




두 번째로는 3x3 conv filter를 사용하는 conv layer를 2번 사용되는 것이 7x7 conv filter를 한 개 사용하는 conv layer보다 연산시 적용되는 parameter수가 줄어든다는 점이에요. 그리고 이렇게 줄어든 parameter들은 overfitting을 줄여주는데 도움을 줄 거에요 (parameter가 줄어드는데 overfitting이 줄어드는 이유는 여기 링크의 '바나나'예시를 참고하세요)


(ex: 앞서 얻어진 feature map의 개수가 64개이고 128개의 3x3x64 conv filter로 연산하면, 3x3x64x128 parameter가 필요함) 



VGG C 모델같은 경우에는 1x1 conv를 두어 non-linear 성격을 좀 더 강화시켰다고해요. (1X1 conv 연산은 GoogLeNet에서 좀더 자세하게 설명하도록 할게요!)










<3. Classification Framework>

 

여기에서는 VGG 모델을 어떻게 학습시켰고 어떻게 test했는지를 상세하게 설명하고 있어요.


3-1) Training


먼저 training을 위해 hyper-parameter를 어떻게 설정했는지 설명하고 있어요.


Cost function: Multinomial logistic regression objective = Cross Entropy

Mini-batch: Batch size 256

Optimizer: Momentum=0.9

Regularization: L2 Regularization = 5.10^-4 & Dropout=0.5

Learning rate: 10-^2 --> validation error rate이 높아질수록 1/10 씩(10^-1) 감소시킴


<사진5. A factor of 10>




AlexNet보다도 더 깊고 parameter도 좀 더 많지만 더 적은 epoch를 기록했다고 언급하고 있어요. 그 이유는 implicit regularisation와 pre-initialisation 때문이라고 언급하고 있어요. Implicit regularisation은 앞선 눈문중에 "This can be seen as imposing a regularisation on the 7x7 conv"라는 부분을 말하고 있는건데요. 7x7 한 개보다 3개의 3x3 conv filter에 적용되는 parameter가 더 적기 때문에 이를 implicit regularisation이라고 언급하고 있어요 (explicit regularization은 'dropout=0.5'라고 볼 수 있겠네요. 왜냐하면 논문에서 명시적으로 regularization 방식을 dropout으로 쓴다고 언급하고 있으니까요)


Pre-initialisation하는 방식은 먼저 VGG A 모델 (16 layer)를 학습하고, 다음 B,C,D,E 모델들을 구성할때 A 모델에 학습된 layer들을 가져다 쓰는 방식으로 진행되었어요. 자세하게는 A모델의 처음 4개 conv layer와 마지막 3개 FC layer를 사용했다고 하네요. 이러한 방법을 통해 최적의 초기값을 설정해주어 학습을 좀 더 용이하게 만들었던것 같습니다 (초기값과 관련된 내용은 여기 링크를 참고해주세요)



Training image size


VGG 모델을 학습시킬 때 제일 처음하는 것은 training image를 VGG 모델의 input size에 맞게 바뀌어주어야 한다는점이에요. 



예를들어 S=256이라고 한다면, 아래 사진처럼 training image의 넓이, 높이 중에서 더 작은 side를 256으로 줄여줄거에요. 이때 aspect ratio를 유지하면서 나머지 side도 rescaling해주는데 이러한 방식을 "isotropically-rescaled" 했다고 말한답니다.



이렇게 isotropically-rescaled training image (ex: 위의 이미지에서 512x256) 에서 224X224 size로 random하게 crop을 해주게되요.


사실 S값을 설정하는 두 가지 방식이 있는데요. 첫 번째가 'single-scale training' 방식이에요. 이 방식은 S를 256 or 384로 고정시켜 사용하는 방식이에요. 처음에 S=256으로 설정하여 학습시킨 VGG 모델의 가중치값들을 기반으로 S=384으로 설정하여 다시 학습시켜요. S=256에서 이미 많은 학습이 진행된 상태이기 때문에 S=384로 설정하고 학습할때는 learning rate를 줄여주고 학습을 시켜줍니다.



또 다른 방식은 multi-scale training 방식이에요. 이번에는 S를 고정시키지 않고 256~512 값들 중에서 random하게 값을 설정해줍니다. 보통 객체들이 모두 같은 사이즈가 아니라 각각 다를 수 있기 때문에 이렇게 random하게 multi-scale로 학습시키게 해주면 학습효과가 더 좋아질 수 있어요.



그리고 보통 이러한 data augmentation 방식을 scale jittering이라고도 합니다.


<사진6>


이러한 multi-scale을 학습시킬 때에는 앞선 single scale training 방식(S=256 or 384)을 진행한 VGG model로 fine tuning 시키게되요.





3-2) Test


Test image size


Training image가 rescaling되는것 처럼 VGG 모델을 test할 때도 rescaling 됩니다. Training image를 rescaling 할때 기준이되는 값을 S라고 했다면, test image를 rescaling 할때 기준이 되는 값은 Q라고 합니다. 이때 Q=S일 필요는 없는데, training image에서 설정된 S값 마다 다른 Q를 적용하면 VGG 모델의 성능이 좋아진다고 하네요 (아마 여기서 말하는 test image는 training 중간중간에 validation하는 validation image dataset을 의미하는거 같네요 -> 4.Classification Experiments 부분에서 Dataset 부분을 보니 validation dataset을 test dataset으로 간주하여 사용했다고 하네요.)



VGGNet 모델은 Training 할때와 중간중간 overfitting을 막기위해 Testing(Validation)할때 쓰이는 CNN 구조가 약간 달라요.


Test시에는 training시 사용되던 첫 번째 FC layer를 7X7 conv layer로 바꾸고, 마지막 두 FC layer를 1X1 conv layer로 바꾸었어요. 이것을 통해 whole (uncropped) image에 적용시킬 수 있다고 설명하고 있어요. 이 부분에 대한 설명을 조금 풀어서 해볼게요. 



먼저 아래 왼쪽 그림을 feature map이 FC layer로 들어가기 전에 flatten하는 순서를 보여주고 있어요. 그리고 오른쪽 그림은 1x1 conv filter를 적용하는게 어떻게 Fully connected layer와 연산구조가 비슷한건지 보여주고 있어요. 오른쪽과 같이 연산을 하면 결국 flatten하는 순서만 바뀌고 구조자체는 FC layer와 동일하게 바뀌어요. 


    


그렇다면 아래 사진처럼 training시 갖고 있던 FC layer를 1x1 conv filter를 가진 conv layer로 바꿔줄 수 있어요.


      




   VS   

       

<사진7. 왼쪽 Test시 VGGNet 구조, 오른쪽 Training시 VGGNet 구조. 왼쪽 이미지의 7x7x512 maxpooling 이후, 7x7 conv layer가 적용된 결과가 이미지에 나타납니다. 왼쪽이미지상에서는 FC-connted라고 표현했지만 실제로 3객의 1x1 conv layer인 셈인것이죠>



논문에서 "The resulting fully-convolutional net is then applied to the whole (uncropped) image. The result is a class score map with the number of channels equal to the number of classes, and a variable spatial resolution, dependent on the image size. Finally, to obtain a fixed size vector of class scores for the image, the class score map is spatially averaged (sum-pooled)." 라고 언급된 부분에서 많은 혼동이 있을 수 있는데 이 부분에 대해서 잘 살펴보도록 할게요. 


Training시에는 crop하는 방법을 쓰지만, Test 시에는 FC layer를 conv layer(=fully-convolutional net)으로 바꿔주어 uncropped image를 사용해도 된다고 나와 있어요. 당연히 FC layer는 MLP 개념으로써 입력 노드가 hyperparameter로 정해져 있기 때문에 항상 입력 노드(size)가 동일해야 해요. 하지만 conv 연산에서는 그런 제약이 없어지게 됩니다. 그런데, 기존 crop을 통해 얻은 224x224 입력 image size가  VGG model에 입력되었을 때 classifier에 해당하는 부분 (FC layer가 1x1 conv layer로 바뀐 부분) 을 거친 최종 output feature map size가 입력 image size에 따라 서로 달라질거에요.


<사진8>


이때 output feature map size가 1x1이 아닌 경우에는 계산을 어떻게 하게 될까요? 예를들어, 224x224 이미지 사이즈가 들어왔을때는 '사진8'의 위쪽에 위치 한 그림처럼 classifier 단계(1x1 conv filter가 적용되기 시작하는 부분)에서 1x1 conv filter가 feature map에 알맞게 적용되는 것을 볼 수 있지만, 아래에 위치한 그림에서는 1x1 conv filter가 feature map size와 다르다는 것을 알 수 있어요. 


만약 큰 이미지가 입력으로 들어오게 되면 1x1 conv filter를 적용할 때 feature map size가 1x1이 아니고 7x7이 될 수도 있어요. 논문에서 언급한 "The result is a class score map with the number of channels equal to the number of classes, and a variable spatial resolution, dependent on the image size."의 의미는 1x1 conv filter(layer)를 거치고 softmax에 들어가기 직전의 output feature map size가 이미지 크기에 따라 달라지는데, 아래와 같은 예에서는 7x7x1000 의 output feature map size를 얻을 수도 있다는 말과 같아요. 이때 7X7 output feature map을 class score map이라고 한답니다. 이렇게 얻은 7x7 class score map은 1000개(channel)를 얻게 되는데요. 이때 각각의 7X7 feature map은 "spatially averaged (mean or average pooling)"을 하게되요. (사실 논문에서는 sum pooling이라고 언급해서 pooling연산 할때 feature map을 더해주는게 아닌가라는 생각도 해봤는데 sum pooling에 대한 정확한 정의를 찾기도 힘들었고 코드들을 보면 GAP(Global Average pooling)을 사용하는것 같아 저는 mean or average pooling을 한다고 해석했어요)


         

      <사진9>                                                                               <사진10. GAP>



위와 같은 작업을 수행하되 softmax 이후에 flipped image와 original image의 평균값을 통해 최종 score (final)를 출력하게 됩니다.


AlexNet에서는 Test할때 1개의 이미지에 대해서 좌상단, 우상단, 가운데, 좌하단, 우하단으로 crop을 하고 각각 crop 된 이미지를 좌, 우 반전을시켜 10 augmented images를 사용하게되요. 이러한 10 augmented images에 대해 평균을 취하는 방식으로 최종 score를 출력했습니다 (Softmax의 결과 확률값이 나오는데 각각의 class에서 나오는 10개의 값들에 대해 평균을 취한것이죠). 그렇기 때문에 속도가 매우 느려지게 되는것이죠. 하지만, FC layer를 1x1 conv layer로 대체하고 약간의 큰 사이즈의 이미지를 넣어주고 학습을 시켰고 data augmentation도 horizontal flipping만 적용했는데도 좋은 효과를 얻어냈다고 언급하고 있어요.



이러한 Fully convolutional network로 구성되어 있을때에는 dense estimation을 적용했다고 하는데요 (이부분은 아직 이해가 명확히 안되서 이해하는대로 정리해서 올리도록 하겠습니다).


VGGNet 저자는 GoogLeNet에서 사용한 multi-crop 방식이 좋은 성능을 보였다는것을 인지하고 VGGNet에서 사용한 dense evaluation 방식을 보완(complementary)하기 위해 multi-crop evaluation 방식 또한 사용했다고해요. 나중에는 multi-crop evaluation과  dense evaluation을 적절하게 섞어 test(validation)을 진행했는데 이러한 방식의 evaluation 기법이 좋은 결과를 내었다고 언급하고 있어요.


 






<4. Classification Experiments>


이 부분에서는 실제 classification 실험(experiments) 결과를 보여주고 있어요. 간단하게 dataset은 ILSVRC를 사용했고, top-1 결과는 multi-class classification error (<-- 이 부분은 뒷부분에서 더 설명이 나와요)이고 top-5결과는 기존 ILSVRC에서 요구하는 test(evaluation) 기준을 사용했다고 해요.



대부분 실험에서 validation set을 test set으로 사용하고 있다고 언급하고 있어요.




4-1) Single scale


Single scale Evaluation이란 test시 image size(scale)가 고정되어 있는것을 의미해요. 앞서 training image size를 설정해주는데 2가지 방식이 있다고 했는데요. 첫 번째는 training image size(S) 256 or 384 로 fix시켜주는 single scaling training 방식과, 256~512 size에서 random하게 골라 multi-scaling training 방식이 있어요. Single scaling training 방식을 선택했을때에는 S=Q size로 test image size가 고정(single scale)되고, multi-scaling trailing 방식에서는 0.5(256+512)=384로 고정됩니다.




AlexNet에서 사용되는 Local Response Normalization 기법을 사용한 모델 (A-LRN)과 그렇지 않은 모델 (A)간의 성능차가 나지 않았기 때문에 B 모델을 사용할때부터는 LRN을 사용하지 않았다고해요. 



또한, 아래의 테이블에서 볼 수 있듯이, 1x1 conv filter를 사용하고 있는 C 모델보다 3x3 conv filter를 사용한 D 모델의 성능이 더 좋게 나온것을 알 수 있어요. 저자는 그 이유를 1x1 conv filter를 사용하면 non linearity를 더 잘 표현할 수 있게 되지만, 3x3 conv filter 가 spatial context (공간 or 위치정보)의 특징을 더 잘 추출해주기 때문에 3x3 conv filter를 사용하는것이 좋다라고 언급하고 있어요. (또한 layer를 19에서 error rate이 정체 되어있다고 이야기하는거 보면 19 layer보다 더 깊이 layer를 쌓고 진행을 했었던거 같아요)






4-2) Multi-scale evaluation


Multi-scale evaluation은 test이미지를 multi scale로 설정하여 evaluation한 방식을 이야기해요. 그래서 아래 테이블을 보시면 하나의 S 사이즈에 대해 여러 test image로 evaluation을 하는것을 볼 수 있으실거에요.






4-3) Multi-crop evaluation & 4-4) ConvNet fusion


앞서 언급했던 dense evaluation 방식으로 validation을 진행한 결과와 multi-crop evaluation방식으로 validation을 진행한 결과에 대해서 언급하고 있어요. 또한 multi-crop evaluation결과와 dense evaluation의 평균을 통해 두 방식을 적절하게 섞은 새로운 방식(=ConvNet fusion)으로 validation한 결과를 보여주고 있네요.




4-5) Comparison with the state of the art


저자는 ILSVRC 대회에 모델성능을 제출할시 7개 모들의 ensemble 기법을 적용했는데요. 나중에 대회가 끝나고 자체 실험에서 단 2개의 모델 (D,E) 만 ensemble한 결과가 더 좋았다고 언급하고 있어요.


(앙상블관련 개념은 아래 영상 or 링크를 참고해주세요)





최종적으로 2014 ILSVRC에 출시된 classification 모델들과 경합한 결과를 보여주고 있는데요. VGGNet 이 대회에서 2등을 차지하게되요.





지금까지 2014 ILSVRC 대회에서 2등을 한 VGGNet 모델에 대해서 언급했어요. 그렇다면 다음글에서는 2014 ILSVRC 대회에서 1등을 한 GoogLeNet 모델을 설명해야겠죠?ㅎ


그럼 다음 글에서 뵙겠습니다~






P.S


이 논문에서는 localisation에 대한 설명도 하고 있고, 이를 위해 Pascal Dataset을 사용했다고도 언급하고 있지만 CNN 모델을 설명할때에는 localisation와 관련된 개념들은 언급을 하지 않으려고해요. 그 이유는 추후에 Object detection chapter를 열게 될건데 이때 자세하게 설명하는게 적절하다고 판단했기 때문이에요~





[논문 래퍼런스]

VGG Net

Very Deep Convolutional Networks for Large-Scale Image Recognition/ Simonyan, Karen and Zisserman, Andrew/ 2014/09/04/ https://arxiv.org/abs/1409.1556v6


[글 래퍼런스]

https://www.google.com/search?q=%EB%9D%BC%EC%98%A8%ED%94%BC%ED%94%8C+VGGNet&oq=%EB%9D%BC%EC%98%A8%ED%94%BC%ED%94%8C+&aqs=chrome.1.69i59l4j35i39j69i61l3.3070j0j4&sourceid=chrome&ie=UTF-8

https://datascienceschool.net/view-notebook/47c57f9446224af08f13e1f3b00a774e/

https://www.youtube.com/watch?v=fe2Vn0mwALI


[사진 래퍼런스]

사진1

https://dataplay.tistory.com/24

사진2

https://www.researchgate.net/figure/llustration-of-the-network-architecture-of-VGG-19-model-conv-means-convolution-FC-means_fig2_325137356

사진3

https://www.youtube.com/watch?v=fe2Vn0mwALI

사진4

https://bskyvision.com/504

사진5

https://ell.stackexchange.com/questions/52706/what-does-reduce-by-a-factor-of-10-mean-in-terms-of-percentage-in-the-followin/129493#129493

사진6

https://slideplayer.com/slide/12507676/

사진7

https://junjiwon1031.github.io/2017/09/08/Single-Shot-Multibox-Detector.html

http://blog.naver.com/laonple/220738560542?

사진8

https://laonple.blog.me/220752877630

사진9

https://www.gputechconf.co.kr/assets/files/presentations/2-1650-1710_DL_Contest_%EC%A7%80%EC%A0%95%EC%A3%BC%EC%A0%9C_%EB%8C%80%EC%83%81.pdf

사진10

https://zhuanlan.zhihu.com/p/42233779

안녕하세요~


이제부터는 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

안녕하세요~


지금까지 Convolution Neural Network (CNN)의 기본구조와 CNN이 DNN에 비해 왜 이미지 영역에서 뛰어난 성과를 갖게 되었는지 알게되었어요.


이제부터는 여러 CNN 모델들을 설명하기 이전에 앞서 CNN 모델의 종류와 CNN 모델의 성능을 평가하는 기준과 방법에 대해서 설명해 보도록 할거에요.






1) ILSVRC (Imagenet Large Scale Visual Recognition Competition)


2017년까지 보편적으로 image classification competition은 ILSVRC에서 이루어졌어요. 보통 ImageNet 사이트에서 방대한 양의 image dataset을 classification 목적으로 무료제공해주는데요. 여기서 training dataset, validation dataset, test dataset을 통해  CNN 모델의 성능을 평가하게되요. 예를들어, 어떤 모델을 만들면 1000개의 categories를 분류하게 되고 이를 통해 성능평가를 하게되요. 


<사진1>


아래 '사진2'는 AlexNet 논문에서 AlexNet에 대한 성능지표를 나타내요. 당시에는 AlexNet이 CNN모델의 시초격이 었기 때문에 AlexNet=CNN으로 표기했었나봐요. 어쨌든, 아래보면 val이라고 되어 있는 부분은 학습도중 validation dataset을 통해 성능을 평가한 결과를 보여준 것이고, test라고 되어 있는 부분은 학습을 마친 CNN 모델을 test dataset으로 성능평가한 결과를 보여주고 있는거에요 (자세한 설명은 여기링크를 참고해주세요).


그런데, Top-1, Top-5라는건 무엇을 의미할까요? 


예를들어, CNN 모델이 강아지 이미지를 입력받았다고 할게요. 그리고 1000개의 종류에 대해 [강아지=0.6, 고양이=0.2, 사슴=0.1, ....................,  뱀=0]와 같이 내림차순으로 결과를 도출했다고 했을 때, 이때 top-1은 강이지가 됩니다. 그렇다면 이러한 결과에서 top-3는 강아지, 고양이, 사슴이 되겠죠? 즉, Top-3에서 16.4%라는 말은 우리가 classification test를 했을 때 우리가 예측한 3개의 범위안에 classification이 제대로 됐을 확률이 83.4% (되지 않았을 확률이 16.4%) 라는 말이에요. 



쉽게 말해서 대충 CNN모델이 입력 이미지에 대해서 3가지 종류중에 하나라고 말했는데 거기서 틀릴 확률이 top-3에서 표현되는 퍼센트(%), 그냥 단답으로 하나의 종류만 말했는데 거기서 틀릴 확률이 top-1에서 표현되는 퍼센트(%)라고 보시면 됩니다.


하지만, 2012년부터 딥러닝 모델 중 하나인 CNN 모델이 모든 상을 휩쓸게 되었고, 2017년에는 classification error 비율이 인간의 수준을 뛰어 넘었기 때문에 사실상 대회가 종료되었어요.


그래서 요즘에는 Kaggle이라는 사이트에서 CNN 모델을 평가하는 대회를 이어가고 있답니다.





2) CNN model history


현재 CNN모델은 수없이 많이 나오고 있지만, 그래도 CNN 모델의 history를 공부할때 대표적으로 언급되는 모델은 아래사진과 같아요.


보시면 ILSVRC (20)12년도에 처음 AlexNet이라는 모델이 처음 CNN을 대표해서 나왔는데요. 해를 거듭할수록 CNN 신경망의 layer가 깊어지면서 error rate도 낮아지는것이 보이시나요? 사실 최근에는 굉장히 기술적으로 업그레이된 버전들이 많이 나와서 error rate이 현실에 적용했을 때 무시해도 되는 수준까지 갔다고 합니다.


<사진2>




지금까지 CNN 모델을 어떻게 평가했는지 그리고 어떻게 CNN이 발전했는지 간단하게 살펴보았어요.




다음글부터는 앞서 설명한 CNN의 기본 뼈대를 기반으로 어떠한 방향을 갖고 CNN 모델이 진화해갔는지에 대해서 설명해보려고해요. 그래서 다음글에서는 CNN 모델의 시초격인 AlexNet을 설명하도록 하려고 합니다~! 



[사진 래퍼런스]

사진1

http://hpkim0512.blogspot.com/2017/12/sdf.html

사진2

https://medium.com/analytics-vidhya/cnns-architectures-lenet-alexnet-vgg-googlenet-resnet-and-more-666091488df5

안녕하세요~


이번 시간에는 DNN의 단점을 바탕으로 CNN이 왜 이미지 영역에서 더 좋은 성과를 보여주는지 말씀드릴거에요~




1) Weight(가중치) parameter 감소


(가중치 parameter가 많으면 안되는 이유를 참고하시려면 여기 링크를 참고해주세요!)


먼저, DNN이 이미지를 학습하는 방식을 살펴볼까요? 처음 입력 이미지가 784개의 차원으로 구성되어 있네요. 입력 이미지와 연결된 hidden layer 수는 사용자가 설정해주는거지만 hidden layer 노드(뉴런) 개수에 따라 가중치들이 굉장히 많아지는것을 볼수있죠? (가중치개수 = 입력차원수 X hidden layer 노드 수)


    

<사진1>



반면에 CNN에서는 학습을 위한 가중치가 몇개나 필요할까요? 먼저 한 개의 3X3 convolution filter를 사용한다고 했을때 9개의 가중치(뉴런)이 필요하게 됩니다.


             

<사진2>


그리고 아래의 사진처럼 6개의feature map을 위해서는 6개의 filter가 필요하니 first convolution layer에서는 54(=6X9)개의 가중치(뉴런)이 필요하게 되네요.

     

                          <사진3>               

                   

DNN과 CNN의 첫 번째 단계에 필요한 가중치 수만 보더라도 굉장한 차이가나는것이 보이시나요? 이를 극단적으로 표현하면 아래와 같이 표현할 수 있어요.


<사진4>


가중치의 수가 현저하게 줄어들면서도 edge 정보 등 수많은 위치정보들을 그대로 유지하면서 feature를 확보하고 있네요. 


    

<사진5>










2) Weight sharing & Sparse connection


위에서 DNN에서 CNN으로 가중치가 줄어드는 이유를 설명했죠? 간단히 말하자면 convolution filter의 가중치수가 적기 때문인데요. CNN에서는 이러한 convolution filter의 특성을 두 가지 용어를 사용하여 설명하고 있답니다.


먼저 weight sharing의 정의를 살펴볼게요.


"Parameter sharing refers to using the same parameter for more than one function in a model. In a traditional neural net, each element of the weight matrix is used exactly once when computing the output of a layer"


아래그림의 왼쪽 부분은 DNN구조이고, 오른쪽 부분은 CNN 구조에요. DNN에서는 하나의 출력값(S)를 위해 각각 다른 가중치들이 사용되고 있어요 (대신에 입력값들이 모두 동일하네요). 반면에 CNN은 하나의 출력값에 같은 가중치들이 사용되고 있어요 (대신에 입력값들이 매번 바뀝니다).


쉽게 말하자면, "각각의 출력값(뉴런;S) 들이 동일한 가중치(weight)를 함께(sharing; 공유) 쓰고있다"라고 말할 수 있겠네요.

 

<사진6>


이러한 weight sharing을 통한 연산은 CNN sparse connection 구조를 형성할 수 있게 기여했는데요. 전체이미지에서 Convolution filter를 적용시켜 연산을 할때, conv filter가 적용되지 않은 부분은 모두 0이라고 할 수 있겠어요 (보통 이렇게 0이 많은 행렬구조를 sparse matrix라고 해요). 0이 의미하는 바는 아래 왼쪽그림처럼 가중치가 모든 입력이미지에 대해서 연결되어 있지 않고 sparse하게 연결되어 있다는걸 의미하는데요. 이러한 특성때문에 CNN은 sparse connection 구조를 가지고 있다고 말할 수 있게 되었어요. 다른말로 표현하자면, 입력이미지에 비해 conv filter 사이즈가 작다보니 이러한 sparse connection을 가능하게 했다고도 말할 수 있겠어요.


         


아래 왼쪽 사진을 보면 가운데 부분이 sparse connection이고, 양측 부분이 Dense(or Fully) connection이에요. 우리가 sparse connection 처럼 가중치를 적게 사용하면서도 좋은 성능을 내면 overfitting 측면이나 학습시간 측면 등에서 더욱 좋은 효과를 많이 볼 수 있겠죠? CNN은 weight sharing을 통해서 이러한 sparse connection이 가능해 졌습니다.


      

                   <사진7>                                                          <사진8>











3) Translation equivariance and Translation invariance


CNN에는 translation equivariance라는 특징이 있는데 이에 대해서 알아보도록 할게요.


Translation equivariance의 수학적 정의는 아래와 같아요.


"Specifically, a function f(x)  is equivariant to a function g if f(g(x)) = g(f(x)). In the case of convolution, if we let g be any function that that translates the input, that is, shifts it, then the convolution function is equivariant to g." 


우선, f를 convolution 연산을하는 함수라고 생각하고, g를 전체 이미지영역(x)을 translate(shift;이동)시키는 함수라고 가정한다면 아래와 같은 수식을 만들 수 있겠어요. 아래 수식이 의미하는것은 이미지에 convolution filter를 적용시킨 것을 이동시킨 결과와 전체이미지를 이동시킨것을 convolution filter 연산을 한 결과와 같다는 뜻이에요. 

convolution(translate(x)) = translate(convolution(x))


예를들어, 우리의 입력 값이 [0,3,2,0,0]이라고 하고 convolution 연산을 적용시킨 결과가 [0,1,0,0]이라고 해볼게요. 그리고 [0,1,0,0]을 오른쪽으로 translate하면 [0,0,1,0]이 나오겠네요. 이번에는 전체이미지가 shift된 [0,0,3,2,0]을 convolution 연산을 적용시켜볼게요. 결과값 [0,0,1,0]이 나오게되네요. 


위의 수식을 보면 왼쪽 convolution(translate(x))는 입력 이미지가 이동되었다는 것을 의미하는데, 이렇게 이동된 이미지의 convolution결과와  기존 이미지X에 convolution 한 결과를 이동시킨 결과 (=translate(convolution(x)) 와 같다는 것은 결과적으로 봤을때 입력 이미지의 위치가 변하면 "동일하게" 출력값도 같이 변한다라는 의미를 갖게 되요. 그래서 Equivariance하다는 뜻을 입력이 변하면 출력도 입력이 변한정도와 동일하게 바뀌는 현상을 의미한답니다.


<사진9>


Convolution연산은 equivariant해서 서로 다른 위치에 있는 특징을 입력으로 넣으면 feature map에서도 각 특징을 서로 다른 위치에 배치시킵니다. 이러한 특징은 feature map이 FC layer에 들어가기전까지 지속됩니다. 








4) Translation invariance


CNN에서는 translation equivariance와 translation invariance라는 특징이 공존해요. '한글 뜻만 봐서는 서로 모순된 개념같은데 어떻게 두 개의 특성을 동시에 갖을 수 있지?'라는 생각을 할거에요. 그럼 이제부터 차근차근 설명해보도록 할게요.


먼저 translation equviariance라는 개념을 다시 복기해보면, 입력 이미지의 위치가 바뀌면 출력값도 동일하게 위치가 변한다는 말이에요. 우측 6개의 이미지를 convolution한 결과로 얻은 6개의 feature map은 숫자8의 위치에 따라 서로 다르게 표현될거에요. 하지만, translation equivariance 특성으로 인해 입력값이 이동한것에 따라 동일하게 출력값이 변했기 때문에, 숫자8이라 부분만 출력값이라고 봤을때 출력값 pattern은 변하지 않았을거에요 (이 부분이 이해가 잘안되실 수 있는데, 제가 그림을 못그려서 설명에 한계가 있네요 ㅜㅜ).

<사진10>


결과적으로 이렇게 추출한 특징들을 FC layer를 통해 classification하게 되면 모두 8이라고 classification하게 되요. 그래서 이러한 CNN은 translation invariance(위치에 따라 출력이 불변한다)라는 특성을 지니게되요. 즉, 강아지 사진에 강아지가 어느 위치에 있건 강아지 label 확률값은 동일하게 높게 출력하기 때문에 Convolution연산의 equivariance한 특성과 파라미터 를 공유하는 덕분에 CNN자체가 translation invariant특성을 갖게 됩니다. DNN에서 처럼 조금만 이미지가 distortion or shift되도 다른 이미지라고 판단하기 때문에 엄청나게 많은 이미지를 학습시켜야 하지만, 여기에서는 translation equivariance을 통해 translation invariance한 특성을 갖게 되기 때문에 학습이미지가 DNN보다 많지 않아도 되는 장점이 생깁니다.




(여기서 부터는 개인적인 의견입니다)


그런데, 조금 이상하지 않나요? 분명히 fully- connected 구조를 가진 DNN에서 이미지가 조그만 translation(or shift)되면 다른 이미지라고 분류한다고 했는데, 결국 CNN도 마지막 단에는 DNN과 같이 fully connected 구조를 갖고 classification하는거면 translation invariance하다고 말할수 없는거 아닌가요?


이러한 이유로 몇몇 책에서는 translation invariance라는 개념이 제한적으로 통용된다라고 언급하고 있습니다. 다시말해서, '사진10'과 같은 경우에는 설명을 하기위해 극단적인 위치변화를 예시로 들었지만 사실상 CNN은 아주 작은 위치변화에 대해서만 translation invariance하다고 설명하고 있습니다. 이러한 주장의 근거로는 pooling 연산의 특성을 언급하고 있는데요. 아래 왼쪽그림에서 왼쪽 부분의 3개의 서로다른 모양의 도형이 있음에도 불구하고, max pooling은 일정 영역에서 가장 큰 특징값만을 취하기 때문에 결과값이 값게 나올 수 있어요. 


     

                  <사진11>                            <사진12>                            <사진13>                  


쉽게설명하면 자전거를 가까이서 봤을때에는 분명 두 자전거가 달라보이지만 굉장히 멀리서 보면 비슷해보이는 현상과 같은거에요.

           --->         

<사진14>


결국 translation equivariance한 특성을 갖은 convolution 연산(filter)과 translation invariance and downsampling 특성을 갖는 pooling 과정을 반복하다 맨 끝단까지가면 CNN이라는 것이 큰 변화에도 translation invariance 할 수 있다고 말하는거 같지만 글쎄요 거기까진 확신하진 못하겠네요;










5) Overfitting


위에서 pooling의 downsampling에 대해서 잠시 설명드렸지만 결국 max pooling 과정에서 특징값이 낮은 값들은 제거가 되요. 결국 이렇게 되면 가장 강력한 특징들만 살아남게 되는데 이것이 overfitting을 피하게 도와줍니다.


예를들어, 아래그림에서두 자전거는 한 눈에 봐도 서로 많이 달라보여요. 만약에 우리가 세상에 처음태어나서 왼쪽사진의 자전거만 학습했다면 우리는 오른쪽의 사진의 물체를 자전거가 아니다라고 할 가능성이 많아요. 왜냐하면 너무 왼쪽 자전거만 학습한 나머지 왼쪽자전거의 자질구레한 특징들 (ex; 바퀴의 크기, 자전거의 중간부분 구조, 손잡이 모양)이 오른쪽 물체에는 없기 때문에 오른쪽 물체는 자전거가 아니다라고 판단내리게 되는거죠.


     --X-->   


반면에 우리가 pooling을 통해 자전거가 각각의 강력한 특징만 갖고 downsampling 되었다고 해볼게요. 왼쪽 사진에서 바퀴 두 개가 보이고, 의자랑 손잡이 같은 것들이 보여요. 마찬가지로 오른쪽도 왼쪽에서 보였던 것 들이 보이네요. 즉, 멀리서 보니까 자전거의 가장 보편적인 특징이라할 수 있는 바퀴, 손잡이, 안장의 여부만보고서 오른쪽 물체가 자전거인지 아닌지만 판단하기 때문에 왼쪽 자전거가 본래 갖고 있던 자질구레한 특징에 너무 치우치지 않고 오른쪽 물체를 자전거라고 바르게 표현할 수 있게 되었어요. 이러한 현상을 통해서 우리는 'pooling 연산을 통해 학습데이터에 overfitting되는 현상을 피할 수 있게 된다'라고 말할 수 있을 것 같네요.


     --X-->   








지금까지 CNN의 특성을 통해 CNN이 왜 DNN보다 이미지영역에서 특화될 수 밖에 없는지 알아보았어요. 이렇게 CNN에한 기본구조와 개념을 알아보았는데요. 다음장에서 앞으로 배울 CNN 모델을 간단히 언급하고 CNN의 성능을 판단하는 지표에는 무엇이 있는지 알아보도록 할게요~!





[글 래퍼런스]

https://medium.com/@seoilgun/cnn%EC%9D%98-stationarity%EC%99%80-locality-610166700979



[사진 래퍼런스]

사진1

https://89douner.tistory.com/26?category=868069

사진2

https://imjuno.tistory.com/entry/Convolutional-Neural-NetworkCNN

사진3

https://d2l.ai/chapter_convolutional-neural-networks/lenet.html

사진4,6,8

https://www.deeplearningbook.org/

사진5

https://www.youtube.com/watch?v=AgkfIQ4IGaM

사진7

https://ai.stackexchange.com/questions/4338/dense-sparse-dense-cnn-training

사진9

https://medium.com/@seoilgun/cnn%EC%9D%98-stationarity%EC%99%80-locality-610166700979

사진10

https://medium.com/@jongdae.lim/%EA%B8%B0%EA%B3%84-%ED%95%99%EC%8A%B5-machine-learning-%EC%9D%80-%EC%A6%90%EA%B2%81%EB%8B%A4-part-3-928a841a3aa

사진11

https://www.quora.com/How-exactly-does-max-pooling-create-translation-invariance

사진12

https://medium.com/@hobinjeong/cnn%EC%97%90%EC%84%9C-pooling%EC%9D%B4%EB%9E%80-c4e01aa83c83

사진13

http://cs231n.github.io/convolutional-networks/

사진14

http://bike-korea.com/index.php?mid=allbike_info&category=3123&m=0




안녕하세요~


이번글에서는 Convolution Neural Network(CNN)의 기본구조에 대해서 알아보도록 할거에요. CNN은 기본적으로 Convolution layer-Pooling layer-FC layer 순서로 진행이 되기 때문에 이에 대해서 차근차근 알아볼거에요.


<사진1>










<1. Convolution layer>


먼저 CNN에서 핵심이 되는 부분은 convolution layer에요. 보통 convolution layer에서 이미지를 classification(분류)하는데 필요한 특징(feature)정보들을 뽑아내요.


<사진2>


Convolution layer에는 수 많은 filter들이 있어요. 이러한 filter들을 통해 feature들을 뽑게 되는데 지금부터 어떻게 뽑아내는건지 보여드릴게요.


이미지의 feature가 될 수 있는 요소는 굉장히 많지만 그 중에서 대표적인 것이 형태가 될거에요. 물체의 윤곽부분만 보더라도 우리는 물체가 무엇인지 구분하는데 큰 정보를 얻게되요. 아래 사진에서도 오른쪽의 윤곽선만 보더라도 우리는 물체를 쉽게 가늠해볼 수 있어요.


<사진3>


먼저 convolution filter가 어떻게 연산을 하는지 살펴보고 좀 더 이해하기 쉽도록 이야기를 풀어나가볼게요.


<사진4>


convolution filter는 위와 같이 전체이미지를 차례대로 움직이면서 (이렇게 움직이는 방식을 window sliding이라고해요) 특징값을 추출해내는거에요. 전체 이미지에서 특정 filter의 모양과 일치하게 되면 그 부분에서 큰 값을 갖게 되겠죠? 이러한 filter가 전체 이미지를 순회하고 나면 전체 이미지에서 해당 filter와 유사한 모양을 가진 부분에 대한 feature들만 얻을 수 있게되요. 우리는 이러한 과정을 통해 "특정 filter에 부합하는 feature 정보를 얻었다"라고 말하게 되는거죠.



1) First convolution layer


CNN에서 물체의 윤곽을 알아내기 위해서 제일 처음 하는 작업은 edge filter를 사용하는거에요. Convolution filter는 모든 layer에서 같은 크기로 고정되어 있어요 (보통은 3x3 size로 구성되는데 이에 대한 이유는 뒤에서 설명드릴게요). 그렇기 때문에 처음에 들어오는 이미지 크기는 convolution filter 크기에 비해 상대적으로 크기 때문에 filter가 이미지를 커버할 수 있는 부분이 선과 같은 단순한 정보에요 (그리고 이러한 단순한 모양들을 edge라고 부릅니다). 예를 들어, 우리가 아래 그림의 오른쪽 사람을 매우가까운 거리에서 현미경으로 살펴본다고 했을 때 사람얼굴이 보이는게 아니라 무수히 많은 선들만 보이겠죠? 


아래 그림을 보시면 더 잘 이해하실거에요. 우리가 아래 그림처럼 7x7 conv filter를 갖고 있다고 가정해 볼게요. 그럼 아래 7x7 conv filter가 쥐 이미지(전체 이미지)를 천천히 순회하다보면 conv filter의 edge 부분과 일치하는 영역에서 굉장히 높은 값을 도출하게 될거에요.


      

 

<사진5>



지금까지 이야기한 것들을 바탕으로 convolution layer가 어떻게 동작하게 되는지 보여들게요.


아래 그림에서 45번째 convolution filter를 적용해볼게요. 아래 그림의 오른쪽 부분 녹색테두리 네모박스 부분이 45번째 convolution filter가 적용된 결과를 보여주는거에요. 아래 그림 왼쪽 부분에서 45번째 convolution filter를 보시면 좌측에서 우측으로 갈 수록 밝아지는걸 볼 수 있죠? 그렇다면, 이러한 filter가 오른쪽 이미지 좌측상단의 사람 이미지에 차례대로 적용된다고 했을때 좌측에는 어둡과 우측에는 밝은 영역을 지닌 부분에는 흰색으로 표시할거에요 (gray scale에서 흰색이 높은 값을 갖게 됩니다).


     

<사진6-1>


위의 그림에서는 96개의 filter가 있는데요. 96개의 filter를 쓴다는건 96개의 서로다른 feature를 뽑아내겠다는것과 같아요.


결과적으로 우리가 6개의 filter를 사용하면 아래 그림의 첫 번째 convolution layer에서는 6개의 결과값들이 나오게 되는데 이를 feature map(특징(feature)정보들이 들어있는 map(정보)인 거죠)이라고 불러요. (전체적인 과정은 뒤에서 다시 요약해서 설명해 드릴게요!) 즉, first convolution layer에서 6개의 convolution filter를 사용한 결과 6개의 feature maps (아래 연두색 그림 부분)을 얻게 되었네요! 각각의 feature map은 위에서 설명한 것과 같이 각각의 convolution filter와 부합하는 feature 정보들이 들어있을거에요.




처음에는 conv filter 역시 초기값 설정을 통해 무작위로 분포하게 되지만 학습을 통해서 아래의 오른쪽과 같이 완성된 edge filter로 만들어지게 됩니다.



<사진6-2>











2) Pooling layer


아래사진을 보면 convolution layer (Conv) 사이에 Pooling layer (pool)가 사이사이에 배치하고 있습니다. 이러한 Pooling layer은 CNN에서 어떤 역할을 담당하고 있는걸까요?


<사진7>


먼저 Pooling 연산에 대해서 알아보도록 할 텐데 Pooling 연산 자체는 크게 어렵지 않아요. convolution filter를 거친 결과로 얻은 각각의 feature map에서 특정영역을 형성하여 해당 영역 내에서 가장 큰 값을 도출하게 되요. 이러한 방법을 max pooling이라고 하는데, 실제로는 pooling에도 여러가지 종류가 있어요. 하지만, 여기에서는 max pooling을 기준으로 설명드릴게요~ 


Max pooling은 말그대로 특정영역에서 가장 큰 값을 꺼내어 쓰는거에요. '사진9'를 보면 모양은 그대로인데 pooling결과 좀 더 feature들이 뚜렷해지는 것을 볼 수 있죠? 당연히 pooling을 할때 주위의 영역중 가장 큰 값을 뽑기 때문에 이러한 결과가 나오는게 아닐까해요.


      <사진8>  



     

<사진9>



 '사진10'를 보시면 아시겠지만 pooling 연산을 통해서 형태는 유지하면서 기존의 이미지크기를 작게 만들어 줄 수 있게 됐어요 (이러한 작업을 down sampling이라고해요). 왜 이런 down sampling을 통해 이미지를 작게 만드는 걸까요?


        <사진10>      



앞서 conv filter의 size는 변함이 없다고 했죠? 만약 pooling을 통해 down sampling을 하게 된다면 이후의 conv filter는 어떻게 학습하게 될까요? First convolution layer에서의 conv filter는 edge 정보만 추출할 수 있다고 말씀드렸죠? 그런데 아래그림의 오른쪽 사람얼굴을 보면 전체 이미지 사이즈가 작아지니 conv filter의 크기가 상대적으로 조금 더 커졌다는걸 알 수 있어요. 그렇기 때문에 이제는 edge 정보가 아니라 눈과 같이 조금 더 추상적(abstract)인 정보를 볼 수 있는 conv filter를 갖을 수 있게 되었어요.


(그림 실력이....;;;)


이러한 pooling layer 때문에 CNN은 아래와 같은 설명이 가능해졌답니다. 즉, layer가 깊어지면 깊어질 수록 좀 더 abstract feature를 추출할 수 있게 되고, 이것을 통해서 아래와 같은 그림으로 CNN을 표현할 수 있게 됩니다. 



<사진11>

<사진12>






3) 중간점검


지금까지 Convolution layer와 pooling layer에 대해서 이야기 해보았어요. 마지막 단계는 FC layer인데 FC layer를 설명하기전에 지금까지 설명했던 부분을 아래그림을 통해 다시 요약해보려고해요.


먼저 첫 번째 convolution layer를 보면 6개의 convolution filter를 사용하고있어요. 그 결과 각각의 특징을 갖는 6개의 feature map이 만들어지겠네요. 그리고, pooling을 통해서 6개의 feature map size가 줄어들게 되었어요.



두 번째 convolution layer에서는 16개의 convolution filter가 사용되었네요. 첫 번째 convolution layer에서 사용된 convolution filter보다는 좀 더 abstract한 convolution filter 모양을 보일거에요. 그리고 두 번째 convolution filter 하나가 사용될 때에는 이전 conv layer-pooling layer를 통해 얻은 6개의 feature map에 동시에 적용되요. 


이렇게 되면 각 feature map을 합산한 하나의 feature map이 만들어 질거고 합산한 feature map에 두 번째 convolution layer에 있는 16개의 conv filter들을 적용해서 또 다른 16개의 feature map을 만들게 되요.


    


아래 영상을 참고하시면 더 이해하기 쉬우실거에요!



그리고 보통 layer가 뒤로갈 수록 filter의 총 개수가 많아지는데요. 그 이유는 두 가지 측면에서 해석해 볼 수 있을거 같아요.



첫 번째는 연산량이에요. 처음에는 이미지가 크기 때문에 6개의 conv filter로만 계산을 해도 굉장히 많은 연산을해야해요. 하지만 마지막 layer까지 가다보면 이미지의 크기 (or feature map)가 매우 작아지게 되는데 이때는 많은 conv filter로 convolutoin 연산을 적용해도 첫 번째 conv layer에서 6개의 filter를 적용한 계산량과 비슷하게 될거에요.


두 번째는 추출한 feature의 형태에요. 첫 번째 layer에서 뽑아낼 edge 정보는 굉장히 단순한 구조로 되어 있어요. 그렇기 때문에 많은 형태의 모양이 있을 필요가 없다고 판단할 수 있을거 같아요. 하지만 모양이 점점 추상적으로 바뀌어 갈수록 점점 형태가 복잡해져요. 예를들어, 강아지의 윤곽선을 만들기 위해서 쓰이는 edge가 직선, 대각선, 곡선 3가지라고 한다면 강아지의 귀를 만들기 위해서는 세모, 네모, 동그라미, 다각형, 구부러진 귀 모양 등등 더 다양한 형태가 필요하게 될거에요. 








4) FC layer


위에서 설명드린 방식으로 feature를 뽑다보면 마지막에는 물체와 유사한 형태들의 feature map들이 선별되게 될거에요.




결국 물체와 유사한 feature map을 통해서 classification(분류)를 하게 되는데요. 이때 사용되는 개념이 FC layer에요. 아래 그림의 FC layer를 보니 뭐가 떠오르시지 않나요? 맞습니다. 결국 FC layer는 기존의 Deep Neural Network(DNN; MLP)네요. 


<사진13>


앞에서 convolution filter를 통해 시각정보를 최대한 보존해 오면서 마지막 feature map들을 일렬로 늘린 후, 이들을 DNN과 같이 입력차원으로 받아드려서 하나의 hidden layer거쳐 classification(분류) 문제를 해결하게 되는거에요. (아래영상은 DNN에 대한 영상이지만 feature map들이 결국 어떻게 일렬로 펼쳐져서 입력되는지 이해하시는데 도움이 되실거에요)




지금까지 CNN 구조와 각각의 역할에 대해서 알아보았어요. 이번장에서는 CNN에 대한 전반적인 개념을 설명하려다 보니 구체적인 수식들은 배제했어요 (정확한 수식에 대해서는 '딥러닝 제대로 시작하기'라는 책을 참고하시면 더 좋을 것 같아요). 


다음글에서는 CNN이 기존 DNN구조에 비해 얼마나많은 연산량의 감소가 있었는지 그리고 이러한 부분이 왜 이미지영역에서 뛰어난 성과를 거두는데 기여하게 되었는지 살펴보도록 할게요!



(아래영상은 CNN이 진행되는 과정을 visualization한 영상이니 참고하시면 도움이 되실거에요~!)










[사진 래퍼런스]

사진1

밑바닥부터 시작하는 딥러닝

사진2

https://d2l.ai/chapter_convolutional-neural-networks/lenet.html

사진3

https://steemit.com/kr/@rubymaker/3ylvdc-rubymaker

사진4

https://stats.stackexchange.com/questions/296679/what-does-kernel-size-mean/296701

사진5

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

사진6-1,9

https://www.youtube.com/watch?v=AgkfIQ4IGaM

사진6-2

밑바닥부터 시작하는 딥러닝

사진7

https://www.researchgate.net/figure/AlexNet-and-VGGNet-architecture_fig1_282270749

사진8

https://www.itread01.com/content/1544830204.html

사진10

http://cs231n.github.io/convolutional-networks/

사진11

https://www.researchgate.net/figure/Illustration-of-Convolutional-Neural-Network-CNN-Architecture_fig3_322477802

사진12

https://slideplayer.com/slide/3270662/

+ Recent posts