標籤 | 數據集 | 指標 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
|
該論文介紹了 LongRoPE,一種將大型語言模型 (LLM) 的上下文視窗擴展到超過 200 萬個標記的方法。
關鍵思想是:
識別並利用位置嵌入中的兩種形式的不均勻性,以最大程度地減少插值期間資訊的遺失。這無需微調即可實現 8 倍上下文擴充。
使用高效的漸進式擴展策略,透過 256k 微調達到 2048k 上下文,而不是直接微調極大的上下文。
調整較短上下文的嵌入以恢復原始視窗大小內的效能。
此方法適用於 LLaMA2 和 Mistral。跨各種任務的實驗證明了 LongRoPE 在保持 4k 到 2048k 上下文長度的性能方面的有效性。
Transformer 架構面臨著自註意力的二次計算複雜性以及缺乏對訓練時未見的 token 位置的泛化的困擾。為了將自註意力計算擴展到大的上下文中,人們提出了各種方法,例如RoPE、AliBi、注意力池等。上下文,同時保持模型的準確性。
本文提出了一種新技術 LongRoPE,將 LLM 的上下文視窗擴展到超過 200 萬個令牌。
LongRoPE 利用漸進式擴展策略來獲得 2048k 上下文窗口,而無需對極長的文本進行直接微調,而極長的文本既罕見又難以獲得。此策略首先對預先訓練的 LLM 進行 256k 擴展,然後在此長度上進行微調。
為了解決原始(較短)上下文窗口中潛在的效能下降問題,LongRoPE 進一步調整擴展LLM 上的RoPE 重新縮放因子,使用其搜尋演算法在256k 微調LLM 上縮小到4k 和8k 上下文窗口,以最大限度地減少位置插值。在對長度低於 8k 的序列進行推理期間,RoPE 會使用這些精心搜尋的重縮放因子進行更新。
對各種法學碩士和需要長上下文的任務進行的測試驗證了 LongRoPE 的功效。該方法在從4k 到2048k 令牌的評估長度上顯著保持了較低的複雜性,在密鑰檢索中實現了90% 以上的準確度,並提供了與4096 個上下文視窗內的標準基準相當的準確度
深入研究結構修改及其對模型性能的影響。
LongRoPE模型架構旨在將大型語言模型(LLM)的上下文視窗擴展到超過200萬個令牌,解決傳統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
該架構從預先訓練的法學碩士開始,並逐步擴展其上下文視窗。最初,模型經過微調以處理 256k 令牌的上下文長度。這種漸進方法避免了對極長文本進行直接微調的需要,這種文本很少見,而且處理起來計算成本很高。透過逐漸增加上下文長度,模型可以更有效地適應更長的序列。
為了在不同的上下文長度下保持效能,LongRoPE 調整了旋轉位置嵌入 (RoPE)。此模型識別並利用位置嵌入中的不均勻性來最大程度地減少插值期間資訊的遺失。這允許 8 倍上下文擴展,而無需進行微調。此外,該模型採用搜尋演算法在 256k 微調的 LLM 上找到較短上下文(例如 4k 和 8k 令牌)的最佳重新調整因子。這些調整確保模型即使在原始上下文視窗大小內也能保持高效能。
該架構結合了多項結構修改,以有效處理增加的上下文長度:
層縮放:對層的縮放進行調整,以確保上下文視窗增長時的穩定性和效能。
記憶體管理:採用高效率的記憶體管理技術來處理大的上下文大小,而不會壓垮系統資源。
注意力機制:整合了增強的注意力機制,以確保模型能夠專注於輸入序列的相關部分,即使有擴展的上下文。
Token-wise Attention :引入了 Token-wise 注意力機制來捕捉 token 之間的上下文關係,使模型能夠更好地理解輸入的語義。
實驗表明,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 的效能可能對超參數很敏感。要調整的關鍵參數包括:
lambda 因子搜尋中的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 }
}
注意:此儲存庫正在開發中,尚未準備好用於生產使用。請參閱論文以了解更多詳細資訊。