Mixture of Experts: 희소 활성화로 거대 모델 만들기
Mixture of Experts(MoE)가 FFN 레이어를 다수의 전문가로 교체하고 토큰마다 Top-K만 활성화해 파라미터는 늘리되 연산량은 유지하는 원리와 실전 구현을 해설한다.
지난 글에서 GQA가 KV 헤드를 줄여 메모리를 절감하는 방법을 살펴봤다. 이번에는 파라미터 규모와 연산 비용을 분리하는 전혀 다른 전략인 **Mixture of Experts(MoE)**를 다룬다. MoE는 1991년 Jacobs et al.의 아이디어를 현대 트랜스포머에 접목한 것으로, 2024년 GPT-4, Mixtral 8×7B, DeepSeek-V3 등에서 적용되며 LLM 아키텍처의 새로운 주류가 됐다.
핵심 아이디어: 희소 활성화
밀집(Dense) 트랜스포머에서 FFN 레이어는 모든 토큰에 대해 동일하게 활성화된다. MoE는 이 FFN을 N개의 독립 전문가(Expert) FFN으로 교체한다. 각 토큰은 라우터(Router)를 통해 이 중 Top-K개만 선택해 실행한다. K=2이면 전체 N개 파라미터 중 2/N만 활성화되는 셈이다.
Dense FFN: 토큰 → FFN(전체 파라미터) → 출력
MoE FFN: 토큰 → Router → Expert₁, Expert₃ → 가중 합산 → 출력
결과적으로 파라미터 수는 N배 증가하지만 추론 FLOPs는 거의 동일하다. “같은 연산 비용으로 더 큰 모델”이 가능해진다. Mixtral 8×7B는 총 47B 파라미터지만 추론 시 활성 파라미터는 13B 수준이다.
라우터와 게이팅 메커니즘
라우터는 간단한 선형 레이어다. 입력 토큰 벡터 x를 받아 각 전문가의 적합도 점수를 계산한다:
# 라우터 게이팅
logits = W_g @ x # (num_experts,)
gates, indices = logits.topk(K) # Top-K 선택
gates = softmax(gates) # 정규화 (합 = 1)
# 출력 = 선택된 전문가의 가중 합산
output = sum(gates[i] * Expert_i(x) for i in indices)
PyTorch 구현
위 구현은 개념 설명용이다. 실제 분산 학습에서는 전문가를 서로 다른 GPU에 배치하고, 토큰을 해당 GPU로 올바르게 라우팅하는 Expert Parallelism과 All-to-All 통신이 필요하다.
로드 밸런싱 문제와 보조 손실
MoE의 고질적 문제는 **라우터 붕괴(Router Collapse)**다. 학습 초기에 특정 전문가가 우연히 좋은 성능을 보이면, 라우터가 그 전문가만 계속 선택하게 되어 나머지 전문가는 학습이 안 된다.
이를 막기 위해 **보조 로드 밸런싱 손실(Auxiliary Load Balancing Loss)**을 추가한다:
def load_balancing_loss(router_probs, expert_indices, num_experts):
# 전문가별 할당 비율 f_i
expert_mask = F.one_hot(expert_indices, num_experts).float()
tokens_per_expert = expert_mask.mean(dim=0) # (num_experts,)
# 전문가별 라우터 점수 평균 p_i
avg_probs = router_probs.mean(dim=0) # (num_experts,)
# 균등 분배 유도: f_i * p_i의 합을 최소화
loss = num_experts * (tokens_per_expert * avg_probs).sum()
return loss
# 총 손실 = 언어 모델링 손실 + α * 로드 밸런싱 손실
total_loss = lm_loss + 0.01 * load_balancing_loss(...)
이 손실은 모든 전문가가 균등하게 토큰을 받도록 유도한다. α(보조 손실 계수)는 0.001~0.01 사이가 일반적이다.
Expert Choice vs Token Choice
기존 방식(Token Choice)은 각 토큰이 Top-K 전문가를 선택한다. 문제는 인기 전문가에 토큰이 몰릴 때 처리 용량 제한(Expert Capacity)을 초과하면 일부 토큰이 전문가를 건너뛰어야 한다는 것이다.
Expert Choice(Zhou et al., 2022) 방식은 반대다. 각 전문가가 처리할 Top-K 토큰을 선택한다. 전문가 용량이 보장되고 로드 밸런싱이 자연스럽지만, 일부 토큰이 어떤 전문가에도 선택받지 못할 수 있다.
DeepSeek은 **공유 전문가(Shared Expert)**를 추가로 두어, 모든 토큰이 반드시 거치는 공통 표현 학습을 담당하게 했다. 나머지 전문가들은 특화된 능력을 학습한다.
주요 MoE 모델 비교
| 모델 | 총 파라미터 | 활성 파라미터 | 전문가 수 | Top-K |
|---|---|---|---|---|
| Mixtral 8×7B | 47B | 13B | 8 | 2 |
| Mixtral 8×22B | 141B | 39B | 8 | 2 |
| DeepSeek-V3 | 671B | 37B | 256 | 8 |
| GPT-4 (추정) | ~1.8T | ~220B | ~16 | 2 |
DeepSeek-V3는 256개 전문가 중 8개를 선택하는 극단적 희소성으로 효율을 극대화했다. 총 파라미터가 671B지만 추론 비용은 Dense 37B 수준이다.
추론 최적화
MoE 추론에서는 배치 내 다른 토큰이 서로 다른 전문가를 선택하므로, GPU 활용률이 Dense 모델보다 낮을 수 있다. 이를 해결하는 방법:
- Expert 배치 최적화: 같은 전문가를 선택한 토큰끼리 묶어 행렬 곱 한 번에 처리
- 전문가 캐싱: 최근에 자주 사용된 전문가를 GPU 메모리에 유지
- vLLM, TensorRT-LLM: MoE 최적화 커널 내장
다음 글에서는 이 거대한 LLM들이 텍스트를 처음 받아들이는 방법, 토크나이저를 다룬다.
지난 글: MQA와 GQA: KV Cache 경량화 전략
다음 글: 토크나이저와 토큰: LLM이 텍스트를 보는 방법
읽어주셔서 감사합니다. 😊