지난 장에서 우리는 LLM이 사람처럼 말하는 것처럼 보이는 이유를 살펴보았습니다. 모델은 문장을 '이해했다'고 말하기 전에, 우선 컨텍스트 안의 토큰들을 바탕으로 다음 토큰의 확률을 계산합니다. 그런데 여기서 중요한 질문이 하나 남습니다.
모델은 많은 토큰 중에서 무엇을 보고 다음 토큰을 예측할까요?
문장이 짧을 때는 그리 어려워 보이지 않습니다. "나는 밥을" 다음에는 "먹었다"가 자연스럽습니다. 하지만 문장이 길어지면 이야기가 달라집니다.
민수는 어제 도서관에서 빌린 책을 가방에 넣어 두었고, 오늘 아침 학교에 도착한 뒤 그것을 꺼냈다.
여기서 "그것"은 무엇을 가리킬까요? 사람은 자연스럽게 "책"이라고 이해합니다. "가방"도 앞에 있고 "도서관"도 앞에 있지만, "꺼낼 수 있는 물건"이라는 관계를 생각하면 책이 가장 그럴듯합니다.
LLM도 비슷한 문제를 풀어야 합니다. 다만 사람처럼 머릿속에 장면을 떠올린다고 단정할 필요는 없습니다. 모델 안에서는 토큰들 사이의 관계가 숫자로 계산됩니다. 이때 핵심 역할을 하는 장치가 바로 Attention입니다.
Attention은 말 그대로 "어디에 주목할 것인가"를 계산하는 방법입니다. 더 정확히 말하면, 어떤 토큰의 표현을 만들 때 문맥 안의 다른 토큰들을 얼마나 참고할지 수치로 정하는 방식입니다.

