前言
如今的大模型被應用在各個場景,其中有些場景則需要模型能夠支持處理較長文本的能力(比如8k甚至更長),其中已經有很多開源或者閉源模型具備該能力比如GPT4、Baichuan2-192K等等。
那關于LLM的長文本能力,目前業界通常都是怎么做的?有哪些技術點或者方向?今天我們就來總結一波,供大家快速全面了解。
當然也有一些關于LLM長文本的綜述,感興趣的小伙伴可以看看,比如:
《Advancing Transformer Architecture in Long-Context Large Language Models: A Comprehensive Survey》:https://arxiv.org/pdf/2311.12351.pdf
今天我們會從如下幾個層面進行介紹::數據層面、模型層面、評估層面。每個層面挑幾個還不錯的工作淺淺學一下業界都是怎么做的。
全文涉及較多工作,建議收藏,方便后續查詢細讀或者下載數據。
數據層面
LongAlpaca-12k
鏈接:https://huggingface.co/datasets/Yukang/LongAlpaca-12k
其是LongAlpaca-12k的一個工作,共收集了9k條長文本問答語料對,包含針對名著、論文、深度報道甚至財務報表的各類問答。
同時為了兼顧短文本能力,還從原有的Alpaca數據集中挑選了3k左右的短問答語料即最終構建了12k。
LongQLoRA
鏈接:https://huggingface.co/datasets/YeungNLP/LongQLoRA-Dataset
其是LongQLoRA的一個工作,其開源了兩部分數據一部分是54k的預訓練數據,一部分是39k的sft數據。
Ziya-Reader
鏈接:https://arxiv.org/abs/2311.09198
本篇paper主要貢獻是如何構建長文本問答訓練數據,專注用于多文檔或單文檔問答,雖然訓練數據沒有開源,但是做數據的方法我們可以學習一下
其主要借鑒cot的思路,在長文本問答領域也采用類cot,具體來說是:
(1)讓模型先對問題進行復述,這使得模型在看了一段非常長的上下文信息后,也不會因為距離衰減的原因忘記原始的提問,因而在生成回復時,更加能夠關注到問題。
(2)讓模型預測正確上下文段落的索引下標,通過這樣的方式可以讓模型更加關注正確的上下文段落。
(3)預測最終答案
可以看到(1)(2)就是作者采用的cot
除此之外之外,還構建了一些負樣本,比如沒有正確上下文等等來增強模型的泛化性。
LongAlign
鏈接:https://huggingface.co/datasets/THUDM/LongAlign-10k
這篇工作主要聚焦做長文本的sft數據,具體來說作者從9個不同的來源收集長篇文章后使用Claude 2.1根據給定的長篇背景生成任務和答案。
模型層面
模型層面主要是探索外推性,即如何確保在模型推理階段可以支持遠遠超過預訓練的長度,其中限制外推的根本原因有兩個即在inference階段面對更長文本的時候,會出現更長的新位置編碼(相比訓練)以及歷史上下文kv緩存過大這兩個根本難題。
為此目前的探索主要發力解決這兩個難題:(1)設計位置編碼;(2)動態設計局部注意力機制。下面我們逐個詳細看看~
(1)設計位置編碼
關于這部分推薦一篇博客:https://mp.weixin.qq.com/s/RtI95hu-ZLxGkdGuNIkERQ
大模型的位置編碼發展史: 絕對位置編碼 -> 相對位置編碼 -> 旋轉位置編碼。
其中絕對編碼的一個缺點是模型無法顯式的感知兩個token之間的相對位置,而后續的比如Sinusoidal相對位置編碼則通過正余弦函數實現了相對位置編碼,而旋轉位置編碼則實現了通過簡單的周期性旋轉將位置信息編入了進去。
其中一個向量維度是d,越靠后的分組,它的旋轉速度越慢,正弦函數的周期越大、頻率越低。
所以我們簡單總結一下旋轉位置編碼直觀的性質,他的核心是通過旋轉向量來將位置信息植入進來(非常巧妙,不需要其他什么復雜的改變,只需要旋轉向量就可以),具體的旋轉過程是:假設當前向量是d維,那么就分為d/2個組,每個組進行各自的周期旋轉,越靠后的分組,它的旋轉速度越慢,正弦函數的周期越大、頻率越低。
轉化為數學一點為:向量q(維度為d)在位置m時, 它的第i組(總共d/2個組)分量的旋轉弧度為
當訓練長度為L時,模型訓練的時候只見過即,當推理長度大于L時,模型不能cover新的旋轉弧度也即無法插入新的位置信息了。
知道了卡點,下面我們來看幾個相關的改進工作。
Position Interpolation
該方法為位置插值,思路也比較好的理解,既然超過L后的旋轉模型因為沒有見過就不能理解,那么我們就不超過,但是位置m還想擴大(比如一倍),那就可以通過縮小每個位置的旋轉弧度(讓向量旋轉得慢一些),每個位置的旋轉弧度變為原來的,這樣的話長度就可以擴大幾倍。具體的為:,這樣的話即保證了沒有超過訓練的旋轉范圍,又插入更長或者更多的位置。
NTK-Aware Interpolation
該方法也是通過縮放,具體方法為如下:具體的是引入了一個縮放因子。
從數學角度看的話,Position Interpolation是將縮放因子放到了外面,而NTK是放到了里面(帶有指數)。從直觀的理論上看Position Interpolation方法是對向量的所有分組進行同等力度地縮小,而NTK對于較前的分組(高頻分量)縮小幅度小,對于較后的分組(低頻分量)縮小幅度大。
這樣做的目的是靠前的分組,在訓練中模型已經見過很多完整的旋轉周期(因為旋轉速度很快,這個性質之前已經介紹過了),位置信息得到了充分的訓練,所以已經具有較強的外推能力。而靠后的分組,由于旋轉的較慢,模型無法見到完整的旋轉周期,或者見到的旋轉周期很少,外推性能就很差,需要進行位置插值。
NTK-by-parts Interpolation
這個方法就更直接了,直接一刀切,對于高頻分量就不縮小了(一點也不)即不進行插值,因為已經具備外推性,而對于低頻分量由于訓練沒見過完整旋轉周期所以外推性差,那就進行插值。相比于NTK-Aware Interpolation方法,這個方法更硬一些。
Dynamic NTK Interpolatio
NTK插值在超過訓練長度L時表現還不錯,但是在訓練長度內反而表現較差,為此本方法實現了動態插值即當inference的長度l在訓練長度L內就不進行插值,超過訓練長度L才進行NTK-Aware Interpolation。
具體的縮小因子也是個動態值為:,其中l隨著不斷生成不斷累加,是個動態值。
(2)動態設計局部注意力機制
在生成每一個token的時候,其實核心都是在計算attention score,那么就需要查詢之前token的kv值,為了提高效率,一般來說會把歷史的kv值都緩沖起來,這樣后續就可以快速用了,但問題是當隨著長度增加時,內存必然OOM。
知道了卡點,下面我們來看幾個相關的改進工作。
EFFICIENT STREAMING LANGUAGE MODELS WITH ATTENTION SINKS
論文鏈接:https://arxiv.org/pdf/2309.17453.pdf
(a) 就是常規inference,可以看到不論是復雜度還是效果性能隨著長度增加,都會變得嚴峻。
(b) 就是常說的滑動窗口,核心方法就是每次只緩沖最近幾個token,這樣的話可以保證效率,但是當文本變長后,性能會下降。
(c) 就是不緩沖,每次重新計算最近幾個token的,好處是保住了性能,但是效率也大大降低,因為每次都要重新計算
(d) 就是本文提出的方法,其通過觀察發現大量的注意力分數被分配給初始token(即使這些token與語言建模任務沒有相關性),基于此作者沿用(b)的方法,只不過每次除了用緩沖的最近幾個token,額外再加上開頭的幾個token。
通過(d)方法最終實現了無限外推,該工作的代碼也已經開源,star非常多,很受歡迎。
LONGLORA: EFFICIENT FINE-TUNING OF LONG- CONTEXT LARGE LANGUAGE MODELS
論文地址:https://browse.arxiv.org/pdf/2309.12307.pdf
本篇主要的貢獻在于開源了一個長文本訓練數據(見上節)以及提出了一個shift short attention
可以看到就是先分組(各個組內進行self attention),只不過由于各個組由于之間沒有交互信息,導致效果變成,于是作者也采用滑窗口機制來緩解一下,即使用半組長度來滑,本質上就是滑動窗口,只不過就是先分組再滑。
同時其支持lora訓練,可快速訓練適配部署自己的模型。
LONGQLORA: EFFICIENT AND EFFECTIVE METHOD TO EXTEND CONTEXT LENGTH OF LARGE LANGUAGE MODELS
論文地址:https://arxiv.org/pdf/2311.04879.pdf
其和上篇的LONGLORA大同小異,主要不同是替用qlora進行訓練,更節省資源,同時另外一個貢獻就是開源了一個長文本數據集(見上節)
Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon
論文地址:https://arxiv.org/pdf/2401.03462v1.pdf
這篇論文的思路也很樸素:大的思路也是采用滑動窗口,只不過在怎么動態保存之前上下文的思路上采用的是壓縮思路,即前面信息既然太多,那就壓一壓。
具體的前面咱們介紹的EFFICIENT是通過每次滑的時候始終保留最前面幾個token,而本篇的思路就是把每個區間的信息(圖中藍色)壓縮成一個激活信標(圖中綠色),而后面就用這些單個激活信標來代表整個區間的信息。
那激活信標怎么得到呢?作者也是采用了注意力機制,具體的探索了三種方法,一種是分段即每個信標只用自己區間的信息(圖A),第二種是逐步分段即每個信標可以關注比其前身多一個子區間(圖B),第三種是完全覆蓋,其中所有信標都可以關注整個上下文(圖C)。這三種方法的計算成本相同。最后作者發現第二種最好。
有了信標后,便可以將信標和來自普通信息一起使用滑動窗口進行流式處理即每個滑動窗口由過去上下文區間的m個信標和最新上下文區間的普通標記組成。
評估層面
在迭代模型長文本能力的過程中,需要一個量化指標來不斷指導,目前業界已經有一些評估,一起來看看吧~
ZeroSCROLLS
論文鏈接:https://arxiv.org/pdf/2305.14196.pdf
其由十個自然語言任務構成,包括摘要、問答、聚合任務(給50條評論,讓模型預測正面評論的百分比)等等
longeval
論文鏈接:https://lmsys.org/blog/2023-06-29-longchat/
該工作通過設計topic和lines長文本記憶能力來測試模型的長文本能力。
L-Eval
論文鏈接:https://arxiv.org/pdf/2307.11088.pdf?
該工作從公開數據集收集數據,然后手動過濾和校正,重新標注得到。
LongBench
論文鏈接:https://arxiv.org/abs/2308.14508
該工作也是設計了單文檔問答、多文檔問答、摘要任務、Few-shot任務、合成任務、代碼補全等等
LooGLE
論文鏈接:https://arxiv.org/pdf/2311.04939.pdf
該工作從科學論文、維基百科文章、電影和電視中收集樣本,然后也是設計摘要等任務。
FinLongEval
論文鏈接:https://github.com/valuesimplex/FinLongEval
主要聚焦金融領域的長文本評測
總結
可以看到,在助力LLM長文本能力的道路上目前有兩個大的方向在發力:
(1)從數據入手即構建做高質量長文本數據,這非常重要,因為有了數據才能訓練,其中長文本預訓練數據相對來說比較好找,但是sft數據就比較難了,并不是說強行cat起來就是有效長文本,比如把多個單輪文本cat到8k,但是這是一個偽多輪,對模型學習全局信息幫助很??;關于怎么構建高質量的長文本數據尤其是中文領域的數據還需要更多的探索,可以借鑒長文本評測任務來汲取靈感進行構建訓練數據。
(2)從模型層面入手進行外推,目前一個是探索位置編碼,另外一個就是探索怎么緩解kv緩沖也即兩個核心問題:第一就是尋找或設計合適的位置編碼;第二是設計局部注意力機制。其中第一個大的方向都是縮放即通過縮放將旋轉范圍依然縮放到和訓練一致但實現了插入了更多的或者更長的位置,第二個大的方向基本都是探索怎么把之前的信息進行動態壓縮,更進一步這里的動態其實就是滑動,只不過在滑動上進行各種不同的邏輯。將兩個技術點(本來就是解決不同問題的)合理的結合也是很重要的。
總的來說,首先盡可能的收集準備好高質量的長文本訓練數據,然后在當前資源下訓練到最大長度,最后在推理時可以借助各種外推手段進行拓展。
審核編輯:黃飛
?
評論
查看更多