Position Encoding

Absolute Position Encoding (절대 위치 인코딩)

Trainable Position Embedding (학습 가능한 위치 임베딩)
Relative Position Encoding (상대 위치 인코딩)
❓그러면 RPE가 추세인건가?
💭현재 트랜스포머 기반 모델이 RPE를 사용해야 한다는 일반적인 규칙은 없습니다. 각 모델의 용도와 상황에 따라 APE와 RPE 중 적절한 방법을 선택해야 합니다. 예를 들어, 긴 문장에서의 문맥 이해가 중요한 경우 RPE가 더 유리할 수 있으며, 고정된 길이의 문장 처리나 절대적인 위치 정보가 중요한 경우 APE가 적합할 수 있습니다.
⭐️ 트랜스포머 기반 LM의 학습 과정에 positional information을 통합하는 다양한 방법을 조사
⭐️ 위치 정보를 효과적으로 활용하기 위해 회전 Position Embedding 임베딩(Rotary Position Embedding, RoPE) 이라는 새로운 방법을 제안
⭐️ 제안된 RoPE는 Absolute 위치를 회전 행렬로 인코딩하면서 self-attention 공식에 Relative 위치 의존성을 통합할 수 있음
⭐️ 특히 RoPE는 시퀀스 길이의 유연성, 상대 거리가 증가함에 따른 토큰 간 의존성 감소, 그리고 linear self-attention에 Relative Position encoding을 장착할 수 있는 능력 등의 유용한 특성을 제공
⭐️ RoFormer를 다양한 장문 텍스트 분류 벤치마크 데이터셋에서 평가하여 뛰어난 성능을 증명
[자연어 처리에서 위치 인코딩의 중요성]
[Transformer & Self-attention]
[Position encoding 접근 방식]
현재 PLMs의 self-attention은 position-agnostic 하다고 알려져 있기 때문에, 이를 보완하기 위해 여러 가지 접근 방식이 제안되었음
Absolute encoding: rule-base(sin&cos) 또는 trainble한 encoding vector를 만듬
Relative encoding: 주로 Relative position 정보를 self-attention에 사용함
하지만 이 접근 방식들은 context representation에 위치 정보를 포함시켜, linear self-attention에서는 적합하지 않을 수 있음
[일반적인 self-attention]
장점: 위치 정보를 포함한 다양한 인코딩 방법을 자유롭게 사용할 수 있습니다. 이는 모델이 문맥과 구조를 더 잘 이해할 수 있도록 돕습니다.
단점: 시퀀스 길이에 따라 메모리 사용량과 계산 비용이 크게 증가합니다. 긴 문장을 처리할 때 효율성이 떨어집니다.
[선형 self-attention]
장점: 메모리 사용량과 계산 비용을 줄여 긴 시퀀스를 효율적으로 처리할 수 있습니다.
단점: Relative 위치 인코딩 같은 복잡한 위치 정보를 다루는 데 제한이 있을 수 있습니다. 이는 모델이 문맥을 완전히 이해하는 데 한계가 될 수 있습니다.
-> ϕ는 dot product 대신 사용되는 특정 함수로, 주로 키 벡터에 대한 변환
-> 계산비용이 O(N^2) -> O(N)으로 줄어들음
선형 self-attention은 일반적인 self-attention에서의 쿼리와 키 벡터 간의 모든 점곱 연산을 피하고, 대신 더 효율적인 계산 방식을 사용하기 때문에, 복잡하고 계산이 필요한 Relative 위치 인코딩을 사용하는 것이 더 어려울 수 있음
[Rotary Position Embedding (RoPE)]
상대 거리가 증가함에 따라 감소하는 토큰 간 의존성
상대 거리가 멀어질수록 토큰 간 의존성을 자연스럽게 감소시키는 것은 모델이 중요한 정보에 집중하고, 덜 중요한 관계는 무시할 수 있게 합니다. 이는 계산 효율성을 높이고, 중요한 관계에 대한 학습을 강화합니다.
[Contribution]
⟨fᵩ(xₘ, 𝑚), fₖ(xₙ, 𝑛)⟩ = g(xₘ, xₙ, 𝑚 - 𝑛)
단어 임베딩 xₘ, xₙ
상대적 위치 m, n
오른쪽 항
왼쪽 항
fᵩ(xₘ, 𝑚): 쿼리 벡터 fᵩ는 단어 벡터 xₘ과 그 단어의 위치 m를 인코딩한 결과이며 즉, 이 벡터는 특정 단어와 그 위치 정보를 포함한 표현입니다.
fₖ(xₙ, 𝑛): 키 벡터 fₖ는 단어 벡터 xₙ과 그 단어의 위치 n를 인코딩한 결과이며 이는 또 다른 단어와 그 위치 정보를 포함한 표현입니다.
내적 (⟨ ⟩): 이 내적 연산은 쿼리 벡터와 키 벡터 간의 유사도를 계산함
내적 값이 클수록 두 벡터가 서로 더 유사하다는 것을 의미하며, 이는 두 단어가 문맥적으로 더 관련이 있다는 것을 나타냄!
따라서, 최종 목표는 상대 위치 정보를 인코딩하기 위해 Relatvie 위치 인코딩을 사용하여(m-n) 함수 fᵩ(xₘ, 𝑚)와 fₖ(xₙ, 𝑛)를 만족시키는 등가의 인코딩 메커니즘 g를 찾는 것!


