Encoder Self-Attention 는 인코더에서 이루어진다
Masked Decoder Self-Attention 과 Encoder-Decoder Attention은 디코더에서 이루어진다
xxx self-Attentionn은 본질적으로 Query, key, Value 가 동일한 출저인 경우를 말한다
여기서 덩일하다는 뜻은 벡터의 값이 같다는 뜻이 아니라 벡터의 출처가 같다는 의미
반면 Encoder-Decoder Attention에서는
Query가 디코더의 벡터인 반면에
Key와 Value가 인코더의 벡터이므로 셀프 어텐션이라고 부르지 않는다.
인코더의 셀프 어텐션 : Query =key =value
디코더의 마스크드 셀프 어텐션 : Query =Key=value
디코더의 인코더-디코더 어텐션 : Query : 디코더 벡터 / key = value :인코더 벡터
트랜스포머 아키텍쳐

세 개의 어텐션에 추가적으로 멀티 헤드라는 이름이 붙어 있다.
-> 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미한다
인코더(Encoder) 구조
트랜스포머는 하이퍼 파라미터인 num_layers 개수의 인코더 층을 쌓는다
인코더를 하나의 층이라는 개념으로 생각한다면 하나의 인코더 층은 크게 총 2개의 서브층으로 나뉘어 진다
셀프 어텐션과 피드 포워트 신경망이다
멀티 헤드 셀프 어텐션과 포지션 와이즈 피드 포워드 신경망이라고 적혀있는데
멀티 헤드 셀프 어텐션은 셀프 어텐션을 병렬적으로 사용하였다는 의미이고
포지션 와이즈 피드 포워드 신경망은 일방적인 피드 포워드 신경망 이다
인코더의 셀프 어텐션
셀프 어텐션의 의미와 이점
어텐션 함수는 주어진 쿼리에 대해서 모든 키와의 유사도를 각각 구합니다 그리고 구해낸 이 유사도를 가중치로 하여 키와 맵핑되어있는 각각의 값에 반영해준다 그리고 유사도가 반영된 값을 모두 가중합하여 리턴한다
여기까지는 앞서 배운 어텐션의 개념이다 그런데 어텐션 중에서는 셀프 어텐션이라는 것이 있습니다. 어텐션을 자기 자신에게 수행한다는 의미입니다. 앞서 배운 seq2seq에서 어텐션을 사용할 경우의 Q,K,V 의 정의를 다시 생각해보기
Seq2Seq 어텐션
상황 : 번역할때 디코더가 단어를 하나씩 뱉어내고 있다
동작 : 디코더는 지금 내가 만들 단어가 인코더의 어떤 단어와 관련이 있지? 라며 인코더를 쳐다본다
비유 : 시험을 보는데(디코더), 옆에 펼쳐진 참고서(인코더)를 컨닝하는것과 같다
셀프 어텐션
상황: 동물은 길을 건너지 않았다 왜냐하면 그것은 너무 피곤했지 때문이다.
동작 : 여기서 그것이라는 단어는 누구를 가리키는지 알아야 한다. 이때 그것은 문장내의 모든 단어를 쓱 훑어본다
비유 : 우리끼리 회의를 하는데 서로가 서로에게 너는 나랑 어떤 관꼐야? 라고 물어보며 문맥을 파악하는 것이다.
나도 우리문장의 일부니까 나를 포함한 모두가 Q,K,V가 되는 것이다.
Q, K,V 를 직돤적으로 이해하기
Q,K,V가 전부 똑같은 단어들에서 나왔지만 역할은 나뉜다. 어떤 문장에서 it이라는 단어를 처리한다고 한다.
| 역할 | 쉬운정의 | 비유 |
| Q(Query) | 질문자 | 나는 it이야 나와 관련 있는 단어 누구없니? |
| K(Key) | 명찰 / 검색어 | 모든 단어들이 각자 명찰을 달고 있다(나는 동물, 나는 길, 나는 피곤) |
| V(Value) | 실제 내용 | 질문(Q)에 답이 매칭되면 그단어가 가진 진짜의미(값)을 가져온다 |
즉 셀프 어텐션은 문장내의 모든 단어가 서로에게 질문(Q)을 던지고,명찰(K)를 확인해서 서로의 정보(V)를 주고받는 과정이다.
왜 굳이 QKV로 나눈 이유
단순히 단어끼리 곱하면 될거같은데 복잡하게 나눌까?
컴퓨터가 단어를 이해할 때 내가 궁굼한 것 (Q) 와 내가 가진 정보 (K,V)를 다르게 표현하고 싶기 때문이다
예를 들어 어떤 단어는 나는 다른 단어와 어울리기 좋아해 (Q가 큼) 라는 성질이 있을 수 있고 어떤 단어는 나는 설명해주기 좋아해(K가큼) 라는 성질이 있을 수도 있다. QKV로 분리함으로써 컴퓨터는 단어의 질문하는 능력과 답변하는 컴퓨터는 단어의 질문하는 능력과 답변하는 능력을 각각 따로 학습할수있게 된다.
Q,K,V벡터 얻기
셀프 어텐션은 입력 문장의 단어 벡터들을 가지고 수행한다고 했는데
사실 셀프 어텐션은
인코더의 초기 입력인 dmodel의 차원을 가지는 단어 벡터들을 사용하여 셀프 어텐션을 수행하는 것이 아니라
우선 각 단어 벡터들로부터 Q벡터, K벡터, V벡터를 얻는 작업을 거친다
이때 Q벡터 k벡터 v벡터들은
초기 입력인 dmodel 의 차원을 가지는 단어 벡터들보다 더 작은 차원을 가진다.
논문에서는 dmodel=512 의 차원을 가졌던 각 단어 벡터들을 64의 차원을 가지는 Q벡터,K벡터,V벡터로 변환하였다.
64라는 값은 트랜스포머의 또 다른 하이퍼파라미터인 num_heads로 인해 결정 되는데
트랜스포머는 dmodel을 num_heads로 나눈 값을 각 Q벡터,K벡터,V벡터의 차원으로 결정한다
논문에서는 num_heads 값을 9로 하였다.(512 / 8 = 64)
예를 들어 사용하고 있는 예문 중 student라는 단어 벡터를 QKV의 벡터로 변환하는 과정을 보자
기존의 벡터로부터 더 작은 벡터는 가중치 행렬을 곱하므로서 완성된다.
곱해지는 각 가중치 행렬의 크기는 dmodel * (dmodel / num_heads)이다
이 가중치 행렬은 훈련과정에서 학습 된다.
즉 dmodel=512이고 num_heads=8 이라면
각 벡터에 3개의 서로 다른 가중치 행렬을 곱하고 64의 크기를 가지는 QKV벡터를 얻어낸다
알기 쉽게 정리
1. 왜 512 차원을 64 차원으로 쪼개나
트랜스포머는 문장을 이해할때 하나의 관점으로만 보지 않는다. 문장 안에는 문법적인 관계도 있고 의미적인 관계도 있고 주어-동사 관계도 있다.
512차원: 문장의 모든 정보를 담은 압축된 원본이다.
8개의 헤드 : 8명의 전문가가 각각 64차원씩 나눠 갖는다
1번 전문가는 주어- 동사관계에 집중하고
2번 전문가는 단어의 감정에 집중하고
3번 전문가는 시간 순서에 집중한다
즉 512를 8로 나눠 64로 만드는 것은 정보를 잃어버리는 것이 아니라 각 전문가가 자기만의 관점으로 문장을 분석하기 위해 업무 분담을 하는 것이다.
2. 가중치 행렬은 무엇인가
가중치 행렬을 곱해서 변환한다는 부분은 렌즈를 갈아 끼우는 과정이다
student 라는 단어의 512차원 벡터는 수많은 정보를 가지고 있는 원석이다 하지만 어텐션을 하려면 질문(Query), 명찰(Key), 답변(Vakye)이라는 세가지 형태가 필요하다
이때 가중치 행렬 (WQ,WK,WV)는 질문용 렌즈 명찰용 렌즈, 내용용 렌즈 이다.
- Student 원석 (512) × 질문용 렌즈 ($W^Q$) = Q벡터 (64)
- Student 원석 (512) × 명찰용 렌즈 ($W^K$) = K벡터 (64)
- Student 원석 (512) × 내용용 렌즈 ($W^V$) = V벡터 (64)
이 렌즈(가중치 행렬) 들은 처음에는 랜덤한 값이었지만 AI가 학습(Training)을 하면서 어떻게 투영해야QKV를 제일 잘 뽑아낼 수 있는지 스스로 알아낸 최적의 값들이다.
| 개념 | 비유 | 역할 |
| dmodel(512) | 원재료(원석) | 모든 정보를 담고있는 초기 단어 벡터 |
| 가중치 행렬(W) | 필더/렌즈 | 원석을 내가 원하는 목적(QKV)에 맞게 깍아내는 도구 |
| dmodel/num_heads | 전문가의 관점 | 8명이 나눠서 분석하기 위한 전문화된 정보 조각 |
결론적으로
우리는 인코더에 들어온 단어 벡터를 그래로 쓰지 않고 학습된 가중치 행렬이라는 특수 안경을 씌워서 QKV라는 3가지 형태로 변환한다
이렇게 하면 8개의 헤드가 서로 다른 관점에서 단어를 처다보며 훨신 입체적으로 문맥을 파악할 수 있게 되는것
스케일드 닷-프로덕트 어텐션
- Q, K, V 벡터를 얻었다면 지금부터는 기존에 배운 어텐션 메커니즘과 동일합니다.
- 각 Q벡터는 모든 K벡터에 대해서 어텐션 스코어를 구하고, 어텐션 분포를 구한 뒤에
- 이를 사용하여 모든 V벡터를 가중합하여 **'어텐션 값' 또는 '컨텍스트 벡터'**를 구하게 됩니다.
- 그리고 이를 모든 Q벡터에 대해서 반복합니다.
1. 점수 매기기 : 얼마나 관련이 있지?
우리는 Q(질문자) 벡터를 가지고 있다. 이 질문자가 문장내 모든 단어 K(명찰)들을 하나씩 다 쳐다본다
동작:Q와 K를 내적한다. 내적은 두 벡터가 얼마나 비슷한지(방향이 얼마나 일치하는지 ) 알려주는 숫자
의미:Q가K를 봤을때 너는 내 질문에 얼마나 중요한 답변을 가지고 있나? 점수를 매기는 단계
2.Attention Score 구하기 - 스케일링: 점수 범위를 예쁘게 조정하기
여기서 왜 스케일드라는 이름이 붙었을까?
문제 : Q와 K의 차원이 커지면 (예: 64차원), 내적 결과 값(점수)가 엄청나게 커진다.
위험: 점수가 너무 크면 나중에 소프트맥스(Softmax)함수를 통과할때 미분 값이 0에 가까워지는 기울기 소실 문제가 생겨서 학습이 안된다.
해결: 그래서 점수들을 루트dk 로 나누어 준다
비유 : 숫자의 볼륨을 적당히 줄여서 AI가 학습하기 딱 좋은 안정적인 범위로 만드는것
3.Attention Value 구하기 - 소프트맥스: 비율로 바꾸기
점수가 나왔을때 그대로 쓰기보다는 합쳐서 1이 되도록 비율로 변환한다.
동작:softmax 함수를 사용한다
의미: 어떤 단어를 얼마나 참고할지에 대한 주요도가 0% 에서 100% 사이의 값으로 나온다.
4. 가중합: 진짜 정보 섞기
앞에서 구한 비율을 각 단어의 V(Value, 실제 내용) 벡터에 곱해서 다 더한다
동작: (비율 *V)들을 전부 합친다
결과 (Attention Value) : 중요도가 높은 단어의 정보는 진하게 반영되고 상관없는 정보는 흐릿하게 반영된다.
이렇게 섞인 결과물이 바로 그 단어를 가장 잘 설명하는 새로운 의미 벡터(컨텍스트 벡터)가 된다.
한 줄 요약:
- Q와 K를 내적해서 "너랑 나랑 얼마나 친해?"(점수 계산)
- $\sqrt{d_k}$로 나눠서 점수가 너무 폭주하지 않게 제어(스케일링)
- Softmax로 "누구를 얼마나 참고할지" 비율 결정(확률화)
- 그 비율대로 V를 섞어서 새로운 정보 완성(가중합)
"결국 셀프 어텐션은, 문장 내의 모든 단어가 서로에게 점수를 매기고, 그 점수만큼 정보를 섞어서 각 단어의 의미를 '문맥에 맞게 다시 정의하는 과정'입니다."

