大模型 VS 小模型
首先,我們思考一個(gè)問(wèn)題,為什么 qwen2 基本上是當(dāng)下最受歡迎的開源模型?說(shuō)實(shí)話,相比于 deepseek、llama、minicpm 這些誠(chéng)意滿滿的技術(shù)報(bào)告,qwen2 的技術(shù)報(bào)告稍顯一些“小家子氣”,并沒(méi)有提及到關(guān)鍵的技術(shù)細(xì)節(jié)。然而,qwen2 提供給開源社區(qū)的“全家桶”套餐,又是多長(zhǎng)的技術(shù)報(bào)告也比不上的。對(duì) llm 的研究者來(lái)說(shuō),用相同 tokenizer,相同的 7T pretrain_data 得到的“一簇小 llm”,其研究?jī)r(jià)值遠(yuǎn)遠(yuǎn)超過(guò) Qwen2-72B 本身!
知乎: https://zhuanlan.zhihu.com/p/714399961
接下來(lái),我們帶著兩個(gè)基本概念進(jìn)入正文:
- 同源小模型:同 tokenizer,同訓(xùn)練數(shù)據(jù)下得到的 size 較小的llm
- 小模型:重點(diǎn)在于“小”,推理快或者本身就是分類模型,怎么訓(xùn)的完全無(wú)所謂。較小 size 的 llm,BERT,RoBERTa,Xgboost,LR 等等都可以稱作小模型
同源小模型是大模型的實(shí)驗(yàn)場(chǎng)
scaling law 告訴我們:小模型的性能表現(xiàn)能用來(lái)預(yù)測(cè)大模型的性能表現(xiàn)。這也就是說(shuō),大部分情況下,我們是可以通過(guò)在同源小模型上做實(shí)驗(yàn),去預(yù)測(cè)大模型的效果的。
在 pretrain / post_pretrain 階段有很多需要做實(shí)驗(yàn)才能知道答案的問(wèn)題。怎么樣的數(shù)據(jù)配比最合理,課程學(xué)習(xí)中哪種學(xué)習(xí)順序效果最好,數(shù)據(jù)的質(zhì)量是否過(guò)關(guān),數(shù)據(jù)的去重程度是否過(guò)關(guān),先訓(xùn)4k、再擴(kuò)到 32k 和直接訓(xùn) 32k 的效果差異,post_pretrain 的時(shí)候怎樣調(diào)整學(xué)習(xí)率和數(shù)據(jù)分布來(lái)防止模型斷崖式的能力遺忘?……
直接啟動(dòng)大模型的成本實(shí)在是在太高昂了,可能訓(xùn)練兩三周,loss 曲線才會(huì)表現(xiàn)出一點(diǎn)點(diǎn)差異。但我們完全可以在小模型上大膽的訓(xùn),每天訓(xùn) 100B token,兩天就能出一版實(shí)驗(yàn)結(jié)果。觀察 tensorbord 的 loss 曲線,刷 benchmark 打榜,或是做 sft 看效果,總之小模型可以幫助我們快速地敲定 pretrain 階段使用的數(shù)據(jù)配置。
在 alignment 階段,我們也可以去借助小模型和 scaling law 來(lái)指導(dǎo)工作。
我要強(qiáng)化模型的某個(gè)能力,準(zhǔn)備了 N 條訓(xùn)練數(shù)據(jù),能讓模型達(dá)到多大的提升呢?可以看看這份數(shù)據(jù)在小模型上能有大提升,繪制一條曲線,去預(yù)估大模型的性能表現(xiàn)。說(shuō)的再通俗一點(diǎn),100B token 能讓 0.5B 模型下降 0.2 loss,能讓 72B 模型下降 0.1 loss, alignment 數(shù)據(jù)能讓 0.5B 模型提高 x% 的 task 能力,那么大概率這份數(shù)據(jù)也只能讓 72B 模型提升 0.5x % 的 task 能力。
- 已知:Qwen2-0.5B + few shot
- 已知:Qwen2-0.5B + SFT + zero_shot
- 已知:Qwen2-1.5B + few shot
- 已知:Qwen2-1.5B + SFT + zero_shot
- ……
- 已知:Qwen2-72B + few shot
- 預(yù)測(cè):Qwen2-72B + SFT + zero_shot
但其實(shí),在 alignment 階段,小模型的實(shí)驗(yàn)指導(dǎo)意義并不是特別強(qiáng),畢竟小模型的最大優(yōu)勢(shì)在于訓(xùn)得快,做實(shí)驗(yàn)快。由于 alignment 的數(shù)據(jù)量不大,我們往往可以直接對(duì)目標(biāo)大模型進(jìn)行訓(xùn)練來(lái)驗(yàn)證結(jié)果。這里的指導(dǎo)意義,往往是在我們需要大量數(shù)據(jù)去強(qiáng)化模型某個(gè)能力時(shí)才顯得有意義,比如代碼強(qiáng)化、創(chuàng)作能力增強(qiáng)。
在這里,額外需要強(qiáng)調(diào)兩個(gè)點(diǎn):
- 小模型需要使用較大的學(xué)習(xí)率,而大模型學(xué)習(xí)能力強(qiáng)、特征空間稀疏,往往需要使用較小的學(xué)習(xí)率;
- 強(qiáng)如 meta,據(jù)說(shuō)也訓(xùn)崩了千億級(jí)別參數(shù)的 MOE 模型。換句話說(shuō),MOE 的 scaling law 可能還不成熟,或者是 MOE 缺少一個(gè)像 llama 一樣的能穩(wěn)定訓(xùn)練的標(biāo)準(zhǔn)結(jié)構(gòu),其在小模型上的優(yōu)異表現(xiàn)可能無(wú)法復(fù)現(xiàn)在大模型上。
大模型是同源小模型的良師
首先,大模型的效果就是同源小模型不可達(dá)到的 ceiling,這點(diǎn)毋庸置疑。(實(shí)際工作中,知道模型效果的上限,是一件非常有意義的事情)。
除此之外,大模型可以在訓(xùn)練中給到同源小模型極大的幫助。
模型蒸餾
“distill”是 BERT 時(shí)代非常火的一個(gè)技術(shù)方案,現(xiàn)在卻提及的不太多了,歸根到底就是蒸餾對(duì)“同源 tokenizer”的要求太硬了。不過(guò)同源小模型沒(méi)有這個(gè)顧慮,蒸餾技術(shù)就像是為同源小模型的效果強(qiáng)化量身定制的技術(shù)方案一樣。
先澄清一個(gè)概念,目前的大部分論文都把“利用 GPT4 造數(shù)據(jù),喂給小模型去訓(xùn)練“叫做蒸餾,這種叫法也沒(méi)錯(cuò),不過(guò)更準(zhǔn)確的叫法應(yīng)該是”知識(shí)蒸餾“:讓小模型去學(xué)習(xí)大模型的知識(shí)能力。而傳統(tǒng)的“模型蒸餾”,指的是我們不再讓模型學(xué)習(xí) hard-label,而是 soft-label:
- hard_label:“臺(tái)灣屬于”,在預(yù)測(cè)下一個(gè) token 的時(shí)候,“中國(guó)”的概率是 1,其他所有 token 的概率是 0;
- soft_label:“臺(tái)灣屬于”,在預(yù)測(cè)下一個(gè) token 的時(shí)候,“中國(guó)”的概率是 0.3,“中華”的概率是 0.2,“大陸”的概率是 0.1……
不管從哪個(gè)角度考慮,似乎 soft_label 都是蘊(yùn)含更多信息量可學(xué)習(xí)的。因此,利用大模型去“模型蒸餾”小模型,很有可能能得到一個(gè)能力遠(yuǎn)高于同等 size 的小模型,Google 的 Gemma 小模型 就應(yīng)用了這項(xiàng)技術(shù)方案。
(模型蒸餾之所以在 llm 方向做的少,其實(shí)還是因?yàn)榈貌粌斒В鋵?duì)算力和存儲(chǔ)的需求較大,與模型的效果提升不成正比。畢竟正常訓(xùn)練學(xué)的是 seq_len 個(gè) one_hot label,蒸餾學(xué)的是 seq_len * vocab_size 的 logits,一個(gè)比較現(xiàn)實(shí)的方案是做 clip,只取最大的 N 個(gè) token logits 標(biāo)簽進(jìn)行學(xué)習(xí),其他 token 的概率依然視為 0)
reward_model
用大模型來(lái)充當(dāng)小模型的 reward_model,目前是一個(gè)很流行的做法,而用同源大模型去做 reward_model 則更是一個(gè)錦上添花的方案。
與蒸餾不同,蒸餾看中的是兩個(gè)模型“tokenizer 同源”,reward_model 看中的則是兩個(gè)模型“pretrain 數(shù)據(jù)同源”。也就是說(shuō),我們的 reward_model 和 policy_model 具有同等的知識(shí)量,兩個(gè)模型的學(xué)習(xí)成績(jī)雖然不一樣,但它們上過(guò)的的課程卻是一樣的。reward_model 會(huì)的知識(shí),就是 policy_model 學(xué)過(guò)的知識(shí):“我學(xué)過(guò)并且我掌握了,你學(xué)過(guò)但你沒(méi)掌握,所以我給你打低分就是合理的?!?/p>
雖然在實(shí)際工作中,一個(gè)同源 reward_model 可能沒(méi)有 GPT4 這種“天才 reward_model ”帶來(lái)的效果更好。但其往往能給出更公允的打分,進(jìn)而避免過(guò)多的幻覺產(chǎn)生。這也是 alignment 的一大痛點(diǎn),模型到底是訓(xùn)過(guò)擬合了才答錯(cuò)這個(gè)知識(shí),還是壓根就沒(méi)學(xué)過(guò)這個(gè)知識(shí) —— 交給同源大模型來(lái)判斷。
大模型背后的無(wú)數(shù)小模型
OK,同源模型的意義我們就談到這里,后面我們開始談?wù)嬲摹靶 蹦P停?strong>一個(gè)優(yōu)秀的大模型,無(wú)論是在訓(xùn)練階段,還是線上部署階段,其背后默默付出的小模型都數(shù)不勝數(shù)。
數(shù)據(jù)質(zhì)量分類器:llama3 和 qwen2 都提到了,他們的 pretrain 訓(xùn)練數(shù)據(jù)是有得分的,然后通過(guò)閾值來(lái)找出最高質(zhì)量的訓(xùn)練數(shù)據(jù),開源 pretrain 數(shù)據(jù)集 fineweb 也提到了他們給數(shù)據(jù)打分的工作。Good data makes good model performance!李沐大佬在他的視頻里說(shuō)到,llama3 的數(shù)據(jù)打分器是 RoBERTa,這很合理,效果又好、推理又快的分類模型確實(shí)還要看 BERT 家族。
數(shù)據(jù) domain 分類器:垂直領(lǐng)域模型的 post_pretrain 工作,往往需要非常精準(zhǔn)的數(shù)據(jù)配比,domain 數(shù)據(jù)的數(shù)據(jù)質(zhì)量也需要非常優(yōu)質(zhì)。這也就是說(shuō),我們需要一個(gè)分類器,去提取海量數(shù)據(jù)中的 domain 數(shù)據(jù),這個(gè)分類器最好還能把低質(zhì)量的 domain 數(shù)據(jù)也視為非 domain 數(shù)據(jù),通常承擔(dān)這個(gè)工作的模型也是 BERT 家族。
線上模型的分類器:眾所周知,RAG 模塊已經(jīng)是 llm 的標(biāo)配,我們總不能讓模型自己判斷該不該做檢索吧?雖然不是不行,但是額外生成“是否RAG”這些 token 會(huì)降低系統(tǒng)的響應(yīng)速度,并且可能降低模型的通用能力(模型學(xué)的越多,忘的也越多)。因此,線上模型往往都是前置掛一個(gè)小模型,來(lái)判別是否需要 RAG,同理也需要判別是否觸發(fā) safety,是否觸發(fā)工具鏈等。
RAG 模型:這個(gè)模型更是重量級(jí),也就是咱們傳統(tǒng)的信息檢索模型,如何從海量 docs 里面選出最相關(guān)的 doc。BGE 是這個(gè)工作較為常用的模型。
數(shù)據(jù)生產(chǎn)模型:
- “小模型 + SFT > GPT4 + zero_shot ”幾乎是數(shù)據(jù)生產(chǎn)階段最常用的公式了。我們?cè)跀?shù)據(jù)生產(chǎn)階段往往面臨幾個(gè)困境,GPT4 并不是百分之百按照我們指定的格式進(jìn)行輸出(復(fù)雜指令任務(wù)尤為明顯),GPT4 真的很貴,特別是在生產(chǎn)多輪對(duì)話數(shù)據(jù)的時(shí)候。這種情況下,最好的方案就是用一個(gè)小模型去學(xué)目標(biāo) task 的高精數(shù)據(jù),讓這個(gè)小模型過(guò)擬合,進(jìn)而變成一個(gè)標(biāo)準(zhǔn)的 task 數(shù)據(jù)生產(chǎn)器;
- 以 role_play 任務(wù)為例,很多場(chǎng)景是需要人不斷和 GPT4 聊天來(lái)生產(chǎn)高質(zhì)量的對(duì)話數(shù)據(jù)的,我們的模型做不到 GPT4 那樣能準(zhǔn)確拿捏角色性格的程度,但扮演一個(gè)“多事兒的用戶”還是綽綽有余的。訓(xùn)一個(gè)聊天模型,讓它和 GPT4 聊天來(lái)自動(dòng)化大量生產(chǎn)數(shù)據(jù)。
這里,我再分享一些個(gè)人使用小模型時(shí)的 trick:
學(xué)會(huì)變通,生成模型也可以當(dāng)判別模型使用。簡(jiǎn)單來(lái)說(shuō),如果我們懶得去找一份 BERT 代碼去訓(xùn)一個(gè)分類器,我們也可以直接訓(xùn)一個(gè) Qwen2-0.5B,讓它只會(huì)輸出 0 和 1,當(dāng)我們的模型完全過(guò)擬合到 0 和 1 的時(shí)候,那么所有 token 中便只有 0 和 1 有概率,其他 token 的概率幾乎為零。此時(shí),我們用 1 所對(duì)應(yīng)的 token_probability,不就是分類器的打分嗎?當(dāng)然,更優(yōu)雅的做法是把 pretrain_model 的 lm_head 替換成 reward_model 的 lm_head。
另外,一個(gè)優(yōu)秀的大模型,無(wú)論是在訓(xùn)練階段,還是線上部署階段,其背后默默付出的小模型都數(shù)不勝數(shù)。。這句話怎么說(shuō)呢,是我在訓(xùn) domain 分類器的時(shí)候,發(fā)現(xiàn) Qwen2-1.5B 的準(zhǔn)確率和召回率都不如 Qwen2-0.5B 高。在一番討論和實(shí)驗(yàn)分析之后,我認(rèn)可了大佬同事的觀點(diǎn):模型越大,其學(xué)習(xí)能力越強(qiáng),但也意味著其更容易過(guò)擬合。
傳統(tǒng)機(jī)器學(xué)習(xí)模型做的事情都是特征抽取,去從輸入的特征中提取出看不到的特征,像 xgboost 這種還會(huì)計(jì)算每個(gè)特征的重要程度。但由于 llm 的參數(shù)量足夠大,再加上 decoder_only 的結(jié)構(gòu),它真的可以做到記住所有的輸入特征(decoder_only 是一個(gè)純信息檢索結(jié)構(gòu),它不壓縮任何 token 信息,和 BERT 的 CLS 位壓縮信息完全是兩種做法)。
因此,較大的模型雖然上限更高,但其所依賴的數(shù)據(jù)質(zhì)量也更高,如果你的訓(xùn)練數(shù)據(jù)是有失偏頗的,分布不均衡的,它完全可以記住這些數(shù)據(jù)的 pattern,而不是從這些 pattern 中抽取共同特征。我的 0.5B 模型效果好于 1.5B 模型大概率就是這種情況:我使用了 4 個(gè)數(shù)據(jù)源作為訓(xùn)練集,但測(cè)試集來(lái)自于 10 個(gè)數(shù)據(jù)源。
寫在最后
誠(chéng)然,大模型的出現(xiàn),解決了困擾 nlp 多年的指代消解、多輪理解、對(duì)話人設(shè)等瓶頸,但小模型的信息壓縮、特征抽取等依然是非常有意義的。我們?cè)诠ぷ髦?,還是應(yīng)該多考慮一下能不能用小模型來(lái)解決問(wèn)題,找找我們的老朋友 BERT,而不是二話不說(shuō)就打開 GPT4 寫 prompt。
