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