AlexNet의 이해

박재한·2022년 2월 21일
4

Deep Learning

목록 보기
7/22

참고
AlexNet은 2012년에 개최된 ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회의 우승을 차지한 컨볼루션 신경망(CNN) 구조이다. CNN의 부흥에 아주 큰 역할을 한 구조라고 말할 수 있다. AlexNet의 original 논문명은 "ImageNet Classification with Deep Convolutional Neural Networks"이다. 이 논문의 첫번째 저자가 Alex Khrizevsky이기 때문에 그의 이름을 따서 AlexNet이라고 부른다.
Imgur

1.AlexNet의 구조

AlexNet의 기본구조는 LeNet-5와 크게 다르지 않다. 2개의 GPU로 병렬연산을 수행하기 위해서 병렬적인 구조로 설계되었다는 점이 가장 큰 변화이다.(GTX-580 3GB 2개로 90 ecoch 돌리는데 5~6일이 걸렸다고 한다.)
AlexNet의 구조도를 살펴보자.
Imgur
AlexNet은 8개의 레이어로 구성되어 있다. 5개의 컨볼루션 레이어와 3개의 full-connected 레이어로 구성되어 있다. 두번째, 네번째, 다섯번째 컨볼루션 레이어들은 전 단계의 같은 채널의 특성맵들과만 연결되어 있는 반면, 세번째 컨볼루션 레이어는 전 단계의 두 채널의 특성맵들과 모두 연결되어 있다는 것을 집고 넘어가자.
이제 각 레이어마다 어떤 작업이 수행되는지 살펴보자. 우선 AlexNet에 입력 되는 것은 227 x 227 x 3 이미지다. (227 x 227 사이즈의 RGB 컬러 이미지를 뜻한다.) 그림에는 224로 되어 있는데 잘못된 것이다.(좀 더 관련 문서들을 찾아서 확인해 보니 논문(paper)에는 224로 나와있으나 그것은 잘못된 표기이고 이후에 227이 맞다고 정정하였다.)

1.1 1st Layer(Convolution Layer)

  • 96개의 11 x 11 x 3 사이즈 커널로 입력 영상을 컨볼루션해준다.
  • 컨볼루션 보폭(stride)를 4로 설정했고, zero-padding은 사용하지 않았다. zero-padding은 컨볼루션으로 인해 특성맵(Feature map)의 사이즈가 축소되는 것을 방지하기 위해, 또는 축소되는 정도를 줄이기 위해 영상의 가장자리 부분에 0을 추가하는 것이다. 결과적으로 55 x 55 x 96 특성맵(96장의 55 x 55 사이즈 특성맵들)이 산출된다.((227-10) / 4 = 54.24, 올림처리하면 55, 10은 kernel로 인해 줄어드는 크기, 4는 stride)
  • 그 다음에 ReLU 함수로 활성화해준다.
  • 이어서 3 x 3 overlapping max pooling이 stride 2로 시행된다. 그 결과 27 x 27 x 96 특성맵을 갖게 된다.(stride가 2라서 끝지점은 55/2=27.5, 27*2=54이고 54에서 3칸 차지하면 56이니깐 마지막 1은 의미없고 55까지 모두 필터링할 수 있다. 따라서 27X27크기가 나온다.)
  • 그 다음에는 수렴 속도를 높이기 위해 local response normalization이 시행된다. local response normalization은 특성맵의 차원을 변화시키지 않으므로, 특성맵의 크기는 27 x 27 x 96으로 유지된다.(96이 GPU 2개로 나뉘어져서 48+48이 된다.) (LRN은 convolution이나 pooling시 특정 픽셀의 값이 매우 높아서 주변에 영향을 주는 것을 방지하고자 다른 맵의 같은 위치에 있는 pixel끼리 정규화(normalization)를 해 준다.)

