1.1.1 最主流的開源模型?
ChatGLM-6B[1] prefix LM
LLaMA-7B[2] causal LM
1.1.2 prefix LM和causal LM的區別?
1.1.2.1 Prefix LM
Prefix LM,即前綴語言模型,該結構是Google的T5模型論文起的名字,望文知義來說,這個模型的”前綴”有些內容,但繼續向前追溯的話,微軟的UniLM已經提及到了。前綴指的是輸入序列中的一部分已知內容,通常用來為模型提供上下文信息,以便生成后續內容。具體來說,前綴就是模型在生成過程中已經處理的那一部分序列,為后續生成提供條件和指導。
Prefix LM其實是Encoder-Decoder模型的變體,為什么這樣說?解釋如下:
(1) 在標準的Encoder-Decoder模型中,Encoder和Decoder各自使用一個獨立的Transformer
( 2) 而在Prefix LM,Encoder和Decoder則共享了同一個Transformer結構,在Transformer內部通過Attention Mask機制來實現。
與標準Encoder-Decoder類似,Prefix LM在Encoder部分采用Auto Encoding (AE-自編碼)模式,即前綴序列中任意兩個token都相互可見。在自編碼過程中,模型學習到的隱藏表示保留了輸入數據中的主要特征。在這個過程中,模型需要訪問所有輸入數據,以便找到數據中的整體結構和相關性。因此,AE模式下的模型可以看到輸入數據中的所有內容。
在自然語言處理中,假設有一個前綴序列 X = [x1, x2, x3, ..., xn]
。在AE模式下,序列中的每個token(如x2
)可以訪問整個前綴 X
,即可以看到其他token的信息。這不同于自回歸模式中的單向性約束(只能看到前面的token),AE模式是雙向的。
而Decoder部分采用Auto Regressive (AR-自回歸)模式,即待生成的token可以看到Encoder側所有token(包括上下文)和Decoder側已經生成的token,但不能看未來尚未產生的token。
Prefix LM的AttentionMask機制(左)及流轉過程(右)
Prefix LM的代表模型有UniLM、T5、GLM(清華滴~)
1.1.2.1.1 Auto Enconding(AE-自編碼)
自編碼器(AutoEncoder)是一種無監督的模型結構,其用途廣泛,可用于特征提取,異常檢測,降噪等。
自編碼器的基本結構是編碼器encoder與解碼器decoder,其中編碼器對輸入的原始數據進行壓縮(降維),解碼器對壓縮后的數據進行重構,將壓縮數據還原為原始數據。整體其類似沙漏形狀。
自編碼器的編碼器encoder與解碼器decoder多用串聯的全連接層構成,如下圖:
-
其中黑色箭頭為構成編碼器encoder的全連接層,多個全連接層逐步將數據維度降低 到指定維度;紅色箭頭為構成解碼器decoder的全連接層,多個全連接層逐步將壓縮數據維度增加到 原始維度。一般來說編碼器與解碼器的結構是對稱的。
-
特別的,編碼器,解碼器內部的層不必為全連接層,卷積層或循環層也可以。
-
-
訓練中,該模型的輸入為原始數據。因為模型的功能是對輸入的數據進行壓縮與重構,所以期望的輸出應該和原始的輸入數據越接近越好。我們以兩者的差異為衡量的損失函數(差異可以使用binary交叉熵或者均方誤差等),進行模型內部參數的優化。
-
輸出是原始數據,模型的輸出結果也是與原始數據對比差異,全程只用到了原始數據本身,不需要額外的信息。
-
https://zhuanlan.zhihu.com/p/625085766 代碼實例鏈接
1.1.2.1.2 Auto Regressive(AR-自回歸)
1.1.2.2 Causal LM
Causal LM是因果語言模型,目前流行的大多數模型都是這種結構,別無他因,因為GPT系列模型內部結構就是它,還有開源界的LLaMa也是。
Causal LM只涉及到Encoder-Decoder中的Decoder部分,采用Auto Regressive模式,直白地說,就是根據歷史的token來預測下一個token,也是在Attention Mask這里做的手腳。
CausalLM的Attention Mask機制(左)及流轉過程(右)
1.1.2.3 結論
attention mask不同,前者的prefix部分的token互相能看到,后者嚴格遵守只有后面的token才能看到前面的token的規則。
1.1.3 哪種架構是主流?
GPT系列就是Causal LM,目前除了T5和GLM,其他大模型基本上都是Causal LM。
1.1.4 說一下LLM常見的問題?
出現復讀機問題。比如:ABCABCABC不斷循環輸出到max length。
對于這種現象我有一個直觀的解釋(猜想):prompt部分通常很長,在生成文本時可以近似看作不變,那么條件概率 P(B|A)也不變,一直是最大的。
固定的 Prompt 和最大條件概率:生成內容的過程中,大語言模型通常會保持給定的 prompt 和上下文不變。這意味著在生成每個新 token 時,模型會基于一個不變的歷史內容進行預測。這時候,條件概率 P(B∣A)就傾向于穩定在某種模式下。例如,模型生成了一個短句 ABC,而模型預測下一部分最有可能是同樣的 ABC 時,它就可能陷入這種循環,生成 ABCABCABC。
生成內容的高概率反饋循環:由于模型的目標是最大化生成內容的概率,它自然會傾向于在「看起來高概率的句子模式」中停留,尤其是在 prompt 固定且上下文信息較少的情況下。簡單來說,重復的句子和結構成為了“高概率”選擇,使得模型不斷選擇生成同樣的內容。這可以類比為「陷入一個局部最優解」——模型在 ABCABC 的重復中找到了最高的概率分布,便難以跳脫出來。
生成重復內容,是語言模型本身的一個弱點,無論是否微調,都有可能出現。并且,理論上良好的指令微調能夠緩解大語言模型生成重復內容的問題。但是因為指令微調策略的問題,在實踐中經常出現指令微調后復讀機問題加重的情況。
另外,可能出現重復用戶問題的情況,原因未知。
1.1.5 如何緩解復讀機問題
1.1.5.1 do_sample
:啟用隨機采樣
-
作用:在常規解碼中,模型通常會選擇概率最高的下一個 token(greedy search),這可能導致高頻短語的重復。
do_sample=True
則允許模型隨機從多個可能的 token 中選擇,使生成更具多樣性。 -
影響:在啟用
do_sample
后,模型不再只選取最高概率的 token,而是通過引入隨機性選擇下一個 token,這可以打破不斷循環的高概率模式。這樣,生成的內容不再嚴格依賴于每一步的最高概率,使得模型可以探索更廣泛的輸出空間。 -
潛在問題:采樣過度可能會導致內容的連貫性下降,生成的文本變得不相關。因此,
do_sample
通常需要配合其他參數(例如temperature
和top-k
)進行細致的調節,以保證內容的質量。
1.1.5.2. temperature
:溫度系數
-
作用:
temperature
控制采樣的「隨機性」。當temperature=1.0
時,模型按照默認概率分布進行采樣;temperature<1.0
時,概率分布變得更尖銳,模型更傾向于選取高概率的 token;而temperature>1.0
會使分布變得更平緩,使得低概率的 token 也有較高的可能被選中。 -
實踐應用
-
當復讀問題嚴重時,可以適當提高
temperature
,例如調至 1.2 或 1.5,使模型不再過于“保守”地生成高概率短語。 -
如果
temperature
設得太高(如 >2),會引入極端隨機性,使文本變得混亂,生成的內容缺乏連貫性和邏輯。 -
推薦的設置范圍:在 1.0 至 1.5 之間微調,既可以提升生成的多樣性,又保持一定的邏輯。
-
1.1.5.3. repetition_penalty
:重復懲罰
-
作用:
repetition_penalty
用來在解碼過程中對已經生成的詞或短語施加懲罰,以降低重復生成的概率。例如,repetition_penalty=1.2
時,模型會對每個重復出現的詞或短語施加 1.2 倍的懲罰,減少它們再次被選中的可能性。 -
設置過大時的副作用:如果懲罰設置過大(例如 >2),模型會過度避免任何形式的重復,包括詞語的自然重復和標點符號的使用,導致生成的內容缺乏基本的語言結構。例如,“.” 和 “,” 等標點符號可能無法正常出現,使句子結構混亂。
-
合理設置:通常建議在 1.1 到 1.5 之間設定
repetition_penalty
,在保持一定懲罰的同時不影響自然語言的流暢度。
1.1.5.4. 組合使用 do_sample
、temperature
和 repetition_penalty
在實際應用中,這些參數往往要結合使用,以達到較好的效果。以下是一些常用的組合技巧:
-
解決復讀問題的常用組合
-
啟用
do_sample
,將temperature
設置為 1.2 左右,增加隨機性,同時將repetition_penalty
設置在 1.1-1.3 范圍內,適度懲罰重復短語。
-
-
過度隨機性問題的解決:如果發現
do_sample
使生成內容變得過于隨機,降低temperature
到 1.0 左右,或者將repetition_penalty
調低,減少對低概率詞的過度采樣。
這種組合方法通常會在減少復讀現象的同時,維持生成內容的連貫性和自然性。
1.1.6 llama 輸入句子長度理論上可以無限長嗎?
以 LLaMA 為代表的許多現代大語言模型,采用了 相對位置編碼(ROPE),理論上可以處理無限長度的序列。這種編碼方式不固定于某一個具體位置,而是根據每個 token 相對于其他 token 的距離來計算,這使得模型在結構上沒有長度限制。因此,模型確實在構架上可以生成極長的文本。
但問題在于:大多數模型的訓練數據通常包含長度不超過一定范圍(比如 2K 或 4K tokens)的序列。如果訓練過程中很少看到長于這個范圍的文本,模型在推理時生成超過訓練長度的文本效果就會明顯下降。這種情況類似于模型在“沒有見過的情境”下工作,即 缺乏“長度外推性”。
1.1.6.1 RoPE
1.1.6.1.1. 關于RoPE
RoPE(Rotary Position Embedding),是蘇劍林大神在2021年就提出的一種Transformer模型的位置編碼。RoPE是一種可以以絕對位置編碼形式實現的相對位置編碼,兼顧了模型性能和效率。
2023年上半年的時候,大模型位置編碼尚有Alibi和RoPE在相互比拼,而到了2023年下半年,及今2024年,新開源出來的模型,大部分都是使用RoPE了。當然Alibi也有其優勢,這個在講Alibi的時候來說。
蘇神在他的個人網站科學空間中對RoPE有相關文章進行了介紹,本篇是在這個基礎上,對RoPE進行理解(公式和符號上也會沿用蘇神的寫法)。
1.1.6.1.2. 以絕對位置編碼的方式實現相對位置編碼
前面提到,RoPE是一種一絕對位置編碼的方式實現的相對位置編碼,那么這么做能帶來什么收益?
先說原因:
在文本長度不長的情況下(比如Bert時代基本都是256/512token的長度),相對位置編碼和絕對位置編碼在使用效果上可以說沒有顯著差別。 如果要處理更大長度的輸入輸出,使用絕對位置編碼就需要把訓練數據也加長到推理所需長度,否則對于沒訓練過的長度(訓練時沒見過的位置編碼),效果多少會打些折扣。 而使用相對位置編碼則更容易外推,畢竟token-2和token-1的距離,與token-10002和token-10001的距離是一樣的,也因此可以緩解對巨量長文本數據的需求。 但是傳統相對位置編碼的實現相對復雜,有些也會有計算效率低的問題。由于修改了self-attention的計算方式,也比較難推廣到線性注意力計算法模型中。 總結來說,就是絕對位置編碼好實現,效率高,適用線性注意力,而相對位置編碼易外推,因此就有了對“絕對位置編碼的方式實現相對位置編碼”的追求,去把二者的優點結合起來。