自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺談—領(lǐng)域模型訓(xùn)練

發(fā)布于 2024-8-7 15:10
瀏覽
0收藏

今天給大家?guī)碇鹾糜袬ybq一篇關(guān)于如何進(jìn)行領(lǐng)域模型訓(xùn)練的文章,主要內(nèi)容是對 post-pretrain 階段進(jìn)行分析,后續(xù)的 Alignment 階段就先不提了,注意好老生常談的“數(shù)據(jù)質(zhì)量”和“數(shù)據(jù)多樣性”即可。

原文:https://zhuanlan.zhihu.com/p/711537210
Qwen2:https://arxiv.org/abs/2407.10671
MiniCPM:https://shengdinghu.notion.site/MiniCPM-c805a17c5c8046398914e47f0542095a
Llama3.1:https://arxiv.org/abs/2407.21783
  • 什么是領(lǐng)域模型?
  • 領(lǐng)域模型為什么需要專門做 post-pretrain 訓(xùn)練,alignment 階段不夠嗎?

簡單來說,領(lǐng)域模型 / 專家模型 就是在某一個(gè)專業(yè)領(lǐng)域性能特別好的模型,可能包括法律、醫(yī)學(xué)、教育、role-play 等等。一般來說,領(lǐng)域模型比較重要的環(huán)節(jié)是 RAG,我們需要有一個(gè)特別高精的檢索庫,來輔助模型做一些專業(yè)的回答。這也就是說,做好 sft 和 ppo 似乎就可以了?

其實(shí),這么想也基本正確,因?yàn)榇蟛糠诸I(lǐng)域模型所處理的任務(wù)場景,80% 都是模型的通用能力能 cover 的。以法律大模型為例,“判斷是否是法律問題、總結(jié)律師發(fā)言重點(diǎn)、提取法官判決結(jié)果等等?” 類似的問題基本任何一個(gè)開源模型 + 幾百條 sft 語料都能做的不錯(cuò)。

然而,領(lǐng)域模型的要求的準(zhǔn)確率是遠(yuǎn)遠(yuǎn)大于 80% 的,而剩下的那 20% case 恰恰又是 sft 無論如何也做不好的。

“張三犯搶劫罪,張三買了蘋果,張三殺了個(gè)人,張三睡覺,張三挪用公款,……,張三尋釁滋事李四。” 請概括張三觸犯的法條?

以上面這個(gè) case 為例,我們的通用模型大概率是會把“尋釁滋事”當(dāng)做一個(gè)動作來看待,而不會把它視為一個(gè)違法行為,進(jìn)而導(dǎo)致概括錯(cuò)誤。可如果連這種簡單 case 都調(diào)用 RAG 的話,那么顯然成本高的有些過分了,何況這種情況還很難檢索準(zhǔn)確。

因此,post-pretrain 的目的便是讓模型盡可能的去認(rèn)識這個(gè)領(lǐng)域的專有名詞,知道某些詞匯就是這個(gè)領(lǐng)域的專有名詞,進(jìn)而讓 attention 給到這些 token 一些更大的權(quán)重。法律模型需要見過所有的法律法規(guī)、醫(yī)學(xué)模型需要見過所有的癥狀和藥品名詞,以此類推。

然而,大量的 paper 已經(jīng)證明:續(xù)訓(xùn)模型的過程,大概率是“學(xué)了新的,忘了舊的”的過程。這也就是說,你提高模型在領(lǐng)域知識上的認(rèn)知能力的同時(shí),往往它也在丟失通用能力。前面也說了,我們有 80% 的場景時(shí)需要通用能力來覆蓋的。因此,我們更加靠譜的目標(biāo)是:在 post-train 階段學(xué)習(xí)領(lǐng)域知識的同時(shí),盡最大可能去避免模型的通用能力損失。(貪不了一點(diǎn),大模型有太多的工作需要 trade-off)

Post-Train