1.2 2nd Layer(Convolution Layer)

  • 128개의 5 x 5 x 48 커널을 2번 사용하여 전 단계의 특성맵을 컨볼루션해준다. stride는 1로, zero-padding은 2로 설정했다. 따라서 27 x 27 x 256 특성맵(256장의 27 x 27 사이즈 특성맵들)을 얻게 된다. (전단계에서 96개의 특성맵이 48개씩 GPU 2개로 분산되었기 때문에 5X5X48 사이즈의 커널을 각각의 GPU에 1번씩 총 2번을 적용시켰다. 결과도 128개씩 2개가 나온다. padding이 있어 convolution후 사이즈는 변화가 없다.)
  • 역시 ReLU 함수로 활성화한다.
  • 그 다음에 3 x 3 overlapping max pooling을 stride 2로 시행한다. 그 결과 13 x 13 x 256 특성맵을 얻게 된다.
  • 그 후 local response normalization이 시행되고, 특성맵의 크기는 13 x 13 x 256으로 그대로 유지된다.

1.3 3rd Layer(Convolution Layer)

  • 384개의 3 x 3 x 256 커널을 사용하여 전 단계의 특성맵을 컨볼루션해준다.(3번째 layer에서는 각각의 GPU 채널이 전단계의 GPU 채널 2개 모두와 연결되어 있으므로 하나의 GPU 채널당 13X13X128X2의 특성맵을 3X3X256의 커널로 convolution한다. 결과는 하나의 GPU 채널당 192개가 나와서 모두 384개가 된다.)
  • stride와 zero-padding 모두 1로 설정한다. 따라서 13 x 13 x 384 특성맵(384장의 13 x 13 사이즈 특성맵들)을 얻게 된다.
  • 역시 ReLU 함수로 활성화한다.

1.4 4th Layer(Convolution Layer)

  • 192개의 3 x 3 x 192 커널을 각 GPU 채널당 1번씩 2번 사용해서 전 단계의 특성맵을 컨볼루션해준다.
  • stride와 zero-padding 모두 1로 설정한다. 따라서 13 x 13 x 384 특성맵(384장의 13 x 13 사이즈 특성맵들)을 얻게 된다.
  • 역시 ReLU 함수로 활성화한다.

1.5 5th Layer(Convolution Layer)

  • 128개의 3 x 3 x 192 커널을 각 GPU 채널당 1번씩 2번 사용해서 전 단계의 특성맵을 컨볼루션해준다.
  • stride와 zero-padding 모두 1로 설정한다. 따라서 13 x 13 x 256 특성맵(256장의 13 x 13 사이즈 특성맵들)을 얻게 된다.
  • 역시 ReLU 함수로 활성화한다.
  • 그 다음에 3 x 3 overlapping max pooling을 stride 2로 시행한다. 그 결과 6 x 6 x 256 특성맵을 얻게 된다.

1.6 6th Layer(Fully connected Layer)

  • 6 x 6 x 256 특성맵을 flatten해줘서 6 x 6 x 256 = 9216 개의 1차원 벡터로 만들어준다.
  • 그것을 여섯번째 레이어의 4096개의 뉴런과 fully connected 해준다.(각 GPU 채널당 2048개)
  • 그 결과를 ReLU 함수로 활성화한다.

1.7 7th Layer(Fully connected Layer)

  • 4096개의 뉴런으로 구성되어 있다. 전 단계의 4096개 뉴런과 fully connected되어 있다.(각 GPU 채널당 2048개이다.)
  • 출력 값은 ReLU 함수로 활성화된다.

1.8 8th Layer(Fully connected Layer)

  • 1000개의 뉴런으로 구성되어 있다. 전 단계의 4096개 뉴런과 fully connected되어 있다.
  • 1000개 뉴런의 출력값에 softmax 함수를 적용해 1000개 클래스 각각에 속할 확률을 나타낸다.

총, 약 6천만개의 파라미터가 훈련되어야 한다. LeNet-5에서 6만개의 파라미터가 훈련되야했던 것과 비교하면 천배나 많아졌다. 하지만 그만큼 컴퓨팅 기술도 좋아졌고, 훈련시간을 줄이기 위한 방법들도 사용되었기 때문에 훈련이 가능했다. 예전 기술 같으면 상상도 못할 연산량이다.

2. AlexNet 좀 더 깊이 들여다 보기

2.1 ReLU 함수

활성화 함수로는 LeNet-5에서 사용되었던 Tanh 함수 대신에 ReLU 함수가 사용되었다. ReLU는 rectified linear unit의 약자이다. 같은 정확도를 유지하면서 Tanh을 사용하는 것보다 6배나 빠르다고 한다. AlexNet 이후에는 활성화함수로 ReLU 함수를 사용하는 것이 선호되고 있다.
Imgur

