1. 背景
關(guān)于LLM復(fù)讀機問題拄丰,本qiang~在網(wǎng)上搜刮了好幾天蝇棉,結(jié)果是大多數(shù)客觀整理的都有些支離破碎,不夠系統(tǒng)澜倦。
因此聚蝶,本qiang~打算做一個相對系統(tǒng)的整理,包括LLM復(fù)讀機產(chǎn)生的原因以及對應(yīng)的解決方案藻治。
2. LLM復(fù)讀機示例
示例1:短語級別的重復(fù)
User: 你喜歡北京么碘勉?
AI: 北京是中國的首都,有很多名勝古跡栋艳,如長城恰聘,故宮,天壇等吸占,我十分喜歡喜歡喜歡喜歡…..
示例2:句子級別的重復(fù)
User: 你喜歡北京么晴叨?
AI: 北京是中國的首都,有很多名勝古跡矾屯,如長城兼蕊,故宮,天壇等件蚕,我十分熱愛北京孙技,我十分熱愛北京,我十分熱愛北京排作,…..
3. LLM復(fù)讀機原因
本文主要參考了清華大學(xué)的論文《Learning
to Break the Loop: Analyzing and Mitigating Repetitions for Neural Text
Generation》牵啦,文中詳細(xì)介紹了LLM產(chǎn)生復(fù)讀的原因。論文的前提假設(shè)是LLM的解碼均為貪心解碼(greedy decoding)妄痪,即每次生成的token選擇詞表中概率最大的token哈雏。
結(jié)論如下:
(1) LLM趨向于提高重復(fù)先前句子的概率
特別地,即使僅出現(xiàn)一條句子級的上下文重復(fù)衫生,重復(fù)的概率在大多數(shù)情況下也會增加裳瘪。產(chǎn)生這種現(xiàn)象的原因可能是LLM對上下文非常有信心,當(dāng)先前的token共享同一個句子級的上下文時罪针,模型會學(xué)到一條捷徑彭羹,直接復(fù)制該token。
另一種解釋就是Inudction Head機制泪酱,即模型會傾向于從前面已經(jīng)預(yù)測word里面挑選最匹配的詞派殷。
舉個例子來說明下还最,示例1中的第二個’喜歡’共享了同句子中的’我十分喜歡’,因此模型直接會將’喜歡’拷貝至’我十分喜歡’毡惜,進而生成’我十分喜歡喜歡’
(2) 自我強化效應(yīng)(self-reinforcementeffect)
重復(fù)的概率幾乎隨著歷史重復(fù)次數(shù)的增加而單調(diào)增加憋活,最終,重復(fù)概率穩(wěn)定在某個上限值附近虱黄。
一旦生成的句子重復(fù)幾次,模型將會受困于因自我強化效應(yīng)引起的句子循環(huán)吮成。
下圖是論文中的圖橱乱,意思是隨著重復(fù)次數(shù)的增加,’general’一詞的概率幾乎單調(diào)增加粱甫,最終趨于穩(wěn)定泳叠。其中紅柱表示生成相同token的概率,藍(lán)色表示最大概率茶宵。
(3) 初始概率較高的句子通常具有較強的自我強化效應(yīng)危纫。
4. 如何解決
目前針對LLM重復(fù)生成的問題,主要有兩種策略乌庶,一種是基于訓(xùn)練思想种蝶,一種是基于解碼策略。
4.1 基于訓(xùn)練策略
整體思想就是通過構(gòu)造偽數(shù)據(jù)瞒大,即短語重復(fù)螃征、句子重復(fù)等偽數(shù)據(jù),如短語或句子重復(fù)N遍透敌,然后設(shè)計重復(fù)懲罰項來抑制大模型生成重復(fù)句子盯滚。
論文中提出了DITTO方法即采用了此策略,DITTO全稱為PseuDo RepetITion
PenalizaTiOn(不得不佩服算法名稱的設(shè)計精美~)酗电。
重復(fù)懲罰項通過設(shè)計損失函數(shù)來達(dá)成魄藕,其中λ是懲罰因子,論文中提到撵术,對于開放式生成背率,推薦取值為0.5,對于總結(jié)摘要類任務(wù)荷荤,取值為0.9性能更好退渗。
代碼分析:
DITTO損失函數(shù)計算的代碼塊位于https://github.com/Jxu-Thu/DITTO中”DITTO/fairseq/custom/repetetion_penalty_accum_loss.py”方法中,大體流程簡要分析如下:
# 構(gòu)造隨機重復(fù)的特征
sample, P, L, N, K = self.re_orgnize_sentence(sample)
# 基于構(gòu)造的重復(fù)特征進行預(yù)測
net_output = model(**sample['net_input'])
……….
## 計算損失函數(shù)
# 獲取重復(fù)的基線概率信息
gt_probs, mask, valid_tokens =? self.obtain_rep_baseline_prob(model.get_targets(sample, net_output),? target_probs.detach(), P, L, N, K)
# 損失函數(shù)公式套用
one_minus_probs = torch.clamp((1.0 - torch.abs((target_probs -? gt_probs*self.rep_reduce_gamma))), min=1e-20)
loss = -torch.log(one_minus_probs) * mask
loss = loss.sum()
此外蕴纳,基于訓(xùn)練的策略還有其他方式会油,如UL(unlikelihood
training)和SG(straight to gradient),論文鏈接可以參考第6小節(jié)古毛。
4.2 基于解碼策略
基于解碼策略包含諸多方法翻翩,如beam search, random search(topK, topP), 溫度, ngram等都许。
(1) 集束搜索(beamsearch)
針對貪心策略的改進,思想就是稍微放寬一些考察范圍嫂冻。即胶征,在每一個時間步,不再只保留當(dāng)前分?jǐn)?shù)最高的1個輸出(貪心策略)桨仿,而是保留num_beams個睛低,當(dāng)num_beams=1時,集束搜索就退化成了貪心搜索服傍。
(2) randomsearch(topK, topP)
topK即從概率最高的K個token中進行篩選钱雷,即允許其他高分tokens有機會被選中
topP將可能性之和不超過特定值的top tokens列入候選名單,topP通常設(shè)置較高的值吹零,目的是限制可能被采樣的低概率token的長尾
(3) 溫度T
較低的溫度意味著較少的隨機性罩抗,溫度為0將始終產(chǎn)生相同的輸出,較高的溫度意味著更多的隨機性灿椅,可以幫助模型給出更有創(chuàng)意的輸出套蒂。
基于解碼的策略墻裂建議直接查閱transformers框架中的實現(xiàn)方法,本qiang~切身體會茫蛹,閱讀源碼確實能愉悅身心~
5. 總結(jié)
一句話足矣~
本文主要展開解讀了LLM的復(fù)讀機問題操刀,并參考相關(guān)論文,給出基于訓(xùn)練策略和基于解碼策略的解決手段麻惶,相信客官們清楚該問題了馍刮。
靜待下一次的LLM知識點分享~
6. 參考
(1) DITTO:https://arxiv.org/pdf/2206.02369.pdf
(2) UL:https://arxiv.org/pdf/1908.04319v2.pdf
(3) SG:https://arxiv.org/pdf/2106.07207v1.pdf
(4) beam search:https://zhuanlan.zhihu.com/p/114669778
(5) random
search(topK, topP), 溫度: https://zhuanlan.zhihu.com/p/613428710