> EulerStack > 튜토리얼 > 믹서 > 1. Attention 상세

1. Attention 상세

한 줄 요약

"모든 토큰이 모든 다른 토큰을 직접 보고, 얼마나 관련 있는지 점수를 매겨서 가중 평균으로 섞는다."

어떻게 동작하나요?

문장 "나는 파리에 간다. 거기서 __ 를 먹었다" 에서 빈칸에 들어갈 단어를 예측한다고 생각해보세요. 모델은 "거기서" 라는 단어를 처리할 때, 과거의 어떤 단어들을 봐야 하는지 결정해야 합니다. "파리" 라는 단어가 가장 관련이 크죠.

Attention 은 이 과정을 다음과 같이 수학적으로 풀어냅니다:

  1. Query (Q): 현재 토큰이 "뭘 찾고 싶은지" 질문
  2. Key (K): 각 과거 토큰이 "나는 이런 정보다" 라는 색인
  3. Value (V): 실제 전달할 정보 내용
  4. 점수 = Q·Kᵀ (모든 Q와 모든 K의 내적)
  5. softmax 로 정규화 → 가중치
  6. 가중치 × V = 현재 토큰의 새 표현

모든 토큰 쌍을 다 계산하기 때문에 N² 번의 내적 연산 이 필요합니다. 문장이 길어지면 계산량이 제곱으로 증가합니다.

장점

단점

현재 쓰이는 개선 기법들

EulerStack v1 은 다음 최신 기법들을 attention 믹서에서 지원합니다:

MLA 사용 가이드: - latent_dim 은 반드시 0 < latent_dim < d_model - 일반적으로 latent_dim = d_model / 2 부터 시작 - 긴 컨텍스트 (≥16K) 서빙에서 KV 캐시 메모리가 병목일 때 가장 큰 이득 - llm_*_mla 프리셋 (0.1B / 0.8B / 2B / 4B / 16B) 과 arch_advanced_mla 참조

실제 적용 예

어떤 상황에 유리한가?

상황 Attention 이 좋은가?
짧은 대화 (≤ 4K) ★★★★★ 완벽
코딩/reasoning 태스크 ★★★★★ 정확한 매칭에 강함
문서 질의응답 (RAG) ★★★★★ 관련 구절 정확히 찾아옴
매우 긴 문서 (≥32K) ★★ (KV 캐시 + O(N²) 때문에 비효율)
실시간 스트리밍 추론 ★★★ (KV 캐시 필요)

EulerStack YAML 예시

layer_templates:
  attn_layer:
    mixer:
      type: attention
      attention:
        qkv_bias: false      # bias 없는 Q,K,V proj (Llama 스타일)
        attn_drop: 0.0       # attention dropout
        window: null         # 전역 attention (null = 무제한)
    ffn:
      type: gated_mlp
      activation: swiglu
    state:
      kv_cache: true         # 추론 시 KV 캐시 사용

로컬 윈도우 사용 시:

      attention:
        window: 4096         # 최근 4096 토큰만 attend

GQA 사용 시 (model 섹션에서):

model:
  n_heads: 16
  n_kv_heads: 4              # 16 heads → 4 KV heads 공유 (4배 압축)

MLA (Phase B2.1) 사용 시:

layer_templates:
  mla_attn:
    mixer:
      type: attention
      attention:
        latent_dim: 768      # d_model=1536 의 절반 → KV 캐시 ~50% 절감
    ffn:
      type: gated_mlp
    state:
      kv_cache: true

MLA 는 GQA, sliding window 와 조합 가능합니다 (모두 독립 차원).

논문 출처