成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談—領域模型訓練

發布于 2024-8-7 15:10
瀏覽
0收藏

今天給大家帶來知乎好友@ybq一篇關于如何進行領域模型訓練的文章,主要內容是對 post-pretrain 階段進行分析,后續的 Alignment 階段就先不提了,注意好老生常談的“數據質量”和“數據多樣性”即可。

原文: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
  • 什么是領域模型?
  • 領域模型為什么需要專門做 post-pretrain 訓練,alignment 階段不夠嗎?

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

其實,這么想也基本正確,因為大部分領域模型所處理的任務場景,80% 都是模型的通用能力能 cover 的。以法律大模型為例,“判斷是否是法律問題、總結律師發言重點、提取法官判決結果等等?” 類似的問題基本任何一個開源模型 + 幾百條 sft 語料都能做的不錯。

然而,領域模型的要求的準確率是遠遠大于 80% 的,而剩下的那 20% case 恰恰又是 sft 無論如何也做不好的。

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

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

因此,post-pretrain 的目的便是讓模型盡可能的去認識這個領域的專有名詞,知道某些詞匯就是這個領域的專有名詞,進而讓 attention 給到這些 token 一些更大的權重。法律模型需要見過所有的法律法規、醫學模型需要見過所有的癥狀和藥品名詞,以此類推。

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

Post-Train

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

pretrain 知識回顧

emm,還往下讀,應該都是沒有自己 model 的同學了,咱們繼續探討!

pretrain 最重要的幾個東西:數據,學習率,優化器!

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

目前,大家基本都默認使用如下三個步驟進行 pretrain:

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

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

淺談—領域模型訓練-AI.x社區

Llama3.1退火結論

淺談—領域模型訓練-AI.x社區

MiniCPM退火結論

post-pretrain 數據儲備

基礎知識我們回顧完了,現在開始準備數據。說句丑話,如果你沒有領域模型的高精數據,也沒打算去爬數據和洗數據,那神仙難救,個人建議換個方向去研究 。

好,我們已經有了領域高精數據。那 common 數據和數據配比怎么搞呢?

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

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

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

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

淺談—領域模型訓練-AI.x社區

面壁智能數據配比

淺談—領域模型訓練-AI.x社區

Llama3數據配比


實驗細節

Channel loss

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

你就算隨機拉一個數據集過來訓,大概率也是 loss 緩慢下降的現象,你能得到啥信息呢?你難道要等訓了一周,才去做實驗驗證數據配比和學習率配置嗎?

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

(題外話,我本來以為 channel_loss 需要在 dataloader 側做很復雜的操作才能實現,后來經大佬同事指點,發現只要給每條數據加一個 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 當然也要有了,原因也很簡單啊。我們用的開源模型并沒有提供給我們 checkpoint 對應的“優化器參數”,我們無法獲得以前積攢的動量啊。

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

這篇論文討論了“post-pretrain 模型時,warmup 應該使用的數據比例”。同時它也指出,warmup 在訓練充分的時候是不太重要的。但因為我們無法判斷模型是不是訓練充分了,所以還是老老實實的做個 warmup 吧。

warmup 比例

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

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

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

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

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

綜上,通過觀察 loss,多做幾組實驗,基本能試探出哪個數據配比和哪個開源數據最適合拿來 post-pretrain。

Scaling law

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

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

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

淺談—領域模型訓練-AI.x社區

D-CPT

這篇論文的結論都是比較 make sense 的:

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

文章再多的內容我就不談了,感興趣的讀者自己拜讀一下即可,scaling law 的文章都相對晦澀一些,我還沒有完全讀懂,不敢班門弄斧。我引用這篇 sacaling law 論文的主要原因是,一是謳歌一下做 scaling law 的大佬們,二是想表達“學習率真的很重要”這一觀點,不要因為大家都在強調數據質量的重要性,就忽略了煉丹的老本行。

這里引用我的大佬同事跟我說過的一句話:“你把學習率設成 0 ,那是不是模型怎么訓效果都不下降。那根據夾逼準則,你只要找到一個好學習率,你數據再爛也能訓出一個通用能力只下降一丟丟的模型。”

退火

退火本身怎么做,我就不多說了,小學習率 + 高精數據。基本每一個開源模型的技術報告,都會詳細指出自己的退火數據配比。

我在這里提到退火,是想強調幾個觀點:

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

本文轉載自 ??NLP工作站??,作者: ybq

收藏
回復
舉報
回復
相關推薦
主站蜘蛛池模板: 精品亚洲一区二区三区 | 亚洲精品久久久久久久不卡四虎 | 红桃视频一区二区三区免费 | 国产这里只有精品 | 久久99精品久久久久久狂牛 | 91在线电影 | 国产精品三级久久久久久电影 | 国产精品久久久久国产a级 欧美日韩国产免费 | cao在线 | 国产精品久久久亚洲 | 91传媒在线观看 | 久久久久久久一区 | av先锋资源 | 奇米av | 性欧美hd | 国产成人免费在线 | 国产高清免费视频 | 日韩成人国产 | 欧美一区二区三区视频在线 | 少妇久久久| 国产亚洲人成a在线v网站 | 日韩久久久久久久 | 美女黄18岁以下禁止观看 | 亚洲美女在线视频 | 亚洲网站在线观看 | 希岛爱理在线 | 亚洲精品视频在线看 | 99久久免费精品国产男女高不卡 | 久久久久国产成人精品亚洲午夜 | 国产精品国产三级国产aⅴ入口 | 久久久久久久久久久久久91 | 性欧美hd | 中文字幕免费中文 | 国产一区二区在线免费观看 | 国产中文字幕在线观看 | 精品国产91乱码一区二区三区 | 91久久精 | 国产第一页在线观看 | 狠狠干美女| 中文字幕精品一区久久久久 | 久久伦理电影 |