728x90

1. AlexNet

AlexNet이 성공할 수 있었던 이유

  • 활성화 함수로 ReLU 사용
    • ReLU는 non-linear(다만 piece-wise linear하긴 함. 0을 기준으로 나눈 구간 각각을 따지만 선형임)
    • 기울기가 1이므로 그레디언트가 사라지거나, 레이어를 깊이 쌓았을 때 네트워크를 망칠만 한 성질이 딱히 없음
  • GPU 2개 사용
  • Local response normalization(LRN)
    • 어떤 입력 공간에서 response가 많이 나오면 몇 개를 죽임. 최종적으로 원하는 건, sparse한 activation이 나오는 것. 지금은 많이 안씀 -> 요즘은 배치 정규화를 많이 씀
    • ? : 그치만 여기서 말하는 response가 뭔지 모르겠다...
  • Overlapping pooling
    • 풀링 커널이 움직이는 보폭인 stride를 커널 사이즈보다 작게 함

출처 : https://bskyvision.com/421

AlexNet에서 쓰인 ReLU

  • 활성화값이 커도 그레디언트값은 1(or 0)으로 유지
  • 선형 모델들이 가진 좋은 성질들을 가지므로, SGD, 미니배치 GD로 학습이 용이
  • 일반화 잘됨
  • 기울기 소실 문제 해결
    • sigmoid, tanh는 0을 기준으로 값이 커질수록 기울기가 줄어듦 -> 뉴런의 값이 많이 크면, 0에서 많이 벗어나게 되면 기울기가 0에 가깝게 됨 => 이것이 바로 기울기 소실
    • ReLU는 이런 문제를 해결해줌

 

 

2. VGGNet

기본 CNN이지만 비중 있는 층(합성곱 계층, 완전연결 계층)을 16층(혹은 19층)으로 심화한 게 특징이다.(층의 깊이에 따라 VGG16, VGG19라 지칭하여 구분하기도 한다.)

  • VGG는 2014년 대회에서 2위였으며, 1위를 한 GoogLeNet보다 성능이 낮지만, 구성이 간단해 응용하기 좋아 많은 사람들이 VGG기반의 신경망을 애용한다.
  • 주목할 점은 3*3의 작은 필터를 사용한 합성곱 계층을 연속적으로 거친다는 것
  • 1x1컨볼루션을 fully connected layer로 사용

왜 3*3 필터를 쓸까?

  • 두 이미지는 같은 결과를 내지만 파라미터의 개수에 차이가 있다
  • 작은 필터를 두 번 거치는 것이 큰 필터를 한 번 거치는 것보다 파라미터 수가 적다
  • 같은 효용을 낼 때 파라미터수가 적을수록 좋으므로 3*3 필터를 사용한다

 

 

3. GoogLeNet

  • 22개 레이어로 구성되어 있으며, 네트워크 안에 네트워크가 있는 모양이라 해서 NiN(Network in Network) 구조라 함
  • 2014 ILSVRC 우승
  • NiN을 인셉션 블록(inception block)으로 연결

inception block

  • GoogLeNet의 인셉션 구조

출처 : https://poddeeplearning.readthedocs.io/ko/latest/CNN/GoogLeNet/

  • 차원 축소를 포함한 인셉견 모듈

출처 : https://poddeeplearning.readthedocs.io/ko/latest/CNN/GoogLeNet/

(a) 인셉션(기본)

(b) 차원 축소를 포함한 인셉션

인셉션 구조 : 크기가 다른 필터(와 풀링)을 여러 개 적용하여 그 결과를 결합

 

  1. 인셉션 구조를 하나의 빌딩 블록(구성 요소)로 사용한 것이 GoogLeNet의 특징
  2. 1*1 크기 필터를 사용한 합성곱 계층을 많은 곳에서 사용(vggnet은 5*5보다 3*3이 좋다는 걸 알았다면, 여기서는 그보다 더 줄여 1*1을 사용한 것)
  3. 1*1 합성곱 연산은 채널 쪽으로 크기를 줄임 → 매개변수 제거 + 고속 처리
  4. 구조가 복잡해보이고 층이 이전에 비해 늘어났지만 오히려 파라미터의 수는 AlexNet(60M), VGGNet(100M)보다 압도적으로 적다.(GoogLeNet은 4M. *M은 million 의미)

 

4. ResNet

마이크로소프트의 팀이 개발한 네트워크이다. 지금까지보다 층을 더 깊게 할 수 있는 특별한 장치가 있다.

이전까지 딥러닝에서는 층을 깊게하여 성능 향상을 하면서도 지나치게 깊으면 오히려 성능이 떨어졌다. 그런 문제를 해결하기 위해 ResNet은 스킵 연결(skip connection)을 도입한다.