패딩마스크 (Padding Mask)
이는 입력 문장에 <PAD> 토큰이 있을 경우 어텐션에서 사실장 제외하기 위한 연산이다
예를 들어 <PAD>가 포함된 입력 문장의 셀프 어텐션의 예제를 보면

사실 단어 <PAD> 의 경우에는 실질적인 의미를 가진단어가 아니다
그래서 트랜스포머에서는 Key의 경우에 <PAD> 토큰이 존재한다면 이에 대해서는 유사도를 구하지 않도록 마스킹(Masking)을 해주기로 했다.
여기서 마스킹이란 어텐션에서 제외하기 위해 값을 가린다는 의미이다.
어텐션 스코어 행렬에서 행에 해당하는 문자은 Query이고 열에 해당하는 문장은 Key이다 그리고 Key에 <PAD>가 있는 경우에는 해당 열 전체를 마스킹을 해준다.
마스킹을 하는 방법은 어텐션 스코어 행렬의 마스킹 위치에 매우 작은 음수값을 넣어주는 것
여기서 매우 작은 음수값이라는 것은 -무한대에 가까운 수라는 의미다.
현재 어텐션스코어 함수는 소프트맥스 함수를 지나지 않은 상태이다 앞서 배운 연산 순서라면 어텐션 스코어 함수는 소프트 맥스 함수를 지나고 그 후 Value 행렬과 곱해지게 된다. 그런데 현재 마스킹 위치에 매우 작은 음수 값이 들어가 있으므로 어텐션 스코어 행렬이 소프트맥스 함수를 지난 후에는 해당 위치의 값은 0이 되어 단어간 유사도를 구하는 일에<PAD>토큰이 반영되지 않게 된다.
'AI > ML' 카테고리의 다른 글
| 트랜스포머 - 잔차 연결(Residual connection)과 층 정규화(Layer Normalization) (0) | 2026.04.28 |
|---|---|
| 트랜스포머 - 포지션-와이즈 피드포워드 신경망 (Position-wise FFNN) (0) | 2026.04.27 |
| Transformer 포지셔널 인코딩 (1) | 2026.04.21 |
| 트랜스포머(Transformer) — Attention Is All You Need (0) | 2026.04.20 |
| Attention Mechanism 완전 쉽게 이해하기 (Score → Output까지) (0) | 2026.04.19 |