大模型解惑

學習以下文章:

如何理解大模型中的參數?

大模型可以看作是數據轉換問題,即輸入\(X\)序列,輸出\(Y\)序列,其中\(Y = WX\),這裏的W矩陣就可以看作大模型必不可少的參數。

大模型中的“大”也可以指參數非常大(多),多大千億、萬億等。

什麼是transformer?

正如上述舉例,大模型可以看作是數據轉換問題,Transformer的本質是一種序列到序列(seq2seq)的機器學習模型的架構,即將序列\(X\)轉換爲\(Y\)的一種機器學習模型架構。例如,將A語言翻譯爲B語言的過程;ChatGPT中將人提問的文字序列轉換爲機器回答的文字序列的過程。

Embedding

對信息的向量化表示,可以將自然語言轉換爲機器可以理解的信息,具體就是把給定的序列轉換爲矩陣或n維向量,方便機器計算、能保留原有語義、可以表示相似度,能實現多模態轉換(圖片、本文、視頻等格式都可以轉爲矩陣)。

Embedding,給大模型裝上了嘴巴、眼睛和耳朵,可以採集大量數據,轉換爲向量/矩陣給大模型。

自注意力機制

Self Attention,作用是將序列信息中各個元素之間隱含的內在關聯進行顯性化表徵的一種編碼技術。例如要翻譯一句話,這裏的內在關聯是指一句話中詞的位置、語義、語法等會影響翻譯結果的因素。

例如,翻譯:怪獸沒有穿過街道,因爲它太累了”,對機器來說,這裏的“它”,難以理解,是指怪獸,還是街道?如何才能理解呢?通過自注意力機制可以讓機器知道“它”和“怪獸”之間Attention(關聯性),要比“它”和“街道”的Attention大得多,這樣機器就知道“它”表示的是怪獸了。

多頭注意力機制

Multi-Head Self Attention,就是多個維度的自注意力機制,每個維度只關注一方面的內在關聯,比如上面例子中,詞的位置信息、語義信息、語法信息等都是一種維度。

在原論文中,指出多頭注意力機制有8個頭,即可以從8個方面去考慮,最終將8個頭的結果連在一起,進行統一編碼即可。

Multi-Head Self Attention, 相當於是“術業有專攻”,讓每一個頭的Self Attention機制都聚焦於一個特定維度的隱含內在關聯,最後再把多個頭的結果彙總進行編碼,這樣得到的結果,比大一統的同時關注多個維度得到的結果,效果要更好。

簡單理解Transformer流程?

整體上看,有兩部分:Encoder(編碼器)和Decoder(解碼器)。

邏輯上看,Transformer就是把一個輸入序列\(X\),先通過Encoder,轉換成中間序列\(Z\);然後再通過Decoder,將\(Z\)轉換成輸出序列\(Y\)的過程,其中\(Z\)是經過編碼後的序列,即把\(X\)中各元素之間銀行的內在關聯都顯性化表徵出來的向量化表示(做了多頭注意力機制)。

image-20231123171330498

  • 編碼器

image-20231123165458785

  • 解碼器

image-20231123165748151

Prompt Engineering的方式是一種相對來說容易上手的使用大模型的方式

我理解的prompt,就是給引導模型去思考,包括問題描述,解決辦法,輸出格式等。例如在prompt中提到要求分步思考,效果會不加這句話要好,還有一些關於prompt的優化技巧:

  • COT(思維鏈),就是在prompt中加入一些實示例,來引導大模型更好的推理,但這種方法有侷限性(參數足夠多時,通常是1000億參數量);
  • seft-consistency(自一致性技術),在COT的基礎上,讓LLM不止生成唯一結果,而是利用LLM結果的多樣性,生成多種不同推理路徑的結果集合,從結果集合中投票選擇,選出最佳的即爲最終答案;
  • least-to-most(從易到難):針對在使用COT時,給出示例是簡單問題,而提問的問題確實很難得,這時效果就不如人意了,Ltm核心思想是把複雜問題拆解成一系列的簡單問題,通過解決一系列簡單問題,來最終得到複雜問題得結果。

還有一些重要參數:

  • 溫度(Temperature):介於0-1之間,用於控制模型輸出的多樣性,當爲0時,模型輸出最可能的答案;當爲1時,模型輸出更多樣化,但可能不會很精準。例如,溫度爲 0:可能會輸出“蘋果是一種水果”,溫度爲 1:可能會輸出“蘋果是一種多汁、美味的水果,常用於製作各種美食”。
  • Top-K:一個整數,用於限制模型在生成每個單詞時考慮的候選單詞的數量。例如,如果 Top_K 設置爲 50,模型在生成下一個單詞時只會考慮概率最高的前 50 個選項。和溫度參數效果很像,當Top-k小時,模型輸出會更加一致和精準,當Top-k大時,模型輸出可能會更加多樣,準確率低。

prompt工程可以看作是通過對話的方式去訓練模型,輸出你想要的結果(這不也是一種“微調”麼?哈哈)。例如以下對話:

  • 第一個問題,確定韓立身份,這是正確的,也是我想要的結果。

image-20231123094721494

image-20231123094738323

  • 第二個問題,通過人工干預,“知識注入”的方式強行“帶偏”,這或許就是prompt工程吧。

image-20231123094837137

image-20231123094903896

image-20231123094928709

image-20231123095044788

如何理解和區分Prompt Engineering/Prompt Tuning/Fine Tuning?

(1) 我們輸入給大模型的是Prompt,大模型返回給我們的是Completion;

(2) Prompt在輸入給大模型之前的優化,是屬於Prompt Engineering的範疇;

(3) Prompt在輸入給大模型之後,在開始進行Transformer的Encoder處理之前的優化,是屬於Prompt Tuning的範疇;

(4) Prompt在進入Transformer之後,在Encoder或者Decoder階段做的優化,是屬於Fine Tuning的範疇。

訓練、推理、微調?

  • 訓練數據(訓練)

    • 預訓練(大量數據/參數)

    • 微調(少量數據/參數)

  • 測試數據(推理)

強化學習?

大模型和人類認知對齊(Reinforcement Learning with Human Feedback, RLHF),核心就是反饋 。

大致工作原理是:

(1) 用戶提供Prompt給大模型,大模型生成Completion給用戶;

(2) 用戶對大模型生成的Completion進行評價打分(Rate)

(3) 系統拿着<Prompt, Completion, Rate>這樣的數據,再去大模型進行微調

(4) 最終大模型就會越來越傾向於生成人類打分高的內容,因爲RLHF的核心就是通過打分來引導機器向打分高的方向進化。

量化?

佈署大模型也有一定的挑戰,因爲大模型確實夠大,佈署起來的最大的挑戰,就是對硬件的要求也非常高。

所以,通常爲了在儘量不影響大模型表現的情況,我們通常還會去做一些壓縮和優化,讓大模型對硬件的要求不要那麼高,這樣整體的使用成本也會更低一些。

量化(Quantization)是一種在保證模型效果基本不降低的前提下,通過降低參數的精度,來減少模型對於計算資源的需求的方法。

大致原理是:

(1)大模型這樣的機器學習模型,參數/數據最終存在在文件中的,就是一堆的數字(矩陣)

(2)如果原來大模型中的參數是用4個字節的數字存儲的,那我們可以把它的精度降低一些,用1個字節來存,這樣就能很大程度上降低對於內存的需求。

例如下面就是百川2對齊版和對齊量化版:

image-20231123184348638

爲何要微調?

prompt 工程效果不好(prompt長度和推理成本呈正相關),通過自由數據,進行微調(Fine Tuning),提升大模型在特定領域的能力,總結一下有兩點意義:

  • 可以增強特定領域的專業能力。
  • 相比於訓練來說微調成本相對較低。

如何微調?

根據訓練數據來源,訓練方式看,大模型的微調有以下技術路線:

  • 監督式微調SFT(Supervised Fine Tuning),採用人工標註的數據,用傳統機器學習中的監督學習方法,對大模型進行微調。
  • 基於人類反饋的強化學習微調RLHF(Reinforcement Learning with Human Feedback),把人類的反饋,通過強化學習,引入到對大模型的微調中,使其輸出更符合人類期望。
  • 基於AI反饋的強化學習微調RLAIF(Reinforcement Learning with AI Feedback),原理和RLAIF相似,但反饋來源是AI,使其反饋效率提升。

根據參數規模,大致分爲兩種常用技術路線:

  • 全量微調FFT(Full Fine Tuning),即對全量的參數,進行全量的訓練。

原理就是用特定的數據,對大模型進行訓練,將\(W\)變成\(W’\),其中\(W’\)\(W\)相比,優點是大模型的推理能力在上述特定數據領域表現會好很多,但也會帶來兩個問題:

(1)訓練成本高,微調的參數和預訓練差不多。

(2)災難性遺忘(Catastrophic Forgetting),即把之前表現好的別的領域的能力變差(遺忘)。

  • 高效參數微調PEFT(Parameter-Efficient Fine Tuning),即只對部分的參數進行訓練。PEFT則可以解決FFT的兩個問題,也是目前主流的微調方案,例如:

    • Prompt Tuning

    思想是基座模型(Foundation Model)的參數不變下,爲每個特定任務,訓練一個少量參數的小模型,在具體執行特定任務的時候按需調用。原理是在輸入序列X之前,增加一些特定長度的特殊Token,以增大生成期望序列的概率,即Prompt Tuning發生在Embedding環節,往輸入序列X前面加特定的Token

    具體來說,就是將\(X = [x1, x2, ..., xm]\)變成,\(X' = [x'1, x'2, ..., x'k; x1, x2, ..., xm], Y = WX'\)

    如果將大模型比做一個函數:\(Y=f(X)\),那麼Prompt Tuning就是在保證函數本身不變的前提下,在\(X\)前面加上了一些特定的內容,而這些內容可以影響\(X\)生成期望中\(Y\)的概率。

    • Prefix Tuning

    思想上述很像,即在不改變大模型的前提下,在Prompt上下文中添加適當的條件,可以引導大模型有更加出色的表現。

    Prefix Tuning是在Transformer的Encoder和Decoder的網絡中都加了一些特定的前綴,具體來說,就是將\(Y=WX\)中的\(W\),變成\(W' = [Wp; W],Y=W'X\)

    • LoRA

    大模型參數很多,但並不是所有的參數都是發揮同樣作用的,其中一部分參數,是非常重要的,是影響大模型生成結果的關鍵參數,這部分關鍵參數就是低維的本質模型。LoRA的基本思路,包括以下幾步:

    (1)首先,要適配特定的下游任務,要訓練一個特定的模型,將\(Y=WX\)變成\(Y=(W+∆W)X\),這裏面\(∆W\)主是我們要微調得到的結果;

    (2)其次,將\(∆W\)進行低維分解$∆W=AB \(,其中\)∆W\(爲\)m * n\(維,\)A\(爲\)m * r\(維,\)B\(爲\)r * n\(維,\)r$就是上述假設中的低維);

    (3)接下來,用特定的訓練數據,訓練出\(A\)\(B\)即可得到\(∆W\),在推理的過程中直接將\(∆W\)加到\(W\)上去,再沒有額外的成本。

    • QLoRA

    量化的核心目標是降成本,降訓練成本,特別是降後期的推理成本。QLoRA就是量化版的LoRA,它是在LoRA的基礎上,進行了進一步的量化,將原本用16bit表示的參數,降爲用4bit來表示,可以在保證模型效果的同時,極大地降低成本。例如,對於65B的LLaMA 的微調要780GB的GPU內存,而用了QLoRA之後,只需要48GB。

微調就是調整參數,進而找到最佳性能,主要參數有:

  • 學習率(LR):參數更新的幅度大小,一般設置的比較小。

  • 訓練輪數:模型訓練的總輪數,全量數據訓練一次爲一輪。

  • 批處理大小(batch size):單次輸入模型的數據量,會受顯存大小限制。

  • 斷點名稱:保存訓練模型的文件夾名稱。

手動微調參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章