skip connection

  • 합성곱 계층을 건어뛰어, 입력 데이터를 출력에 바로 더하는 구조
  • 구조가 층의 깊이에 비례성능을 향상시킬 수 있게 한 핵심입니다.(물론 여전히 한계는 존재)

ResNet의 구성요소 : weight layer는 합성곱 계층을 이름

 

네이버부스트캠프 자료

 

  • 위와 같은 단축 경로 부재 시, 두 합성곱 계층의 출력은 $F(x)$이 된다.
  • 그러나 스킵 연결로 인해 $F(x) + x$ 가 되는 것이 핵심
  • 역전파 시 스킵 연결이 신호 감쇠를 막아줌 → 층이 깊어져도 학습이 효율적으로 이뤄짐
  • 스킵 연결
    • 입력 데이터를 그대로 흘리는 것
    • 역전파 때도 상류의 기울기를 그대로 하류로 보낸다. 여기에서의 핵심은 상류의 기울기에 아무런 수정도 가하지 않고 그대로 흘린다는 것
    • 스킵 연결로 기울기가 작아지거나 지나치게 커질 걱정 없이 앞 층에 의미 있는 기울기가 전해지리라 기대할 수 있음
    • 층을 깊게 할수록 기울기가 작아지는 소실 문제를 이 스킵 연결이 줄여줌
  • 1*1 shortcut

위에서 언급한 스킵 연결을 통한 계산식은 $F(x) + x$ 였다. 그런데 F(x)와 x의 차원이 맞지 않을 수도 있는 상황을 위해서 x에 1*1 컨볼루션을 곱해줌으로써 차원을 맞춰준다.

  • 위 그림에서는 원 논문과 동일하게 Batch Normalization(배치 정규화)가 3*3 convolution 뒤에 위치한다. 그러나 꼭 이렇게만 진행해야하는 것은 아니고 두 계산이 바뀌기도 한다고 한다.
  • Bottleneck architecture
    • 구글넷의 인셉션 구조와 동일
    • 최종적인 파라미터 수를 줄이기 위해 도입
    • 3*3컨볼루션하기 전에 먼저 1*1 conv를 통해 차원의 수를 줄여주고
    • 3*3컨볼루션을 한 후, 출력 차원수를 맞춰주기 위해 또 한번 1*1 conv을 거치면서 다시 차원 수를 늘려줌
    • 즉, 최종적인 파라미터 수를 줄이기 위해, 그리고 최종 차원을 맞춰주기 위해 각각 앞뒤로 1*1 convolution이 들어감

네이버 부스트캠프

ResNet은 VGG 신경망을 기반으로 스킵 연결을 도입하여 합성곱 계층을 2개 층마다 건너뛰면서 층을 깊게 했다. 실험 결과 150층 이상으로 해도 정확도가 계속 오르는 모습을 확인할 수 있다. 그리고 IILSVRC 대회에서 톱-5 오류율이 겨우 3.5%라는 경이로운 결과를 도출했다.

 

 

5. DenseNet

ResNet이 덧셈(element-wise곱셈 후 덧셈해주는 convolution 연산)이었다면 DenseNet은 이어붙인다.

그러나 단순히 이어붙여주기만 하면 채널 수가 기하급수적으로 늘어난다. 따라서 피쳐 맵의 크기도 증가하고 파라미터 수도 많아진다.

네이버 부스트캠프

따라서 파라미터가 기하급수적으로 증가하는 것을 막기 위해 중간중간 채널을 줄여줘야 한다 -> 1*1 컨볼루션 연산을 이용해서!

  • Dense블록에서는 피쳐 맵을 계속 키워서 컨볼루션을 기하급수적으로 키운다
  • 그리고 마지막에 transition블록에서
    • 배치 정규화를 거치고
    • 1*1 컨볼루션 연산을 통해 컨볼루션 피쳐 맵 사이즈를 줄인다.(차원 축소) => Dense block & Transition block의 반복

 

6. 요약

  • VGG : 3*3블록을 반복. receptive field를 늘리는 입장에서는 vgg처럼 3*3이 좋음
  • GoogLeNet : 1*1 convolution으로 채널 수를 줄여서 파라미터 수 줄임
  • ResNet : 스킵 커넥션으로 네트워크 깊게 쌓을 수 있게 함
  • DenseNet : concatenation(이어붙이는 것, 쌓는 것으로 생각할 수 있음)으로 피쳐맵을 더하는 것 대신, 쌓아놓으면서 더 좋은 성능을 냄

 

728x90