공부하다 궁금해졌다.
왜 짝수 차원에는 sin, 홀수 차원에는 cos을 사용할까?
그래서 공부해보았다.
1. 서로 다른 패턴을 만들기 위해
- Transformer 모델은 입력 데이터를 벡터 형태로 다루기 때문에, 단어의 위치 정보를 벡터의 여러 차원에 골고루 분포시켜야 한다.
- sin과 cos을 번갈아 적용하면 서로 다른 주기적인 변화를 가지는 위치 정보를 생성할 수 있다.
- 이렇게 하면 위치 정보가 더 풍부해지고, 모델이 더 쉽게 순서를 학습할 수 있다.
2. sin과 cos의 수학적 성질 (위상 차이 90도)
- sin과 cos 함수는 같은 형태의 주기 함수지만, 서로 90도(π/2) 만큼 위상 차이(phase shift)가 있다.
- 이를 통해 같은 위치라도 서로 다른 차원에서 값이 다르게 표현되도록 만들 수 있다.
- 📈 그래프
- sin(0) = 0, cos(0) = 1
- sin(π/2) = 1, cos(π/2) = 0
- sin(π) = 0, cos(π) = -1
- sin(3π/2) = -1, cos(3π/2) = 0
- sin(2π) = 0, cos(2π) = 1
3. 차원마다 서로 다른 변화를 가지도록 하기 위해
Transformer 모델은 입력 벡터를 d_model 크기의 차원으로 표현한다.
모든 차원에서 같은 변화를 가지면 의미가 없기 때문에, 각 차원마다 서로 다른 패턴을 부여하는 것이 중요하다.
짝수 차원 (sin)
pe[:, 0::2] = torch.sin(position * div_term)
- sin을 적용하면 0부터 시작하여 위치가 증가할수록 점진적으로 변하는 패턴을 가짐
홀수 차원 (cos)
pe[:, 1::2] = torch.cos(position * div_term)
- cos을 적용하면 1부터 시작하여 다른 방향으로 변하는 패턴을 가짐
즉, 두 함수를 번갈아 적용하면 위치 정보가 여러 차원에서 균형 있게 분포되며, Transformer가 더 쉽게 학습할 수 있다.
4. 위치 정보가 사라지는 것을 방지하기 위해
위치 인코딩에서 한 가지 함수(sin 또는 cos)만 사용하면 문제 발생 가능하다.
예를 들어, sin만 사용하면 특정 위치(pos)에 대해 모든 차원이 같은 변화를 가질 수 있다.
이를 방지하려면 각 차원마다 변화하는 패턴을 다르게 만들어야 한다.
정리

즉, Transformer에서 위치를 더 효과적으로 인코딩하기 위해 sin과 cos을 번갈아 사용한다!!
빠이~

'학부연구생' 카테고리의 다른 글
| HeartGPT / Heart_PT_generate.py 공부하기 (0) | 2025.02.18 |
|---|---|
| Decoder-Only Transformer - Positional Encoding Coding ver. (0) | 2025.02.14 |
| Decoder-Only Transformer 모델 설명 (0) | 2025.02.14 |
| 트랜스포머 모델 개념(1) (0) | 2025.01.30 |