如果你的 base_model 是自己訓(xùn)的,那后面不用看了。使用退火前的 checkpoint,沿用 pretrain 階段的訓(xùn)練數(shù)據(jù),使用類似于“91開”的數(shù)據(jù)配比去混合領(lǐng)域數(shù)據(jù)續(xù)訓(xùn),訓(xùn)完再退火,然后這個(gè)工作就完成了!

pretrain 知識回顧

emm,還往下讀,應(yīng)該都是沒有自己 model 的同學(xué)了,咱們繼續(xù)探討!

pretrain 最重要的幾個(gè)東西:數(shù)據(jù),學(xué)習(xí)率,優(yōu)化器!

  • 數(shù)據(jù)就不多說了,質(zhì)量為王,記得去重!
  • 學(xué)習(xí)率:模型的更新幅度,size越大的模型,特征空間越大、表達(dá)能力和學(xué)習(xí)能力越強(qiáng),因此學(xué)習(xí)率也應(yīng)該小一點(diǎn)(做個(gè)假設(shè),模型 size 無限大,有無數(shù)的神經(jīng)元,那么它完全可以啟用沒用到的神經(jīng)元來學(xué)習(xí)新知識,這樣就避免了遺忘舊知識這個(gè)現(xiàn)象的發(fā)生)。
  • 優(yōu)化器:Adam 的基礎(chǔ)知識我就不談了,這里只強(qiáng)調(diào)一點(diǎn),模型的優(yōu)化方向是“歷史動量”和“當(dāng)前數(shù)據(jù) grad”共同決定的。也就是說,不管當(dāng)前數(shù)據(jù)多 bad,優(yōu)化器都會限制你做出太大幅度的更新,梯度裁剪/梯度正則類似。因此,基本可以認(rèn)為我們的模型具有一定的抗噪能力。

目前,大家基本都默認(rèn)使用如下三個(gè)步驟進(jìn)行 pretrain:

  • warmup:在訓(xùn)練過程中,將學(xué)習(xí)率慢慢提高。(可以這么理解,你的模型還沒有積攢足夠的動量去抗噪,太大的學(xué)習(xí)率容易造成不可逆的影響)
  • linear / constant / cosine decay:維持穩(wěn)定的學(xué)習(xí)率,或者緩慢衰減的學(xué)習(xí)率。
  • Anneal:用小學(xué)習(xí)率去學(xué)高精數(shù)據(jù),IFT數(shù)據(jù),邏輯數(shù)據(jù),去提高通用邏輯能力能力和打榜能力。

(Llama3.1和面壁的MiniCPM都明確提出了退火階段帶來的能力提升)

淺談—領(lǐng)域模型訓(xùn)練-AI.x社區(qū)

Llama3.1退火結(jié)論

淺談—領(lǐng)域模型訓(xùn)練-AI.x社區(qū)

MiniCPM退火結(jié)論

post-pretrain 數(shù)據(jù)儲備

基礎(chǔ)知識我們回顧完了,現(xiàn)在開始準(zhǔn)備數(shù)據(jù)。說句丑話,如果你沒有領(lǐng)域模型的高精數(shù)據(jù),也沒打算去爬數(shù)據(jù)和洗數(shù)據(jù),那神仙難救,個(gè)人建議換個(gè)方向去研究 。

好,我們已經(jīng)有了領(lǐng)域高精數(shù)據(jù)。那 common 數(shù)據(jù)和數(shù)據(jù)配比怎么搞呢?

