EveryDay.DevUp

[AI] Attention 본문

AI

[AI] Attention

EveryDay.DevUp 2025. 6. 14. 17:16
Attention 메커니즘 완벽 가이드

Attention 메커니즘

🔍 Attention이란?

💡 핵심 개념

Attention은 모델이 입력 시퀀스의 어떤 부분에 "주의"를 기울일지 결정하는 메커니즘입니다. 인간이 긴 문장을 읽을 때 중요한 단어에 집중하는 것처럼, AI 모델도 관련성이 높은 정보에 더 많은 가중치를 부여합니다.

🎯 작동 원리

Attention은 세 가지 핵심 요소로 구성됩니다:

  • Query (질의): 현재 처리하고 있는 위치의 정보
  • Key (키): 모든 입력 위치의 식별자
  • Value (값): 실제 정보를 담고 있는 벡터

🏪 도서관 검색 비유로 이해하기

🔍 Query (질의)

"파이썬 프로그래밍"
찾고 있는 주제

🔑 Key (키)

책들의 제목/태그
검색 가능한 식별자

📖 Value (값)

책의 실제 내용
가져올 정보

도서관에서 "파이썬 프로그래밍"을 검색(Query)하면, 모든 책의 제목/태그(Key)와 비교해서 가장 관련된 책들을 찾고, 그 책의 실제 내용(Value)을 가져오는 것과 같습니다.

📊 간단한 문장 vs 복잡한 문장에서 Attention 비교

☕ 간단한 상황: "아메리카노 주세요"
"아메리카노 주세요"
아메리카노
주세요
🎯 "아메리카노" 처리 시 Attention 점수
아메리카노
0.7
자기 자신
주세요
0.3
요청
🧠 결과

"아메리카노" = 0.7×[커피 종류] + 0.3×[주문 요청]

→ "주문하려는 일반적인 커피"

VS
☕ 복잡한 상황: 카페에서의 긴 주문
"어제 마셨던 달콤한 아메리카노를 오늘도 한 잔 주세요"
어제
마셨던
달콤한
아메리카노를
오늘도
주세요
🎯 "아메리카노를" 처리할 때 Attention의 집중도

Query: "아메리카노를"이 지금 무슨 의미인지 알아보자!

🔍 모든 단어와 관련성 점수 계산
어제
0.15
시간 관련
마셨던
0.25
음료 경험
달콤한
0.30
맛 특징
아메리카노를
0.05
자기 자신
오늘도
0.10
시간 연속성
한 잔
0.10
수량
주세요
0.05
요청
🎯 Attention이 발견한 중요한 관계들
달콤한 (0.30)

아메리카노의 맛 특성

마셨던 (0.25)

과거 경험과 연결

어제 (0.15)

시간적 맥락 제공

🧠 최종 맥락적 의미 완성
"아메리카노를" = 0.30×[달콤한 특성] + 0.25×[과거 경험] + 0.15×[어제] + ...

"어제 마셨던 그 달콤한 맛의 특별한 아메리카노"

🔥 Attention의 똑똑한 점!
  • "달콤한"에 가장 높은 점수(0.30) - 아메리카노의 핵심 특징
  • "마셨던"에 두 번째 점수(0.25) - 과거 경험과 연결
  • "주세요"는 낮은 점수(0.05) - 일반적인 요청어라 덜 중요
  • 자기 자신에도 낮은 점수(0.05) - 다른 단어들의 맥락이 더 중요
💡 만약 단순한 문장이었다면?

"아메리카노 주세요" → 그냥 일반적인 커피 주문

"어제 마셨던 달콤한 아메리카노를..." → 특별한 기억과 맛이 있는 특정한 아메리카노

이것이 바로 Attention의 핵심! 같은 단어라도 문맥에 따라 완전히 다른 의미로 이해합니다.

✅ 장점

  • 장거리 의존성 해결
  • 병렬 처리 가능
  • 해석 가능성 제공
  • 선택적 정보 집중

