| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 부트캠프
- docker
- n8n
- 코드트리
- SQL
- ICT 글로벌 인턴십
- SQLD
- 통계
- 개발 도서
- 해외유학준비
- 데이터사이언스
- 인공지능
- 아이펠
- 아이펠 리서치
- 해외입시
- 해외석사
- unity
- 딥러닝
- OpenAI
- 모두의연구소
- 데이터분석
- 미국석사
- 코딩테스트 준비
- 영국석사
- 해외석사준비
- 자동화
- 코딩테스트
- 인턴십 면접
- 제이펍
- 머신러닝
- Today
- Total
Developer Jenny Lim's Blog
[D+26] 아이펠 리서치 14기 TIL | Transformer (2) 본문
1. 오늘 배운 내용
[Positional Encoding - 위치 정보를 더하는 방법]
Positional Encoding은 트랜스포머가 단어의 순서 정보를 가지게 만드는 핵심 장치이다. Self Attention은 단어 순서를 전혀 고려하지 않고 모든 단어를 한 번에 보기 때문이다. 기본 구조는 입력 벡터 = 단어 임베딩 + Positional Encoding으로, 여기서 단어 임베딩은 단어의 의미를 담은 벡터를, Positional Encoding은 단어 위치를 나타내는 벡터를 말한다.
논문에서는 sin, cos 함수를 사용하여 주기적인 패턴을 만들고 각 차원 별로 다른 주기를 갖도록 설계했다. 짧은 거리의 단어 관계뿐만 아니라 멀리 떨어진 단어 관계까지 표현할 수 있다는 것이 장점이다. sin, cos의 주기적인 성질 덕분에 문장 길이가 달라도 일반화할 수 있다.

먼저 단어 임베딩을 생성하고 같은 크기의 Positional Encoding 벡터를 생성한다. 두 벡터를 더하면(Element-Wise) 순서 정보가 포함된 벡터가 생성되고 Self Attention에 입력하면 된다. 참고로 임베딩 벡터의 차원 인덱스가 짝수면 sin 함수를, 홀수면 cos 함수를 사용한다.
[Positional Encodig의 전제]
1. Positional Encoding은 임베딩보다 상대적으로 작아야 한다.
- 단어 임베딩과 Positional Encoding을 단순히 더할 경우, Positional Encoding의 값이 너무 크면 단어의 의미가 묻히거나 왜곡될 수 있기 때문이다.
- 그래서 임베딩을 √d_model로 곱한 뒤 Positional Encoding을 더해 상대적으로 임베딩 비중을 확보하여 해당 문제를 해결한다.
2. 임베딩과 Positional Encoding은 d_model 차원으로 맞춰야 한다.
- 덧셈 연산 시에 임베딩과 Positional Encoding은 동일한 차원을 가져야 한다.
- 불일치할 경우 연산이 불가능하거나 의미가 왜곡될 수 있기 때문이다.
3. Positional Encoding은 상대 위치 간의 선형 관계를 모델이 학습할 수 있는 형태여야 한다.
- 모델이 절대 위치만 알고 있으면, 다른 길이의 문장에서도 위치 관계를 유연하게 파악하기 어렵기 때문이다.
- 절대 위치 Positional Encoding을 사용했다고 하더라도, sin, cos 함수로 구성되어 있다면 그 값에 주기성과 선형성이 있으므로, 두 위치 차이를 포함한 정보를 학습할 수 있다.

4. Positional Encoding은 학습 길이를 초과한 위치에도 일반화가 가능해야 한다.
- 학습 시 사용된 길이보다 긴 문장에서 위치 인식이 제대로 되지 않을 수 있기 때문이다.
- sin, cos 함수를 사용하는 Positional Encoding은 주기성을 갖고 있어, 학습된 길이 이상의 시퀀스에서도 값이 정의되어 있고 예측 가능하다.
왜 절대 위치 Positional Encoding이 sin, cos 함수로 구성되어 있을 때 어떻게 위치 차이를 선형 변환만으로 표현할 수 있는 것인지 궁금해서 조금 더 찾아 보았다. 먼저 위에서 언급한 바와 같이 각 위치 pos에 대해 d_model 차원의 벡터를 만들어 내고, 벡터 차원 인덱스에 따라 sin 또는 cos 함수를 적용하기 때문에 각 차원마다 서로 다른 주기를 가지는 파형이 된다.
위의 사진 속 항등식은 두 위치 pos 1, pos 2의 Postional Encoding 차이가 다른 위치의 Postional Encoding으로 선형 조합을 표현될 수 있다는 것을 나타낸다. 즉, pos 위치의 벡터를 기준으로 이동한 위치는 일정한 행렬(= 선형 변환)으로 표현할 수 있는 것이다.

