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