본문 바로가기

DeepLearning Specialization(Andrew Ng)/Convolutional Neural Networks

[Week 2] 1. Case studies

728x90
Case studies
1. Why look at case studies
2. Classic Network
3. ResNet
4. Why ResNet work well?
5. Networks in Network and 1x1 convolution
6. Inception Network Motivation
7. Inception Network

1. Why look at case studies?

 

 cnn 의 기본 블록들(conv, pool, fc)을 어떻게 결합할 수 있을지에 대한 직관을 줌. 

먼저, 클래식한 network를 알아보고 res나 inception과 같은 신경망들에 대해 알아볼 것.

 

2. Classic Network

1) Lenet-5

-  Lenet-5는 요래 생겼다.

- 좀 더 심화해서 말하자면, Lenet은 pooling 후에 sigmoid 함수를 활성화함수로 하여 값을 변화시켰고, Relu를 사용하지 않았다.  

 

2) Alex Net

- Alex 는 요래 생겼다.

- Lenet과 비슷하지만 보다시피 훨씬 큰 네트워크다. parameter도 6백만개나 된다. 

- Relu 함수를 사용한다.

- 227*227*3 이 input layer다.

 

3) VGG-16

- VGG-16은 요래 생겼다. 

- parameter가 겁나 많고 네트워크도 깊지만, 구조를 보면 좀 단순하다.

- few cov 후에 pool 형식이며 height와 weight가 일정하게 절반으로 줄어드는 것을 확인할 수 있다.

- 저자를 비롯한 엔지니어들은 이렇게 균일하고 체계적으로 차원이 감소하는게 좋아서 이걸 좋아한단다.

- 단점은 parameter가 너어무 많다는 것.

 


3. ResNet

 

#참고

- 너무 깊은 네트워크는 학습하기 힘들다. 왜냐하면 Vanishing Gradient나 Exploding Gradients와 같은 문제들이 발생하기 때문이다. 

 

- 앞서 언급한 deep network의 문제점들을 ResNet은 'skip layer' 기법으로 해결한다.

- 이게 무엇이냐 하면, a{l]을 저기 보라색 선이 가리키는 방향으로 집어 넣어 a[l+2]를 위와 같이 만들어버리는 것이다. 그리고 위에 적혀있는 a[l] ~ a[l+2] 를 Residual Block이라 한다. 

 

- 위와 같이 그냥 우리가 지금까지 적용해왔던 plain network는 레이어가 많아질 수록 이론적으로는 training set에 overfitting 되어 점점 error가 감소해야하지만, 실제로는 그렇지 않다. 참고에서 언급한 deep network의 문제점들 때문이다. 

- ResNet은 이에 대한 안전장치를 마련하여 the deeper layer, the small error 를 이뤄낸다.

 


4. Why ResNet works well?

- 기존에 plain network에서 residual block 을 하나 추가하면 위와 같다.

- 수식을 보면 a[l+2]는 위와 같은데, 여기서 L2 Regularization에 의해 W와 b가 0에 근사하게 된다면 a[l]만 남는다. Relu의 특성상 산출값은 모두 0보다 같거나 크므로 a[l] 또한 그렇다.  a[l]을 relu에 넣으면 당연히 identitly function 즉 항등함수(y=x)가 된다. 

- 이게 왜 좋냐? 

 먼저, plain 네트워크의 경우 deep할 수록 a[l]의 값이 점점 이상해진다. 반면 ResNet의 경우 w와 b가 0에 근사할 경우 a[l+2]가 계속 이상한 값으로 가게 놔두는 것이 아니라 다시 a[l]가 근사하게 만들어 값의 손실을 없게 해준다.

즉, 안전장치가 마련되었다고 생각하면 된다. 그러므로 수행성능의 손실이 일어나지 않고 좋아질 일만 남은 것!

 