❓왜 갑자기 복소수 회전 변환에서 회전행렬이 나오지?



🤗그래서! Absolute 위치를 회전 행렬로 인코딩하면서 self-attention 공식에 Relative 위치 의존성을 통합할 수 있다는 말은?
RoPE는 긴 거리의 단어 쌍 간의 관계가 약해지는 특성을 가지고 있음 -> Relative position 사용했기때문
이는 단어 간의 상대적 거리가 증가할수록 내적(inner-product) 값이 감소하는 것을 의미
이러한 특성은 먼 거리에 있는 두 단어가 서로 적은 관련성을 가진다는 직관과 일치!
이를 위해 RoPE에서는 각 𝜃𝑖를 10000−2𝑖/𝑑로 설정합니다. 이 설정은 단어 간의 거리가 멀어질수록 연관성이 감소하는 "Long-term Decay" 특성을 제공

매우 큰 값을 갖는 것을 막고, 회전 각도를 적절한 수준으로 조정하는 역할을 함

self-attention

linear self-attention

쿼리와 키 벡터를 변환하는 비음수 함수 사용하여 계산 비용을 줄임
elu(x)+1이나 relu(𝑥)와 같은 함수

많은 요소들이 0 또는 작은 값이 되어, 실제로 계산해야 하는 연산의 수를 줄임
linear self attention with RoPE







def rotate_half(x):
x = rearrange(x, '... (d r) -> ... d r', r=2)
x1, x2 = x.unbind(dim=-1)
x = torch.stack((-x2, x1), dim=-1)
return rearrange(x, '... d r -> ... (d r)')
def apply_rotary_emb(freqs: torch.Tensor, t: torch.Tensor, start_index=0):
rot_dim = freqs.shape[-1]
end_index = start_index + rot_dim
assert rot_dim <= t.shape[-1], f'feature dimension {t.shape[-1]} is not of sufficient size to rotate in all the positions {rot_dim}'
t_left, t_right = t[..., :start_index], t[..., start_index:end_index]
t = torch.cat((t_left, t_right * freqs.cos() + rotate_half(t_right) * freqs.sin(), t[..., end_index:]), dim=-1)
return t
rot_q = apply_rotary_emb(freqs, q)
rot_k = apply_rotary_emb(freqs, q)
🫨감사합니닷
relative position embedding을 각도로 접근한다는 방법이 신선한것 같습니다!