위치 인코딩
정의
임의의 집합 $\mathcal{P}$에 대해서 단사함수 $f : \mathbb{N} \to \mathcal{P}$를 위치함수라 하자. $f(\mathbb{N})$에서 유클리드 공간 $\mathbb{R}^{d}$로 가는 단사함수 $\operatorname{PE} : f(\mathbb{N}) \to \mathbb{R}^{d}$를 위치 인코딩positional encoding이라 한다.
$$ f(i) \ne f(j) \implies \operatorname{PE}(f(i)) \ne \operatorname{PE}(f(j)) $$
설명
정의의 $\mathcal{P}$는 위치집합이라 부를 수 있다. 정의상 무엇이어도 상관없는데, 스칼라들의 집합이거나 벡터, 행렬들의 집합 혹은 다른 무엇이어도 무관하다. 수학적으로 엄밀한 정의에 집착할 필요는 없다. 합성함수 $\operatorname{PE} \circ f$를 위치 인코딩이라 부를 수도 있고, 위 정의와 맞지 않지만 위치 인코딩이라 불리는 함수가 있을 수도 있다. 어찌됐건 이 맥락에서는 의도가 더 중요하다. 아래의 의도를 만족시키는 함수라면 충분히 위치 인코딩이라 불릴 수 있다.
위치인코딩: 데이터의 수열이 주어져있을 때, 각 데이터가 몇번째에 위치하느냐에 따라서 서로 다른 값을 지정할 수 있는 방법.
위치 인코딩이 어떤 경우에 필요한지 구체적인 예시로 알아보자. 위치인코딩이란 데이터를 다루는 방식에서 함수의 출력이 데이터의 순서에 의존하지 않을 때, 위치에 대한 정보를 출력에 포함시킬 수 있도록 하는 방식을 말한다. 가령 순환신경망(RNN)에서 입력 벡터 $\mathbf{X} = \begin{bmatrix} \mathbf{x}_{1} & \cdots & \mathbf{x}_{N} \end{bmatrix}$가 있을 때, 초기 은닉벡터를 $\mathbf{h}_{0} = \mathbf{0}$이라 하면 은닉벡터 $\mathbf{h}_{0}, \dots, \mathbf{h}_{N}$는 $\mathbf{X}$ 내 벡터의 순서에 따라 그 값이 달라진다.
$$ \begin{align*} \mathbf{h}_{1} &= f(\mathbf{x}_{1}, \mathbf{h}_{0}) \\ \mathbf{h}_{2} &= f(\mathbf{x}_{2}, \mathbf{h}_{1}) \\ &\vdots \\ \mathbf{h}_{N} &= f(\mathbf{x}_{N}, \mathbf{h}_{N-1}) \end{align*} $$
반면 어떤 두 벡터들의 수열 $\mathbf{Q} = \begin{bmatrix} \mathbf{q}_{1} & \cdots & \mathbf{q}_{N} \end{bmatrix}$, $\mathbf{K} = \begin{bmatrix} \mathbf{k}_{1} & \cdots & \mathbf{k}_{N} \end{bmatrix}$이 주어졌을 때 $\mathbf{q}_{i}$와 $\mathbf{k}_{i}$의 🔒(26/08/13)유사도를 내적 $\mathbf{q}_{i} \cdot \mathbf{k}_{i}$로 잰다고 하자. 이 값은 인덱스가 바뀐다고 달라지지 않으며, 두 수열의 열을 같은 방식으로 뒤섞어 $\mathbf{Q}^{\prime}$, $\mathbf{K}^{\prime}$을 만들어도 내적값들의 집합은 그대로다. 구체적으로 아래와 같은 예시를 보자.
$$ \begin{align*} \mathbf{Q} &= \begin{bmatrix} \mathbf{q}_{1} & \mathbf{q}_{2} & \mathbf{q}_{3} \end{bmatrix} = \begin{bmatrix} 1 & 3 & 5 \\ 2 & 4 & 6 \end{bmatrix}, \qquad \mathbf{K} = \begin{bmatrix} \mathbf{k}_{1} & \mathbf{k}_{2} & \mathbf{k}_{3} \end{bmatrix} = \begin{bmatrix} 1 & 2 & 3 \\ 1 & 2 & 3 \end{bmatrix} \\ \mathbf{Q}^{\prime} &= \begin{bmatrix} \mathbf{q}_{3} & \mathbf{q}_{2} & \mathbf{q}_{1} \end{bmatrix} = \begin{bmatrix} 5 & 3 & 1 \\ 6 & 4 & 2 \end{bmatrix}, \qquad \mathbf{K}^{\prime} = \begin{bmatrix} \mathbf{k}_{3} & \mathbf{k}_{2} & \mathbf{k}_{1} \end{bmatrix} = \begin{bmatrix} 3 & 2 & 1 \\ 3 & 2 & 1 \end{bmatrix} \end{align*} $$
여기서 $\mathbf{Q}^{\prime}$, $\mathbf{K}^{\prime}$은 열의 순서를 뒤집어 얻은 것이다. 각 자리에서 같은 인덱스의 $\mathbf{q}_{i}$와 $\mathbf{k}_{i}$를 내적한 유사도를 늘어놓으면 다음과 같다.
$$ \begin{bmatrix} \mathbf{k}_{1} \cdot \mathbf{q}_{1} \\ \mathbf{k}_{2} \cdot \mathbf{q}_{2} \\ \mathbf{k}_{3} \cdot \mathbf{q}_{3} \end{bmatrix} = \begin{bmatrix} 3 \\ 14 \\ 33 \end{bmatrix}, \qquad \begin{bmatrix} \mathbf{k}_{3} \cdot \mathbf{q}_{3} \\ \mathbf{k}_{2} \cdot \mathbf{q}_{2} \\ \mathbf{k}_{1} \cdot \mathbf{q}_{1} \end{bmatrix} = \begin{bmatrix} 33 \\ 14 \\ 3 \end{bmatrix} $$
두 결과는 나열된 순서만 다를 뿐 등장하는 값의 집합 $\{3, 14, 33\}$은 완전히 같다. 즉 유사도 값만으로는 그 값이 원래 몇 번째 위치에서 나온 것인지 알 수 없다. 이것을 구분할 수 있게 하는 것이 위치 인코딩이며, 이 예시에는 각 유사도 $\mathbf{k}_{i} \cdot \mathbf{q}_{i}$에 그 위치 $i$를 두번째 성분으로 덧붙이면 수열 내 순서에 의존하는 값으로 표현할 수 있다.
$$ \operatorname{PE}\left( \begin{bmatrix} \mathbf{k}_{1} \cdot \mathbf{q}_{1} \\ \mathbf{k}_{2} \cdot \mathbf{q}_{2} \\ \mathbf{k}_{3} \cdot \mathbf{q}_{3} \end{bmatrix} \right) = \begin{bmatrix} (3, 1) \\ (14, 2) \\ (33, 3) \end{bmatrix}, \qquad \operatorname{PE}\left( \begin{bmatrix} \mathbf{k}_{3} \cdot \mathbf{q}_{3} \\ \mathbf{k}_{2} \cdot \mathbf{q}_{2} \\ \mathbf{k}_{1} \cdot \mathbf{q}_{1} \end{bmatrix} \right) = \begin{bmatrix} (33, 1) \\ (14, 2) \\ (3, 3) \end{bmatrix} $$
이제 값 $3$은 원래 수열에서 $(3, 1)$, 뒤섞은 수열에서 $(3, 3)$로 서로 다르게 표현되어 두 경우를 구분할 수 있다.
종류
- 🔒(26/08/25)사인파 위치 인코딩

저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