cf) 참고로 Residual block에서 z[l+2]와 a[l]의 연산이 이루어지므로 두 행렬의 차원이 같으면 좋다. 그러나 여의치 않을 경우 Ws를 곱해주어 차원을 같게 만들어준다. Ws는 parameter로 이루어진 행렬이어도 좋고, 그냥 임의의 수를 넣어 fix해도 좋다. 아니면 a[l]을 padding(0으로 가득찬) z[l+2]와 차원을 같게 만들어주는 행렬이어도 좋다. 

 

- 솔직히 정확히 어떤 논리로 이게 좋은 건지 모르겠다. W과b가 0과 근사해지면 뭐가 안좋은거지? 지금 머리가 안돌아가니 구글링 좀 하면서 알아보겠다. 좀따.

  => 왜 그럴까 좀 찾아보니 내가 이해한 바는 다음과 같다. 일단 일반적인 plain network에서는 identity mapping 을 학습하기가 어렵다. 왜냐하면 층이 거듭될 수록 vanishing과 exploding의 문제가 발생하기 때문. 그런데 위와 같이 구조를 만들어 놓으면, z[l+2]를 0으로 만들어 a[l+2] = a[l]로 유지할 수 있는 루트가 열린다. 즉, 모델이 학습을 진행하며 필요에 따라 W[l+2]와 b[l+2]를 0으로 학습시켜 identity mapping을 이뤄낼 수 있다. 이런 길이 열리는 것만으로도 모델의 안전장치가 마련되어 성능향상을 꾀할 수 있다.  

 


 

5. Networks in Networks and 1x1

 

1) 1x1 convolutoin computation

 

 1x1 ( x nc)  filter의 연산방식은 다른 filter와 다르지 않다. 나중에 바뀔지는 모르겠지만 bias를 더하지 않고 relu를 적용하는 정도? 근데 이걸 왜 쓰냐?

 

2) convolution의 장점

 - channel 감소

 - 연산량 감소

 - 비선형성 추가(아마 relu를 적용해서 그런듯) 

 


6. Inception Network Motivation

1) Inception module?

- 쭉 쌓는다. 참고로 pooling을 하면 일반적으로 padding을 하지 않아 height와 width가 작아지는데, 여기서는 padding을 하여 h와 w를 일치시켜준다.

 

2) Computational Problem

 

 근데 약간 화제를 전환해서, conv의 특성상 계산이 굉장히 많아진다. 특히 inception module에서는 한 layer에서 여러번의 conv, pooling 등이 이루어지므로 더욱 그렇다. 우리가 1x1 convolution을 사용하는 의의는 여기서 찾을 수 있다. 

  1x1 conv는 위와 같이 'bottle neck' 방식으로 사용할 때 큰 계산효율을 확보할 수 있다. 그냥 바로 5x5 conv를 적용시킨 것과 비교해서 곱셈의 수만 해도 1/10로 줄어드는 것을 확인할 수 있음. 참고로 중간의 채널 수가 16개인 것은 임의로 설정한 것인데 너무 크거나 작지 않은 것이 좋다고 한다. 

 이 방식이 차원을 축소시킴으로써 성능을 저하시키는 것이 아니냐고 의심할 수 있지만, 큰 성능의 저하없이 계산효율을 증진시키는 좋은 방법이라고 한다.

 

 


7. Inception Network

 

 아까랑 같다. 하고 싶은 conv 혹은 pooling을 쭉 이어붙이면 되는데, 1x1이용해서 계산효율을 증진시킨 부분들을 살펴볼 수 있다. 

 

 'GoogLenet' 이라 불리는 network이다. inception module이 반복적으로 사용된 것을 확인할 수 있다. 저 곁가지들 각각에 softmax가 적용되어 예측을 수행한다. 

 

 cf) 인셉션과 관련하여 여러 변형과 관련된 후속 논문들이 나오고 있으며, ResNet의 skipping connection 기법을 응용한 network도 있다. 

 

비판과 질문은 언제나 환영입니다. 많이 꾸짖어주세요.

728x90