[Positional Encodig 계산]
아래 그림은 트랜스포머 모델에서 사용되는 Positional Encoding의 실제 예시이다. 왼쪽에는 I am a Robot 이라는 문장이 있고, 각 단어는 순서대로 0, 1, 2, 3번 토큰 인덱스를 가진다. 4차원으로 설정했고 n 은 스케일을 의미하는 100을 사용했다.

첫 번째 단어 I는 위치 0에 있고, 각 차원에 대해 계산을 하면 I의 위치 벡터는 [0, 1, 0, 1]이 된다. 두 번째 단어는 위치 1에 있고 각 차원에 계산을 하면 [0.84, 0.54, 0.10, 1,0]이 된다. 각 단어마다 이런 식을 ㅗ자신만의 고유한 위치 벡터를 갖게 되며, 이 벡터는 단어 임베딩 벡터에 더해져서 입력으로 들어가게 된다.
[Attention - Dot Product]
먼저 RNN 계열은 정보를 시간 순서대로 처리하기 때문에 이전 정보가 멀어질 수록 기억하기 어렵고, 역전파 과정에서 시퀀스가 길 수록 기울기 소실 혹은 기울기 폭발 문제가 발생할 수 있다.
Attention은 문장의 모든 단어 쌍 관계를 직접 계산하여 장기 의존성 문제를 해결할 수 있고, 모든 연산을 병렬적으로 수행하여 안정적인 학습이 가능하다.

위의 그림은 Scaled Dot Product Attention의 계산 과정을 나타낸 것이다. 가장 처음 MatMul에서는 Q가 K에 얼마나 주의를 기울일지 Dot Product를 이용하여 계산한다.

그 다음으로, 유사도 점수가 너무 커지면 기울기 소실 문제가 발생할 수 있어 Key 벡터 차원 수로 나눠서 값의 크기를 조절한다.

Mask는 디코더에서만 사용되는데, 다음 단어를 예측할 때 미래 단어를 보지 못하게 하는 Look Ahead Mask를 적용한다. 또는 패딩 토큰을 무시하기 위한 패딩 마스크를 적용하기도 한다.

SoftMax에서는 모든 단어에 대한 집중 점수를 확률 분포(0 ~ 1)로 변환한다. 높은 값은 더 중요한 Key를 의미한다.

마지막으로 MatMul에서 SoftMax 확률을 Value 벡터에 곱해서 문맥 정보를 반영한 새로운 표현 벡터를 생성한다. 관련 있는 정보들의 가중 합이 결과로 나온다. 여기서는 단순하게 Scaled Dot Product를 했지만 residual 연결이나, bias 추가 등의 연산을 추가로 적용할 수 있다.

[Attention - Q, K, V의 의미]
- Q : 내가 지금 무엇을 찾고 싶은지
- K : 내가 어떤 정보를 갖고 있는지
- V : 내가 줄 수 있는 실제 정보

사실 왜 T일까 궁금했는데 알고보니 n_k x d_k의 형태라 전치하여 d_k x n_k로 만드는 것이었다. 그리고 해당 값은 쿼리와 키 벡터 간의 내적 값이며, 이 값이 클 수록 둘은 방향이 비슷하고 의미적으로 관련이 있다고 볼 수 있다. 코사인 유사도와 원리는 비슷하지만 계산 효율성과 단순화를 위해 트랜스포머에서는 Dot Product를 사용한다고 한다.

[Attention VS Scaled Dot Product]
Attention은 주로 RNN 기반 인코더 - 디코더 구조에서 사용되며, Q는 디코더의 현재 은닉층을, K와 V는 인코더의 각 은닉층으로 설정된다. MLP 기반 혹은 Dot Product로 계산된다.
Scaled Dot Product는 트랜스포머에서 사용되는 어텐션 방식으로, Q, K, V는 모두 동일한 토큰 임베딩에서 선형 변환으로 생성된다. SoftMax와 V 곱까지 행렬 단위로 병렬 계산이 가능하다는 차이점이 존재한다.


[Self Attention VS E-D Attention(= Cross Attention)]
Self Attention은 인코더와 디코더 내부에 존재하며, Q, K, V는 동일한 입력을 가진다. 문장 내 토큰 관계에 집중하며, 하나의 문장 안에서 단어들끼리 서로 참조한다는 특징이 있다.

하지만 E-D Attention(= Cross Attention)은 디코더 중간에 존재하며, Q는 디코더, K와 V는 인코더 출력에 해당한다. 디코더가 인코더 정보에 집중하고 다른 문장의 정보를 디코더가 참조한다는 특징을 가진다.

글로 보면 이해가 어느 정도 되긴 하는데 이해가 잘 안되는 부분은 아래 사진을 참고하여 이해할 수 있었다. Cross Attention은 디코더가 현재 번역하려는 토큰에 맞춰, 인코더가 만든 전체 입력 문장 정보(K, V)를 참고한다는 점을 짚고 넘어가면 좋을 것 같다.

