대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

王林
풀어 주다: 2024-04-01 20:19:01
앞으로
481명이 탐색했습니다.

2017년에 출판된 "Attention Is All You Need" 논문 이후 Transformer 아키텍처는 자연어 처리(NLP) 분야의 초석이 되었습니다. 디자인은 수년 동안 크게 변하지 않았으며, 2022년에는 RoPE(로터리 위치 인코딩)가 도입되면서 이 분야에서 큰 발전이 이루어졌습니다.

회전 위치 임베딩은 가장 발전된 NLP 위치 임베딩 기술입니다. Llama, Llama2, PaLM 및 CodeGen과 같은 가장 널리 사용되는 대규모 언어 모델에서는 이미 이를 사용하고 있습니다. 이 글에서는 회전 위치 인코딩이 무엇인지, 절대 위치 임베딩과 상대 위치 임베딩의 장점을 어떻게 깔끔하게 혼합하는지 자세히 살펴보겠습니다.

대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

위치 인코딩의 필요성

RoPE의 중요성을 이해하기 위해 먼저 위치 인코딩이 왜 중요한지 검토해 보겠습니다. Transformer 모델은 고유 설계에 따라 입력 토큰의 순서를 고려하지 않습니다.

예를 들어, "개가 돼지를 쫓는다", "돼지가 개를 쫓는다"와 같은 문구는 의미는 다르지만 순서가 지정되지 않은 토큰 세트로 간주되므로 구별할 수 없는 것으로 간주됩니다.

시퀀스 정보와 그 의미를 유지하려면 위치 정보를 모델에 통합하는 표현이 필요합니다.

절대 위치 인코딩

문장의 위치를 ​​인코딩하려면 각 벡터가 문장의 위치를 ​​나타내는 동일한 차원의 벡터를 사용하는 또 다른 도구가 필요합니다. 예를 들어 문장의 두 번째 단어에 대한 특정 벡터를 지정합니다. 따라서 각 문장 위치에는 고유한 벡터가 있습니다. 그런 다음 Transformer 계층에 대한 입력은 단어 임베딩과 해당 위치의 임베딩을 결합하여 형성됩니다.

이러한 임베딩을 생성하는 두 가지 주요 방법이 있습니다.

  1. 데이터에서 학습: 여기서 위치 벡터는 다른 모델 매개변수와 마찬가지로 학습 중에 학습됩니다. 각 위치(예: 1부터 512까지)에 대한 고유한 벡터를 학습합니다. 이로 인해 제한이 발생합니다. 최대 시퀀스 길이가 제한됩니다. 모델이 위치 512만 학습하는 경우 해당 위치보다 긴 시퀀스를 나타낼 수 없습니다.
  2. 사인 함수: 이 방법에는 사인 함수를 사용하여 각 위치에 대한 고유한 임베딩을 구축하는 방법이 포함됩니다. 이 구성의 세부 사항은 복잡하지만 기본적으로 시퀀스의 각 위치에 대해 고유한 위치 임베딩을 제공합니다. 경험적 연구에 따르면 데이터에서 사인 함수를 학습하고 사용하면 실제 모델에서 비슷한 성능을 제공할 수 있습니다.

절대 위치 인코딩의 한계

널리 사용되지만 절대 위치 임베딩에는 단점이 없는 것은 아닙니다.

  1. 제한된 시퀀스 길이: 위에서 언급했듯이 모델이 특정 지점까지 학습하는 경우 A 위치 벡터는 본질적으로 이 제한을 넘어서는 위치를 나타낼 수 없습니다.
  2. 위치 삽입의 독립성: 각 위치 삽입은 다른 위치 삽입과 독립적입니다. 이는 모델 관점에서 볼 때 위치 1과 위치 2의 차이가 위치 2와 500의 차이와 동일하다는 것을 의미합니다. 그러나 실제로 위치 1과 2는 상당히 멀리 떨어져 있는 위치 500보다 더 밀접하게 관련되어 있어야 합니다. 이러한 상대적 위치 지정이 부족하면 모델이 언어 구조의 뉘앙스를 이해하는 능력이 저하될 수 있습니다.

상대 위치 인코딩

상대 위치는 문장 내 음표의 절대 위치가 아니라 음표 쌍 사이의 거리에 초점을 맞춥니다. 이 방법은 위치 벡터를 단어 벡터에 직접 추가하지 않습니다. 대신, 상대 위치 정보를 통합하도록 주의 메커니즘이 변경됩니다.