순서대로 읽는 모델의 한계
Transformer가 널리 쓰이기 전에도 문장을 처리하는 신경망 모델은 있었습니다. 대표적으로 RNN 계열 모델은 문장을 앞에서 뒤로 하나씩 읽어 나가는 방식에 가까웠습니다.
예를 들어 다음 문장을 생각해 봅시다.
나는 어제 친구가 추천해 준 아주 두꺼운 소설책을 밤새 읽었다.
순서대로 처리하는 모델은 "나는"을 읽고, 그다음 "어제"를 읽고, 그다음 "친구가"를 읽는 식으로 정보를 계속 넘깁니다. 마치 릴레이 달리기처럼 앞 토큰의 정보가 다음 토큰으로 전달됩니다.
이 방식은 직관적입니다. 우리도 글을 왼쪽에서 오른쪽으로 읽으니까요. 하지만 문제가 있습니다. 문장이 길어질수록 앞쪽 정보가 뒤쪽까지 온전히 전달되기 어렵습니다. "소설책"과 "읽었다"는 서로 강하게 연결되어야 하지만, 그 사이에 수식어가 길게 끼어 있으면 관계가 흐려질 수 있습니다.
더 큰 문제는 모든 관계를 같은 통로로만 전달한다는 점입니다. 문장에는 가까운 단어끼리의 관계도 있고, 멀리 떨어진 단어끼리의 관계도 있습니다. "그것"이 무엇을 가리키는지 찾을 때는 바로 앞 단어보다 훨씬 앞에 나온 단어가 중요할 수도 있습니다.
Attention은 이 문제를 다른 방식으로 풉니다. 정보를 무조건 순서대로만 밀어 넣지 않고, 문장 안의 토큰들이 서로를 직접 바라볼 수 있게 만듭니다.
모든 토큰이 서로를 바라본다는 생각
Attention의 핵심 아이디어는 간단합니다.
각 토큰은 자기 표현을 새로 만들 때, 문맥 안의 다른 토큰들을 필요한 만큼 참고한다.
여기서 "참고한다"는 말은 감성적인 표현이 아니라 계산적인 표현입니다. 어떤 토큰을 많이 참고할지, 적게 참고할지를 숫자로 정합니다.
문장을 하나 보겠습니다.
고양이는 소파 위에서 잠들었고, 그것은 아주 편안해 보였다.
"그것은"이라는 토큰을 처리할 때, 모델은 어떤 토큰을 봐야 할까요? "고양이"를 많이 봐야 할 수도 있고, "소파"를 봐야 할 수도 있습니다. 실제 의미만 놓고 보면 "편안해 보였다"는 표현은 소파보다는 고양이와 더 잘 어울립니다. 따라서 "그것"을 이해하려면 "고양이" 쪽 정보가 중요합니다.
Attention은 이런 관계를 점수로 만듭니다. "그것"이라는 토큰이 "고양이"를 얼마나 봐야 하는지, "소파"를 얼마나 봐야 하는지, "잠들었고"를 얼마나 봐야 하는지를 각각 계산합니다.
물론 모델이 처음부터 "고양이는 생물이고 소파는 가구니까…" 하고 말로 추론하는 것은 아닙니다. 학습 과정에서 수많은 문장 패턴을 접하면서, 어떤 토큰 조합이 다음 토큰 예측에 도움이 되는지 벡터 공간 안에 반영됩니다. Attention은 그 관계를 매번 문맥에 맞게 꺼내 쓰는 장치입니다.
Attention은 '중요도'를 숫자로 만든다
Attention에서 가장 먼저 이해해야 할 개념은 Attention score입니다. Attention score는 한 토큰이 다른 토큰을 얼마나 중요하게 볼지를 나타내는 점수입니다.
문장을 아주 작게 줄여 보겠습니다.
고양이 는 생선 을 먹었다
토큰을 단순하게 나누면 다음과 같습니다.
| 위치 | 토큰 |
|---|---|
| 1 | 고양이 |
| 2 | 는 |
| 3 | 생선 |
| 4 | 을 |
| 5 | 먹었다 |
이제 "먹었다"라는 토큰의 표현을 갱신한다고 생각해 봅시다. "먹었다"는 어떤 토큰과 관련이 깊을까요? 아마 "고양이"와 "생선"이 중요할 것입니다. "는"과 "을"도 문법적인 정보를 주지만, 의미의 중심은 "누가 먹었는가"와 "무엇을 먹었는가"입니다.
이를 아주 단순한 숫자로 표현하면 다음처럼 볼 수 있습니다.
| 현재 토큰 | 고양이 | 는 | 생선 | 을 | 먹었다 |
|---|---|---|---|---|---|
| 먹었다 | 0.35 | 0.05 | 0.45 | 0.05 | 0.10 |
이 표는 실제 모델에서 나온 값이 아니라 이해를 위한 예시입니다. 여기서 "먹었다"는 자기 표현을 만들 때 "생선"을 0.45만큼, "고양이"를 0.35만큼, 자기 자신을 0.10만큼 참고합니다. 조사인 "는"과 "을"도 완전히 버리지는 않지만 상대적으로 적게 참고합니다.
중요한 점은 이 값들의 합이 보통 1이 되도록 정리된다는 것입니다. 즉, 전체 관심의 양을 여러 토큰에 나누어 배분하는 셈입니다. 어떤 토큰에 관심이 몰릴 수도 있고, 여러 토큰에 고르게 퍼질 수도 있습니다.
이렇게 계산된 중요도는 단순한 표시용 점수가 아닙니다. 실제로 다음 단계에서 토큰의 벡터 표현을 새로 만드는 데 사용됩니다.
한 토큰의 표현은 혼자 만들어지지 않는다
앞장에서 우리는 토큰이 임베딩 벡터로 바뀐다고 했습니다. 하지만 Transformer 안에서 토큰의 벡터는 처음 임베딩 상태로 가만히 있지 않습니다. 문맥을 지나며 계속 바뀝니다.
처음의 "먹었다" 벡터는 그저 "먹었다"라는 토큰 자체의 기본 의미에 가깝습니다. 그런데 문장 안에서는 "고양이가 생선을 먹었다"의 "먹었다"일 수도 있고, "학생이 점심을 먹었다"의 "먹었다"일 수도 있습니다. 같은 토큰이라도 주변 문맥에 따라 역할이 조금씩 달라집니다.
Attention은 이 주변 정보를 섞어 새 표현을 만듭니다. 방금 표를 다시 떠올려 봅시다.
| 현재 토큰 | 고양이 | 는 | 생선 | 을 | 먹었다 |
|---|---|---|---|---|---|
| 먹었다 | 0.35 | 0.05 | 0.45 | 0.05 | 0.10 |
이제 "먹었다"의 새 벡터는 대략 이런 식으로 만들어진다고 볼 수 있습니다.
새 "먹었다" 표현
= 0.35 × "고양이" 정보
0.05 × "는" 정보
0.45 × "생선" 정보
0.05 × "을" 정보
0.10 × "먹었다" 정보
여기서 벡터를 숫자 목록이라고 생각하면 됩니다. 각 토큰은 자기만의 벡터를 가지고 있고, Attention score는 그 벡터들을 어떤 비율로 섞을지 정합니다. 이처럼 여러 정보를 가중치에 따라 더하는 것을 가중합이라고 부릅니다.
가중합이라는 말이 어렵게 느껴진다면 주스를 떠올리면 됩니다. 오렌지 70%, 망고 20%, 레몬 10%를 섞으면 오렌지 맛이 강한 주스가 됩니다. 마찬가지로 "먹었다"의 표현에 "생선" 정보가 많이 섞이면, 이 문장에서의 "먹었다"는 '무엇을 먹었는가'와 강하게 연결된 표현이 됩니다.
이 과정 덕분에 토큰의 표현은 고정된 사전적 의미에서 벗어나 문장 안의 역할을 반영하게 됩니다.
bank는 은행인가, 강둑인가
Attention이 왜 중요한지 보여 주는 대표적인 예가 중의성입니다. 영어 단어 "bank"는 문맥에 따라 "은행"일 수도 있고 "강둑"일 수도 있습니다.
다음 두 문장을 봅시다.
I deposited money at the bank.
나는 bank에 돈을 입금했다.
I sat on the bank of the river.
나는 강의 bank에 앉았다.
두 문장 모두 "bank"라는 같은 토큰을 포함할 수 있습니다. 하지만 의미는 전혀 다릅니다. 첫 번째 문장에서는 "money", "deposited" 같은 단어가 금융 기관의 의미를 강하게 만듭니다. 두 번째 문장에서는 "river", "sat on" 같은 표현이 강둑의 의미를 강하게 만듭니다.
Attention 관점에서 보면, "bank"의 의미는 혼자 결정되지 않습니다. 주변 토큰과의 관계 속에서 결정됩니다.
이해를 위해 예시 Attention score를 만들어 보겠습니다.
| 문장 | bank가 강하게 참고할 만한 토큰 | 의미 |
|---|---|---|
| I deposited money at the bank | deposited, money | 금융 기관 |
| I sat on the bank of the river | sat, river | 강둑 |
실제 LLM에서는 "bank" 하나만 따로 해석하고 끝내지 않습니다. 각 위치의 토큰 표현이 여러 층을 지나며 계속 갱신됩니다. 하지만 핵심은 같습니다. 같은 토큰이라도 어떤 토큰을 많이 참고하느냐에 따라 문맥 속 표현이 달라집니다.
한국어에도 비슷한 예가 많습니다.
배를 먹었다.
배를 탔다.
배가 아프다.
여기서 "배"는 과일일 수도 있고, 탈것일 수도 있고, 신체 부위일 수도 있습니다. "먹었다", "탔다", "아프다"가 의미를 가르는 결정적 단서입니다. Attention은 이런 단서와 대상 토큰 사이의 연결을 숫자로 다룹니다.
Attention 행렬 읽기
Attention은 토큰 하나에 대해서만 계산되는 것이 아닙니다. 문장 안의 모든 토큰이 다른 토큰들을 얼마나 참고할지 계산할 수 있습니다. 이 결과를 표로 정리하면 Attention 행렬이 됩니다.
문장을 다시 보겠습니다.
고양이 는 생선 을 먹었다
이 문장에는 토큰이 5개 있습니다. 각 토큰이 5개 토큰을 각각 얼마나 참고하는지 나타내면 5×5 표가 됩니다.
| 현재 토큰 참고 토큰 | 고양이 | 는 | 생선 | 을 | 먹었다 |
|---|---|---|---|---|---|
| 고양이 | 0.60 | 0.20 | 0.05 | 0.05 | 0.10 |
| 는 | 0.50 | 0.30 | 0.05 | 0.05 | 0.10 |
| 생선 | 0.10 | 0.05 | 0.60 | 0.15 | 0.10 |
| 을 | 0.05 | 0.05 | 0.55 | 0.25 | 0.10 |
| 먹었다 | 0.35 | 0.05 | 0.45 | 0.05 | 0.10 |
이 표도 설명을 위한 가상의 예시입니다. 하지만 Attention 행렬을 읽는 기본법은 실제 모델에서도 비슷합니다.
가로 방향은 "어떤 토큰을 참고하는가"를 뜻합니다. 세로 방향은 "현재 어떤 토큰의 표현을 갱신하는가"를 뜻합니다. 예를 들어 마지막 줄을 보면, 현재 갱신되는 토큰은 "먹었다"입니다. 이때 "먹었다"는 "생선"을 0.45, "고양이"를 0.35만큼 참고합니다.
Attention 행렬을 볼 때는 한 줄씩 읽으면 됩니다.
"이 토큰은 자기 표현을 만들기 위해 어떤 토큰들을 보고 있는가?"
값이 큰 칸은 관계가 강하다는 뜻입니다. 시각화 도구에서는 이런 값을 색으로 표현하기도 합니다. 값이 클수록 진하게, 값이 작을수록 옅게 표시하면 문장 안에서 어떤 연결이 두드러지는지 한눈에 볼 수 있습니다.
아주 단순하게 색 대신 기호로 표현하면 다음과 같습니다.
| 현재 토큰 참고 토큰 | 고양이 | 는 | 생선 | 을 | 먹었다 |
|---|---|---|---|---|---|
| 고양이 | ●●● | ● | · | · | · |
| 는 | ●● | ● | · | · | · |
| 생선 | · | · | ●●● | ● | · |
| 을 | · | · | ●●● | ● | · |
| 먹었다 | ●● | · | ●●● | · | ● |
"먹었다" 줄에서 "생선"과 "고양이"가 진하게 나타난다면, 우리는 모델이 이 두 토큰을 중요하게 참고하고 있다고 해석할 수 있습니다. 물론 주의해야 할 점도 있습니다. Attention 값이 높다고 해서 반드시 사람이 생각하는 의미 관계와 완벽히 일치한다고 단정할 수는 없습니다. Attention은 모델 내부 계산의 일부이고, 최종 예측은 여러 층과 여러 계산을 거쳐 만들어집니다.
그래도 Attention 행렬은 LLM이 문맥 속 관계를 다루는 방식을 직관적으로 보여 주는 좋은 창문입니다.
모든 토큰을 동시에 본다는 말의 정확한 의미
Transformer를 설명할 때 흔히 "모든 토큰이 서로를 동시에 본다"고 말합니다. 이 표현은 유용하지만, 조금 조심해서 이해해야 합니다.
먼저 RNN처럼 토큰을 하나씩 순서대로 넘겨 처리하는 방식과 달리, Transformer는 한 층 안에서 여러 토큰 사이의 관계를 한꺼번에 계산할 수 있습니다. 그래서 긴 문장 안의 멀리 떨어진 토큰도 직접 연결될 수 있습니다. "문장 앞의 주어"와 "문장 뒤의 동사"가 많은 단계를 거치지 않고 Attention 계산 안에서 만날 수 있는 것입니다.
하지만 GPT 같은 생성형 언어 모델에는 중요한 제약이 있습니다. GPT는 다음 토큰을 맞히도록 학습되기 때문에, 어떤 위치의 토큰을 처리할 때 미래 토큰을 몰래 보면 안 됩니다. 예를 들어 "나는 오늘 점심으로 김치찌개를"까지 보고 다음 토큰을 예측해야 하는데, 정답인 "먹었다"를 미리 보면 안 되겠지요.
그래서 GPT 계열 모델은 보통 causal mask, 즉 미래를 가리는 마스크를 사용합니다. 이 말은 현재 위치의 토큰이 자기보다 뒤에 있는 토큰을 참고하지 못하게 막는다는 뜻입니다.
예를 들어 다음 토큰들이 있다고 해 봅시다.
나는 / 오늘 / 점심을 / 먹었다
GPT 방식에서는 "점심을" 위치의 표현을 만들 때 "먹었다"를 볼 수 없습니다. 아직 미래 토큰이기 때문입니다. 대신 "나는", "오늘", "점심을"까지는 볼 수 있습니다.
이를 표로 나타내면 다음과 같습니다. 여기서 ✓는 볼 수 있음, ✕는 볼 수 없음을 뜻합니다.
| 현재 토큰 참고 토큰 | 나는 | 오늘 | 점심을 | 먹었다 |
|---|---|---|---|---|
| 나는 | ✓ | ✕ | ✕ | ✕ |
| 오늘 | ✓ | ✓ | ✕ | ✕ |
| 점심을 | ✓ | ✓ | ✓ | ✕ |
| 먹었다 | ✓ | ✓ | ✓ | ✓ |
이런 마스크 덕분에 GPT는 문장을 생성할 때 규칙을 지킵니다. 앞에서 나온 토큰만 보고 다음 토큰을 예측합니다.
그러면 "모든 토큰 관계를 동시에 본다"는 말은 틀린 말일까요? 그렇지는 않습니다. 정확히는 허용된 범위 안에서 토큰들 사이의 관계를 한꺼번에 계산한다는 뜻입니다. GPT에서는 미래를 제외한 과거와 현재 토큰들 사이의 관계를 병렬적으로 계산합니다. 반면 번역이나 문장 이해에 쓰이는 다른 Transformer 구조에서는 양방향 문맥을 모두 보는 경우도 있습니다.
이 차이를 기억해 두면 앞으로 GPT 구조를 볼 때 혼란이 줄어듭니다.
Attention은 문법도 보고, 의미도 보고, 위치도 본다
Attention이 보는 것은 하나로 고정되어 있지 않습니다. 어떤 Attention은 문법적 관계에 민감할 수 있고, 어떤 Attention은 의미적 관계에 민감할 수 있습니다. 또 어떤 Attention은 가까운 토큰을 주로 보고, 어떤 Attention은 멀리 떨어진 토큰을 연결하는 데 쓰일 수 있습니다.
예를 들어 다음 문장을 보겠습니다.
철수는 영희가 어제 산 케이크를 먹었다.
"먹었다"를 이해하려면 여러 관계가 필요합니다. "철수는"은 먹은 주체와 관련될 수 있고, "케이크를"은 먹은 대상과 관련됩니다. "영희가 어제 산"은 케이크를 설명하는 수식 정보입니다.
문장을 사람이 읽을 때도 한 가지 관계만 보지 않습니다. 누가 했는지, 무엇을 했는지, 무엇을 대상으로 했는지, 어떤 수식어가 붙었는지 동시에 엮어 이해합니다. Transformer도 여러 층의 Attention을 통해 이런 다양한 관계를 조금씩 반영합니다.
물론 이 장에서는 아직 Multi-Head Attention을 자세히 다루지 않았습니다. 이름만 살짝 예고하자면, Transformer는 Attention을 하나만 두지 않고 여러 개의 "시선"을 병렬로 둡니다. 하나의 시선이 주어-동사 관계를 잘 잡는다면, 다른 시선은 수식 관계나 참조 관계를 더 잘 잡을 수 있습니다. 이 여러 시선이 합쳐지면서 토큰 표현은 더 풍부해집니다.
지금은 이렇게만 이해하면 충분합니다.
Attention은 문장 안에서 어떤 정보가 지금 토큰에 필요한지 계산하는 장치다.
Attention이 긴 문맥을 다루는 방식
LLM을 쓰다 보면 모델이 꽤 긴 대화의 앞부분을 기억하는 것처럼 보일 때가 있습니다. 예를 들어 사용자가 처음에 "앞으로 나를 '작가님'이라고 불러 줘"라고 말하면, 모델은 이후 답변에서 그 호칭을 유지할 수 있습니다.
이것도 결국 컨텍스트 안의 토큰들을 참고하는 문제입니다. 뒤쪽 답변을 생성할 때 앞쪽에 있던 "작가님"이라는 지시가 중요한 정보로 떠오를 수 있어야 합니다. Attention은 멀리 떨어진 토큰도 직접 참고할 수 있게 해 주므로, 이런 긴 거리 관계를 처리하는 데 유리합니다.
하지만 Attention이 있다고 해서 무한히 긴 문맥을 완벽하게 기억하는 것은 아닙니다. 앞장에서 본 것처럼 컨텍스트 윈도우에는 한계가 있습니다. 또한 컨텍스트 안에 들어와 있더라도 모든 정보를 똑같이 잘 쓰는 것은 아닙니다. 중요한 정보가 너무 많거나, 서로 충돌하거나, 문맥이 지나치게 길면 모델이 핵심을 놓칠 수 있습니다.
그래서 실제 서비스를 만들 때는 중요한 정보를 문맥 안에 잘 넣어 주는 설계가 필요합니다. 나중에 다룰 RAG는 바로 이 문제와 연결됩니다. 모델이 모든 지식을 내부 파라미터에 기억하게 하는 대신, 필요한 문서를 검색해서 컨텍스트에 넣어 주고, Attention이 그 문서의 관련 부분을 참고하도록 돕는 방식입니다.
아직 RAG를 자세히 알 필요는 없습니다. 다만 지금 기억할 것은 하나입니다. LLM이 긴 문맥을 활용한다는 말은, 그 문맥 안의 토큰들 사이에 Attention 관계를 계산한다는 뜻입니다.
작은 예제로 직접 따라가 보기
이제 Attention의 흐름을 아주 작은 예제로 정리해 봅시다.
문장이 있습니다.
새가 하늘을 날았다
토큰을 다음처럼 나누겠습니다.
| 위치 | 토큰 |
|---|---|
| 1 | 새가 |
| 2 | 하늘을 |
| 3 | 날았다 |
각 토큰은 처음에 임베딩 벡터를 가집니다. 여기서는 실제 벡터값 대신 이름으로만 표시하겠습니다.
| 토큰 | 처음 벡터 |
|---|---|
| 새가 | v_새가 |
| 하늘을 | v_하늘을 |
| 날았다 | v_날았다 |
이제 "날았다"의 표현을 갱신하려고 합니다. 모델은 "날았다"가 어떤 토큰을 얼마나 참고할지 점수를 계산합니다.
| 현재 토큰 | 새가 | 하늘을 | 날았다 |
|---|---|---|---|
| 날았다 | 0.45 | 0.35 | 0.20 |
그다음 이 점수를 이용해 벡터를 섞습니다.
새 "날았다" 표현
= 0.45 × v_새가
0.35 × v_하늘을
0.20 × v_날았다
이렇게 갱신된 "날았다" 벡터는 단순히 "날았다"라는 동작만 담고 있지 않습니다. "새가" 날았고, "하늘을" 날았다는 문맥 정보가 섞여 있습니다. 따라서 다음 층으로 넘어갈 때 모델은 더 문맥화된 표현을 사용할 수 있습니다.
이번에는 문장을 바꿔 보겠습니다.
비행기가 하늘을 날았다
"날았다"는 여전히 같은 토큰일 수 있지만, 이번에는 "새가" 대신 "비행기가"와 연결됩니다. Attention score도 달라질 수 있습니다.
| 현재 토큰 | 비행기가 | 하늘을 | 날았다 |
|---|---|---|---|
| 날았다 | 0.50 | 0.30 | 0.20 |
같은 "날았다"라도 문맥에 따라 새 표현은 달라집니다. 이것이 Attention의 힘입니다. 토큰은 고정된 의미 덩어리가 아니라, 문장 안에서 다른 토큰들과 연결되며 계속 새로 해석됩니다.
Attention이 마법은 아니다
Attention을 처음 배우면, 마치 이것만으로 언어 이해가 모두 해결되는 것처럼 느껴질 수 있습니다. 하지만 Attention은 마법이 아닙니다. Attention은 "무엇을 참고할지"를 계산하는 강력한 방법이지만, 그 자체가 완전한 이해를 보장하지는 않습니다.
모델이 좋은 Attention 패턴을 만들려면 먼저 많은 데이터로 학습되어야 합니다. "먹었다"가 음식과 잘 연결되고, "입금했다"가 돈과 은행에 연결되고, "강가에 앉았다"가 강둑의 의미와 연결되려면 그런 패턴이 학습 과정에서 충분히 반영되어야 합니다.
또 Attention score가 높다고 해서 항상 사람이 납득하는 설명이 되는 것도 아닙니다. 모델 내부에는 Attention 외에도 여러 계산이 있습니다. 뒤에서 다룰 Feed Forward Network, LayerNorm, Residual Connection 등이 함께 작동합니다. Attention은 Transformer의 핵심 부품이지만 전체 기계의 전부는 아닙니다.
그럼에도 Attention을 이해하는 것은 매우 중요합니다. 왜냐하면 LLM이 문맥 속 관계를 다루는 방식의 중심에 Attention이 있기 때문입니다. 토큰이 다른 토큰을 참고하고, 그 중요도에 따라 정보를 섞고, 그 결과 더 문맥화된 표현을 만드는 과정이 Transformer의 출발점입니다.
이번 장에서 기억할 것
Attention은 문장 안에서 어떤 토큰이 어떤 토큰을 얼마나 참고해야 하는지 계산하는 방법입니다. 예전 방식이 정보를 주로 순서대로 전달했다면, Transformer는 허용된 문맥 안에서 토큰들 사이의 관계를 직접 계산합니다. 이 덕분에 멀리 떨어진 단어 사이의 관계나 중의적인 단어의 의미도 더 유연하게 다룰 수 있습니다.
"bank"가 은행인지 강둑인지는 "bank" 혼자 결정하지 않습니다. "money", "deposited", "river", "sat" 같은 주변 단서와의 관계 속에서 결정됩니다. Attention score는 이런 관계의 중요도를 숫자로 나타내고, 그 점수를 이용해 다른 토큰들의 벡터를 가중합합니다. 그 결과 각 토큰의 표현은 문맥을 반영한 새 표현으로 바뀝니다.
Attention 행렬은 이 과정을 표로 보여 줍니다. 행은 현재 갱신할 토큰, 열은 참고할 토큰이라고 생각하면 됩니다. 값이 큰 칸은 현재 토큰이 해당 토큰을 많이 참고한다는 뜻입니다.
이제 우리는 Attention이 "무엇을 보는가"를 알았습니다. 다음 장에서는 한 걸음 더 들어가, Transformer에서 가장 중요한 형태인 Self-Attention을 자세히 살펴보겠습니다. Self-Attention은 문장 안의 토큰들이 같은 문장 안의 다른 토큰들을 바라보며 자기 표현을 갱신하는 방식입니다. 지금까지의 이야기가 "주목한다"는 직관이었다면, 다음 장부터는 그 주목이 실제로 어떤 계산으로 이루어지는지 천천히 풀어 보겠습니다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.