❌ 단점

  • 계산 복잡도 O(n²)
  • 메모리 사용량 증가
  • 긴 시퀀스에서 비효율적
  • 위치 정보 부족

✅ 장점 상세 설명

🔗 장거리 의존성 해결

기존 RNN의 문제: "오늘 아침에 마신 커피가 정말 맛있어서 내일도 그 카페에 가려고 해"라는 긴 문장에서, RNN은 "오늘 아침"과 "내일도"의 연결을 기억하기 어려웠습니다.

🤔 왜 RNN이 기억하기 어려울까?

1. 순차적 처리의 한계:

RNN은 "오늘" → "아침에" → "마신" → "커피가" → ... → "내일도" 순서로 하나씩 처리합니다. "내일도"에 도달할 때까지 11개의 단어를 거쳐야 하는데, 각 단계마다 이전 정보가 조금씩 희석됩니다.

2. 기울기 소실 (Vanishing Gradient) 문제:

학습 과정에서 먼 과거의 정보일수록 기울기가 0에 가까워져서, "오늘 아침"의 중요한 시간 정보가 "내일도"까지 제대로 전달되지 못합니다.

3. 고정된 크기의 숨겨진 상태:

RNN은 모든 과거 정보를 고정된 크기의 벡터에 압축해서 저장해야 합니다. 문장이 길어질수록 중요한 정보들이 뒤섞이거나 덮어써집니다.

4. 정보 병목 현상:

"맛있어서"와 같은 중간 단어들이 "오늘 아침"과 "내일도" 사이의 정보 전달 통로 역할을 해야 하는데, 이 과정에서 시간적 대비라는 핵심 정보가 손실됩니다.

Attention의 해결: 문장의 어떤 위치에서든 다른 모든 위치와 직접 연결되어, "오늘 아침"과 "내일도"의 시간적 대비를 즉시 파악할 수 있습니다.

💡 핵심: 거리에 상관없이 모든 단어 간의 관계를 한 번에 계산!

🔍 Attention이 단어 쌍을 찾는 과정
1단계: 모든 단어를 벡터로 변환

각 단어를 숫자 벡터로 표현합니다. (예: "오늘" = [0.2, 0.8, 0.1, ...], "내일도" = [0.3, 0.7, 0.2, ...])

2단계: 유사도 점수 계산 (내적)

두 벡터를 곱해서 유사도를 계산합니다. 비슷한 의미일수록 높은 점수가 나옵니다.

유사도("오늘", "내일도") = [0.2×0.3] + [0.8×0.7] + [0.1×0.2] + ... = 0.68
🤖 딥러닝이 여기서 사용됩니다!

Q: 단어 벡터는 어떻게 만들어질까요?

A: 딥러닝 신경망이 학습을 통해 생성합니다!

1. Query, Key, Value 변환:

  • 원본 단어 벡터에 학습된 가중치 행렬을 곱함
  • Query = 원본벡터 × W_Q (학습된 가중치)
  • Key = 원본벡터 × W_K (학습된 가중치)
  • Value = 원본벡터 × W_V (학습된 가중치)

2. 학습 과정:

  • 수많은 문장으로 훈련하면서 가중치 조정
  • "시간 관련 단어들은 서로 높은 유사도를 가져야 한다" 학습
  • "의미가 다른 단어들은 낮은 유사도를 가져야 한다" 학습

3. 결과:

딥러닝이 "오늘"과 "내일도"가 시간적으로 관련있다는 것을 자동으로 학습하여, 이들 간의 유사도가 높게 계산되도록 벡터를 조정합니다.

💡 즉, 유사도 자체는 단순한 내적 계산이지만,
그 벡터들을 만드는 과정에서 딥러닝이 핵심 역할을 합니다!

3단계: 모든 단어 쌍에 대해 반복

"오늘"을 기준으로 문장의 모든 단어와 유사도를 계산합니다:

