학부연구생

Positional Encoding에서 sin과 cos의 역할

euphoria24 2025. 2. 14. 12:58

공부하다 궁금해졌다.

 

왜 짝수 차원에는 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을 번갈아 사용한다!!

빠이~