Yolo 비전 선전
선전
지금 참여하기
용어집

깊이의 혼합 (MoD)

깊이 혼합(MoD)이 토큰을 동적으로 라우팅하여 AI 효율성을 최적화하는 방식을 살펴보세요. 이 기법이 Ultralytics 및 대규모 언어 모델(LLM)에서 연산량(FLOPs)을 어떻게 줄이는지 알아보세요.

딥 러닝 아키텍처에서는 특히 긴 시퀀스나 고해상도 입력을 처리할 때 계산 효율성이 가장 중요하다. 새로운 접근법은 네트워크가 입력의 어느 부분이 완전한 처리가 필요한지, 어느 부분이 특정 레이어를 안전하게 우회할 수 있는지 결정하도록 허용함으로써 계산 자원을 동적으로 할당한다. 이 동적 라우팅 전략은 모델의 예측 능력이나 정확도를 희생하지 않으면서 전체 계산 복잡성을 줄인다.

개념 이해하기

깊이 혼합(Mixture of Depths, MoD)은 주로 트랜스포머 아키텍처에 적용되는 기술로, 모델이 다양한 레이어에서 특정 토큰에 대한 계산을 동적으로 건너뛰도록 학습합니다. 기존 트랜스포머는 중요한 정보든 채우기 콘텐츠든 모든 토큰을 모든 레이어를 통해 처리합니다. 반면 MoD 모델은 라우터 메커니즘을 사용하여 토큰을 평가하고 점수를 할당합니다. 사전 정의된 용량 한도 내에서 가장 높은 점수를 받은 토큰들만이 어텐션 메커니즘이나 밀집 전이 (dense feed-forward) 레이어와 같은 중량급 계산 블록을 통과합니다. 나머지 토큰들은 잔류 연결(residual connection)을 통해 블록을 우회하며, 이로 인해 서로 다른 토큰들이 각기 다른 수준의 처리 깊이를 경험하는 "깊이의 혼합(mixture of depths)"이 효과적으로 생성됩니다.

이 방법은 최근 딥마인드 연구를 통해 대중화되었으며 arXiv 저장소에 광범위하게 기록되어 있으며, 훈련과 추론 과정에서 필요한 총 부동소수점 연산량(FLOPs) 을 획기적으로 감소시킵니다.

전문가 혼합(MoE)과의 차별화

이 개념을 전문가 혼합(Mixture of Experts, MoE)과 혼동하기 쉽습니다. 둘 다 라우팅 메커니즘을 사용하지만, 해결하는 문제는 다릅니다:

  • MoE는 토큰을 레이어 내의 서로 다른 하위 네트워크 (전문가)로 라우팅합니다. 모든 토큰에 대해 계산 깊이는 동일하게 유지되지만, 모델의 매개변수 수는 증가합니다.
  • MoD는 토큰을 계산 블록 또는 스킵 연결로 라우팅합니다. 매개변수 개수는 엄격히 일정하게 유지되지만, 중요도가 낮은 토큰의 경우 계산 깊이가 감소하여 추론 지연 시간을 직접적으로 개선합니다.

실제 애플리케이션

동적으로 컴퓨팅 자원을 할당하는 능력은 이 기법을 컴퓨터 비전과 자연어 처리의 다양한 분야에서 매우 가치 있게 만듭니다.

  1. 언어 모델의 컨텍스트 최적화: 현대적 접근 OpenAI 및 Anthropic과 같은 기관의 현대적 대규모 언어 모델(LLM) Anthropic 동적 심도 라우팅을 활용함으로써 이러한 모델들은 구조적 또는 반복적인 채움 단어를 건너뛸 수 있으며, 복잡한 추론 단계와 사실 추출을 위해 심층 계산을 할당합니다.
  2. 고해상도 비전 AI: Ultralytics 모델과 같은 고급 비전 시스템에서 객체 탐지 이미지 분할을 위한 대형 이미지 처리는 막대한 메모리를 필요로 합니다. 뎁스 라우팅은 네트워크가 균일한 배경(빈 하늘이나 빈 벽 등)에 대한 특징 추출을 우회하도록 하여, 복잡한 전경 객체에 컴퓨팅 성능을 집중시킵니다. 이는 CUDA 라이브러리로 최적화된 리소스 제약형 에지 AI 하드웨어에 모델을 배포하는 데 매우 중요합니다.

구현 예시

아래는 기본적인 라우팅 메커니즘이 입력 토큰의 일부에 대한 계산을 건너뛰어 깊이 라우팅 동작을 시뮬레이션하는 방법을 보여주는 개념적인 PyTorch 조각입니다.

import torch
import torch.nn as nn


class MixtureOfDepthsBlock(nn.Module):
    def __init__(self, d_model, capacity_factor=0.5):
        super().__init__()
        self.capacity_factor = capacity_factor
        self.router = nn.Linear(d_model, 1)
        self.heavy_compute = nn.Sequential(nn.Linear(d_model, d_model * 4), nn.GELU(), nn.Linear(d_model * 4, d_model))

    def forward(self, x):
        # x shape: (batch_size, seq_len, d_model)
        seq_len = x.size(1)
        capacity = int(seq_len * self.capacity_factor)

        # 1. Compute routing scores
        scores = self.router(x).squeeze(-1)  # Shape: (batch_size, seq_len)

        # 2. Identify top-k tokens to process
        topk_indices = torch.topk(scores, capacity, dim=1).indices

        # 3. Create an output tensor mirroring the input (residual baseline)
        output = x.clone()

        # 4. Apply heavy computation only to the selected tokens
        for b in range(x.size(0)):
            selected_tokens = x[b, topk_indices[b]]
            processed_tokens = self.heavy_compute(selected_tokens)
            output[b, topk_indices[b]] += processed_tokens

        return output


# Example usage
dummy_input = torch.randn(2, 64, 128)  # Batch=2, Seq=64, Dim=128
mod_block = MixtureOfDepthsBlock(d_model=128, capacity_factor=0.5)
output = mod_block(dummy_input)
print(f"Output shape: {output.shape}")  # Expect (2, 64, 128)

PyTorch TensorFlow개발자는 이러한 맞춤형 모델 최적화 블록을 통합할 수 있습니다. 또한 Ultralytics 같은 도구는 팀이 이러한 라우터를 정확하게 훈련하는 데 필요한 훈련 데이터를 관리하는 동시에 Google AI와 같은 기업 생태계와 원활하게 통합하는 데 도움을 줍니다.

Ultralytics YOLO 파워업

프로젝트에 필요한 고급 AI 비전을 확보하세요. 오늘 목표에 맞는 라이선스를 찾아보세요.

라이선스 옵션 살펴보기