NAS (Neural Architecture Search) 설명

Bean·2025년 4월 22일
0

인공지능

목록 보기
10/123

1. NAS란?

NAS는 딥러닝 모델의 구조(architecture)를 자동으로 설계하는 방법입니다.
사람이 직접 레이어 구성이나 파라미터를 하나하나 고르는 대신, 컴퓨터가 스스로 좋은 구조를 찾아주는 방법이에요.

1.1. 왜 NAS가 필요할까요?

  • 기존에는 전문가들이 경험과 직관으로 CNN이나 Transformer 구조를 설계했어요.
  • 하지만 가능한 구조 조합은 너무 많아서,
    사람이 일일이 실험하며 최고의 구조를 찾는 건 비효율적이에요.
  • 그래서 NAS는 최적의 구조를 자동으로 탐색해서
    정확도는 높이고, 연산량은 줄이거나 속도를 개선하는 데 도움을 줍니다.

1.2. NAS의 기본 구성 요소

NAS는 보통 3가지 핵심 요소로 구성됩니다:

요소설명
Search Space (탐색 공간)어떤 구조를 조합해서 만들 수 있는지 정의 (예: Conv, Pooling, skip connection 등)
Search Strategy (탐색 전략)어떤 방식으로 좋은 구조를 찾을지 결정 (진화 알고리즘, 강화학습, 그리드 탐색 등)
Evaluation Strategy (평가 전략)후보 구조의 성능을 어떻게 평가할지 (정확도, FLOPs, latency 등)

1.3. NAS의 예시 방식

  1. 강화학습 기반 NAS
    → controller가 구조를 설계하고, 성능 좋으면 보상 줌

  2. 진화 알고리즘 기반 NAS
    → 유전자처럼 구조를 교배, 변이시켜 점점 더 나은 구조 찾음

  3. Differentiable NAS (DARTS) ← 논문에서도 사용
    → 모든 후보 구조를 동시에 학습하면서 연속적인 가중치로 최적의 구조를 선택
    → 속도가 매우 빠르고 효율적

1.4. NAS의 장점과 단점

장점단점
- 구조 설계 자동화
- 정확도 vs 속도 균형 조절
- 새로운 구조 발견 가능
- 계산량이 많을 수 있음
- 탐색 결과가 데이터셋에 의존할 수 있음

2. Differentiable NAS 기반 학습

"Differentiable NAS를 사용하는 구조라면, 특정 데이터셋으로 학습할 때 NAS가 자동으로 함께 진행되고, 그에 따라 네트워크 구조와 가중치가 동시에 달라집니다."

2.1. 일반적인 학습

보통은 구조가 고정되어 있고, 학습 시에는 가중치(weight)만 업데이트하죠.

2.2. Differentiable NAS 학습

이 방식은 다음을 동시에 학습합니다:

항목설명
가중치 (WW)각 연산 모듈(예: Conv, Pooling 등)의 일반적인 학습 파라미터
구조 선택 가중치 (α\alpha)어떤 연산을 선택할지를 결정하는 가중치 (Softmax로 확률처럼 처리)

이 두 가지를 동시에 학습해요:

  • WW는 일반적인 방식으로 역전파 학습
  • α\alpha도 gradient descent로 업데이트됨 (다시 말해 어떤 구조가 더 좋은지 학습함)

즉, 학습하는 동안 "구조(architecture)"도 진화하고, "연산 가중치"도 학습돼요.

결과적으로 어떤 일이 벌어지냐면:

  1. 당신이 특정 데이터셋으로 학습을 시작하면,
  2. 네트워크는 그 데이터셋에 가장 적합한 구조(연산 조합)를 스스로 찾아가고,
  3. 동시에 그 구조에 맞는 최적의 가중치를 학습합니다.

그래서 가중치가 달라지느냐?

맞습니다.

  • 구조가 달라지면 어떤 연산이 사용되는지도 달라지고,
  • 따라서 학습되는 가중치도 자연스럽게 달라지게 됩니다.

그럼 언제 구조가 "고정"되나요?

보통 Differentiable NAS에서는 이런 흐름이에요:

  1. 탐색(학습) 단계:
    구조 가중치 αα와 일반 가중치 WW를 함께 학습

  2. 구조 확정:
    가장 확률이 높은 연산들을 골라 최종 구조로 고정

  3. 고정된 구조에서 다시 학습 (선택적 단계):
    구조가 확정되었으니, 이제 이 구조로 WW만 다시 정식 학습해서 성능을 극대화함

요약

질문답변
학습하면 NAS가 자동 진행되나요?Differentiable NAS를 사용한다면 그렇습니다.
그럼 가중치가 달라지나요?네, 구조와 함께 가중치도 달라집니다.
구조는 언제 고정되나요?탐색이 끝나고 가장 좋은 구조가 선택된 후에 고정됩니다.

3. NAS Pytorch 예제 코드

3.1. 핵심 개념

  • 연산 후보(op): Conv3x3, Conv5x5, Identity
  • 구조 선택 가중치(alpha): softmax로 어떤 연산을 선택할지 결정
  • 연산 가중치(weight): 일반 학습 파라미터

3.2. 코드 예제

import torch
import torch.nn as nn
import torch.nn.functional as F

