DeepSeek簡明解析,10分鐘速通DeepSeekV1~V3核心技術(shù)點(diǎn)!
最近,DeepSeek在國際上很火,一方面其效果比肩非開源模型ChatGPT,另一方面其運(yùn)行成本很低。可以說,DeepSeek是目前為止最先進(jìn)的大模型之一。
今天這篇文章,就帶大家梳理一下從2024年至今DeepSeek發(fā)布的V1版本到V3版本的核心技術(shù)點(diǎn),看看DeepSeek采用了哪些技術(shù)構(gòu)建了最先進(jìn)的大模型,每一次的升級基本都伴隨著訓(xùn)練數(shù)據(jù)的優(yōu)化、模型結(jié)構(gòu)的升級、優(yōu)化方式的更新。
為了方便大家閱讀,本文會用比較簡潔的語言進(jìn)行主要技術(shù)的介紹,一些其他相關(guān)的技術(shù)細(xì)節(jié)深度解析,后續(xù)也會陸續(xù)進(jìn)行更新。
1.DeepSeek V1
DeepSeek V1是2024年1月份發(fā)布的第一版DeepSeek模型,包含DeepSeek的核心構(gòu)建方式,核心技術(shù)點(diǎn)分為數(shù)據(jù)端、模型端、優(yōu)化端、對齊4個部分,前面3個部分處于模型的預(yù)訓(xùn)練階段,對齊階段使用SFT進(jìn)行人類風(fēng)格對齊。
數(shù)據(jù)端:在數(shù)據(jù)的處理上,包括去重、過濾、混合3個步驟,目的是構(gòu)建一個多樣性強(qiáng)、純凈的高質(zhì)量預(yù)訓(xùn)練數(shù)據(jù)。在去重階段,對于Common Crawl數(shù)據(jù)集進(jìn)行全局的去重過濾,可以提升去重比例。在過濾階段,構(gòu)建了一套詳細(xì)的包括文法語法分析在內(nèi)的評估流程,去除低質(zhì)量數(shù)據(jù)。在混合階段,對不同domain的數(shù)據(jù)進(jìn)行采樣,平衡不同domain數(shù)據(jù)量,讓數(shù)據(jù)量較少的domain也能有足夠的樣本占比,提升數(shù)據(jù)集多樣性和全面性。
此外,在數(shù)據(jù)處理方面,使用Byte-level Byte-Pair Encoding (BBPE)作為tokenizer,相比BPE是在字符粒度進(jìn)行字符串分割,BBPE在字節(jié)粒度進(jìn)行處理,整體算法邏輯和BPE類似。
整體參與預(yù)訓(xùn)練的token數(shù)量為2 trillion。在V2和V3中,訓(xùn)練的token數(shù)量不斷上升,V2為8 trillion,V3為14 trillion。
模型端:模型的主體結(jié)構(gòu)基本沿用LLaMA。LLaMA主體就是Transformer結(jié)構(gòu),主要差異包括RMSNorm的Pre-normalization(每層Transformer輸入使用RMSNorm進(jìn)行歸一化)、激活函數(shù)采用SwiGLU、位置編碼采用Rotary Embeddings。模型包括7B和67B兩種尺寸,67B尺寸的Transformer中的attention采用了Grouped Query Attention代替最普通的self-attention降低inference開銷。Grouped Query Attention每組query共用同一組key和value。
優(yōu)化端:使用multi-step learning rate代替LLaMA中的cosine learning rate schedule,主要原因是實(shí)驗發(fā)現(xiàn)兩者雖然最終收斂到的loss差不多,但是前者在連續(xù)學(xué)習(xí)上loss能夠保證一致性,連續(xù)學(xué)習(xí)更加方便。先用2000個step的warmup將學(xué)習(xí)率提升到最大值,然后在訓(xùn)練完80%的訓(xùn)練數(shù)據(jù)后將學(xué)習(xí)率降低到31.6%,在訓(xùn)練完90%的訓(xùn)練數(shù)據(jù)后進(jìn)一步降低到10%。
對齊:使用Supervised Fine-Tuning、DPO兩種方式進(jìn)行預(yù)訓(xùn)練模型的finetune,進(jìn)行風(fēng)格對齊。Supervised Fine-Tuning使用120w搜集到的SFT數(shù)據(jù)(一些根據(jù)指令給出答案的文本,由人類標(biāo)注的高質(zhì)量數(shù)據(jù),幫助預(yù)訓(xùn)練模型遷移人類風(fēng)格)進(jìn)行finetune。DPO是針對之前ChatGPT中基于強(qiáng)化學(xué)習(xí)的RHLF風(fēng)格遷移的一種升級,不用強(qiáng)化學(xué)習(xí),只使用一個指定對應(yīng)的兩個答案之前的相對偏好關(guān)系作為損失函數(shù)加入到模型中。
2.DeepSeek V2
DeepSeek V2最核心的2點(diǎn)改動都在模型結(jié)構(gòu)上,一個是提出了一種Multi-head Latent Attention提升了inference效率;另一個是構(gòu)建了基于DeepSeekMoE的語言模型結(jié)構(gòu)。
Multi-head Latent Attention:MLA的主要目的是減少KV緩存占用的空間。KV緩存是大模型都會使用的技術(shù),在inference階段,每一個token的輸出都要和歷史所有token計算attention,每次新增token都有很多重復(fù)計算,因此可以將前面token計算出的key和value緩存起來。但是直接緩存key和value占用較大的空間,因此MLA對KV進(jìn)行了一個低維映射,只存儲這個低維的向量,節(jié)省了緩存存儲空間。
DeepSeekMoE:MoE是目前大模型在探索應(yīng)用的一項技術(shù),基礎(chǔ)的MoE將原來的每個token的單個FFN層變成多個并行的FFN層(對應(yīng)多個expert),并根據(jù)輸入生成一個路由到各個FFN的打分,選擇topN個專家,實(shí)現(xiàn)在單token運(yùn)算量沒有顯著提升的前提下,擴(kuò)大模型的參數(shù)空間的目的。如下圖a中,即是一個激活2個專家的MoE。
而DeepSeekMoE相比MoE有2個核心優(yōu)化。一個是把Expert變多了(文中稱為Fine-Grained Expert),其實(shí)就是把原來每個Expert的FFN維度調(diào)小,增加Expert數(shù)量,并且最終激活的Expert數(shù)量也變多。另一個就是增加了幾個所有token都走的公用Expert,通過讓所有token都走這些Expert,讓這些Expert提取通用信息,其他Expert就能更專注于提取差異化的信息。
3.DeepSeek V3
DeepSeekV3在模型結(jié)構(gòu)上的核心優(yōu)化,一方面是對DeepSeekMoE中的多專家負(fù)載均衡問題,提出了一種不需要輔助loss就能實(shí)現(xiàn)的解決方案,相比使用輔助loss提升了模型性能;另一方面是引入了Multi-Token Prediction技術(shù),相比原來每次只能預(yù)測一個token,顯著提升了infer的速度。
Auxiliary-Loss-Free Load Balancing:MoE的一個核心問題是有可能會出現(xiàn)坍縮問題,即訓(xùn)練到最后,激活的總是那么幾個Expert,沒有實(shí)現(xiàn)各個Expert的均衡,從而失去了多專家的意義。一般的解決方法會顯示引入一個負(fù)載均衡loss(DeepSeekV2,以及一些其他MoE的做法),但是顯示引入一個和目標(biāo)不相關(guān)的loss會影響訓(xùn)練效果。因此,DeepSeek V3采用了無需loss的負(fù)載均衡方法,在每個Expert打分增加一個這個相應(yīng)的bias項,bias項只影響路由不影響后續(xù)的Expert加權(quán)求和計算,每個step都會監(jiān)控各個Expert的負(fù)載均衡情況,對于過載的Expert降低bias項減少其相應(yīng)的激活數(shù)量,對于比較稀疏的Expert增大其bias項提升激活其的樣本比例。
Multi-Token Prediction:語言模型都是逐個預(yù)測的,每次將當(dāng)前預(yù)測結(jié)果作為最新的一個輸入,再次預(yù)測下一個。改成多token預(yù)測,一方面可以顯著提升infer的速度,另一方面也可以讓模型在生成后續(xù)token的時候有一個全局性,提升生成效果,對訓(xùn)練數(shù)據(jù)利用的也更加充分,加速收斂。
具體做法為,在訓(xùn)練階段,除了原來的主模型外,還會有幾個并行的MTP模塊,這些MTP模塊的Embedding層和Output Head和主模型共享,內(nèi)部有一個Transformer層。在主模型預(yù)測了next token后,將這個預(yù)測token的表征和之前token的Embedding拼接到一起,生成一個新的輸入(超出長度的更久遠(yuǎn)的token被才減掉)。這個拼接好的Embedding輸入到第一個MTP中預(yù)測next next token。以此類推,將MTP Module1的當(dāng)前預(yù)測token表征和歷史token拼接到一起,作為MTP Module2的輸入,再預(yù)測next next next token。
文中引入Multi-Token Prediction主要為了提升訓(xùn)練效果,inference階段直接去掉這些MTP模塊,也可以引入這些MTP模塊提升inference效率。
