🔍 Attention이란?
💡 핵심 개념
Attention은 모델이 입력 시퀀스의 어떤 부분에 "주의"를 기울일지 결정하는 메커니즘입니다. 인간이 긴 문장을 읽을 때 중요한 단어에 집중하는 것처럼, AI 모델도 관련성이 높은 정보에 더 많은 가중치를 부여합니다.
🎯 작동 원리
Attention은 세 가지 핵심 요소로 구성됩니다:
- Query (질의): 현재 처리하고 있는 위치의 정보
- Key (키): 모든 입력 위치의 식별자
- Value (값): 실제 정보를 담고 있는 벡터
🏪 도서관 검색 비유로 이해하기
🔍 Query (질의)
"파이썬 프로그래밍"
찾고 있는 주제
🔑 Key (키)
책들의 제목/태그
검색 가능한 식별자
📖 Value (값)
책의 실제 내용
가져올 정보
도서관에서 "파이썬 프로그래밍"을 검색(Query)하면, 모든 책의 제목/태그(Key)와 비교해서 가장 관련된 책들을 찾고, 그 책의 실제 내용(Value)을 가져오는 것과 같습니다.
📊 간단한 문장 vs 복잡한 문장에서 Attention 비교
☕ 간단한 상황: "아메리카노 주세요"
🧠 결과
"아메리카노" = 0.7×[커피 종류] + 0.3×[주문 요청]
→ "주문하려는 일반적인 커피"
☕ 복잡한 상황: 카페에서의 긴 주문
🎯 "아메리카노를" 처리할 때 Attention의 집중도
Query: "아메리카노를"이 지금 무슨 의미인지 알아보자!
🎯 Attention이 발견한 중요한 관계들
아메리카노의 맛 특성
과거 경험과 연결
시간적 맥락 제공
🧠 최종 맥락적 의미 완성
→ "어제 마셨던 그 달콤한 맛의 특별한 아메리카노"
🔥 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단계: 유사도 점수 계산 (내적)
두 벡터를 곱해서 유사도를 계산합니다. 비슷한 의미일수록 높은 점수가 나옵니다.
🤖 딥러닝이 여기서 사용됩니다!
Q: 단어 벡터는 어떻게 만들어질까요?
A: 딥러닝 신경망이 학습을 통해 생성합니다!
1. Query, Key, Value 변환:
- 원본 단어 벡터에 학습된 가중치 행렬을 곱함
- Query = 원본벡터 × W_Q (학습된 가중치)
- Key = 원본벡터 × W_K (학습된 가중치)
- Value = 원본벡터 × W_V (학습된 가중치)
2. 학습 과정:
- 수많은 문장으로 훈련하면서 가중치 조정
- "시간 관련 단어들은 서로 높은 유사도를 가져야 한다" 학습
- "의미가 다른 단어들은 낮은 유사도를 가져야 한다" 학습
3. 결과:
딥러닝이 "오늘"과 "내일도"가 시간적으로 관련있다는 것을 자동으로 학습하여, 이들 간의 유사도가 높게 계산되도록 벡터를 조정합니다.
💡 즉, 유사도 자체는 단순한 내적 계산이지만,
그 벡터들을 만드는 과정에서 딥러닝이 핵심 역할을 합니다!
3단계: 모든 단어 쌍에 대해 반복
"오늘"을 기준으로 문장의 모든 단어와 유사도를 계산합니다:
4단계: 확률로 변환 (Softmax)
유사도 점수들을 0~1 사이의 확률로 변환하여 모든 점수의 합이 1이 되도록 합니다.
5단계: 가중 평균으로 최종 의미 생성
각 단어의 의미를 attention 확률에 따라 섞어서 "오늘"의 새로운 맥락적 의미를 만듭니다.
🎯 최종 결과
"오늘"이 단순한 시간 표현이 아니라, "아침에 경험한 과거"와 "내일과 대비되는 시점"이라는 풍부한 의미를 갖게 됩니다!
🔑 핵심 포인트
- 벡터 내적으로 의미적 유사도를 수치화
- 모든 단어 쌍을 빠짐없이 계산
- 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