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

1.AlexNet의 구조
AlexNet의 기본구조는 LeNet-5와 크게 다르지 않다. 2개의 GPU로 병렬연산을 수행하기 위해서 병렬적인 구조로 설계되었다는 점이 가장 큰 변화이다.(GTX-580 3GB 2개로 90 ecoch 돌리는데 5~6일이 걸렸다고 한다.)
AlexNet의 구조도를 살펴보자.

AlexNet은 8개의 레이어로 구성되어 있다. 5개의 컨볼루션 레이어와 3개의 full-connected 레이어로 구성되어 있다. 1, 2, 4, 5번째 컨볼루션 레이어들은 전 단계의 같은 GPU 채널의 특성맵들과만 연결되어 있는 반면, 3번째 컨볼루션 레이어와 fully-connected layer 3개는 전 단계의 두 GPU 채널의 특성맵들과 모두 연결되어 있다는 것을 집고 넘어가자.
이제 각 레이어마다 어떤 작업이 수행되는지 살펴보자. 우선 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 사이즈 특성맵들)이 산출된다. 산출 근거는 다음의 feature map size 구하는 공식에 따른다.
nout=Snin−K+2P+1
nin:numberofinputfeatures
nout:numberofoutputfeatures
K:convolutionkernel(feature)size
P:convolutionpaddingsize
S:convolutionstridesize
따라서 feature map size는 4227−11+0+1=55 가 된다. 이러한 kernel이 96개(96채널)가 있으므로 output의 크기는 55 x 55 x 96 이 된다.
- GPU 2개를 사용하기 때문에 실제로는 55 x 55 x 48 크기의 output이 2개의 GPU에 각각 할당이 된다.
- 그 다음에 ReLU 함수로 활성화해준다.
- 이어서 3 x 3 overlapping max pooling(보통 pooling은 kernel끼리 서로 겹치지 않는데 여기서는 겹치도록 했기 때문에 overlapping pooliong이라고 하였다.)이 stride 2로 시행된다. 그 결과 27 x 27 x 96 크기의 특성맵을 갖게 된다.(255−3+0+1=27)
- 하나의 GPU 채널로 따지면 27 x 27 x 48이 된다.
- 그 다음에는 수렴 속도를 높이기 위해 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로 설정했다. (5 x 5 x 48 커널을 2번 사용했으므로(2개의 GPU라서 2번 사용) 5 x 5 x 96 커널인 셈이되고 이를 앞 단계의 output인 27 x 27 x 96에 적용하면 127−5+2×2+1=27의 feature map size가 나온다. 커널이 128개 짜리가 2개가 있으므로 256개의 커널이 있고 최종 output의 크기는 27 x 27 x 256 크기의 특성맵(256장의 27 x 27 사이즈 특성맵들)을 얻게 된다. (전단계에서 96개의 특성맵이 48개씩 GPU 2개로 분산되었기 때문에 5 x 5 x 48 사이즈의 커널을 각각의 GPU에 1번씩 총 2번을 적용시켰다. 현재 단계도 256개의 특성맵이 2개로 분산되어 있기 때문에 결과도 128개씩 2개가 나와서 각각의 GPU에 할당되는 특성맵의 크기는 27 x 27 x 128이 된다. padding이 있어 convolution을 해도 feature map의 사이즈는 변화가 없다.)
- 역시 ReLU 함수로 활성화한다.
- 그 다음에 3 x 3 overlapping max pooling을 stride 2로 시행한다. 그 결과 13 x 13 x 256 특성맵을 얻게 된다.(227−3+0+1=13)
- 하나의 GPU 채널로 따지면 13 x 13 x 128의 크기를 가진다.
- 그 후 local response normalization이 시행되고, 특성맵의 크기는 13 x 13 x 256으로 그대로 유지된다.
1.3 3rd Layer(Convolution Layer)
- 384개(192x2)의 3 x 3 x 256 커널을 사용하여 전 단계의 특성맵을 컨볼루션해준다. 이 때 stride는 1, zero-padding도 1.(3번째 layer에서는 각각의 GPU 채널이 전단계의 GPU 채널 2개 모두와 연결되어 있으므로 하나의 GPU 채널당 13 x 13 x 128 x 2의 특성맵을 3 x 3 x 256의 커널로 convolution한다. 113−3+1×2+1=13이고 output size는 13 x 13 x 384이다. 2개의 GPU이므로 하나의 GPU 채널당 13 x 13 x 192의 크기를 가진다.)
- 역시 ReLU 함수로 활성화한다.
1.4 4th Layer(Convolution Layer)
- 192개의 3 x 3 x 192 커널을 각 GPU 채널당 1번씩 2번 사용해서 전 단계의 특성맵을 컨볼루션해준다.
- stride와 zero-padding 모두 1로 설정한다.(113−3+1×2+1=13). 192개의 커널을 2번 사용했으므로 384개의 커널인 셈이고 따라서 13 x 13 x 384 크기의 특성맵(384장의 13 x 13 사이즈 특성맵들)을 얻게 된다.
- 하나의 GPU 채널로 따지면 13 x 13 x 192의 크기를 가진다.
- 역시 ReLU 함수로 활성화한다.
1.5 5th Layer(Convolution Layer)
- 128개의 3 x 3 x 192 커널을 각 GPU 채널당 1번씩 2번 사용해서 전 단계의 특성맵을 컨볼루션해준다.
- stride와 zero-padding 모두 1로 설정한다.(113−3+1×2+1=13). 128개의 커널을 2번 사용했으므로 256개의 커널인 셈이고 따라서 13 x 13 x 256 크기의 특성맵(256장의 13 x 13 사이즈 특성맵들)을 얻게 된다.
- 하나의 GPU 채널로 따지면 13 x 13 x 128의 크기를 가진다.
- 역시 ReLU 함수로 활성화한다.
- 그 다음에 3 x 3 overlapping max pooling을 stride 2로 시행한다.(213−3+0+1=6). 128개의 커널을 2번 사용했으므로 256개의 커널인 셈이고 따라서 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개의 뉴런으로 구성되어 있다.(ImageNet은 1000개의 class로 분류되어 있기 때문에 최종 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 함수를 사용하는 것이 선호되고 있다.

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

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

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이란 방법을 통해 데이터의 양을 늘렸다.

쉽게 말해서 하나의 이미지를 가지고 여러 장의 비슷한 이미지를 만들어 내는 것이다. 이미지를 좌우 반전시키거나, AlexNet이 허용하는 입력 이미지 크기인 227 x 227 x 3보다 좀 더 큰 이미지를 조금씩 다르게 잘라서 227 x 227 x 3으로 만들어줘서 여러 장을 만들어낸다. 같은 내용을 담고 있지만 위치가 살짝 다른 이미지들이 생산된다.
예제로 가져온 그림을 보면 원본 이미지를 좌우 대칭 시키거나(mirror image), 끝 부분을 조금씩 자르는 등의 하나의 이미지로 여러 개의 서로 다른 비슷한 이미지들을 만들어 낼 수가 있다.
이 작업은 tensorflow의 keras에서 ImageDataGenerator가 지원해 준다.
나중(2026.06.01)에 다시 review해 보니 몇 군데 오류 및 설명이 부족한 부분이 있어서 수정 및 보완 하였읍니다.