DeepSeek 系列模型詳解之 DeepSeek LLM
DeepSeek LLM發(fā)布于2024年1月,收集了2萬億個(gè)詞元用于預(yù)訓(xùn)練,在模型層面沿用了LLaMA的架構(gòu),并將余弦退火學(xué)習(xí)率調(diào)度器替換為多階段學(xué)習(xí)率調(diào)度器,便于持續(xù)訓(xùn)練。并從多種來源收集了超過100萬個(gè)實(shí)例進(jìn)行監(jiān)督微調(diào)(SFT)。此外,利用直接偏好優(yōu)化(DPO)技術(shù)進(jìn)一步提升模型的對(duì)話能力。
一、預(yù)訓(xùn)練
1. 數(shù)據(jù)
為了全面提升數(shù)據(jù)集的豐富性和多樣性,將數(shù)據(jù)構(gòu)建方法分為三個(gè)關(guān)鍵階段:去重、過濾和混洗。
(1) 去重階段
采用激進(jìn)的去重策略,擴(kuò)大去重范圍。分析表明,對(duì)整個(gè)Common Crawl語(yǔ)料庫(kù)進(jìn)行去重比單獨(dú)處理單個(gè)數(shù)據(jù)包更能有效去除重復(fù)實(shí)例。如表展示了在跨91個(gè)數(shù)據(jù)包進(jìn)行去重時(shí),消除的重復(fù)文檔數(shù)量是單個(gè)數(shù)據(jù)包方法的4倍。
各種Common Crawl數(shù)據(jù)包的去重比率
(2) 過濾階段
在過濾階段,專注于制定用于文檔質(zhì)量評(píng)估的穩(wěn)健標(biāo)準(zhǔn)。
(3) 混洗階段
調(diào)整策略以解決數(shù)據(jù)不平衡問題,側(cè)重于增加代表性不足領(lǐng)域的數(shù)據(jù)。
DeepSeek LLM基于分詞器庫(kù)(Huggingface)實(shí)現(xiàn)了字節(jié)級(jí)字節(jié)對(duì)編碼(BBPE)算法。與GPT-2類似,采用預(yù)分詞處理,以防止來自不同字符類別的(如換行符、標(biāo)點(diǎn)符號(hào)和中日韓(CJK)字符)合并。
此外,將數(shù)字拆分為單個(gè)數(shù)字,且將詞匯表中的常規(guī)標(biāo)記數(shù)量設(shè)定為100000。該分詞器在一個(gè)約24GB的多語(yǔ)言語(yǔ)料庫(kù)上進(jìn)行訓(xùn)練,并在最終詞匯表中增加了15個(gè)特殊詞元標(biāo)記,使得詞表總大小達(dá)到100015個(gè)。同時(shí),為確保訓(xùn)練期間的計(jì)算效率并為未來可能需要的額外特殊標(biāo)記預(yù)留空間,將模型的詞匯表大小配置為102400。
2. 架構(gòu)
(1) 微觀設(shè)計(jì)
DeepSeek LLM微觀設(shè)計(jì)主要沿用了LLama的設(shè)計(jì)思路,具體包括:
- 歸一化結(jié)構(gòu):采用Pre-Norm結(jié)構(gòu),使用RMSNorm歸一化函數(shù)。
- 激活函數(shù):在前饋網(wǎng)絡(luò)(FFN)中使用SwiGLU激活函數(shù),中間層維度為。
- 位置編碼:使用旋轉(zhuǎn)嵌入(RoPE)進(jìn)行位置編碼。
- 注意力機(jī)制:為優(yōu)化推理成本,67B模型采用分組查詢注意力機(jī)制(Grouped-Query Attention,GQA),而非傳統(tǒng)的多頭注意力(MHA)。
(2) 宏觀設(shè)計(jì)
在宏觀設(shè)計(jì)方面,DeepSeek LLM與大多數(shù)現(xiàn)有模型有所不同:
- 層數(shù)調(diào)整:70億參數(shù)的DeepSeek LLM是一個(gè)30 層的網(wǎng)絡(luò),670億參數(shù)的DeepSeek LLM有95層。這種層數(shù)調(diào)整不僅保持了與其他開源模型的參數(shù)一致性,還便于模型的流水線劃分,從而優(yōu)化訓(xùn)練和推理過程。
- 參數(shù)擴(kuò)展策略:選擇了增加網(wǎng)絡(luò)深度而不是拓寬FFN層的中間寬度來擴(kuò)展67B模型的參數(shù),以追求更好的性能。
詳細(xì)的網(wǎng)絡(luò)規(guī)格如表所示。
DeepSeek LLM系列模型的詳細(xì)規(guī)格
3. 超參數(shù)
DeepSeek LLM的初始化標(biāo)準(zhǔn)差為0.006,并使用AdamW優(yōu)化器進(jìn)行訓(xùn)練,具體超參數(shù)設(shè)置如下:
- 動(dòng)量參數(shù):
- 權(quán)重衰減:weight_decay = 0.1
- 梯度裁剪:訓(xùn)練階段的梯度裁剪值設(shè)為1.0
在預(yù)訓(xùn)練過程中,采用了多階段學(xué)習(xí)率調(diào)度器,而非傳統(tǒng)的余弦退火調(diào)度器。具體的學(xué)習(xí)率變化策略如下:
- 預(yù)熱階段:學(xué)習(xí)率在前2000個(gè)warmup steps后線性增加到最大值。
- 第一階段:處理完80%的訓(xùn)練詞元后,學(xué)習(xí)率降低到最大值的31.6%。
- 第二階段:處理完90%的訓(xùn)練詞元后,學(xué)習(xí)率進(jìn)一步降低到最大值的10%。
通過這種方式,多階段學(xué)習(xí)率調(diào)度器能夠在保持最終性能與余弦調(diào)度器一致的同時(shí),提供更方便的持續(xù)訓(xùn)練支持。如圖(a)所示,盡管訓(xùn)練損失曲線的趨勢(shì)有所不同,但最終性能基本一致。
調(diào)整不同階段的比例可以略微提升性能,如圖(b)所示。然而,為了平衡持續(xù)訓(xùn)練中的復(fù)用比例和模型性能,選擇了80%、10%和10%的三階段分布。
不同學(xué)習(xí)率調(diào)度器的訓(xùn)練損失曲線
此外,batch size和學(xué)習(xí)率會(huì)隨模型規(guī)模的不同而變化。具體可參見DeepSeek LLM系列模型的詳細(xì)規(guī)格表。
4. 基本框架
DeepSeek LLM使用的是高效且輕量級(jí)的訓(xùn)練框架HAI-LLM。該框架集成了數(shù)據(jù)并行、張量并行、序列并行和1F1B流水線并行技術(shù)。此外,還利用閃存注意力機(jī)制(Flash Attention)技術(shù)來提高硬件利用率。采用ZeRO-1方法在數(shù)據(jù)并行節(jié)點(diǎn)之間劃分優(yōu)化器狀態(tài)。
(1) 計(jì)算與通信優(yōu)化
為了最小化額外的等待開銷,采取了以下措施:
- 計(jì)算與通信重疊:包括最后一個(gè)微批次的反向傳播過程和ZeRO-1中的reduce-scatter操作,以及序列并行中的矩陣乘法(GEMM)計(jì)算和all-gather/reduce-scatter操作。
- 層/運(yùn)算符融合:通過融合LayerNorm、盡可能多的矩陣乘法運(yùn)算和Adam更新,加速訓(xùn)練過程。
- 精度優(yōu)化:模型以bf16精度進(jìn)行訓(xùn)練,但梯度累積以fp32精度進(jìn)行,以提高訓(xùn)練穩(wěn)定性。
- 交叉熵優(yōu)化:采用in-place交叉熵計(jì)算,減少GPU內(nèi)存消耗。具體來說,在交叉熵CUDA內(nèi)核中動(dòng)態(tài)地將bf16對(duì)數(shù)幾率(logits)轉(zhuǎn)換為fp32精度,并計(jì)算相應(yīng)的bf16梯度,覆蓋對(duì)數(shù)幾率(logits)以存儲(chǔ)其梯度。
(2) 模型保存與恢復(fù)
模型權(quán)重和優(yōu)化器狀態(tài)每5分鐘異步保存一次,這意味著即使在偶爾的硬件或網(wǎng)絡(luò)故障情況下,最多也只會(huì)丟失5分鐘的訓(xùn)練進(jìn)度。這些臨時(shí)模型檢查點(diǎn)會(huì)定期清理,以避免占用過多的存儲(chǔ)空間。并支持從不同的3D并行配置恢復(fù)訓(xùn)練,以應(yīng)對(duì)計(jì)算集群負(fù)載的動(dòng)態(tài)變化。
(3) 模型評(píng)估
在生成任務(wù)中,使用vLLM進(jìn)行評(píng)估;而在非生成任務(wù)中,采用連續(xù)批處理方法,以避免手動(dòng)調(diào)整批處理大小和減少token填充,從而提高評(píng)估效率。
二、Scalling lows
關(guān)于縮放定律(Scalling lows)的最早研究是在大模型出現(xiàn)之前的。研究表明,通過增加計(jì)算預(yù)算(C)、模型規(guī)模(N)和數(shù)據(jù)規(guī)模(D),可以提升模型性能。當(dāng)模型規(guī)模(N)由模型參數(shù)表示,數(shù)據(jù)規(guī)模(D)由詞元數(shù)量表示時(shí),計(jì)算預(yù)算(C)可以近似為。
為了減少實(shí)驗(yàn)成本和擬合難度,采用了Chinchilla中的IsoFLOP profile方法來擬合縮放曲線。為了更準(zhǔn)確地表示模型規(guī)模,使用了新的模型表示法——非嵌入FLOPs/token-M,取代了之前使用的模型參數(shù)(N),并將計(jì)算預(yù)算公式從改為更精確的
。實(shí)驗(yàn)結(jié)果提供了關(guān)于最優(yōu)模型/數(shù)據(jù)擴(kuò)展分配策略和性能預(yù)測(cè)的見解,并準(zhǔn)確預(yù)測(cè)了DeepSeek LLM 7B和67B模型的預(yù)期性能。
IsoFLOP曲線和最優(yōu)模型/數(shù)據(jù)分配
該研究在縮放定律方面的貢獻(xiàn)和發(fā)現(xiàn)可以總結(jié)如下:
- 建立了超參數(shù)的縮放定律,為確定最優(yōu)超參數(shù)提供了一個(gè)經(jīng)驗(yàn)框架。
- 采用非嵌入FLOPs (M) 表示模型規(guī)模,更準(zhǔn)確的最優(yōu)模型/數(shù)據(jù)擴(kuò)展分配策略和更好的大模型泛化損失預(yù)測(cè)。
- 提出預(yù)訓(xùn)練數(shù)據(jù)質(zhì)量影響最優(yōu)模型/數(shù)據(jù)擴(kuò)展分配策略,數(shù)據(jù)質(zhì)量越高,增加的計(jì)算預(yù)算應(yīng)更多地分配給模型擴(kuò)展。
- 證明了縮放定律的普遍適用性,并預(yù)測(cè)了未來更大規(guī)模模型的性能。
1. 超參數(shù)縮放定律
DeepSeek LLM 最初在計(jì)算預(yù)算的小規(guī)模實(shí)驗(yàn)中對(duì)批量大小和學(xué)習(xí)率進(jìn)行了網(wǎng)格搜索,針對(duì)特定模型規(guī)模(每詞元1.77億次浮點(diǎn)運(yùn)算)的實(shí)驗(yàn)結(jié)果如下圖所示。結(jié)果顯示,在廣泛的批量大小和學(xué)習(xí)率選擇范圍內(nèi),泛化誤差保持穩(wěn)定。這表明,可以在相對(duì)寬泛的參數(shù)空間內(nèi)實(shí)現(xiàn)接近最優(yōu)的性能。
利用上述多步學(xué)習(xí)率調(diào)度器,通過復(fù)用第一階段的訓(xùn)練成果,對(duì)多個(gè)具有不同批量大小、學(xué)習(xí)率以及計(jì)算預(yù)算(范圍從到
FLOPs的模型進(jìn)行了有效訓(xùn)練??紤]到參數(shù)空間中的冗余,將泛化誤差不超過最小值0.25%的模型視為近似最優(yōu)超參數(shù)。
隨后,擬合了批量大小B和學(xué)習(xí)率與計(jì)算預(yù)算C的關(guān)系。如下圖所示,隨著計(jì)算預(yù)算C的增加,最優(yōu)批量大小B逐漸增加,而最優(yōu)學(xué)習(xí)率
逐漸減小。這與模型擴(kuò)量時(shí)對(duì)批量大小和學(xué)習(xí)率的直觀經(jīng)驗(yàn)設(shè)置相符。此外,所有近似最優(yōu)超參數(shù)都落在一個(gè)較寬的區(qū)間內(nèi),表明在這個(gè)區(qū)間內(nèi)選擇近似最優(yōu)參數(shù)相對(duì)容易。
最終擬合出的批量大小和學(xué)習(xí)率公式如下:
DeepSeek LLM 在一系列計(jì)算預(yù)算為FLOPs的模型上驗(yàn)證了這些公式,特定模型規(guī)模(每詞元2.94億次浮點(diǎn)運(yùn)算)的驗(yàn)證結(jié)果如上圖 (b) 所示。結(jié)果顯示,擬合參數(shù)集中在最優(yōu)參數(shù)空間內(nèi)。
需要注意的是,目前的研究尚未考慮超出計(jì)算預(yù)算C的其他因素對(duì)最優(yōu)超參數(shù)的影響。這與一些早期研究成果不一致,后者認(rèn)為最優(yōu)批量大小可以建模為僅與泛化誤差L相關(guān)。此外,在計(jì)算預(yù)算相同但模型/數(shù)據(jù)分配不同的模型中,最優(yōu)參數(shù)空間存在細(xì)微差異。
2. 估算最優(yōu)模型和數(shù)據(jù)規(guī)模
在推導(dǎo)出擬合近似最優(yōu)超參數(shù)的公式后,開始擬合縮放曲線并分析最優(yōu)模型/數(shù)據(jù)擴(kuò)展分配策略。這一策略旨在找到分別滿足和
的模型擴(kuò)展指數(shù)a和數(shù)據(jù)擴(kuò)展指數(shù)b,其中數(shù)據(jù)規(guī)模D可以用數(shù)據(jù)集中的詞元數(shù)量來表示。
在早期的研究中,模型規(guī)模通常由模型參數(shù)表示,包括非嵌入?yún)?shù)和完整參數(shù)
,計(jì)算預(yù)算C與模型/數(shù)據(jù)規(guī)模之間的關(guān)系可以近似描述為
,即可以用
或
來近似模型規(guī)模。
然而,由于和
都沒有考慮注意力操作的計(jì)算開銷,并且
還包括了對(duì)模型容量貢獻(xiàn)較小的詞匯表計(jì)算,因此在某些設(shè)置下存在顯著的近似誤差。
為了減少這些誤差,引入了一種新的模型規(guī)模表示法:非嵌入層每詞元浮點(diǎn)運(yùn)算次數(shù)M, M包括了注意力操作的計(jì)算開銷,但不考慮詞表計(jì)算。使用M表示模型規(guī)模時(shí),計(jì)算預(yù)算C可以簡(jiǎn)單地表示為。、
和
的具體差異如下:
其中,表示層數(shù),
表示模型寬度,
是詞表大小,
是序列長(zhǎng)度。
如下表所示,在不同規(guī)模的模型上評(píng)估了這三種表示法的差異。
不同模型規(guī)模表示法的差異及非嵌入?yún)?shù)N1和完整參數(shù)N2相對(duì)于每詞元非嵌入M的差異
結(jié)果表明,和
在不同規(guī)模的模型中都會(huì)高估或低估計(jì)算成本,這種差異在小規(guī)模模型中尤為明顯,最大可達(dá)50%。這種不準(zhǔn)確性在擬合縮放曲線時(shí)會(huì)引入顯著的統(tǒng)計(jì)誤差。
采用M表示模型規(guī)模后,目標(biāo)可以清晰的描述為:給定計(jì)算預(yù)算,找到最小化模型泛化誤差的最佳模型規(guī)模
和數(shù)據(jù)規(guī)模
。這個(gè)目標(biāo)可以形式化為:
為了減少實(shí)驗(yàn)成本和擬合難度,采用Chinchilla模型的等浮點(diǎn)運(yùn)算量(IsoFLOP)配置方法來擬合縮放曲線。DeepSeek LLM選取了從到
的8個(gè)不同的計(jì)算預(yù)算,并為每個(gè)預(yù)算設(shè)計(jì)了大約10種不同的模型/數(shù)據(jù)規(guī)模分配方案。每個(gè)預(yù)算的超參數(shù)由擬合得到的批量大小和學(xué)習(xí)率公式確定,并在獨(dú)立驗(yàn)證集上計(jì)算泛化誤差,該驗(yàn)證集與訓(xùn)練集分布相似,包含1億個(gè)詞元。
上圖展示了IsoFLOP曲線和模型/數(shù)據(jù)縮放曲線,這些曲線是通過使用每個(gè)計(jì)算預(yù)算下的最優(yōu)模型/數(shù)據(jù)分配擬合得出的。最優(yōu)非嵌入層每詞元浮點(diǎn)運(yùn)算次數(shù)和
最優(yōu)詞元數(shù)量的公式如下:
此外,根據(jù)計(jì)算預(yù)算C和最優(yōu)泛化誤差擬合了損失縮放曲線,并預(yù)測(cè)了DeepSeek LLM 7B和67B模型的泛化誤差,如圖所示。結(jié)果顯示,利用小規(guī)模實(shí)驗(yàn)?zāi)軌驕?zhǔn)確預(yù)測(cè)計(jì)算預(yù)算為其1000倍的模型的性能。
三、對(duì)齊
為確保實(shí)際應(yīng)用的有用性和安全性,DeepSeek LLM收集了大約150萬條英文和中文的指令數(shù)據(jù)實(shí)例,涵蓋了廣泛的有益性和無害性話題。其中,有益數(shù)據(jù)包含120萬個(gè)實(shí)例,具體分布為:31.2%為一般語(yǔ)言任務(wù),46.6%為數(shù)學(xué)問題,22.2%為編程練習(xí)。安全數(shù)據(jù)則由30萬個(gè)實(shí)例組成,覆蓋了各種敏感話題。
對(duì)齊流程
DeepSeek LLM對(duì)齊流程分為兩個(gè)階段:監(jiān)督微調(diào)(Supervised Fine-Tuning, SFT)和直接偏好優(yōu)化(Direct Preference Optimization, DPO)。
(1) 監(jiān)督微調(diào)(SFT)
①訓(xùn)練設(shè)置:
- 對(duì)7B模型進(jìn)行4個(gè)epoch的微調(diào),對(duì)67B模型僅進(jìn)行2個(gè)epoch的微調(diào),因?yàn)橛^察到67B模型存在嚴(yán)重的過擬合問題。
- 7B和67B模型學(xué)習(xí)率分別為
和
。
- 微調(diào)過程中,不僅監(jiān)控基準(zhǔn)準(zhǔn)確度,還評(píng)估聊天模型的重復(fù)率。共收集了3868個(gè)中英文提示,并確定生成響應(yīng)未能終止而是無限重復(fù)文本序列的比例。
- 觀察到隨著數(shù)學(xué)SFT數(shù)據(jù)量的增加,重復(fù)率有上升趨勢(shì)。這可能是由于數(shù)學(xué)SFT數(shù)據(jù)中偶爾包含類似的推理模式,導(dǎo)致較弱的模型難以掌握這些模式,從而產(chǎn)生重復(fù)響應(yīng)。
②解決重復(fù)問題:
- 嘗試了兩階段微調(diào)和DPO方法,這兩種方法都能幾乎保持基準(zhǔn)分?jǐn)?shù)并顯著減少重復(fù)。
(2) 直接偏好優(yōu)化(DPO)
①訓(xùn)練設(shè)置:
- 為了進(jìn)一步增強(qiáng)模型的能力,使用了直接偏好優(yōu)化算法DPO,這是一種簡(jiǎn)單但有效的方法,用于LLM的對(duì)齊。
- 構(gòu)建了關(guān)于有益性和無害性的偏好數(shù)據(jù)。對(duì)于有益性數(shù)據(jù),收集了涵蓋創(chuàng)意寫作、問答、指令跟隨等類別的多語(yǔ)言提示,并使用DeepSeek Chat模型生成響應(yīng)候選。對(duì)于無害性偏好數(shù)據(jù),也采用了類似的操作。
- DPO訓(xùn)練了一個(gè)epoch,學(xué)習(xí)率為,批量大小為512,使用了學(xué)習(xí)率預(yù)熱和余弦學(xué)習(xí)率調(diào)度器。
②效果:
- DPO可以強(qiáng)化模型的開放式生成能力,同時(shí)在標(biāo)準(zhǔn)基準(zhǔn)性能上幾乎沒有差異。
參考:https://arxiv.org/abs/2401.02954