先說數(shù)據(jù)質(zhì)量,post-pretrain 不用那么精細(xì),我們的目標(biāo)是通用能力不下降,而不是通用能力大幅度提升。Qwen2 的技術(shù)報(bào)告明確指出,訓(xùn)了 12T 數(shù)據(jù)的模型與訓(xùn)了 7T 數(shù)據(jù)的模型,基本沒有提升。也就說,額外的 5T 數(shù)據(jù)僅僅是因?yàn)橘|(zhì)量稍有下降(論文里說卡的閾值更?。?,就沒有帶來任何收益。

我們大概率拿不到比 Qwen2、Llama3 的 pretrain 階段質(zhì)量更好的數(shù)據(jù),因此我個(gè)人覺著不要太執(zhí)著于做一份特別干凈的 pretrain 數(shù)據(jù)了,你怎么洗數(shù)據(jù)都很難帶來明顯收益。

再說數(shù)據(jù)配比,Llama3 和面壁智能明確給出了他們的數(shù)據(jù)配比,基本就是一個(gè)結(jié)論:代碼很重要,英文很重要(即使是中文模型也應(yīng)該保證英文語料的比例,有些 paper 認(rèn)為模型的 general knowledge 基本來自于英文語料,中文更多的是對齊作用)。

這里給出不權(quán)威的個(gè)人建議:中英五五開,代碼不能少,領(lǐng)域占比看算力。(根據(jù)個(gè)人需求和個(gè)人喜好,可以提高英文比例,如果有質(zhì)量較好的 math 數(shù)據(jù)或邏輯數(shù)據(jù),也添加一些)

淺談—領(lǐng)域模型訓(xùn)練-AI.x社區(qū)

面壁智能數(shù)據(jù)配比

淺談—領(lǐng)域模型訓(xùn)練-AI.x社區(qū)

Llama3數(shù)據(jù)配比


實(shí)驗(yàn)細(xì)節(jié)

Channel loss

就一句話:做 domain post-pretrain 不看 channel loss,你不如別開 tensorboard。

你就算隨機(jī)拉一個(gè)數(shù)據(jù)集過來訓(xùn),大概率也是 loss 緩慢下降的現(xiàn)象,你能得到啥信息呢?你難道要等訓(xùn)了一周,才去做實(shí)驗(yàn)驗(yàn)證數(shù)據(jù)配比和學(xué)習(xí)率配置嗎?

channel loss:不同數(shù)據(jù) channel 各自的 loss。也就是說假設(shè) 1 個(gè) batch 有 100 條數(shù)據(jù):40條 en,30 條 cn, 20條 code, 10 條 domain,那么就繪制四條不同 channel 的 loss 曲線和一條總的 total loss 曲線。

(題外話,我本來以為 channel_loss 需要在 dataloader 側(cè)做很復(fù)雜的操作才能實(shí)現(xiàn),后來經(jīng)大佬同事指點(diǎn),發(fā)現(xiàn)只要給每條數(shù)據(jù)加一個(gè) channel 字段,再通過 all_gather_object 去通訊下就行,代碼如下)

channel_loss = {}
for step, batch in enumerate(train_dataloader):
    batch = to_device(batch, device)
    channel = batch['channel'][0]
    
    del batch['channel']
    outputs = model(**batch)
    loss = outputs.loss

    # Update channel loss
    if channel in channel_loss:
        channel_loss[channel][0] += loss.item()
        channel_loss[channel][1] += 1
    else:
        channel_loss[channel] = [loss.item(), 1]

    all_channel_loss = [None for _ in range(world_size)]
    torch.distributed.all_gather_object(all_channel_loss, channel_loss)

    merged_channel_loss = {}
    for lst in all_channel_loss:
        for k, v in lst.items():
            if k in merged_channel_loss:
                merged_channel_loss[k][0] += v[0]
                merged_channel_loss[k][1] += v[1]
            else:
                merged_channel_loss[k] = [v[0], v[1]]

    for k,v in merged_channel_loss.items():
        avg_loss = v[0] / v[1] if v[1] != 0 else 0.0
        print_rank_0("The Channel {} loss is {}".format(k, avg_loss), args.global_rank)

        # Log channel loss to TensorBoard
        if dist.get_rank() == 0:
            writer.add_scalar(f'Loss/channel_{k}', avg_loss, epoch * num_batches + step)

    channel_loss = {}

Loss 分析

前面提到過,pretrain 階段有 warmup,那么 post-pretrain 當(dāng)然也要有了,原因也很簡單啊。我們用的開源模型并沒有提供給我們 checkpoint 對應(yīng)的“優(yōu)化器參數(shù)”,我們無法獲得以前積攢的動量啊。

continue pretrain:https://arxiv.org/pdf/2406.01375

這篇論文討論了“post-pretrain 模型時(shí),warmup 應(yīng)該使用的數(shù)據(jù)比例”。同時(shí)它也指出,warmup 在訓(xùn)練充分的時(shí)候是不太重要的。但因?yàn)槲覀儫o法判斷模型是不是訓(xùn)練充分了,所以還是老老實(shí)實(shí)的做個(gè) warmup 吧。

