태그 | 데이터 세트 | 측정항목 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
이 백서에서는 LLM(대형 언어 모델)의 컨텍스트 창을 200만 개 이상의 토큰으로 확장하는 방법인 LongRoPE를 소개합니다.
핵심 아이디어는 다음과 같습니다.
보간 중 정보 손실을 최소화하기 위해 위치 임베딩에서 두 가지 형태의 비균일성을 식별하고 활용합니다. 이를 통해 미세 조정 없이 8x 컨텍스트 확장이 가능합니다.
매우 큰 컨텍스트를 직접 미세 조정하는 대신 256k 미세 조정을 통해 효율적인 점진적 확장 전략을 사용하여 2048k 컨텍스트에 도달합니다.
원래 창 크기 내에서 성능을 복구하려면 더 짧은 컨텍스트에 대한 임베딩을 조정하세요.
이 방법은 LLaMA2와 Mistral에 적용됩니다. 다양한 작업에 대한 실험을 통해 4k에서 2048k 컨텍스트 길이까지 성능을 유지하는 LongRoPE의 효율성이 입증되었습니다.
Transformer 아키텍처는 self-attention의 2차 계산 복잡성과 훈련 시간에 볼 수 없는 토큰 위치에 대한 일반화가 부족한 문제로 어려움을 겪고 있습니다. Self-Attention 계산을 대규모 컨텍스트로 확장하기 위해 RoPE, AliBi, Attention Sink 등과 같은 다양한 방법이 제안되었습니다. 그럼에도 불구하고 이러한 솔루션 중 어느 것도 모델의 정확도를 유지하면서 수백만 개의 토큰을 사용하여 컨텍스트에 맞게 효과적으로 확장할 수 없습니다. .
이 문서에서는 LLM의 컨텍스트 창을 200만 개 이상의 토큰으로 확장하는 새로운 기술인 LongRoPE를 제시합니다.
LongRoPE는 희귀하고 조달하기 어려운 매우 긴 텍스트를 직접 미세 조정할 필요 없이 2048k 컨텍스트 창을 달성하기 위해 점진적인 확장 전략을 활용합니다. 이 전략은 사전 훈련된 LLM에서 256k 확장으로 시작한 다음 이 길이에서 미세 조정됩니다.
원래(더 짧은) 컨텍스트 창에서 잠재적인 성능 저하를 해결하기 위해 LongRoPE는 확장된 LLM에서 RoPE 재조정 요소를 추가로 조정하고 위치 보간을 최소화하기 위해 검색 알고리즘을 사용하여 256k 미세 조정된 LLM에서 4k 및 8k 컨텍스트 창으로 축소합니다. 길이가 8k 미만인 시퀀스를 추론하는 동안 RoPE는 꼼꼼하게 검색된 재조정 요소로 업데이트됩니다.
긴 컨텍스트가 필요한 다양한 LLM 및 작업에 대한 테스트를 통해 LongRoPE의 효율성이 검증되었습니다. 이 방법은 4k에서 2048k 토큰의 평가 길이 전반에 걸쳐 낮은 복잡성을 크게 유지하고 암호 키 검색에서 90% 이상의 정확도를 달성하며 4096 컨텍스트 창 내에서 표준 벤치마크에 필적하는 정확도를 제공합니다.
구조적 수정과 모델 성능에 대한 영향을 심층적으로 살펴봅니다.
LongRoPE 모델 아키텍처는 LLM(대형 언어 모델)의 컨텍스트 창을 2백만 개 이상의 토큰으로 확장하여 기존 Transformer 아키텍처의 한계를 해결하도록 설계되었습니다. 핵심 혁신은 점진적 확장 전략과 위치 임베딩 조정에 있습니다.
주요 구성 요소는 다음과 같습니다.
class RoPEPositionalEncoding ( nn . Module ):
def __init__ ( self , d_model , max_len = 1000000 , base = 10000 ):
super (). __init__ ()
self . d_model = d_model
self . max_len = max_len
self . base = base
self . theta = torch . tensor ([ base ** ( - 2 * ( i // 2 ) / d_model ) for i in range ( d_model )])
def forward ( self , positions ):
angles = positions . unsqueeze ( - 1 ) * self . theta
sin_cos = torch . stack ([ angles . cos (), angles . sin ()], dim = - 1 )
return sin_cos . view ( * sin_cos . shape [: - 2 ], - 1 )
def non_uniform_interpolation ( pos_embed , extension_ratio , lambda_factors , n_hat ):
d_model = pos_embed . shape [ - 1 ]
interpolated_pos = pos_embed . clone ()
for i in range ( d_model // 2 ):
mask = torch . arange ( pos_embed . shape [ - 2 ], device = pos_embed . device ) < n_hat
scale = torch . where ( mask , torch . ones_like ( pos_embed [..., 0 ], device = pos_embed . device ),
1 / ( lambda_factors [ i ] * extension_ratio ))
interpolated_pos [..., 2 * i ] *= scale
interpolated_pos [..., 2 * i + 1 ] *= scale
return interpolated_pos
def progressive_extension ( model , data , base_length , target_length , population_size , num_mutations , num_crossovers , max_iterations ):
# Extend to 128k
lambda_factors_128k , n_hat_128k = search_lambda_factors ( model , data , 128000 / base_length , population_size , num_mutations , num_crossovers , max_iterations )
model = fine_tune ( model , data , 128000 , lambda_factors_128k , n_hat_128k , steps = 400 )
# Extend to 256k
lambda_factors_256k , n_hat_256k = search_lambda_factors ( model , data , 256000 / base_length , population_size , num_mutations , num_crossovers , max_iterations )
model = fine_tune ( model , data , 256000 , lambda_factors_256k , n_hat_256k , steps = 600 )
# Extend to target length
if target_length > 256000 :
final_lambda_factors , final_n_hat = search_lambda_factors ( model , data , target_length / base_length , population_size // 2 , num_mutations // 2 , num_crossovers // 2 , max_iterations // 2 )
model . lambda_factors [ "2048k" ] = final_lambda_factors
model . n_hat [ "2048k" ] = final_n_hat
return model , final_lambda_factors , final_n_hat , lambda_factors_256k , n_hat_256k
아키텍처는 사전 훈련된 LLM으로 시작하여 컨텍스트 창을 점진적으로 확장합니다. 처음에 모델은 256,000개의 토큰의 컨텍스트 길이를 처리하도록 미세 조정되었습니다. 이러한 진보적인 접근 방식을 사용하면 드물고 처리 비용이 많이 드는 매우 긴 텍스트를 직접 미세 조정할 필요가 없습니다. 컨텍스트 길이를 점진적으로 늘리면 모델이 더 긴 시퀀스에 더 효과적으로 적응할 수 있습니다.
다양한 컨텍스트 길이에서 성능을 유지하기 위해 LongRoPE는 RoPE(회전 위치 임베딩)를 조정합니다. 이 모델은 위치 임베딩의 비균일성을 식별하고 활용하여 보간 중 정보 손실을 최소화합니다. 이를 통해 미세 조정 없이 8x 컨텍스트 확장이 가능합니다. 또한 이 모델은 검색 알고리즘을 사용하여 256k 미세 조정 LLM에서 더 짧은 컨텍스트(예: 4k 및 8k 토큰)에 대한 최적의 크기 조정 요소를 찾습니다. 이러한 조정을 통해 모델은 원래 컨텍스트 창 크기 내에서도 높은 성능을 유지할 수 있습니다.
아키텍처에는 늘어난 컨텍스트 길이를 효율적으로 처리하기 위해 여러 가지 구조적 수정 사항이 통합되어 있습니다.
레이어 크기 조정 : 컨텍스트 창이 커짐에 따라 안정성과 성능을 보장하기 위해 레이어 크기 조정이 조정됩니다.
메모리 관리 : 효율적인 메모리 관리 기술을 사용하여 시스템 리소스에 부담을 주지 않으면서 대규모 컨텍스트 크기를 처리합니다.
주의 메커니즘 : 확장된 컨텍스트에서도 모델이 입력 시퀀스의 관련 부분에 집중할 수 있도록 향상된 주의 메커니즘이 통합되었습니다.
토큰별 주의(Token-wise Attention) : 토큰 간의 맥락적 관계를 포착하기 위해 토큰별 주의 메커니즘이 도입되어 모델이 입력의 의미론적 의미를 더 잘 이해할 수 있습니다.
실험에 따르면 LongRoPE는 4k에서 2048k 토큰의 평가 길이에 걸쳐 낮은 복잡성을 유지하고 긴 컨텍스트가 필요한 작업에서 높은 정확도를 달성합니다. 따라서 상황 내 학습, 긴 문서 요약, 소수 학습 등 다양한 응용 분야에 적합합니다.
자세한 내용은 여기에서 전체 문서를 참조하세요.
LongRoPE의 기능을 활성화하는 코딩 및 운영 세부 사항에 대한 통찰력. 여기에는 주요 구성 요소를 설명하는 스니펫이나 의사 코드가 포함될 수 있습니다.
자세한 내용은 논문을 참고해주세요.
텍스트 분석부터 광범위한 문서 생성에 이르기까지 다양한 애플리케이션에 LongRoPE를 활용하는 방법을 보여주는 포괄적인 예입니다.
# Example usage
data_path = "path/to/your/dataset"
d_model = 512
n_heads = 8
num_layers = 6
base_length = 4096
target_length = 2048 * 1024
data = load_data ( data_path )
model = LongRoPEModel ( d_model , n_heads , num_layers , base_length )
model = model . extend_context ( data , target_length )
input_ids = torch . randn ( 2 , target_length , d_model )
output = model ( input_ids )
print ( output . shape ) # Expected shape: (batch_size, target_length, d_model)
커스텀 데이터세트 학습
커스텀 데이터 세트를 학습하려면 다음 안내를 따르세요.
하이퍼파라미터 튜닝 LongRoPE의 성능은 하이퍼파라미터에 민감할 수 있습니다. 조정할 주요 매개변수는 다음과 같습니다.
람다 인자 검색의 population_size
, num_mutations
및 num_crossovers
훈련 안정성을 위해 그래디언트 gradient_accumulation_steps
미세 조정하기 위한 학습 속도 및 스케줄러 매개변수
LongRoPE를 구현하면 다음과 같은 결과를 얻을 수 있습니다.
당황:
패스키 검색 정확도:
정확성:
기본 모델과의 비교:
@article { ding2024longrope ,
title = { LongRoPE: Extending LLM Context Window Beyond 2 Million Tokens } ,
author = { Ding, Yiran and Zhang, Li Lyna and Zhang, Chengruidong and Xu, Yuanyuan and Shang, Ning and Xu, Jiahang and Yang, Fan and Yang, Mao } ,
journal = { arXiv preprint arXiv:2402.13753 } ,
year = { 2024 }
}
참고: 이 저장소는 진행 중인 작업이며 아직 프로덕션에서 사용할 준비가 되지 않았습니다. 자세한 내용은 논문을 참고해주세요.