NAS
Neural Architecture Search
신경망 구조를 자동으로 탐색하는 기법. AutoML의 핵심 기술.
Neural Architecture Search
신경망 구조를 자동으로 탐색하는 기법. AutoML의 핵심 기술.
NAS(Neural Architecture Search)는 딥러닝 모델의 구조를 자동으로 탐색하고 최적화하는 AutoML 기술입니다. 인간 연구자가 수동으로 설계하던 신경망 아키텍처를 알고리즘이 자동으로 발견하여, 특정 작업에 최적화된 네트워크 구조를 찾아냅니다.
2017년 Google Brain 팀이 발표한 논문에서 본격적으로 주목받기 시작했습니다. 초기에는 수천 GPU-일(GPU-days)이 필요한 막대한 연산 비용이 문제였으나, DARTS, ENAS 등 효율적인 탐색 방법이 개발되면서 실용화되었습니다.
NAS는 탐색 공간(Search Space), 탐색 전략(Search Strategy), 성능 추정(Performance Estimation) 세 가지 핵심 요소로 구성됩니다. 강화학습, 진화 알고리즘, 경사 기반 방법 등 다양한 탐색 전략이 사용됩니다.
실무에서 NAS는 모바일/엣지 디바이스용 경량 모델 설계, 특정 도메인 최적화 모델 개발에 활용됩니다. EfficientNet, MobileNetV3 등 유명 모델들이 NAS로 발견되었으며, 수작업 대비 10-30% 성능 향상을 달성한 사례가 많습니다.
# NNI (Neural Network Intelligence)를 사용한 NAS 예제
# pip install nni
import nni
from nni.nas.evaluator import FunctionalEvaluator
from nni.nas.strategy import DARTS
# 탐색 공간 정의
import torch.nn as nn
from nni.nas.nn.pytorch import ModelSpace, LayerChoice
class NASModel(ModelSpace):
def __init__(self):
super().__init__()
# 레이어 선택지 정의
self.conv = LayerChoice([
nn.Conv2d(3, 64, 3, padding=1),
nn.Conv2d(3, 64, 5, padding=2),
nn.Conv2d(3, 64, 7, padding=3),
], label='conv_choice')
self.activation = LayerChoice([
nn.ReLU(),
nn.GELU(),
nn.SiLU(),
], label='act_choice')
self.classifier = nn.Linear(64 * 32 * 32, 10)
def forward(self, x):
x = self.conv(x)
x = self.activation(x)
x = x.view(x.size(0), -1)
return self.classifier(x)
# DARTS 전략으로 탐색 실행
model_space = NASModel()
strategy = DARTS()
# 평가자 정의
def evaluate_model(model):
# 모델 학습 및 검증 로직
accuracy = train_and_validate(model)
return accuracy
evaluator = FunctionalEvaluator(evaluate_model)
# 탐색 시작
# experiment = strategy.run(model_space, evaluator)
print("NAS 탐색 공간이 정의되었습니다.")
"모바일 배포를 위해 경량화가 필요한데, NAS를 적용해서 latency-accuracy 트레이드오프가 최적화된 아키텍처를 탐색해보면 어떨까요? EfficientNet-lite처럼 NAS로 찾은 모델이 수작업 설계보다 20% 이상 효율적인 경우가 많습니다."
"NAS는 탐색 공간, 탐색 전략, 성능 추정 세 요소로 구성됩니다. 초기 NAS는 수천 GPU-일이 필요했지만, DARTS 같은 미분 가능 방식이나 weight sharing으로 비용이 크게 줄었습니다. 실제로 MobileNetV3, EfficientNet 등이 NAS로 발견되었습니다."
"Full NAS는 비용이 높으니, Once-for-All이나 ProxylessNAS처럼 효율적인 방법을 쓰거나, 이미 탐색된 아키텍처(EfficientNet family)를 fine-tuning하는 것도 좋은 전략입니다."
탐색 공간이 잘못 설계되면 좋은 아키텍처가 애초에 포함되지 않을 수 있습니다. 탐색 공간 설계가 NAS 성능의 80%를 결정합니다.
효율적인 방법을 쓰더라도 NAS는 여전히 많은 연산이 필요합니다. 작은 데이터셋에서 proxy task로 먼저 테스트하세요.
작은 규모로 탐색 공간을 검증하고, 이미 검증된 NAS 결과물(EfficientNet 등)을 baseline으로 활용한 뒤, 필요시 fine-grained NAS를 적용하세요.