Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

민성 Skystarry의 연구 창고

[딥러닝] 트랜스포머 Multi-Head Attention: 여러 개의 눈으로 세상을 보는 법 본문

트랜스포머 시리즈

[딥러닝] 트랜스포머 Multi-Head Attention: 여러 개의 눈으로 세상을 보는 법

민성 Skystarry 2026. 1. 12. 19:39

지난 글에서 이어집니다.

"Attention을 안다"고 말하는 사람들이 많습니다. 하지만 $Q, K, V$의 개념을 넘어, 왜 굳이 '여러 개의 머리(Multi-Head)'를 달아야 했는지 그 설계 철학까지 깊게 고민해 본 사람은 많지 않습니다.

왜 하나로는 부족했을까요? 단순히 병렬 연산을 위해서일까요?

오늘은 트랜스포머가 문맥을 입체적으로 이해하는 비결, 그리고 이 우아한 설계 뒤에 숨겨진 '공짜 점심'의 마법에 대해 이야기해 보겠습니다.


하나의 시선이 가진 한계

잠시 $d_{model}=512$인 단일 헤드(Single-Head) 어텐션을 상상해 봅시다. 문장을 읽을 때, 하나의 단어는 문맥 속에서 여러 단어와 동시에 복잡한 관계를 맺습니다.

"그 동물은 길을 건너지 않았다. 왜냐하면 그것은 너무 피곤했기 때문이다."

여기서 '그것(it)'이라는 단어를 처리할 때, 모델은 여러 가지 정보를 동시에 포착해야 합니다.

  1. 참조 관계: '그것'이 가리키는 대상이 '그 동물'임을 알아야 합니다.
  2. 상태 관계: '피곤하다'는 형용사가 '그것'의 상태임을 연결해야 합니다.
  3. 행위 관계: '건너지 않았다'는 동사의 주체가 '그것'임을 파악해야 합니다.

만약 어텐션 헤드가 하나라면, 이 모든 관계를 하나의 확률 분포(Attention Score)로 뭉뚱그려야 합니다. '동물'에도 좀 집중하고, '피곤함'에도 좀 집중해서 평균을 내버리는 식이죠. 결국 정보가 섞이고 희석됩니다. 문법적 관계를 보는 눈과 의미론적 관계를 보는 눈이 분리되지 않은 채 흐릿해지는 셈입니다.


해결책: 역할을 쪼개자 (Subspace Representation)

트랜스포머의 저자들은 이 문제를 해결하기 위해 Representation Subspace(표현 부분 공간)이라는 개념을 도입합니다. 쉽게 말해 "서로 다른 관점"을 동시에 유지하는 것입니다.

우리는 전체 차원($d_{model}$)이 고정되어 있다는 전제하에, 이를 $h$개의 헤드로 쪼갭니다. 보통 8개의 헤드를 사용하니, 각 헤드는 $512 / 8 = 64$ 차원을 갖게 됩니다. 이제 8개의 헤드는 각자의 역할에 집중합니다.

  • Head 1: 주어-동사 관계에만 집중 (문법 담당)
  • Head 2: 대명사가 지칭하는 대상 찾기 (참조 담당)
  • Head 3: 시제나 장소 정보 파악 (배경 담당)

나중에 이 결과들을 다시 합치면(Concat), '그것'이라는 단어는 문법적 정보와 의미적 정보를 모두 뚜렷하게 가진 강력한 벡터가 됩니다. 정보를 섞지 않고 각자의 고유한 특징을 보존하는 것, 이것이 Multi-Head의 핵심인 '다양성(Diversity)'입니다.


연산량의 마법: 공짜 점심은 있다?

여기서 드는 합리적인 의문이 있습니다. "헤드를 8개나 만들면 연산량이 8배로 늘어나는 거 아닌가요?"

이 부분이 트랜스포머 설계의 백미입니다. 놀랍게도 전체 연산량은 단일 헤드일 때와 거의 같습니다. 비결은 바로 '차원 쪼개기'에 있습니다. 총 차원($d_{model}$)이 고정되어 있다면, 행렬 연산의 총량은 변하지 않기 때문입니다.

  • Single Head: $d_{model} \times d_{model}$ 연산 1회
  • Multi Head: $(d_{model} \times d_k)$ 연산 $h$회 (단, $h \times d_k = d_{model}$)

전체 파라미터 수와 연산량(FLOPs)은 비슷하게 유지하면서 표현력만 8배 풍부하게 만든 것입니다. 또한, 이는 모델 내부에서 일종의 앙상블(Ensemble) 효과를 냅니다. 특정 헤드가 실수로 이상한 곳에 집중하더라도, 나머지 헤드들이 올바른 정보를 잡고 있다면 최종 결과물에서는 노이즈가 상쇄됩니다. 모델의 강건성(Robustness)을 높이고 과적합을 방지하는 아주 영리한 안전장치인 셈입니다.


마치며: 완벽해 보이는 MHA의 '비싼' 뒷모습

Multi-Head Attention은 분명 혁신적입니다. 하지만 이 '공짜 점심'은 연산량에만 해당할 뿐, 실제 서비스를 운영하는 엔지니어들에게는 또 다른 고민거리를 안겨주었습니다.

바로 KV 캐시(KV Cache)의 효율성 때문입니다.

MHA 구조에서는 모든 쿼리(Query) 헤드가 각자 독립적인 Key와 Value 헤드를 가져야만 합니다. 즉, 헤드가 8개라면 문장 하나를 처리할 때도 8개 세트의 K, V 데이터를 메모리에 유지해야 하죠. 문장이 길어질수록 이 중복된 듯한 데이터가 VRAM을 가득 채우며 '메모리 병목'을 일으키게 됩니다. 배치 사이즈를 키우고 싶어도 이 메모리 점유율 때문에 발목을 잡히게 되죠.

그래서 최근 Llama 3나 Mistral 같은 최신 거대 언어 모델(LLM)들은 순수한 MHA의 비효율을 개선한 변형 구조를 사용합니다.

  • 메모리 효율을 극단적으로 끌어올린 MQA(Multi-Query Attention)
  • 성능과 효율의 황금 밸런스를 찾은 GQA(Grouped-Query Attention)
  • 긴 문맥도 가볍게 처리하는 SWA(Sliding Window Attention)

지난 글에서 RoPE를 언급하며 현대적 트랜스포머의 서막을 알렸듯, 이 기법들 역시 나중에 다룰 [고급] 현대 트랜스포머 시리즈에서 아주 깊게 파헤쳐 볼 예정입니다.

자, 이제 입력 데이터를 다각도로 분석하는 법까지 배웠습니다. 하지만 딥러닝이 복잡한 언어의 비선형성을 정복하기 위해서는 '마지막 한 조각'이 더 필요합니다.

다음 글에서는 트랜스포머 내부의 또 다른 엔진, Feed Forward Network (FFN)와 깊은 층을 쌓게 해주는 일등공신 Add & Norm을 다루겠습니다.

그럼 다음 글에서 뵙겠습니다!


해당 게시글은 Gemini 3 Flash를 이용해 작업하였음을 알립니다.