• "오늘" ↔ "아침에": 0.85 (높음)
• "오늘" ↔ "마신": 0.12 (낮음)
• "오늘" ↔ "커피가": 0.23 (낮음)
• "오늘" ↔ "맛있어서": 0.18 (낮음)
• "오늘" ↔ "내일도": 0.68 (높음)
• "오늘" ↔ "카페에": 0.15 (낮음)
4단계: 확률로 변환 (Softmax)

유사도 점수들을 0~1 사이의 확률로 변환하여 모든 점수의 합이 1이 되도록 합니다.

• "오늘" → "아침에": 0.35
• "오늘" → "마신": 0.08
• "오늘" → "커피가": 0.12
• "오늘" → "맛있어서": 0.10
• "오늘" → "내일도": 0.25
• "오늘" → "카페에": 0.10
합계 = 1.00 ✓
5단계: 가중 평균으로 최종 의미 생성

각 단어의 의미를 attention 확률에 따라 섞어서 "오늘"의 새로운 맥락적 의미를 만듭니다.

"오늘"의 새로운 의미 = 0.35×[아침에 의미] + 0.25×[내일도 의미] + 0.12×[커피가 의미] + ...
🎯 최종 결과

"오늘"이 단순한 시간 표현이 아니라, "아침에 경험한 과거""내일과 대비되는 시점"이라는 풍부한 의미를 갖게 됩니다!

🔑 핵심 포인트
  • 벡터 내적으로 의미적 유사도를 수치화
  • 모든 단어 쌍을 빠짐없이 계산
  • Softmax로 중요도를 확률 분포로 변환
  • 가중 평균으로 맥락적 의미 완성
⚡ 병렬 처리 가능

기존 RNN의 한계: "고양이가 집에서 잠을 잔다"를 처리할 때, 반드시 "고양이가" → "집에서" → "잠을" → "잔다" 순서대로 처리해야 했습니다.

Attention의 혁신: 모든 단어를 동시에 처리할 수 있어서, GPU의 여러 코어가 각각 다른 단어를 병렬로 계산합니다.

💡 결과: 훈련 시간이 몇 시간에서 몇 분으로 단축!

❌ 단점 상세 설명

📈 계산 복잡도 O(n²)

문제: 문장의 길이가 n개 단어일 때, 모든 단어 쌍의 관계를 계산해야 하므로 n² 번의 계산이 필요합니다.

예시:

  • 10개 단어 → 100번 계산
  • 100개 단어 → 10,000번 계산
  • 1,000개 단어 → 1,000,000번 계산!

💡 문장이 2배 길어지면 계산량은 4배 증가!

💾 메모리 사용량 증가

문제: 모든 단어 쌍의 attention 점수를 메모리에 저장해야 합니다.

메모리 사용량 예시:

  • 512개 단어 문서 → 약 1GB 메모리
  • 1,024개 단어 문서 → 약 4GB 메모리
  • 2,048개 단어 문서 → 약 16GB 메모리

💡 긴 문서일수록 엄청난 메모리가 필요!

🐌 긴 시퀀스에서 비효율적

실제 문제: 책 한 권(수만 개 단어)이나 긴 대화를 처리할 때 현실적으로 불가능해집니다.

현실적 한계:

  • 대부분의 Transformer 모델: 최대 512~2048 토큰
  • 긴 문서는 잘라서 처리해야 함
  • 문맥이 끊어져서 의미 손실 발생

💡 이 때문에 최근 "Efficient Attention" 연구가 활발!

🌟 실제 응용 예시

  • 기계 번역: Google Translate의 GNMT 모델
  • 이미지 캡셔닝: Show, Attend and Tell
  • 음성 인식: Listen, Attend and Spell
  • 문서 요약: Pointer-Generator Networks

'AI' 카테고리의 다른 글

[AI] Gradient Descent 옵티마이저의 진화  (2) 2025.06.14
[AI] Transformer  (0) 2025.06.14
[AI] RNN모델부터 Seq2Seq 모델 까지  (7) 2025.06.14
[AI] AI의 발전 과정  (0) 2025.06.14
[AI] 텍스트 임베딩  (4) 2025.06.14