어텐션의 사전적 의미는 '주의'입니다. 텍스트 처리 관점에서는 입력된 텍스트에서 단어들 간의 관련성을 '주의 깊게' 파악한다는 의미로 이해할 수 있습니다.
어텐션이 발표되기 전까지는 RNN 기반 전이학습(Transfer Learning)이 가진 대규모 데이터셋 학습의 한계를 해결하기 위한 연구가 여러 대학에서 진행되고 있었습니다. 2017년 구글브레인에서 발표한 Attention is All you need는 이 문제를 단순히 개선하는 데 그치지 않고 완전히 해결할 수 있는 획기적인 연구논문이었습니다. 2025년 현재, 트랜스포머 아키텍처가 세상에 등장한 지 10년이 다 되어가는 시점에서 LLM이라는 형태로 우리 삶에 녹아들고 있는 것을 보면, 당시 느꼈던 혁신적인 변화의 예감이 틀리지 않았음을 알 수 있습니다.
LLM을 이해하고 활용, 응용하기 위해 반드시 알아야 할 어텐션의 개념을 쉽게 정리해보겠습니다. 수식으로도 설명할 수 있지만, 가능한 한 도식화하여 쉽게 설명하고자 했습니다. 더 명확한 이해를 원하시면 원논문을 직접 참고하시기를 추천드립니다.
https://arxiv.org/abs/1706.03762
사람처럼 단어를 이해하는 어텐션(Atention)
우리는 책을 읽을때 각각의 단어의 뜻을 어떻게 인지하고 문장을 이해하는걸까요?
생각해보면 소설이나 신문처럼 자주접하는 쉬운글은 왼쪽에서 오른쪽으로 흐르듯이 읽습니다. 하지만 복잡한 논문이나 전공책, 개념서 등 잘 모르는 단어나 지식이 있는 글을 읽을때는 어떻게 읽을까요?
읽다가 생소한 단어가 있으면 이전에 그 단어와 유사하게 쓰인 단어가 있는지 확인하고, 같은 뜻의 단어인지 파악후 문장 안에서 고민하면서 다시 곱씹고 읽어나가는 것을 반복합니다.
어텐션은 이렇게 사람이 문장과 단어를 이해하기 위해 단어와 단어, 문장과 단어 사이의 관계를 고민하는 과정을 딥러닝 모델이 수행할 수 있도록 모방한 모델입니다.
예를 한번 들어볼까요?
“OOOO OOOOO OO 바람 OOO”
여기서 바람은 무슨 뜻일까요? 기압의 변화? 배신? 고난?
바람이라는 한단어가 여러뜻으로 쓰이니 ‘바람’만 가지고는 제대로 뜻을 파악하기 어렵습니다.
“카페에서 기다렸는데 결국 바람 맞았어”
이제 어떤가요? 이 문맥에서 쓰인 바람은 배신을 뜻하는 바람인거 바로 아시겠죠.
이처럼 주변 단어를 통해 맥락을 추가하면서 이해하는 방식이 ‘어텐션’인 것입니다. 여기서는 “기다렸는데”와 “맞았어”에 주의를 기울이니 ‘바람’이 배신이라고 해석한 것입니다.
어텐션은 단어와 단어 사이의 관계를 계산해서 그 값에 따라 관련이 깊은 단어, 관련이 깊지 않은 단어를 구분합니다.
어텐션(Attention)이 단어간 관련성을 판단하는 방법
논문에 나와있는 정의는 다음과 같습니다.
Q,K,V 이렇게 쓰여있는데 이걸 좀더 직관적으로 이해하기 쉽게 말씀드려볼게요.
- Q는 쿼리
- K는 키
- V는 값
쿼리, 키, 값은 보통 정보검색(Information Retrival)에서 주로 사용되는 변수입니다. 우리가 구글, 네이버와 같은 포털에서 검색할 때 단어를 입력하고 포털사이트에서는 단어를 통해 검색 단어와 의미가 유사한 문서들의 특징값을 도출해 문서를 찾고, 그 문서를 보여줍니다.
- 여기서 검색하는 단어가 Q(쿼리)고,
- 포털사이트에서 단어의 의미와 유사한 문서들의 특징값을 K(키),
- 검색에 대한 결과를 V(값) 이라고 할 수 있습니다.
바람을 검색하고 바람과 관련된 단어를 찾는 방법에는 여러 가지가 있습니다. 이렇게 관련된 단어를 찾는 과정을 '거리(Distance)를 구한다'고 합니다. 이중 가장 보편적인 방법은 평균법입니다. 이는 바람과 관련된 모든 단어를 평균값으로 매핑하는 방식입니다.
하지만 거리가 모두 똑같으면 '바람'이 포함된 모든 문장이 검색 결과로 나오게 되어 원하는 결과를 얻을 수 없습니다.
이런 상태로 학습이 지속되면 특징값이 평이하게 분포될 수밖에 없습니다.
그렇다면 '바람'과 관련성이 깊은 단어의 거리는 어떻게 판단할 수 있을까요? 직관적으로 보면, 바람의 의미를 유추할 수 있는 관련성 높은 단어들은 '바람'과 가깝게 붙어있습니다. [기다렸는데, 결국, 바람, 맞았어]
이처럼 가까운 거리에 있는 단어에는 높은 숫자를, 멀리 있는 단어에는 낮은 숫자를 부여하여 판단하면 평균 방법보다 더 나은 결과를 얻을 수 있습니다.
하지만 이 방법에도 문제가 있습니다. 문장에 단어가 추가될 경우 거리값이 달라지게 됩니다.
예를 들어 '대놓고'라는 단어 하나만 추가되어도 기존 단어들의 거리값이 모두 달라지는 것을 볼 수 있습니다. 이는 '바람'이라는 단어가 포함된 문장의 모든 경우의 수가 학습되고, 문법에 맞게 문장이 구성되어 있다는 전제 하에서만 정확성을 기대할 수 있는 방법입니다.
어텐션은 특정 단어에서 발생하는 모든 가능성을 규칙화하기보다는 문장 자체에서 해당 단어의 연관성을 계산하는 방식을 적용합니다.
문장을 각 토큰으로 나누어 임베딩한 후, 그 임베딩된 값을 '관련성 점수'라고 하겠습니다.
각 관련성 점수는 초기에 임베딩된 값으로 설정됩니다. 쉽게 이해하기 위해, 가까운 거리순으로 1차 값이 매겨진다고 보겠습니다.
초기에 설정된 관련성 점수가 학습을 진행하면서 실제로 관련이 있는지를 판단하기 위해서는 "가중치"가 필요합니다. 가중치를 통해 관련성이 낮은 토큰의 점수는 낮추고, 관련성이 높은 토큰의 점수는 높여야 하기 때문입니다.
트랜스포머 아키텍처는 기존 RNN과 달리 각 토큰의 가중치를 종합하여 적용하는 방식으로 설계되어 있습니다.(아래 그림에서 Wq, Wk가 가중치를 의미합니다.)
트랜스포머에서는 Wq, Wk 가중치를 통해 "토큰과 토큰 사이의 관계를 계산하는 능력"을 학습시킨 것입니다.
트랜스포머에서는 V(값)도 토큰 임베딩을 가중치를 통해 변환합니다. 이렇게 세 가지 가중치(Wk, Wq, Wv)를 활용하여 내부적으로 토큰 간의 관계를 계산하고, 주변 맥락을 반영하는 방법을 학습합니다.
아래 그림과 같이 쿼리와 키값의 관계를 계산한 관련성 점수와, '바람'의 토큰 임베딩을 값 가중치(Wv)로 변환한 V(값)를 가중합하면, 우리가 의도한 '배신'을 의미하는 '바람'으로 재해석된 결과를 얻을 수 있습니다.
맺음말
트랜스포머 인코더와 디코더의 핵심 연산인 어텐션에 대해 쉽게 살펴보았습니다. 참고 문헌의 세부적인 계산 방법을 최대한 이해하기 쉽게 풀어서 설명했습니다.
어텐션의 핵심은 텍스트의 모든 단어를 토큰화하고, 전체 데이터를 기반으로 각 토큰이 다른 토큰과 맺는 "관련성 점수"를 계산하여 반복 학습을 통해 토큰 간의 관련성을 이해하는 것입니다.
트랜스포머 아키텍처에서 어텐션(Attention) 연산 이후에 이어지는 '정규화'와 '피드 포워드 레이어'는 관련성 점수를 정규화하여 안정적이고 빠른 학습을 가능하게 합니다. 이 부분은 다음 포스팅에서 자세히 다루도록 하겠습니다.
참고 문헌
- LLM을 활용한 실전 AI 애플리케이션 개발, 허정준, 책만
- Attention all you need, 2017, Ashish Vaswani