T5(Text-to-Text Transfer Transformer)는 상대 위치 임베딩을 활용하는 유명한 모델입니다. T5는 위치 정보를 처리하는 미묘한 방법을 도입합니다.

  • 위치 오프셋에 대한 바이어스: T5는 바이어스(부동 소수점 수)를 사용하여 가능한 각 위치 오프셋을 나타냅니다. 예를 들어 편향 B1은 문장에서의 절대 위치에 관계없이 한 위치 떨어져 있는 두 토큰 사이의 상대적 거리를 나타낼 수 있습니다.
  • Self-Attention 레이어의 통합: 이 상대 위치 편향 행렬은 Self-Attention 레이어의 쿼리 행렬과 키 행렬의 곱에 추가됩니다. 이렇게 하면 시퀀스의 위치에 관계없이 동일한 상대 거리에 있는 마커가 항상 동일한 바이어스로 표시됩니다.
  • 확장성: 이 접근 방식의 중요한 장점은 확장성입니다. 임의의 긴 시퀀스로 확장될 수 있으며 이는 절대 위치 임베딩에 비해 확실한 이점이 있습니다.

상대 위치 인코딩의 제한 사항

대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

이론적으로는 매력적이지만 상대 위치 인코딩은 매우 문제가 많습니다.

  1. 계산적으로 비효율적입니다. 쌍 위치 인코딩 행렬을 만든 다음 각 시간 단계 상대 위치 인코딩을 얻기 위해 많은 수의 텐서 연산을 수행해야 합니다. 특히 더 긴 시퀀스의 경우. 이는 주로 위치 행렬이 쿼리 키 행렬에 추가되는 self-attention 레이어의 추가 계산 단계 때문입니다.
  2. 키-값 캐시 사용의 복잡성: 각 추가 토큰이 다른 모든 토큰의 포함을 변경하므로 Transformer에서 키-값 캐시의 효과적인 사용이 복잡해집니다. KV 캐시를 사용하기 위한 한 가지 요구 사항은 새 단어를 생성할 때 이미 생성된 단어의 위치 인코딩이 변경되지 않는다는 것입니다(절대 위치 인코딩 제공). 따라서 각 토큰의 포함이 새로운 변경마다 변경되므로 상대 위치 인코딩은 추론에 적합하지 않습니다. 시간 단계로.

이러한 엔지니어링 복잡성으로 인해 위치 인코딩은 특히 대규모 언어 모델에서 널리 채택되지 않았습니다.

RoPE(회전 위치 인코딩)?

RoPE는 위치 정보를 인코딩하는 새로운 방식을 나타냅니다. 전통적인 방법의 절대법과 상대법 모두에는 한계가 있습니다. 절대 위치 인코딩은 각 위치에 고유한 벡터를 할당합니다. 이는 간단하지만 확장이 잘 되지 않으며 상대 위치를 효과적으로 캡처할 수 없습니다. 상대 위치 인코딩은 마커 간의 거리에 초점을 맞추고 마커 관계에 대한 모델의 이해를 향상시키지만 모델 아키텍처를 복잡하게 만듭니다. .

RoPE는 두 가지 장점을 교묘하게 결합합니다. 모델이 마커의 절대 위치와 상대 거리를 이해할 수 있도록 위치 정보를 인코딩합니다. 이는 시퀀스의 각 위치가 임베딩 공간의 회전으로 표시되는 회전 메커니즘을 통해 달성됩니다. RoPE의 우아함은 모델이 언어 구문과 의미의 뉘앙스를 더 잘 이해할 수 있도록 하는 단순성과 효율성에 있습니다.

회전행렬은 우리가 고등학교 때 배운 사인과 코사인의 삼각법적 성질에서 파생된 것인데, 2차원 행렬을 이용하면 아래와 같은 회전행렬의 이론을 얻기에 충분할 것입니다!

대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

위 이미지에서 "r"로 표시된 것처럼 회전 행렬이 원래 벡터의 크기(또는 길이)를 유지하는 것을 볼 수 있습니다. 변경되는 유일한 것은 x축과의 각도입니다.

