LeNet-5
얀 르쿤은 1998년 우편물에 필기체로 쓰인 우편변호를 인식하는 최초의 컨벌루션 신경망인 `LeNet-5`를 선보였다.
모델 구조
LeNet-5는 컨벌루션 계층과 풀링 계층을 2번 반복한 뒤 완전 연결 3계층으로 연결되는 구조이다. 컨벌루션 계층과 풀링 계층은 생체 신경망의 시각 영역을, 완전 연결 계층은 연관 영역을 모델링했다.
- 입력 데이터는 (32 x 32 x 1) 이미지
- 컨벌루션 계층은 (5 x 5) 필터(stride=1)
- 활성 함수는 시그모이드 혹은 하이퍼볼릭 탄젠트
- 풀링 계층은 (2 x 2) 필터(stride=2)로 평균 풀링을 통해 액티베이션 맵의 크기를 절반으로 감소
- 완전 연결 계층은 액티베이션 맵과 같은 크기의 (5 x 5 x 16) 컨벌루션 필터 120개로 크기가 120인 1차원 벡터 변환
- 파라미터는 약 60K개로 작은 모델
AlexNet
`이미지넷(ImageNet)`은 약 1,400만 개의 이미지로 구성된 세계에서 가장 방대한 이미지 데이터 베이스로서 2만여 개의 카테고리를 포함한다. 2010년부터 매년 1,000개의 클래스에 대한 이미지 분류 및 객체 인식 부문으로 이루어진 ILSVRC 대회가 개최되고 있다. `알렉스넷(AlexNet)`은 ILSVRC 2012 대회에서 객체 인식 오류율을 25.6%에서 16.4%로 낮추며 1위를 차지한 최초의 CNN 모델이다.
모델 구조
병렬처리 방식
AlexNet은 2개의 GPU(GTX 580)에서 실행되는 병렬처리 구조로 설계되었다. 컨벌루션 필터를 두 그룹으로 나눈 뒤 그룹별로 GPU를 할당하여 처리하고 중간 계층에서 정보를 교환하며 최종 결과를 한쪽 그룹으로 합친다. AlexNet의 구조에서 첫 번째 계층에 (227 x 227 x 3) 이미지가 입력 데이터로 들어오면 그룹별로 48개 컨벌루션 필터가 컨벌루션 연산을 수행한다. 이후 정보를 교환하기 위해 CONV3와 CONV5, FC6, FC7 계층에서 그룹 간에 출력을 교환하며 출력 계층인 FC8에서 전체 결과를 합친다. 이미지넷으로 AlexNet을 훈련했을 때 5~6일 정도 소요되었다.
모델 구조
AlexNet은 'CONV-CONV-CONV-CONV-CONV-FC-FC-FC'로 컨벌루션 5계층과 완전 연결 3계층이 연결된 8계층 모델이다. 풀링은 컨벌루션 계층에 포함된다.
- CONV1 : '11 x 11, 4'(11 x 11 필터, stride=4) 컨벌루션 연산, '3 x 3, 2'로 맥스 풀링, `LRN(Local Response Normalization)` 정규화
- 상대적으로 큰 컨벌루션 필터와 스트라이드를 사용하므로 학습이 잘 안되는 문제
- 맥스 풀링은 한 픽셀씩 겹치게 풀링
- LRN 정규화는 픽셀별로 이웃 채널의 픽셀을 이용하여 정규화하는 방식으로 지금은 사용 x
- ReLU의 출력이 무한히 커질 수 있으므로 이를 막기 위한 정규화
- CONV2 : '5x5, 1' 컨벌루션 연산, '3 x 3, 2' 맥스 플링, LRN 정규화
- CONV3 : '3x3, 1' 컨벌루션 연산
- CONV4 : '3x3, 1' 컨벌루션 연산
- CONV5 : '3x3, 1' 컨벌루션 연산, '3 x 3, 2' 맥스 풀링
- FC6 : 드롭아웃
- FC7 : 드롭아웃
- FC8 : 출력(1000개)
해당 모델에서 파라미터는 FC 계층에 집중된다. 초기 컨벌루션 신경망 모델들은 생체 신경망의 연관 영역을 모델링하기 위해 FC 계층을 포함하지만, 파라미터가 과도하게 사용된다. 따라서 GoogleNet 이후 나온 모델들은 파라미터를 줄이기 위해 출력 계층을 제외하고 모든 계층을 컨벌루션 계층으로 구성한다.
훈련 방식
- ReLU, LRN, Dropout(p=0.5), L2 정규화(lambda=5e-4), 데이터 증강과 같은 다양한 정규화 기법 적용
- 모델 7개로 구성된 앙상블을 사용해서 오류율 감소
- 최적화 알고리즘은 SGD 모멘텀을 사용하며 배치 크기는 128
- 학습률은 1e-2로 시작해 검증 정확도가 증가하지 않을 때 학습률 감소(learning rate decay) 실행
ZFNet
`ZFNet`은 ILSVRC 2013 대회에서 우승한 모델로 모델 시각화 방식으로 알렉스넷의 문제점을 분석하고 개선했다.
모델 구조
ZFNet의 기본 구조는 AlexNet과 같지만, 일부가 개선되었다.
- CONV1의 컨벌루션을 '11 x 11, 4'에서 '7 x 7, 2'로 수정
- CONV3, CON4, CONV5의 필터 개수를 384, 384, 256개에서 512, 1024, 512로 조정
- 모델을 GTX 580 GPU 하나로 훈련하기 위해 두 그룹을 하나로 합침
ZFNet에서 CONV1 컨벌루션 연산을 수정한 이유는 AlexNet을 시각화해본 결과 첫 번째 계층이 잘 학습되지 않는다는 것을 발견했기 때문이다. 이는 지나치게 크게 설게된 수용 영역 때문이었는데 컨벌루션 필터와 스트라이드를 조정한 뒤 정상적으로 학습이 되었고 이를 시각화해서 확인했다. 다음 그림을 보면 (b)와 (d)는 각각 AlexNet의 특징이며 (c)와 (e)는 ZFNet의 특징이다. AlexNet의 특징은 까맣게 죽은 특징이 많고 특징에 잡음이 섞여 있지만 ZFNet은 특징이 선명하게 포착되는 것을 확인할 수 있다. ZFNet은 GTX 580 GPU로 12일 동안 훈련하였으며 AlexNet의 10%에 해당하는 데이터만을 사용해 성능을 향상시켰다. 이는 하이퍼파라미터 튜닝만 잘해도 모델 성능이 매우 향상될 수 있음을 말해준다.
모델 시각화 방식
ZFNet의 가장 이상적인 성과는 컨벌루션 신경망을 시각화해서 모델의 학습 과정과 학습 내용을 이해할 수 있게 되었다는 점이다. 컨벌루션 신경망의 계층별 학습 내용을 시각화함으로써 입증된 사실은 다음과 같다.
- 컨벌루션 신경망의 계층이 높아질수록 수용 영역이 넓어지고 지역적 특징에서 전역적 특징으로 학습 내용 변화
- 컨벌루션 신경망 학습은 낮은 계층에서 먼저 학습되기 시작해 점점 높은 계층으로 학습 진행
- 컨벌루션 신경망은 입력에 작은 변화가 있어도 동일한 결과를 출력하는 위치불변성을 갖음
- 컨벌루션 신경망은 특징을 포착할 때 모양은 물론이고 위치까지 가늠
ZFNet에서 사용한 시각화 방법은 역연산으로 액티베이션 맵을 픽셀 공간으로 투영하는 방법이다. 이를 위해 컨벌루션 신경망과 짝을 이루며 컨벌루션 연산의 역연산인 디컨벌루션을 수행하는 `디컨벌루션 네트워크(deconvolutional network)`를 만들었다. 특정 계층에 액티베이션 맵을 시각화하려면, 짝을 이루는 디컨벌루션 계층에 액티베이션 맵을 입력해서 입력 계층 방향으로 디컨벌루션을 수행하면 된다. 디컨벌루션 연산의 순서는 다음과 같다.
- 컨벌루션 계층을 '컨벌루션 - ReLU - 맥스 풀링' 순서로 실행하면서 스위치(switch) 변수에 맥스 풀링한 최댓값의 위치를 기억
- 디커벌루션 계층은 반대로 '맥스 언풀링 - ReLU - 트랜스포즈 컨벌루션' 순서로 실행하며 스위치 변수를 사용해 맥스 언풀링을 수행(트랜스포즈 컨벌루션 필터는 컨벌루션 필터의 전치)
컨벌루션 신경망의 계층별 시각화 결과를 보면, 첫 번째 계층은 주로 에지와 색을 인식한다. 기울기가 상이한 에지를 구분하고, 서로 다른 색도 구분한다. 두 번째 계층은 에지들로 이루어진 모양을 인식한다. 세 번째 계층은 비슷한 질감을 갖는 복잡한 형태를 인식한다. 특히 세 번째 계층에서는 위치불변성에 따라 객체가 약간 이동해도 같은 컨벌루션 필터로 인식한다. 네 번째 계층은 사물이나 개체의 일부를 특징으로 인식하며, 다섯 번째 계층은 사물이나 개체의 위치 및 자세 변화를 포함한 전체적인 모습을 인식한다.
VGGNet
`VGGNet`은 ILSVRC 2014 대회에서 2위를 수상한 모델로 작은 필터를 사용하는 대신 깊은 신경망을 만들자는 아이디어로 설계되었다. 성능은 당시 구글넷에 조금 못 미쳤지만 (3 x 3) 컨벌루션 필터만을 사용하며, 컨벌루션 연산과 맥스 풀링 연산이 규칙적으로 배치되어 매우 단순한 구조로 이루어져 지금까지도 많이 쓰인다.
설계 사상
VGGNet은 신경망이 깊어질수록 수용 영역이 넓어지는 원리를 이용하여 필터를 작게 만들어서 파라미터 수를 줄이고 대신 신경망을 깊게 하여 수용 영역이 충분하도록 설계했다. 뉴런의 수용 영역은 컨벌루션 필터의 크기, 스트라이드, 계층에 따라 정해진다. 예를 들어 수용 영역이 5인 뉴런을 만드는 경우 한 계층에 크기가 5인 컨벌루션 필터를 사용해도 되지만, 두 계층에 각각 크기가 3인 컨벌루션 필터를 사용할 수도 있다. 두 방식 중 어떤 방식의 성능이 좋은지는 단정지을 수 없지만, 작은 필터를 사용해서 여러 계층으로 쌓는 방식이 파라미터 수를 줄이는 방식이다. 이러한 방식을 통해 VGGNet은 깊이가 8계층에서 19계층으로 깊어졌다.
모델 구조
VGGNet은 11계층, 13계층, 16계층, 19계층이 있으며 이 중 16계층 모델이 'VGG16'이라는 이름으로 가장 많이 사용한다. 19계층 모델인 'VGG19'의 경우 VGG16보다 파리미터 수는 많지만 성능 차가 크지 않아 많이 사용하지 않는다. VGG16의 모델 구조를 보면, 출력 크기에 따라 컨벌루션 계층을 그룹으로 묶으며 각 그룹마다 (3 x 3) 컨벌루션을 2회 또는 3회 수행한다. 이를 통해 Conv1 - Conv2 - Conv3 - Conv4 - Conv5이 완전 연결 계층으로 연결되는 구조이다. 여기서 그룹이 바뀔 때는 맥스 풀링을 수행하기 때문에 액티베이션 맵의 크기는 1/2가 되지만, 컨벌루션 필터 개수가 64, 128, 256, 512개로 Conv5을 제외하면 2배씩 늘어나 깊이가 2배씩 늘어난다.
VGGNet은 이미지의 특징을 추출할 때 많이 사용한다. 그 중 FC7 계층의 특징은 이미지를 설명하는 컨텍스트 벡터로 쓰인다. 이는 FC7이 출력 직전의 계층이므로 이미지 표현이 가장 추상화된 상태이기 때문이다. 예를 들어 이미지 캡션을 생성할 때 이미지의 컨텍스트 벡터로 사용하거나, GAN 기반으로 이미지를 변환할 때 원래 이미지와 변환된 이미지의 유사도 측정에 사용되기도 한다. 또한 VGGNet은 초기 계층의 메모리 사용량이 많고 후반 FC 계층에 파라미터가 집중되어 있다. 전체 메모리 사용량은 96M이고 전체 파라미터 수는 138M이다.
GoogleNet
`GoogleNet`은 ILSVRC 2014 대회에서 우승을 차지한 모델이다. GoogleNet이 InceptionV4로 발전했기 때문에 `InceptionV1`이라고 부르기도 한다. GoogleNet은 전형적인 컨벌루션 신경망의 구조를 탈피하여 네트워크 모듈을 쌓는 방식의 `네트워크 속 네트워크(NIN: Network In Network)` 구조로 설계되었다. 전체 파라미터 수는 5M으로 AlexNet보다 12배 적으면서 깊은 신경망을 실현할 수 있는 효율적인 구조를 이룬다. GoogleNet의 네트워크 모듈을 `인셉션(Inception)`이라고 부른다.
설계 사상
시스템이 `희소(sparsity) 성질`을 가지면 극히 일부 구성 요소 사이에만 상호작용이 일어나며, `조밀(density) 성질`을 가지면 대부분의 구성 요소 사이에 상호 작용이 일어난다. 인공 신경망은 상관성이 있는 출력끼리 연결된 희소 연결 구조를 갖는 것이 성능이나 컴퓨팅 자원의 효율성 측면에서 바람직하지만, 하드웨어의 연산 효율 측면에서는 조밀 성질을 갖는 구조가 더 효율적이다. 인셉션 모듈은 성능과 컴퓨팅 자원의 효율성을 높이기 위한 희소 연결 구조를 가지면서 동시에 하드웨어의 연산 효율을 위해 조밀 연산을 하도록 설계되었다. 즉, 어느 계층을 구성하는데 필요 없는 역할은 연결할 필요가 없으므로 `희소 연결`을 하며, 하드웨어 연산 효율을 높이기 위해 모든 역할의 결과를 합쳐서 `조밀 연산`을 한다. 여기서의 `역할 분리`는 다음과 같다.
- (1 x 1) 컨벌루션 : 채널 특징을 인식
- (3 x 3), (5 x 5) 컨벌루션 : 서로 다른 크기의 수용 영역에서 공간 특징과 채널 특징을 통합적으로 인식
- 맥스 풀링 : 가장 두드러진 특징을 인식
인셉션 모듈(Inception module)
다음 그림은 역할 분리, 희소 연결, 조밀 연산이라는 인셉션 모듈의 설계 사상에 따라 정의된 `기본 인셉션 모듈(naive inception module)`이다. 기본 인셉션 모듈은 좋은 설계 사상을 가졌지만 한 가지 문제점이 있다. 이는 데이터의 채널 수가 과도하게 증가하는 문제이다. 구조적으로 맥스 풀링은 입력과 출력의 채널 수가 동일하므로 다른 컨벌루션 결과를 합치면 채널 수가 증가할 수밖에 없다. 채널 수가 증가하면 그에 비례하여 연산량도 증가한다.
이러한 기본 인셉션 모듈의 문제를 해결하기 위해 개선된 인셉션 모듈은 `병목 계층(bottleneck layer)`를 두어 채널 수와 연산량을 대폭 줄였다. 병목 계층은 (1 x 1) 컨벌루션으로 채널의 차원을 축소하는 계층이다. 컨벌루션은 연산 전에 병목 계층을 두어 채널 수를 줄이고, 맥스 풀링은 연산 후에 병목 계층을 두어 차원을 줄인다. 이러한 병목 계층이 추가됨에 따라 연산량이 대폭 감소한다.
모델 구조
GoogleNet의 구조는 `스템(Stem)`, `몸체(body)`, `최종 분류기(final classifier)`, `보조 분류기(auxiliary classifier)`로 나뉘며 22계층으로 구성된다. 인셉션 모듈을 2계층으로 계산하면 9개 인셉션 모듈은 총 18개층이 되며, 여기에 컨벌루션 3계층과 FC 1계층을 더하면 22계층이 된다. 22계층에는 파라미터를 갖는 계층만 포함되어 풀링 계층은 제외한다.
- 스템(stem) : 신경망 도입부로 인셉션 모듈의 효과가 없이 일반적인 컨벌루션과 풀링으로 구성(Conv-Pool-Conv-Conv-Pool)
- 몸체(body) : 인셉션 모듈을 9개 쌓은 구조로, 1,3,8번째 인셉션 모듈 전에 맥스 풀링을 두어 액티베이션 맵의 크기를 감소
- 최종 분류기(final classifier) : 완전 연결 계층 대신 평균 풀링을 사용해 파라미터 수를 대폭 감소(AvgPool-FC-Softmax)
- 보조 분류기(auxiliary classifier) : 2개의 보조 분류기를 사용, 하위 계층에 그레이디언트를 원할히 공급 및 정규화 역할 수행
- 훈련 용도로만 사용하며 테스트할 떄는 사용 X(AvgPool-1x1 Conv-FC-FC-Softmax)
ResNet
`ResNet`은 2015년 ILSVRC 대회와 COCO 대회의 분류 및 탐지 모든 부문에서 우승을 차지한 모델이다. ResNet도 GoogleNet과 마찬가지로 네트워크 모듈을 여러 계층으로 쌓는 네트워크 속 네트워크(NIN) 구조로 설계되었다. ResNet은 GoogleNet의 22계층과 비교했을 때 152계층의 매우 깊은 신경망이다. ResNet이 이처럼 깊은 신경망을 구성할 수 있었던 비결은 `잔차 연결(residual connection)`을 가지는 구조 때문이다. ResNet의 네트워크 모듈을 `레즈 블록(residual block)`이라고 한다.
설계 사상
학습을 통해 좋은 성능을 갖게 된 20계층 신경망 모델이 있을때, 이 모델에 계층을 추가하여 56계층 모델로 만들면 성능이 좋아지기보단 오히려 훈련과 테스트 오류가 모두 커지는 현상이 생긴다. 이는 테스트 오류가 훈련이 진행될수록 감소하기 때문에 과적합이라고 볼 수는 없으며, 신경망이 깊어지면서 그레이디언트 소실이 발생했다고 보는 편이 더 합리적이다. 모델을 깊게 하더라도 최소한 얕은 모델 이상의 성능을 나오게 하려면 얕은 모델을 낮은 계층에 복사하고 그 위에 `항등 매핑(identity mapping)` 계층을 쌓으면 된다. 항등 매핑 계층은 입력을 그대로 출력하고 그레이디언트도 그대로 전달하기 때문에 성능을 저하시키지 않는다. 여기서 더 나아가 학습 여부에 따라 학습이 필요하면 입/출력 매핑을 학습하고, 학습이 필요 없으면 입력을 그대로 통과하는 방법이 있다.
레즈 블록
위의 설계 사상으로 만들어진 것이 바로 레즈 블록이다. 레즈 블록의 모습은 다음과 같다. 레즈 블록은 컨벌루션 계층이 포함된 학습 경로와 항등 함수로 정의된 항등 매핑 경로로 구성된다. 입력 데이터는 두 경로를 따라 실행되며 실행 결과는 더해져 출력 데이터가 된다. 레즈 블록의 항등 매핑을 잔차 연결이라고 한다. 잔차 연결은 학습이 필요 없을 때 입력을 그대로 전달하는 역할과 그레이디언트가 잘 흐를 수 있는 지름길 역할을 수행한다.
레즈 블록은 x를 입력하면 항등 매핑 경로에서는 x를 출력하고, 학습 경로에서는 F(x)를 출력하므로 두 경로의 출력을 더한 H(x) = F(x) + x를 출력한다. 따라서 학습 경로에서는 모듈의 입력과 출력의 차이인 잔차 F(x) = H(x) - x를 학습한다. 학습 경로에서 잔차를 학습하기 때문에 학습 경로를 `잔차 경로(residual path)`라고 부른다. 또한 레즈 블록에는 두 가지 경로가 있어 블록을 깊게 쌓을수록 입력에서 출력까지 갈 수 있는 경로가 다양해진다. 모델을 실행할 때마다 매번 입력 데이터가 다른 경로로 갈 수 있으므로 마치 여러 모델을 실행하는 것과 같은 앙상블 효과가 있다.
모델 구조
ResNet 구조는 스템, 몸체, 분류기로 나뉘며 18계층부터 34계층, 50계층, 101계층,152계층까지 총 다섯 가지 모델로 구성된다.
- 스템 : 신경망 도입부로 (7 x 7) 컨벌루션 계층으로 구성
- 몸체 : 레즈 블록을 쌓은 부분으로 모델 구성에 따라 쌓는 규칙이 변화
- 분류기 : FC 계층을 제거하고 `전역 평균 풀링(global average pooling)`을 사용해서 파라미터 수 감소
- FC 계층은 클래스 출력을 위한 1000계층만 존재(GlobalAvgPool-FC-Softmax)
- 전역 평균 풀링은 채널별로 평균을 계산해 1차원 벡터로 축소하는 방법(1차원 벡터 크기는 채널 수와 동일)
모델 구성별로 레즈 블록을 쌓는 방식이 다르다. 출력 크기에 따라 conv1, conv2_x, conv3_x, conv4_x, conv5_x로 계층 그룹을 나누고 그룹별로 레즈 블록을 여러 번 반복한다. 그룹이 바뀔 때는 스트라이드 2 컨벌루션으로 크기는 반으로 줄이고 깊이는 2배 늘린다.
50계층 이상인 경우에는 계산 효율을 위해 병목 계층을 추가한 레즈 블록을 사용한다. 병목 계층이 추가된 레즈 블록은 (3 x 3) 컨벌루션 전후로 (1 x 1) 컨벌루션이 있다. 입력 채널이 256개라면 (1 x 1) 컨벌루션으로 채널을 64개로 줄여서 (3 x 3) 컨벌루션 연산을 한 뒤 다시 (1 x 1) 컨벌루션을 통해 채널을 256개로 복구한다.
컨벌루션 신경망 비교
- AlexNet : 초기 모델인 만큼 모델은 크고 연산량과 정확도는 낮은 편
- VGGNet : 모델이 크고 연산량도 가장 많지만 구조가 단순
- GoogleNet : 모델도 작고 연산량도 적은 효율적인 모델
- ResNet : 모델 크기와 연산량은 중간 정도지만 정확도가 매우 높음
- InceptionV4 : ResNet보다 모델 크기와 연산량이 조금 커졌고 정확도도 상승
본 포스팅은 'Do it! 딥러닝 교과서'를 공부하고 작성한 글입니다.