Neural Architecture Search (NAS)
신경망 아키텍처 탐색(NAS)은 레이어와 연결을 탐색해 신경망 설계를 자동화합니다. 방법, 연산 비용, NAS로 구축한 모델을 살펴봅니다.
신경망 아키텍처 탐색(NAS)은 자동화 머신러닝(AutoML) 분야 중 하나로, 신경망의 구조를 자동으로 설계합니다. 엔지니어가 컨볼루션 및 기타 레이어 유형, 깊이, 너비, 연결을 직접 선택하는 대신 탐색 알고리즘이 후보 아키텍처를 제안하고, 각 아키텍처의 작업 성능을 추정한 후 결과를 활용해 더 나은 아키텍처를 제안합니다. 목표는 대개 정확도이며, 대상 하드웨어의 추론 지연 시간, 파라미터 수 또는 FLOPs와 같은 비용을 함께 고려하기도 합니다. NAS는 EfficientNet과 MobileNetV3를 비롯해 널리 사용되는 여러 컴퓨터 비전 백본을 만들어 냈습니다.
NAS의 작동 방식#
Journal of Machine Learning Research의 서베이 논문은 NAS 방법을 세 가지 차원으로 분류합니다.
- 탐색 공간: 구축할 수 있는 아키텍처의 집합입니다. 사용할 수 있는 연산 유형, 커널 크기, 스킵 연결 및 연결 방식 등이 여기에 포함됩니다. 많은 방법은 반복해서 쌓을 수 있는 작은 셀을 탐색합니다. 이 방식은 공간을 줄이고 작은 데이터셋에서 찾은 셀을 대규모 데이터셋에 적용할 수 있게 합니다.
- 탐색 전략: 강화 학습 컨트롤러, 진화 알고리즘, 경사 기반 방법, 단순 무작위 샘플링 등을 포함해 시도할 후보를 선택하는 알고리즘입니다.
- 성능 추정 전략: 학습 에포크 수를 줄이거나 더 작은 이미지 또는 데이터셋을 사용하고, 최종 정확도를 예측하거나 후보 간 가중치를 공유하여 전체 학습 없이 후보의 점수를 매기는 방법입니다.
수천 GPU일에서 몇 시간으로#
초기 NAS는 각 후보를 수렴할 때까지 학습했기 때문에 비용이 많이 들었습니다. Zoph와 Le의 2016년 연구에서는 강화 학습으로 학습한 순환 컨트롤러가 네트워크를 생성했고 탐색은 GPU 800개에서 동시에 실행되었습니다. 후속 연구인 NASNet은 GPU 500개를 4일간 사용해 CIFAR-10에서 ImageNet으로 전이할 수 있는 셀을 찾았습니다. AmoebaNet은 정규화된 진화 기법으로 비슷한 결과를 얻었지만 약 3,150 GPU일이 들었습니다. ENAS는 대규모 네트워크 하나의 서브그래프로 간주되는 모든 후보가 모델 가중치를 공유하게 하여 단일 GPU에서 탐색 시간을 16시간 미만으로 줄였습니다. DARTS는 연산의 이산 선택을 연속 가중치로 완화해 아키텍처 자체를 며칠간의 GPU 연산으로 경사 하강법 최적화할 수 있게 했습니다. 벤치마킹은 이 분야의 기대를 조정하기도 했습니다. Penn Treebank 및 CIFAR-10 벤치마크에서 조기 중단을 적용한 무작위 탐색은 ENAS와 최소한 동등한 성능을 보였습니다.
하드웨어 인식 NAS 및 NAS로 구축한 모델#
NAS는 특정 디바이스에서 속도와 정확도의 균형을 맞춰야 하는 엣지 AI용 효율적인 모델에 가장 큰 실질적 영향을 미쳤습니다. MnasNet은 실제 휴대전화에서 측정한 지연 시간을 탐색 목표에 포함해 Pixel 휴대전화에서 78ms에 ImageNet top-1 정확도 75.2%를 달성했습니다. 이는 MobileNetV2보다 1.8배 빠르고 정확도는 0.5% 높습니다. EfficientNet-B0도 비슷한 탐색으로 만들어진 후 복합 스케일링으로 B1~B7 제품군까지 확장되었습니다. MobileNetV3는 하드웨어 인식 NAS와 NetAdapt 알고리즘을 결합해 모바일 CPU에 맞게 조정했습니다. 객체 탐지에서는 Deci의 YOLO-NAS 모델이 AutoNAC 탐색 엔진으로 탐색되었으며 INT8 양자화 후에도 정확도 손실이 적도록 설계되었습니다. 이 모델은 학습을 제외한 추론, 검증, 내보내기에 NAS 클래스를 통해 Ultralytics 패키지에서 실행할 수 있습니다. 이후 NVIDIA가 Deci를 인수했으며, 원래 팀은 더 이상 해당 모델을 업데이트하지 않습니다.
간단한 NAS 예제#
다음 예제는 scikit-learn의 손글씨 숫자 데이터에서 다층 퍼셉트론의 작은 탐색 공간을 대상으로 가장 단순한 탐색 전략인 무작위 샘플링을 실행합니다. 비용을 줄이기 위해 각 후보는 에포크 30회만 학습하고 검증 데이터로 점수를 계산합니다.
import random
import warnings
from sklearn.datasets import load_digits
from sklearn.exceptions import ConvergenceWarning
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPClassifier
warnings.simplefilter("ignore", ConvergenceWarning) # short training runs are the cheap estimate
X, y = load_digits(return_X_y=True)
X_train, X_val, y_train, y_val = train_test_split(X / 16, y, random_state=0)
# Search space: 1-3 hidden layers, each 8-128 units wide. Search strategy: 12 random samples
random.seed(0)
space = [8, 16, 32, 64, 128]
candidates = {tuple(random.choices(space, k=random.randint(1, 3))) for _ in range(12)}
# Performance estimation: train each candidate for only 30 epochs, then score it on validation data
scores = {}
for layers in candidates:
model = MLPClassifier(hidden_layer_sizes=layers, max_iter=30, random_state=0)
scores[layers] = model.fit(X_train, y_train).score(X_val, y_val)
worst, best = min(scores, key=scores.get), max(scores, key=scores.get)
print(f"{len(scores)} architectures: worst {worst} {scores[worst]:.3f}, best {best} {scores[best]:.3f}")12개 샘플에서 서로 다른 아키텍처 10개가 나오며, 검증 정확도는 유닛이 8개인 레이어 2개를 사용한 모델의 0.398부터 유닛이 128개, 128개, 16개인 레이어를 사용한 모델의 0.978까지 분포합니다. 따라서 아키텍처 선택만으로 정확도가 거의 60%p 달라집니다. 전체 NAS 실행에서는 최적 모델을 수렴할 때까지 다시 학습하고 별도의 테스트 세트에서 점수를 보고합니다.
NAS와 관련 용어 비교#
- 하이퍼파라미터 튜닝: 고정된 아키텍처에서 학습률과 같은 학습 설정을 최적화합니다. NAS는 아키텍처 자체를 변수로 다루며, 두 방법은 함께 실행되는 경우가 많습니다.
- 모델 가지치기 및 지식 증류: 학습이 끝난 후 기존 네트워크의 크기를 줄이거나 기존 네트워크를 모방합니다. NAS는 학습 전에 효율적인 설계를 탐색합니다.
- 전이 학습: 사전 학습된 모델의 학습된 가중치를 재사용합니다. NAS는 해당 가중치가 채워질 구조를 결정하며, EfficientNet과 같이 NAS로 발견한 네트워크 자체도 널리 사용되는 사전 학습 백본입니다.