# 연산 후보 정의
class MixedOp(nn.Module):
    def __init__(self, C):
        super().__init__()
        self.ops = nn.ModuleList([
            nn.Conv2d(C, C, 3, padding=1, bias=False),
            nn.Conv2d(C, C, 5, padding=2, bias=False),
            nn.Identity()
        ])
        # 구조 선택 가중치 (학습됨)
        self.alpha = nn.Parameter(torch.randn(len(self.ops)))

    def forward(self, x):
        weights = F.softmax(self.alpha, dim=0)  # softmax로 연산 선택 확률 계산
        return sum(w * op(x) for w, op in zip(weights, self.ops))

# 간단한 네트워크 (2개의 MixedOp layer)
class TinyNASNet(nn.Module):
    def __init__(self, C=16):
        super().__init__()
        self.stem = nn.Conv2d(3, C, 3, padding=1)
        self.layer1 = MixedOp(C)
        self.layer2 = MixedOp(C)
        self.classifier = nn.Linear(C * 32 * 32, 10)

    def forward(self, x):
        x = self.stem(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = x.view(x.size(0), -1)
        return self.classifier(x)

# 예시 학습 루프 (MNIST 형태 데이터라고 가정)
model = TinyNASNet()
optimizer = torch.optim.Adam(model.parameters(), lr=0.003)
criterion = nn.CrossEntropyLoss()

# dummy data (3채널 이미지, 32x32)
x = torch.randn(8, 3, 32, 32)
y = torch.randint(0, 10, (8,))

# 학습 단계
model.train()
for epoch in range(10):
    optimizer.zero_grad()
    out = model(x)
    loss = criterion(out, y)
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch}: loss = {loss.item():.4f}")

3.3 결과 확인 (구조 선택 가중치)

학습이 끝나면, 각 MixedOp의 alpha 값을 확인하면 어떤 연산이 선택되었는지 알 수 있어요.

print("Layer1 alpha:", F.softmax(model.layer1.alpha, dim=0).data)
print("Layer2 alpha:", F.softmax(model.layer2.alpha, dim=0).data)

3.4. 다음 단계

  • 이 구조를 기반으로 구조를 고정해서 새로운 네트워크로 만들 수 있어요.
  • EfficientPose 같은 NAS 논문들은 이런 아이디어를 훨씬 정교하게 확장한 구조라고 보면 됩니다.

3.5. 간단한 정리

  1. alpha는 학습 가능한 파라미터입니다. 각 후보 연산마다 하나씩 존재합니다.
    예: Conv3x3, Conv5x5, Skip, None

  2. 소프트맥스(softmax(alpha))를 통해 연산들의 가중치(weighted sum)로 계산된 출력을 사용합니다.
    즉, 여러 연산이 동시에 계산되지만, 실제 사용은 거의 한두 개에 집중됩니다.

  3. 학습이 진행되면서 덜 중요한 연산은 alpha 값이 작아지고,
    결국에는 softmax 후 거의 0이 되어 영향력이 사라집니다.

  4. NAS 탐색이 끝나면:

    • 가장 큰 alpha 값을 가진 연산만 남기고 나머지는 제거하여 최종 네트워크를 확정합니다.
    • 이 과정을 discretization 또는 architecture derivation이라고 합니다.

파라미터 개수 조절과의 관계:

  • NAS 탐색 중에는 모든 연산을 다 사용하므로 파라미터가 많지만,
  • 탐색이 끝나고 최종 연산만 남기면 네트워크가 슬림해져서 파라미터 수가 확 줄어듭니다.

시각적으로 표현하면:

             Input
               |
      ------------------------
     |     |     |     |     |
   Conv3  Conv5  Skip  None  ...
     |     |     |     | 
     v     v     v     v
   w1*x1 + w2*x2 + w3*x3 + w4*x4  ← softmax(alpha)
  • w1, w2, w3, w4는 softmax(alpha)
  • 학습 후 예를 들어 w3 ≈ 1이고 나머지는 거의 0 → Skip connection만 남기고 나머지는 제거

3.6. NAS 탐색 이후

NAS 탐색 단계에서는:

x_out = sum(p_o * o(x) for o in operations)
  • 각 연산 o(x)이 실제로 전부 실행됨
  • 계산량(FLOPs)도 전체 연산을 다 수행한 만큼 들어가게 됩니다

그런데 실제 배포할 모델에서는?

탐색 후에는 softmax에서 확률이 가장 높은 하나만 선택해서
불필요한 연산은 제거합니다:

chosen_op = argmax(α)
x_out = chosen_op(x)

이걸 "discretization" 또는 "architecture finalization"이라고 합니다.
즉:

  • 탐색 단계: 여러 연산 다 수행 (비효율적이지만 구조 탐색에 필요)
  • 탐색 완료 후: 가장 좋은 연산만 선택해 실제 네트워크 구성 (효율적)

정리:

  • 탐색 중에는 softmax 가중치가 0이 아니라면 다 계산됨
  • 최종 모델에서는 α가 가장 큰 연산만 남겨서 효율 확보
  • 실제 연산 수(FLOPs)는 탐색 후 줄어듭니다
profile
AI developer

0개의 댓글