[Multihead Attention]
Multihead Attention은 Attention을 여러 개의 헤드로 나누어 수행하는 것으로, 여러 관점에서 병렬적으로 여러 관계를 학습할 수 있다. 단일 헤드 대비 다양한 문법과 의미 관계를 포착할 수 있다는 장점이 있다. Multihead Attention의 작동 방식은 다음과 같다.
- 하나의 입력에 대해 Q, K, V로 표현하고 전체 임베딩 차원을 여러 헤드로 나눈다. (512차원이고 8개의 헤드가 있다면, 헤드 당 64차원씩)
- 헤드마다 독립적인 WQ, WK, WV를 사용해서 다른 기준으로 Q, K, V를 생성한다.
- 각 헤드마다 Scaled dot product attention을 수행한다.
- 모든 헤드가 병렬적으로 동시에 수행한 다음, 헤드 출력을 차원 연결하여 합친다.

Multihead Attention은 두 가지 측면에서 접근할 수 있는데, 먼저 가장 일반적인 것은 분할 방식(Dimension Splitting)이다. 전체 모델 차원을 헤드 수로 나누어서 각 헤드가 더 작은 차원에서 Attention을 수행한다. 계산 효율이 좋고 병렬 처리에 적합하지만 각 헤드 당 표현력이 낮아질 수 있다.

그 다음으로는 중복 방식(Full-Dimension)이 있는데, 각 헤드가 전체 차원을 그대로 사용하여 어텐션을 수행한다. 헤드 간 정보 중복 없이 서로 다른 표현 공간을 확보할 수 있지만, 계산량이 증가하고 차원이 커지면 메모리 부담이 증가할 수 있다.

2. 느낀점 / 어려웠던 점
트랜스포머는 예전에 깊게 공부하지 않았어서 정말 반성을 많이 했다. 논문도 잘 읽어둘 걸 싶었는데, 갑자기 트랜스포머 공부를 하려니 Positional Encoding, Attention 등 중요한 개념들이 많이 나와서 공부하는데 오래 걸리기도 했고 쉽게 지쳐갔다. 그래도 팀 활동 템플릿에 적힌 내용을 바탕으로 공부해 나가니 개념 정리가 확 되어서 괜찮아졌다.
머릿 속에 구름처럼 둥실 둥실 개념들이 정리되지 않고 떠다녀서 물어보면 설명을 못하겠다 싶었는데 훨 나아진듯 하다. 매번 스튜던트 그룹 하다가 이번에 티칭 그룹이 되었는데 점점 갈 수록 설명을 잘 할 수 있게 되었다. 천천히 오래 공부하는 스타일이라 빠르게 지식을 습득하고 정리해서 상대방에게 설명한다는 것이 쉽지 않은데, 점점 적응하고 있는 것 같아 다행이다.
다른 팀이랑 같이 헷갈린 부분 개념도 짚어가면서 이런 저런 정보도 얻고, 가장 인상 깊었던 것은 우리 팀의 한 팀원 분께서 트랜스포머 설명이 잘 정리된 동영상을 보여주셨는데 이렇게 친절하고 자세한 강의는 처음이었다. 티칭 준비할 때 강의 영상 보면서 Positional Encoding 부분도 다시 정리할 수 있어서 너무 감사했다!
조금 있으면 오늘 교육도 진행 되는데 자연어 처리가 어렵긴 하지만 묘한 재미가 있어서 포기하고 싶지는 않다. 빨리 개념 정리 다 하고 프로젝트도 해보고 싶다. 학원 강의 들으랴 교육 받으랴 프로젝트 하랴 시간이 점점 모자른데, 피할 수 없으면 즐기자는 마인드로 8월을 보내야겠다.
'Aiffel Research 14th' 카테고리의 다른 글
| [D+36] 아이펠 리서치 14기 TIL | 네이버 영화 리뷰 감정 분석 문제에 SentencePiece 적용하고 KoNLPy와 비교해보기 (0) | 2025.08.29 |
|---|---|
| [D+27] 아이펠 리서치 14기 TIL | 머신러닝 시스템 디자인 패턴 (6) | 2025.08.15 |
| [D+23] 아이펠 리서치 14기 TIL | 자연어 처리에서 RNN과 CNN 살펴보기, 영화 리뷰 감성 분석 프로젝트 (4) | 2025.08.04 |
| [D+22] 아이펠 리서치 14기 TIL | 자연어 처리 - 토큰화, 임베딩 (1) (5) | 2025.08.02 |
| [D+8] 아이펠 리서치 14기 TIL | 머신러닝 실습 : 데이터 전처리부터 모델 학습까지 (1) | 2025.08.01 |