Part 7 · Transformer Architecture - Why Sine and Cosine?

위치 정보를 왜 사인과 코사인으로 만들까

위치 정보는 단순히 1, 2, 3처럼 번호를 붙이는 것으로는 충분하지 않습니다. 모델은 서로 가까운 위치와 먼 위치의 관계까지 함께 이해해야 합니다. Transformer는 이러한 관계를 자연스럽게 표현하기 위해 사인과 코사인 함수를 이용한 위치 벡터를 사용합니다.

A New Question

위치마다 다른 벡터가 필요하다면, 모두 미리 저장해야 할까?

T
“1번째, 2번째, 3번째 위치마다 서로 다른 벡터가 필요합니다. 그런데 문장이 아주 길어지면 모든 위치 벡터를 하나씩 준비해야 할까요?”
1번째
2번째
3번째
100번째
1,000번째
계속...

앞에서는 단어의 의미 벡터에 위치 벡터를 더했습니다. 이제는 그 위치 벡터 자체를 어떻게 만들지 생각해 볼 차례입니다.

필요한 것은 위치마다 다른 벡터입니다. 그러나 그 벡터를 반드시 하나씩 외워 두어야 하는 것은 아닙니다.
The Storage Problem

위치 벡터를 하나씩 저장하는 방법은 불편하다

가장 단순한 방법은 각 위치의 벡터를 미리 만들어 표에 저장하는 것입니다. 하지만 문장이 길어질수록 저장해야 할 벡터도 계속 늘어납니다.

1번째[벡터 저장]
2번째[벡터 저장]
3번째[벡터 저장]
4번째[벡터 저장]
100번째[벡터 저장]
1,000번째[벡터 저장]
10,000번째[벡터 저장]
그 이후어디까지 준비할까?
모든 위치를 미리 저장하려면 “최대 몇 번째까지 사용할 것인가?”를 먼저 정해야 합니다. 그리고 더 긴 문장이 들어오면 준비하지 않은 위치가 생길 수 있습니다.
Store Less, Calculate More

벡터를 저장하지 말고 규칙으로 만들면 어떨까?

×

모든 답을 저장한다

1번째 벡터, 2번째 벡터, 3번째 벡터를 위치마다 하나씩 준비합니다.

→
✓

필요할 때 계산한다

위치 번호를 규칙에 넣으면 그 위치에 맞는 벡터가 자동으로 만들어집니다.

Transformer의 초기 방식은 위치 번호를 입력하면 그 위치에 맞는 숫자들을 계산해 주는 규칙을 사용했습니다.
Think of a Wave

규칙적으로 변하는 파도를 떠올려 보자

바닷가의 파도는 계속 움직입니다. 같은 높이에만 머물지 않고 위아래로 변하지만, 완전히 무작위로 움직이는 것도 아닙니다.

위치가 앞으로 이동하면 값도 규칙에 따라 조금씩 달라집니다.
사인과 코사인은 이런 파도처럼 값이 규칙적으로 변하는 함수입니다. 그래서 위치마다 서로 다른 숫자를 만들 수 있습니다.
Another Analogy

시계바늘도 같은 원리로 움직인다

시계바늘은 시간이 지날수록 계속 움직입니다. 위치는 매 순간 달라지지만 움직임에는 일정한 규칙이 있습니다.

1번째
2번째
3번째
4번째
5번째
6번째
파도와 시계는 이해를 돕기 위한 비유입니다. 실제 위치 벡터는 하나의 값이 아니라 여러 개의 숫자로 이루어집니다.
Why Sine and Cosine?

사인과 코사인이 위치 표현에 잘 맞는 이유

1

규칙적으로 변한다

위치가 한 칸 이동할 때 값이 갑자기 무작위로 바뀌지 않고 일정한 규칙에 따라 움직입니다.

2

필요한 위치를 계산할 수 있다

10번째든 10,000번째든 위치 번호를 공식에 넣어 그 자리의 값을 계산할 수 있습니다.

3

서로 다른 위치를 구별할 수 있다

여러 속도로 움직이는 파도를 함께 사용하면 각 위치마다 다른 숫자 조합이 만들어집니다.

Interactive Position Vector

위치를 움직이면 벡터도 달라진다

슬라이더를 움직여 위치 번호를 바꿔 보세요. 위치가 달라질 때마다 여러 숫자가 서로 다른 속도로 변합니다.

현재 위치1

빠르게 변하는 숫자들

가까운 위치의 작은 차이를 빠르게 구분하는 데 도움을 줍니다.

값 1
값 2

천천히 변하는 숫자들

더 넓은 범위에서 위치의 흐름을 구분하는 데 도움을 줍니다.

값 3
값 4
현재 위치에 해당하는 사인·코사인 값들이 하나의 위치 벡터를 만듭니다.
Different Speeds

파도 하나만 쓰지 않고 여러 속도의 파도를 함께 사용한다

한 가지 파도만 사용하면 일정한 시간이 지난 뒤 같은 값이 반복될 수 있습니다. 그래서 Transformer는 빠르게 변하는 파도와 천천히 변하는 파도를 함께 사용합니다.

빠른 파도

짧은 간격으로 위아래가 바뀝니다.

느린 파도

더 긴 간격으로 천천히 변합니다.

여러 속도의 사인과 코사인을 함께 사용하면 각 위치는 서로 다른 숫자 조합을 갖게 됩니다. 이 숫자 조합이 위치를 나타내는 일종의 패턴이 됩니다.
A Light Look at the Formula

공식은 복잡해 보여도 하는 일은 단순하다

실제 Transformer는 위치 번호를 사인과 코사인 함수에 넣어 위치 벡터의 각 숫자를 계산합니다.

sin(위치 ÷ 어떤 값)
cos(위치 ÷ 어떤 값)

여기서 “어떤 값”을 서로 다르게 설정하면 어떤 숫자는 빠르게 변하고 어떤 숫자는 천천히 변합니다. 그 결과 한 위치를 여러 관점에서 표현할 수 있습니다.

지금 단계에서는 공식의 모든 기호를 외울 필요가 없습니다. 위치 번호를 규칙에 넣어 여러 개의 숫자를 만들고, 그 숫자들이 위치 벡터가 된다는 흐름만 이해하면 충분합니다.
Do Not Misunderstand

모든 Transformer가 지금도 같은 방식만 사용하는 것은 아니다

원래 Transformer 논문에서는 사인과 코사인으로 위치 벡터를 계산하는 고정형 Positional Encoding을 소개했습니다. 이후 모델들은 학습 가능한 위치 임베딩이나 다른 위치 표현 방법도 사용합니다.

그러나 핵심 목적은 같습니다. 순서를 직접 모르는 Self-Attention에 토큰의 위치 정보를 전달하는 것입니다.
Summary

이번 페이지에서 기억할 것

  • 위치마다 다른 벡터가 필요합니다.
  • 모든 위치 벡터를 하나씩 저장하지 않고 규칙으로 계산할 수 있습니다.
  • 사인과 코사인은 값이 규칙적으로 변하는 함수입니다.
  • 빠른 파도와 느린 파도를 함께 사용하면 위치마다 다른 숫자 조합이 만들어집니다.
  • 그 숫자 조합이 위치 벡터가 됩니다.
  • 위치 벡터는 의미 벡터에 더해져 Transformer 입력으로 들어갑니다.
이제 Transformer의 내부로 들어갑니다입력 벡터에는 단어의 의미와 위치가 함께 들어 있습니다. 다음 페이지에서는 Encoder가 이 입력을 받아 어떤 순서로 처리하는지 살펴봅니다.