warmup 比例

敲定 warmup 的數(shù)據(jù)比例后,選擇一個(gè)順眼的學(xué)習(xí)率和數(shù)據(jù)配比,就去開始訓(xùn)練和觀察 channel loss 吧,在最理想情況下,我們期待得到一個(gè)這樣的曲線:

  • domain_channel 的 loss 明顯下降(新知識好學(xué))
  • common_channel 的 loss 基本持平,極緩慢下降(理論上會選用作為底座的 model,通用能力已經(jīng)很強(qiáng)了,這時(shí)候很難再讓他的通用能力再進(jìn)步一提升了,上文提到過 Qwen2 多訓(xùn)了 5T 通用數(shù)據(jù)但毫無收益)

結(jié)合 loss 曲線,我們再回過頭來談?wù)剶?shù)據(jù)配比:post-pretrain 階段最好的數(shù)據(jù)配比,就是沿用 pretrain 階段的數(shù)據(jù)配比,很可惜,我們不可能獲取到 Qwen、Llama 的 pretrain數(shù)據(jù)。因此,我們也別糾結(jié)數(shù)據(jù)去重了,大概率我們使用的 common 數(shù)據(jù)是人家已經(jīng)訓(xùn)過的,我們盡可能去找質(zhì)量最高的 common 數(shù)據(jù)喂給模型就可以了。

不過從 channel loss 上,我們大概率能觀察和反推一些東西:

  • 初始 loss 低:任務(wù)簡單,或者模型已經(jīng)訓(xùn)過這份數(shù)據(jù)。如果你使用的底座模型效果巨強(qiáng),比如是 Qwen2-72B,Llama3-70B,你甚至可以斷言這個(gè)數(shù)據(jù)的質(zhì)量很高(能力差的小模型不能隨便下定論)。當(dāng)然,loss 低也有可能存在一種情況,那就是數(shù)據(jù)十分的臟,全都是重復(fù) token 或者 固定 pattern;
  • 初始 loss 高:好現(xiàn)象,說明模型沒有見過這個(gè)數(shù)據(jù)。但也有數(shù)據(jù)質(zhì)量很差的風(fēng)險(xiǎn),最好再清洗下這個(gè)數(shù)據(jù)源;
  • loss 持平或緩慢下降:好現(xiàn)象,沒有比這更好的現(xiàn)象了,基本就是我們蒙對了底座模型 pretrain 階段使用的數(shù)據(jù)配比才會有的現(xiàn)象;
  • loss 快速下降:說明這個(gè)數(shù)據(jù)很容易學(xué)習(xí),有可能是 domain 數(shù)據(jù)的特點(diǎn)比較顯著,也有可能是數(shù)據(jù)比較臟,都是固定 pattern 或者具有明顯的格式(提一句,Llama 說任何 markdown 數(shù)據(jù)都對模型性能有損失,所以有明顯格式的數(shù)據(jù)要慎重使用);
  • common channel loss 下降明顯:你的 common 數(shù)據(jù)顯然不夠 common,它相對模型來說有可能更像是 domain 數(shù)據(jù),說明當(dāng)前數(shù)據(jù)配比和 pretrain 的配比偏離有點(diǎn)遠(yuǎn);
  • domain channel loss 下降明顯:好事,鼓掌歡呼;
  • domain channel loss 不下降:初始 loss 低說明模型大概率已經(jīng)訓(xùn)過這份 domain 數(shù)據(jù)了,初始 loss 高還不下降,可能是數(shù)據(jù)不夠干凈,也可能是數(shù)據(jù)比較難學(xué),再多訓(xùn)會吧;
  • loss 上升:和導(dǎo)師或領(lǐng)導(dǎo)匯報(bào)就說學(xué)習(xí)率設(shè)置的不合適,自己私下再順帶 check 一下訓(xùn)練代碼;

