Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

AlexNet

2012년 세계 1등 합성곱 신경망

1998년 LeNet은 당시 기준으로 놀라운 성과를 거두었지만, 그 무렵에는 신경망이 크게 주목받지 못하였습니다. 합성곱 신경망의 가치는 2012년 AlexNet으로 재발견되었다고 할 수 있습니다. AlexNet은 LeNet으로부터 15년 정도 지난 시점의 모델이지만, 합성곱 계층과 풀링 계층을 거듭 쌓는 LeNet의 기본 구성을 그대로 계승하였습니다.

다만 두 모델이 상대하는 데이터의 규모는 크게 다릅니다. LeNet은 32x32 크기의 작은 흑백 이미지를 다룬 반면, AlexNet의 입력은 ImageNet 데이터셋의 224x224 컬러 이미지이며, 분류해야 하는 유형의 수도 1000개에 이릅니다. 입력 이미지의 크기와 유형이 대폭 증가한 것입니다.

1LeNet과의 차이

AlexNet은 LeNet의 구성을 이어받으면서도 몇 가지 중요한 차이를 둡니다. 첫째, 2010년 이후 딥러닝 모델의 흐름을 반영하여 기본 활성화 함수로 시그모이드 대신 렐루(ReLU)를 사용합니다. 둘째, LRN(국소 응답 정규화, Local Response Normalization)이라 불리는 국소적 정규화 계층을 활용합니다. 셋째, 드롭아웃(dropout) 기법을 도입하여 일반화 성능의 향상을 꾀합니다.

2깊이와 전산 능력

작은 이미지에 합성곱 계층을 두 번만 사용하는 LeNet과 달리, AlexNet은 약 10배 크기의 입력에 합성곱 계층을 5개 사용합니다. 그만큼 연산의 요구량도 크게 증가하였습니다. 1990년대와 비교하여 2010년대에는 프로세서의 발전으로 전산 능력이 대폭 향상되었고, AlexNet은 이러한 환경을 적극적으로 활용하여 상대적으로 깊은 심층 합성곱 신경망을 구성하였습니다. 그 결과 대규모 데이터 집합에 대한 학습을 성공적으로 수행하여, 당시의 다른 알고리즘들을 모두 능가하는 탁월한 성능을 보였습니다. 이 성과는 많은 사람들이 신경망에 다시 주목하는 계기가 되었고, 결과적으로 딥러닝의 열풍을 불러오는 데 큰 역할을 하였습니다.

from tensorflow.keras import Sequential, layers

create_alexnet = lambda: Sequential([
    layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), activation='relu', input_shape=(227,227,3)),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
    layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), activation='relu', padding="same"),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
    layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
    layers.BatchNormalization(),
    layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
    layers.BatchNormalization(),
    layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), activation='relu', padding="same"),
    layers.BatchNormalization(),
    layers.MaxPool2D(pool_size=(3,3), strides=(2,2)),
    layers.Flatten(),
    layers.Dense(4096, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(4096, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(10, activation='softmax')
])

create_alexnet().summary()