RoPE는 새로운 컨셉을 선보입니다. 위치 벡터를 추가하는 대신 단어 벡터에 회전을 적용합니다. 회전 각도(θ)는 문장에서 단어의 위치에 비례합니다. 첫 번째 위치의 벡터는 θ만큼 회전되고, 두 번째 위치의 벡터는 2θ만큼 회전되는 식입니다. 이 접근 방식에는 여러 가지 이점이 있습니다.

  1. 벡터의 안정성: 문장 끝에 마커를 추가해도 시작 단어의 벡터에는 영향을 주지 않으므로 효율적인 캐싱에 도움이 됩니다.
  2. 상대 위치 보존: 두 단어가 서로 다른 문맥에서 동일한 상대 거리를 유지하는 경우 해당 벡터는 동일한 양만큼 회전됩니다. 이렇게 하면 각도와 벡터 사이의 내적이 일정하게 유지됩니다.

RoPE의 행렬 공식

대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

RoPE의 기술 구현에는 회전 행렬이 포함됩니다. 2D의 경우, 논문의 방정식에는 벡터를 Mθ만큼 회전시키는 회전 행렬이 포함되어 있습니다. 여기서 M은 문장의 절대 위치입니다. 이 회전은 Transformer의 self-attention 메커니즘에서 쿼리 벡터와 키 벡터에 적용됩니다.

더 높은 차원의 경우 벡터는 2D 블록으로 분할되고 각 쌍은 독립적으로 회전됩니다. 이는 n차원이 공간에서 회전하는 것으로 생각할 수 있습니다. 이 방법은 구현하기가 복잡해 보이지만 그렇지 않습니다. PyTorch와 같은 라이브러리에서는 약 10줄의 코드만으로 효율적으로 구현할 수 있습니다.

import torch import torch.nn as nn  class RotaryPositionalEmbedding(nn.Module): def __init__(self, d_model, max_seq_len): super(RotaryPositionalEmbedding, self).__init__()  # Create a rotation matrix. self.rotation_matrix = torch.zeros(d_model, d_model, device=torch.device("cuda")) for i in range(d_model): for j in range(d_model): self.rotation_matrix[i, j] = torch.cos(i * j * 0.01)  # Create a positional embedding matrix. self.positional_embedding = torch.zeros(max_seq_len, d_model, device=torch.device("cuda")) for i in range(max_seq_len): for j in range(d_model): self.positional_embedding[i, j] = torch.cos(i * j * 0.01)  def forward(self, x): """Args:x: A tensor of shape (batch_size, seq_len, d_model). Returns:A tensor of shape (batch_size, seq_len, d_model)."""  # Add the positional embedding to the input tensor. x += self.positional_embedding  # Apply the rotation matrix to the input tensor. x = torch.matmul(x, self.rotation_matrix)  return x
로그인 후 복사

대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

为了旋转是通过简单的向量运算而不是矩阵乘法来执行。距离较近的单词更有可能具有较高的点积,而距离较远的单词则具有较低的点积,这反映了它们在给定上下文中的相对相关性。

대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?

使用 RoPE 对 RoBERTa 和 Performer 等模型进行的实验表明,与正弦嵌入相比,它的训练时间更快。并且该方法在各种架构和训练设置中都很稳健。

最主要的是RoPE是可以外推的,也就是说可以直接处理任意长的问题。在最早的llamacpp项目中就有人通过线性插值RoPE扩张,在推理的时候直接通过线性插值将LLAMA的context由2k拓展到4k,并且性能没有下降,所以这也可以证明RoPE的有效性。

代码如下:

import transformers  old_init = transformers.models.llama.modeling_llama.LlamaRotaryEmbedding.__init__ def ntk_scaled_init(self, dim, max_position_embeddings=2048, base=10000, device=None): #The method is just these three linesmax_position_embeddings = 16384a = 8 #Alpha valuebase = base * a ** (dim / (dim-2)) #Base change formula old_init(self, dim, max_position_embeddings, base, device)   transformers.models.llama.modeling_llama.LlamaRotaryEmbedding.__init__ = ntk_scaled_init
로그인 후 복사

总结

旋转位置嵌入代表了 Transformer 架构的范式转变,提供了一种更稳健、直观和可扩展的位置信息编码方式。

RoPE不仅解决了LLM context过长之后引起的上下文无法关联问题,并且还提高了训练和推理的速度。这一进步不仅增强了当前的语言模型,还为 NLP  的未来创新奠定了基础。随着我们不断解开语言和人工智能的复杂性,像 RoPE 这样的方法将有助于构建更先进、更准确、更类人的语言处理系统。

위 내용은 대규모 언어 모델에서 흔히 사용되는 RoPE를 인코딩하는 회전 위치 인코딩에 대한 자세한 설명: 왜 절대 위치 인코딩이나 상대 위치 인코딩보다 나은가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:51cto.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