대규모 이미지 인식에 있어 convolutional network depth가 정확도에 어떤 영향을 미치는지 조사
→ 3 x 3 Conv filter를 여러 개 쌓아 기존 CNN 모델의 layer 개수를 deep하게 늘리고, 이것이 대규모 이미지 인식에서도 좋은 결과를 얻음(layer가 적층이 되니 네트워크가 deep해지는 것)
ConvNets이 computer vision 분야에서 더 상용화 되어가면서, 더 좋은 정확도를 얻기 위해 AlexNet의 기본 구조를 향상시키기 위한 많은 시도가 이루어지고 있고, ConvNet depth가 중요한 구조라고 드러냄
(LeNet-AlexNet-VggNet-Googlenet-Resnet)
→ 매우 작은 3 x 3 convolutional filters를 사용하여 더 많은 convolutional layer을 추가함으로써 network의 depth를 증가시키는 것이 가능해짐
→ 결과적으로, 상당히 더 정확한 ConvNet 구조를 구상했으며 높은 정확도를 갖고 다른 이미지 인식 dataset에도 적용 가능
training 중에 ConvNets에 대한 input은 고정된 크기의 224 x 224 RGB 이미지이고, training set의 각 pixel에서 평균 RGB값을 각 픽셀에서 뺌
입력 이미지는 3x3 filter가 적용된 ConvNet에 전달되고, 비선형성을 위해 1x1 convolutional filters도 적용함, stride=1이 적용되었고 공간 해상도를 보존하기 위해 padding도 적용함
Conv layer 다음에 적용되고 5개의 max-pooling(2 x 2, stride=2) layer가 있음
convolutional layer 다음에는 3개의 Fully-Connected(FC) layer가 있고, 첫 번째와 두 번째 FC는 4096 channel, 세 번째 FC는 1000 channels를 갖고 있는 soft-max layer
모든 hidden layer에는 활성화 함수로 ReLU를 이용했으며 AlexNet에 적용된 LRN(Local Response Normalization)는 VGG 모델의 성능에 영향이 없기 때문에 적용하지 않음
(LRN: ReLU의 양수방향으로는 입력값을 그대로 사용하게 되는데, 그렇게 되면 매우 높은값이 주변 픽셀에 영향을 미침 → 다른 activation map의 같은 위치에 있는 픽셀끼리 정규화 적용, 강한 자극을 약하게 만드는 정규화))
Table 1에 깊이가 다른 모델 A~E의 NET가 있음: 11~19 범위의 깊이로 실험이 진행되었고, 넓이(channels)는 각 max-pooling layer 이후에 2배씩 증가하여 512에 도달
Table2는 각 배치의 parameter 수: 깊은 depth에도 얕은 net과 비교해서 weights의 수가 많지 않음
VGG는 전체에 stride=1인 3x3 필터 사이즈만을 사용함: 3x3(x2) = 5x5, 3x3(x3) = 7x7
→ 3x3을 여러 겹 이용하게 되면 하나의 relu 대신 2개, 3개의 relu를 이용할 수 있음
→ parameter 수를 감소시킴: C개의 channel를 가진 3개의 3x3 filter를 이용하면 연산량은 3x3x3xCxC=27C^2가 되고, C개의 channel를 가진 1개의 7x7 filter를 이용하면 연산량은 7x7x1xCxC=49C^2가 됨
1x1 conv layer: receptive field Conv layer가 아니지만, ****비선형성을 부여하기 위한 용도이며, 입력과 출력의 channels를 동일하게 하고 1x1 conv layer를 이용하면 relu 함수를 거치게 되어 추가적인 비선형성이 부여됨
학습 과정은 입력 이미지 crop 방법을 제외하고 AlexNet과 동일하게 진행
multinomial logistic regression을 mini-batch gradient descent로 최적화를 시켜 수행
batch size = 256, momentum = 0.9, weight decay(L2) = 0.00005, dropout=0.5, epoch = 74, learning rate = 0.01(10배씩 감소)
AlexNet과 비교하여 VGG 모델이 깊고 더 많은 parameter를 갖고 있음에도 더 적은 epoch가 요구되는데, implicit regularisation(더 작은 conv filter size로 깊은 depth를 생성)과 pre-initialisation 덕분
pre-initialisation
bad initialisation은 gradient의 불안정함 때문에 학습을 지연시키고, 이를 해결하기 위해 pre-initialisation을 이용 → 가장 얕은 구조인 A의 처음 3개와 마지막 3개의 FC layer의 가중치를 이용하여 최적의 가중치 초기값을 설정, 중간 layer은 randomly로 초기화
Training image size
VGG 모델을 학습시킬 때, training image를 VGG 모델의 Input size에 맞게 바꿔줘야함
S가 (S는 트레이닝 이미지의 Scale 파라미터) 224인 경우, training image의 가로, 세로 중 더 작은 쪽을 224에 맞춰 원 사이즈의 비율을 지키며 사이즈를 rescaling 함(isotropically-rescaled)
rescale 된 이미지에서 random 하게 224 x 224 size로 crop을 하여 input size를 맞춤
input size
앞서 training image를 rescale 하는 것처럼 VGG 모델을 test 할 때에도 rescale을 적용: 이때, Q가 (테스트 이미지의 Scale 파라미터) S와 같을 필요는 없는데 각각의 S값마다 다른 Q를 적용 시 VGG 모델의 성능이 좋아짐
그 다음, test를 수행할 때는 FC layer를 Conv layer로 바꿔줌: 첫 번째 FC layer를 7 x 7 conv layer로 바꾸고, 마지막 두 FC layer를 1 x 1 conv layer로 바꾼 뒤, 전체 이미지(uncropped image)에 적용(fully-convolutional net)
→ FC layer는 MLP개념으로, 입력 노드의 수가 항상 정해져있고 똑같아야 하지만, convolution 연산에서는 그런 제약이 없어지게 됨
그 결과 channel 수가 class 수와 동일한 class score map과 input image에 따른 spatial resolution 이 생성
마지막으로, 이미지의 class score의 고정된 크기의 vector을 얻기 위해 class score map을 spatially averaged함(mean or average pooling)
또한, test set를 horizontal flipping aumentation을 하였고, image의 final score를 얻기 위해 원본의 flipped image를 softmax 사후확률들을 평균화함
C++ Caffe 를 이용해서 구현됨
4-GPU system에서 학습 시간은 2~3주가 소요되었고 이는 single GPU보다 3.75배 빠름
Dataset
dataset은 1000개의 클래스에 대한 이미지들이 포함
평가기준은 top-1, top-5 error를 이용하였으며 전자는 예측이 잘못된 이미지의 비율, 후자는 top-5 예측된 범주에 정답이 없는 이미지의 비율
single scale evaluation: test시 image size(scale)가 고정되어 있는것
→ single scaling training: Q=S로 고정
→ multi scaling training: S=256~512, Q는 min, max의 0.5인 384로 고정
1) AlexNet에서 이용되었던 LRN(local response normalisation)이 효과가 없음
2) 깊이가 깊어질수록 error가 감소: C가 D보다 성능이 낮고 B보다 성능이 높음→ 추가적인 비선형성은 도움이 되고 conv filter를 사용하여 공간적인 맥락을 포착하는 것이 중요하며, 5x5 filter를 이용하는 것보다 3x3 filter를 2개 이용하는 것이 성능 향상에 도움이 됨
3) 다양한 scale[256~512]로 resize한 것이 고정된 scale의 training image보다 성능이 좋음: 다양한 scale의 training set augmentation는 이미지의 통계값을 다양한 척도로 포착하는 데에 도움이 됨
test 에서의 scale jittering의 성능을 확인: 고정된 S 사이즈의 경우, Q = {S - 32, S, S + 32}로 평가하였고, 변하는 S 사이즈의 경우, Q = {Smin, 0.5(Smin + Smax), Smax}로 평가
→ test 에서 다양한 스케일로 evaluation한 결과 Q를 고정한 값 보다 더 좋은 결과 기록
여기서는 multi crop과 dense를 평가 방법으로 이용했을 때 어떤 결과를 보였는지에 대해 비교: multi crop이 dense보다 더 좋은 결과를 보였고, 이 둘을 섞어 사용한 것이 제일 좋은 결과
dense evaluation: 이미지를 일정한 픽셀간격으로 마치 sliding window를 적용하듯이 결과를 끌어내는 기법
7개의 모델의 앙상블을 사용하였을 때 가장 좋은 성능을 보였으며, 2위를 달성할 수 있었고 이후에 따로 실험한 결과, D와 E 2개만 앙상블 했을 때 결과가 더 좋았다고 함
분류 성능에 있어 네트워크의 깊이를 상당히 늘려도 좋은 결과를 보임