티스토리 뷰
[업데이트 2018.04.30 16:03]
여섯번째 요약할 논문은 "Going Deeper with Convolutions
"(https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Szegedy_Going_Deeper_With_2015_CVPR_paper.pdf) 입니다. GoogLeNet이라고 부르는 22개의 Layer를 가진 심층 신경망으로 ILSVRC 2014년에 top-5 test error 6.7%를 기록하며, 우승을 하였습니다. 그리고 Inception Module이라는 아키텍쳐 형태로 심층 신경망을 구성합니다.
NIN(Network in network, Lin 외) 논문에서 말하는 새로운 형태의 deep network structure(mlp conv layer 및 aver. pooling 사용)와 유명한 인터넷 meme(짤방)인 "we need to go deeper"(영화 Inception의 한 장면)를 결합하여 Inception이라는 code name으로 부르게 되었습니다. NIN 컨셉이 적용된 것이 Inception module이며, 아래의 Figure1 (b)와 Figure2 그림을 보면 유사한 형태임을 알 수 있습니다. 전체 네트워크의 일부에 또하나의 micro network(Inception module)를 포함하는 구조입니다.
GoogLeNet의 큰 특징은 네트워크의 depth, width가 깊어짐에도 기존 CNN 아키텍쳐보다 computing resource에 대해 효율적으로 사용하며, 성능 또한 우수함을 보여주고 있습니다. 기존 2012년 ILSVRC 우승한 Alex Net이 사용한 파라메터보다 12배나 더 적게 사용하였다고 합니다.
논문의 동기에서 알 수 있듯이 높은 성능 향상을 위해 할 수 있는 가능 쉬운 방법은 신경망의 depth와 width를 늘리는 것인데, 두가지 문제가 발생합니다. 첫째는 파라메터 개수의 증가이고, 둘째는 computing resource의 증가입니다. 본 논문에서는 depth/width는 늘리면서도(22 layers) 이러한 dense한 신경망을 sparse한 구조로 만들고, fully-connected layer를 sparse한 형태로 변경함으로써 성능 향상을 도모 하고 있습니다.
아래에서 알 수 있듯이 Inception module은 기존 layer를 입력으로 받아 여러개의 filter를 통해 각각을 convolution 또는 max pooling한 후 최종적으로 각각 만들어진 feature map을 concatenation합니다. 1x1 convolution을 3x3, 5x5 convolution전에 수행함으로써 차원 축소를 하여 파라메터 개수 및 computing resource를 줄이는 효과를 얻게 됩니다.
Inception module안에서 수행되는 convolution의 경우 모두 ReLU를 사용하고 있으며, 그 외에 reduction layer(1x1 convolution) 및 projection layer(built-in max-pooling)에서도 ReLU를 사용합니다. GoogLeNet의 경우 실제로 사용하는 것을 염두해 만든 신경망이라고 말하고 있습니다. 특히 개인 디바이스처럼 low-memory나 제한된 리소스를 가진 환경에서도 추론 등의 동작을 할 수 있도록 computational efficiency 높이는 방향으로 설계 되었습니다.
아래의 테이블1은 GoogLeNet 아키텍쳐에 대해 정리한 것으로 총 22개의 deep한 layer로 구성되어 있습니다. (pooling까지 count하면 27개, 전체 layer 개수로는 약 100개) Input의 경우 224x224x3입니다. GoogLeNet은 총 9개의 Inception module을 사용하고 있습니다. Network In Network 논문에서 사용한 Average Pooling으로 Fully-Connected Layer를 대체하였으며(많은 파라메터의 감소/오버피팅 최소화), top-1 accuracy에서 약 0.6%의 성능 향상이 있었다고 합니다.
위 컬럼의 의미는 다음과 같습니다.
1) Type : layer에 사용된 type
2) patch size/stride : convolution/pooling시 사용된 filter size 및 stride
3) output size : convolution/pooling/inception module 적용후 얻는 feature map의 size
4) depth : convolution layer의 개수.
5) #1x1 : 1x1 convolution후 얻은 feature map의 개수.
6) reduced #3x3 : Inception module안에서 3x3 convolution전에 수행되는 1x1 convolution후 얻은 feature map의 개수.
7) #3x3 : 3x3 convolution후 얻은 feature map의 개수.
8) reduced #5x5 : Inception module안에서 5x5 convolution전에 수행되는 1x1 convolution후 얻은 feature map의 개수.
9) #5x5 : 5x5 convolution후 얻은 feature map의 개수.
10) pool/proj : Inception module안에서 3x3 map-pooling후 수행되는 1x1 convolution후 얻은 feature map의 개수.
11) params : 해당 layer에서 사용된 free parameter 개수.
12) ops : 연산의 수
또한 아래의 GoogLeNet 전체 아키텍쳐에서 빨간색으로 표시된 부분은 Auxiliary classifier를 사용한 것인데, deep한 network에서 학습시 발생할 수 있는 vanishing gradient 이슈를 개선하도록 설계하였습니다. 실제 추론시에는 해당 부분은 삭제후 적용되며, 학습시에만 적용합니다. 아래와 같이 layer가 구성됩니다. Auxiliary classifier loss에 0.3 weight를 적용 후, 최종적으로 Total loss에 더합니다. (Regularization 효과)
1) average pooling 5x5 filter size/stride 3 적용, (4a) stage output 4x4x512 (4d) stage output 4x4x528
2) 1x1 convolution /w 128 filters 적용
3) fully-connected layer /w 1024 unit/ ReLU 적용
4) dropout 70% ratio 적용
학습시에는 CPU 기반으로 구현하였지만, high-end GPUs를 사용하여 1주일안에 학습을 마쳤다고 합니다. asynchronous SGD momentum 0.9, 8 epochs마다 learning rate 4% 감소시켜 학습하였다고 합니다. 또한 입력 이미지로부터 다양한 사이즈로 crop하여 학습 시켰다고 합니다.
- Total
- Today
- Yesterday
- ate
- Sea Bottom
- #ELK Stack
- Jekyll and Hyde
- ILoop Engine
- 도커
- some time ago
- #REST API
- Worry
- Memorize
- GOD
- docker
- OST
- belief
- Mask R-CNN
- #ApacheZeppelin
- aws #cloudfront
- sentence test
- Library
- Badge
- SSM
- 2D Game
- Meow
- project
- Physical Simulation
- #ApacheSpark
- English
- #TensorFlow
- Game Engine
- Ragdoll
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |