點網(wǎng)站出圖片怎么做網(wǎng)站開發(fā)培訓
所謂知識注入,其實不該脫離于LLM的基礎工作原理,然后空談抽象概念。
知識,也就是你問他問題,他能輸出正確的回答,這只是一個簡單的輸出token的過程。輸出得準了,就是知識,輸出不準了,你就說它是幻覺。什么是幻覺?不就是該輸出的token上,概率不大,導致的亂輸出。
所以,知識注入就是你要對一個query,自回歸輸出一個完全一致的answer。如果你愿意不考慮LLM的其他功能,就為了某一個QA對服務,你完全可以加訓個100個epoch,它必然就“記住”了。
知識注入根據(jù)知識的體量、復雜度、垂類程度不同,要基于增量預訓練、sft、也必須使用RLHF和DPO。
對于這么一個QA:XXX的生日是多少?1980年1月23日。sft的所有l(wèi)oss都是先拿到正確的前述token,然后計算當前token的loss。假設現(xiàn)在LLM訓練好了,對于query,后續(xù)token的概率都很高,除了”8“這個位置的概率幾乎為0,那么對于后面的“0年1月23日”,如果前面這個“8”LLM吐不出來,那么它們的高概率也就完全不頂用了,大概率是要出所謂的“幻覺”的,畢竟你現(xiàn)在的狀況和訓練時候完全不一樣嘛??蛇@種情況放sft里,loss很小。也就是說"8"這個數(shù)字在sft階段會訓練不完全。
(這里只是一個例子,實際上tokenizer大概率把1980這一整個數(shù)字綁定成一個token,或者是19和80。)
RLHF和DPO這類RL算法的訓練目標是,我當前這個token的reward和選定token后對未來value的期望要達到最高。如果出現(xiàn)8這個數(shù)字概率低的情況,且如果value函數(shù)正常工作,那么RL會知道,你必須給8的概率拉高,否則整個后續(xù)的reward期望會極低。RL和SFT的差距就在這里,RL要考慮當前對后續(xù)的影響,sft只要考慮當前這個token就好。
(RL的思想很好,但是"value函數(shù)正常工作"這個條件沒那么好保證,所以RL不穩(wěn)定。這是必須先sft后rl的原因。)
對于簡單的知識注入,例如“改變大模型的自我認知”,隨便給幾條認知相關的內容重復的簡單數(shù)據(jù),用lora訓個10個epoch,就能得到極好的效果。我基于qwen1.5-7b-chat嘗試sft注入1000條簡單的wiki的知識,lora rank=32,epoch=1,lr=3e-5。然后手動測試了幾條wiki數(shù)據(jù),發(fā)現(xiàn)關于數(shù)字的會有嚴重幻覺,例如“丹麥海峽的最長長度是多少“,不僅是我的模型,你百度去搜,百度ai給的結果也不對。關于醫(yī)學的會很差勁,因為過于復雜了,需要專業(yè)知識才能撐得起來我給的回答,我敢信我的醫(yī)學數(shù)據(jù)的每條answer的困惑度都極高,這使得LLM不可能僅憑一次訓練就扭轉輸出。但是簡單知識會記得很好,我讓他記住他是一根香蕉(簡單QA),他也記住了。最后測得c-eval評分還能維持69,比微調前的71不差多少。
對于復雜的知識注入,絕對不能寄希望于少量數(shù)據(jù)就完成訓練。這個復雜,既是指存在很多生詞和知識點,還是指知識體系的龐大,還是指answer很長。前兩個好理解,第三個其實就是前面說的"8"的問題,你answer一長,中間出錯的概率就高,就不容易續(xù)寫成功。
我們統(tǒng)稱符合上面特點的數(shù)據(jù)為“垂類數(shù)據(jù)”。
對于垂類數(shù)據(jù),你絕不能期望僅用finetune和簡單的lora就能成功。你的垂類數(shù)據(jù)和LLM的訓練數(shù)據(jù)可以說是分布完全不相似的兩組數(shù)據(jù),你無法通過簡單的lora微調就讓LLM從一個輸出分布就跳到另一個完全不同的分布上。走完預訓練+sft+rl基本是標配了。
預訓練的作用是解決“眼生”的問題,所謂獲取知識也就是這個,你希望“給個query返回一個answer”,這個answer的碎片就隱藏在預訓練的數(shù)據(jù)里。所以這里需要大量預訓練數(shù)據(jù)。
然后是sft。為什么不直接rl?因為rl存在不穩(wěn)定的問題,所以最好用sft先把底子打好。sft就是給了LLM一個輸入輸出的范式,“問哪個問題,就回答哪段話”。問題是問題的花樣可多了,要是大伙都一個問問題的方式,對我們來說就沒這么累了。有一批人專門干批量指令生成,就是為了得到“一個問題,多種表達”的數(shù)據(jù),以適應用戶的需求。sft階段,一定要盡量壓低loss,既然干了垂類模型,就千萬別考慮泛用性了,否則你就得重走一遍chatgpt的訓練路子,數(shù)據(jù)也得用人家量級的,區(qū)別就是你多了一份垂類數(shù)據(jù)。Gimini今年6月有個論文指出幻覺就是loss太大,你壓低就沒幻覺了,這從上面對"8"的討論也能看出來。所以,一定要對單知識點做多指令QA,既可以等價于多個epoch,又可以防止過擬合,并且知識量大就必須有海量數(shù)據(jù)支撐。
rl階段可以選rlhf和dpo,后者現(xiàn)在好像效果更好,但是還是得看實際數(shù)據(jù),所以兩種都要做。