綜上,通過觀察 loss,多做幾組實(shí)驗(yàn),基本能試探出哪個(gè)數(shù)據(jù)配比和哪個(gè)開源數(shù)據(jù)最適合拿來 post-pretrain。

Scaling law

真的勇士,就應(yīng)該去研究 sacling law,這也就是除了Llama、Qwen,我還特別推崇“面壁MiniCPM”的原因,它似乎是國內(nèi)唯一一家不執(zhí)著于size,而是執(zhí)著于“sacaling law”的公司。

這篇 domain scaling law 的論文明確指出“domain能力“和”general 能力“是相互沖突的,也就回歸到了我一開始說的:我們的目標(biāo)不是提高通用能力,而是去損失盡量少的通用能力。

D-CPT:https://arxiv.org/pdf/2406.01375

淺談—領(lǐng)域模型訓(xùn)練-AI.x社區(qū)

D-CPT

這篇論文的結(jié)論都是比較 make sense 的:

  • 小學(xué)習(xí)率,domain 學(xué)得快,通用忘得慢;
  • 大學(xué)習(xí)率,domain 學(xué)得快,但到一定地步后就震蕩,畢竟學(xué)習(xí)能力有限;
  • 不同 size 的模型適合不同的學(xué)習(xí)率。

文章再多的內(nèi)容我就不談了,感興趣的讀者自己拜讀一下即可,scaling law 的文章都相對晦澀一些,我還沒有完全讀懂,不敢班門弄斧。我引用這篇 sacaling law 論文的主要原因是,一是謳歌一下做 scaling law 的大佬們,二是想表達(dá)“學(xué)習(xí)率真的很重要”這一觀點(diǎn),不要因?yàn)榇蠹叶荚趶?qiáng)調(diào)數(shù)據(jù)質(zhì)量的重要性,就忽略了煉丹的老本行。

這里引用我的大佬同事跟我說過的一句話:“你把學(xué)習(xí)率設(shè)成 0 ,那是不是模型怎么訓(xùn)效果都不下降。那根據(jù)夾逼準(zhǔn)則,你只要找到一個(gè)好學(xué)習(xí)率,你數(shù)據(jù)再爛也能訓(xùn)出一個(gè)通用能力只下降一丟丟的模型?!?/p>

退火

退火本身怎么做,我就不多說了,小學(xué)習(xí)率 + 高精數(shù)據(jù)?;久恳粋€(gè)開源模型的技術(shù)報(bào)告,都會詳細(xì)指出自己的退火數(shù)據(jù)配比。

我在這里提到退火,是想強(qiáng)調(diào)幾個(gè)觀點(diǎn):

  • 退火直接能提高刷榜能力!
  • 我們 post-pretrain 的模型,都是做過退火的,也就是說這個(gè)模型就像是剛高考完的高三學(xué)生,考試能力是人生巔峰!現(xiàn)在不管教他什么知識,他的考試能力都會下降。
  • 你怎么訓(xùn),模型的打榜能力基本都會下降,所以大家不要太過焦慮這個(gè)現(xiàn)象。但做 post-pretrain 之前,一定要構(gòu)建好 domain 能力的評估集,證明自己的 domain 能力在提升。要不然 common 也降、domain 也降,是錢多閑得慌嗎?

本文轉(zhuǎn)載自 ??NLP工作站??,作者: ybq

收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