2.2 Drop-out

과적합(over-fitting)을 막기 위해서 규제 기술의 일종인 dropout을 사용했다. dropout이란 fully-connected layer의 뉴런 중 일부를 생략하면서 학습을 진행하는 것이다. 몇몇 뉴런의 값을 0으로 바꿔버린다. 따라서 그 뉴런들은 forward pass와 back propagation에 아무런 영향을 미치지 않는다. dropout은 훈련시에 적용되는 것이고, 테스트시에는 모든 뉴런을 사용한다.
즉 특정한 뉴런의 weight에 치중하여 학습하지 않고 모든 뉴런에 대해 골고루 학습하여 이를 평균내면 좀 더 균형있고 좋은 결과를 얻을 수 있다.
Imgur

2.3 Overlapping pooling

CNN에서 pooling의 역할은 컨볼루션을 통해 얻은 특성맵의 크기를 줄이기 위함이다. LeNet-5의 경우 평균 풀링(average pooling)이 사용된 반면, AlexNet에서는 최대 풀링(max pooling)이 사용되었다. 또한 LeNet-5의 경우 풀링 커널이 움직이는 보폭인 stride를 커널 사이즈보다 작게 하는 overlapping pooling을 적용했다. 따라서 정확히 말하면 LeNet-5는 non-overlapping 평균 풀링을 사용한 것이고, AlexNet은 overlapping 최대 풀링을 사용한 것이다.
overlapping 풀링과 non-overlapping 풀링을 비교한 그림은 아래와 같다. 편의를 위해 최대 풀링인 경우로 설명했다.
Imgur
overlapping 풀링을 하면 풀링 커널이 중첩되면서 지나가는 반면, non-overlapping 풀링을 하면 중첩없이 진행된다. overlapping 풀링이 top-1, top-5 에러율을 줄이는데 좀 더 효과가 있다고 한다.

2.4 Local Response Normalization(LRN)

신경생물학에는 lateral inhibition이라고 불리는 개념이 있다. 활성화된 뉴런이 주변 이웃 뉴런들을 억누르는 현상을 의미한다. lateral inhibition 현상을 모델링한 것이 바로 local response normalization이다. 강하게 활성화된 뉴런의 주변 이웃들에 대해서 normalization을 실행한다. 주변에 비해 어떤 뉴런이 비교적 강하게 활성화되어 있다면, 그 뉴런의 반응은 더욱더 돋보이게 될 것이다. 반면 강하게 활성화된 뉴런 주변도 모두 강하게 활성화되어 있다면, local response normalization 이후에는 모두 값이 작아질 것이다.

2.5 Data augmentation

과적합을 막기 위해 dropout 말고도 또다른 방법이 사용되었다. 과적합을 막는 가장 좋은 방법 중 하나는 데이터의 양을 늘리는 것이다. 훈련시킬 때 적은 양의 데이터를 가지고 훈련시킬 경우 과적합될 가능성이 크기 때문이다. 따라서 AlexNet의 개발자들은 data augmentation이란 방법을 통해 데이터의 양을 늘렸다.
Imgur
쉽게 말해서 하나의 이미지를 가지고 여러 장의 비슷한 이미지를 만들어 내는 것이다. 이미지를 좌우 반전시키거나, AlexNet이 허용하는 입력 이미지 크기인 227 x 227 x 3보다 좀 더 큰 이미지를 조금씩 다르게 잘라서 227 x 227 x 3으로 만들어줘서 여러 장을 만들어낸다. 같은 내용을 담고 있지만 위치가 살짝 다른 이미지들이 생산된다.
예제로 가져온 그림을 보면 원본 이미지를 좌우 대칭 시키거나(mirror image), 끝 부분을 조금씩 자르는 등의 하나의 이미지로 여러 개의 서로 다른 비슷한 이미지들을 만들어 낼 수가 있다.

이 작업은 tensorflow의 keras에서 ImageDataGenerator가 지원해 준다.

profile
바쁘게 부지런하게 논리적으로 살자!!!

0개의 댓글