本文深入探討了 DeepSeek-R1 模型架構。讓我們從輸入到輸出追蹤 DeepSeek-R1 模型,以找到架構中的新發展和關鍵部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架構。本文旨在涵蓋其設計的所有重要方面。
📝 1. 輸入上下文長度
DeepSeek-R1的輸入上下文長度為128K。
DeepSeek-R1 從其基礎模型 DeepSeek-V3-Base 繼承了 128K 上下文長度。最初,DeepSeek-V3 使用 4K 上下文長度進行預訓練。然后,利用 YaRN 技術,兩階段上下文長度擴展首先將其增加到 32K,然后增加到 128K。
YaRN(另一種 RoPE 擴展方法)是一種旨在有效擴展使用旋轉位置嵌入 (RoPE)的大型語言模型 (LLM) 的上下文窗口的技術。RoPE 使用旋轉矩陣對位置信息進行編碼,而 YaRN 則修改這些旋轉頻率的縮放方式。它不是簡單地推斷頻率(這通常會導致性能下降),而是平滑地插入和調整這些頻率,從而能夠更好地推廣到更長的上下文。它在計算上是高效的,并且無需大量重新訓練即可擴展模型上下文長度。
🏛 2. 總層數
DeepSeek-R1 由一個嵌入層、其后的 61 個變換器層以及輸出階段的多個預測頭組成。
DeepSeek-R1 在所有 Transformer 層上采用多頭潛在注意力 (MLA) 層,而不是標準多頭注意力。前三個 Transformer 層與其他層不同,使用標準前饋網絡 (FFN) 層。從第 4 層到第 61 層,混合專家 (MoE) 層取代了 FFN 層。MLA 和 MoE 的細節將在以下部分中探討。
帶有維度的完整模型架構描述:
DeepSeek-V3使用多標記預測 (MTP) 技術,利用最后兩個預測頭預測接下來的2 個標記。第二個預測標記的接受率介于85% 和 90%之間,表明在各個生成主題中均具有很高的可靠性。 DeepSeek-R1 (DeepSeek-V3) 總共包含 671B 個參數,其中每個標記激活 37B 個。在這里插入圖片描述
🔬 3. 前 3 個 DeepSeek-R1 層
前 3 層由多頭潛在注意力 (MLA) 和標準 FFN 層組成。這些通常被稱為“密集 LLM 層”,因為 FFN 層不會被 MoE 層取代,相比之下 MoE 層被認為更稀疏。
DeepSeek-R1 中的前 3 個 Transformer 層
🧩 4. DeepSeek-R1 的第 4 層至第 61 層
這些層由 MLA 層和 MoE 層組成。我們將在接下來的部分中了解什么是 MLA 層和 MoE 層以及它們如何工作。
MoE Transformer 層
🧠 5.多頭潛在注意力(MLA)
現在讓我們了解什么是 MLA。
MLA 首次在 DeepSeek-V2 中引入,并已延續到 DeepSeek-V3 和 DeepSeek-R1。
為什么要開發MLA?
以下是 DeepSeek-V2 論文/技術報告中的一份聲明,它清楚地闡述了開發 MLA 背后的原因。
“傳統的Transformer模型通常采用多頭注意力機制(MHA),但在生成過程中,其繁重的鍵值(KV)緩存會成為限制推理效率的瓶頸。為了減少KV緩存,提出了多查詢注意力機制(MQA)和分組查詢注意力機制(GQA)。它們需要的KV緩存量級較小,但性能不如MHA。
對于 DeepSeek-V2,我們設計了一種創新的注意力機制,稱為多頭潛在注意力 (MLA)。MLA 配備了低秩鍵值聯合壓縮,性能優于 MHA,但所需的 KV 緩存量卻少得多。”
MLA 與 MHA、GQA 和 MQA 的比較:來自 DeepSeek-V2 的圖表
MLA 如何實現減少 KV 緩存以加快推理速度?
“MLA 的核心是對注意力鍵和值進行低秩聯合壓縮,以減少推理過程中的鍵值 (KV) 緩存。” — DeepSeek-V2
讓我們一步一步地理解這個圖:
步驟 1:Q、K 和 V 的下投影
MLA 層的輸入是 h t ? h_t? ht??。為清楚起見,我們假設 h t h_t ht? 的形狀為 (input_sequence_length×2000)。
在傳統的 Transformer 層中,權重矩陣用于將 h_t? 投影到查詢 (Q)、鍵 (K) 和值 (V) 表示中。這些表示中的每一個通常都保留與輸入相同的隱藏維度,從而導致 Q、K、V 具有 (input_sequence_length×2000) 的形狀。
MLA 層的輸入是 h t h_t ht??。為清楚起見,我們假設 h t h_t ht? 的形狀為 (input_sequence_length×2000)。
在傳統的 Transformer 層中,權重矩陣用于將 h_t? 投影到查詢 (Q)、鍵 (K) 和值 (V) 表示中。這些表示中的每一個通常都保留與輸入相同的隱藏維度,從而導致 Q、K、V 具有 (input_sequence_length×2000) 的形狀。
然而,在具有多頭潛在注意力 (MLA) 的 Transformer 層中,權重矩陣生成的 Q、K 和 V 的尺寸明顯小于輸入。MLA 不會保留完整的隱藏維度,而是會減小它們的尺寸。例如,如果輸入 h t h_t ht?? 的形狀為 (序列長度 × 2000),則生成的 Q、K 和 V 的形狀可能為 (序列長度 × 100)。
在實施過程中,通常會融合 Q、K 和 V 的權重矩陣,以提高GPU 上的計算和內存效率。不是應用單獨的投影,而是使用組合權重矩陣來優化操作。在 MLA 中, K和V的生成遵循這一原則。具體而言,在方程中使用單個權重矩陣,表示為 W D K V W^{DKV} WDKV ?。這里, W D K V W^{DKV} WDKV? 中的“D”代表下投影權重矩陣,反映了其在降低維度以實現高效注意力計算方面的作用。
潛在 K 和 V 嵌入
此投影的輸出是包含 K 和 V 的連接表示。可以使用簡單的切片機制輕松提取它們。結果輸出的形狀為 (序列長度 × 200),其中第一個 (序列長度 × 100) 對應于 K,其余 (序列長度 × 100) 對應于 V。
壓縮的 K 和 V 輸出在推理期間被緩存,從而顯著減少了 KV 緩存的內存占用。
類似地,Q 也在MLA中被壓縮。Q 的結果形狀為(序列長度 × 100)。
第 2 步:Q、K 和 V 的向上投影
壓縮后,Q、K 和 V被向上投影回更大的尺寸以進行注意力計算。這個更大的尺寸可以匹配原始輸入 h t h_t ht? ?,也可以遵循基于注意力頭配置的結構。
例如,向上投影的形狀可以是:
- (序列長度×2000),與輸入大小匹配。
- 序列長度×3200),其中3200來自于64×50(有64 個注意力頭,每個頭有 50 個維度)。
K 和 V 向上投影
Q 向上投影
Q、K 和 V的上投影是使用專用權重矩陣執行的:
- W_UK? 表示K 向上投影
- W_UV? 用于垂直向上投影
- W_UQ? 用于Q 向上投影
這里,“U”代表向上投影,表示將壓縮表示擴展回更大維度的空間以進行注意力計算。
注意:每個注意力頭的輸入維度將進行調整以適應旋轉位置嵌入 (RoPE)。此調整將在接下來的部分中變得更加清晰。
步驟 3:Q 和 K 中的 RoPE 嵌入用于編碼位置信息
此步驟用于計算 RoPE 嵌入來編碼位置信息。
旋轉位置嵌入(RoPE)的結合:
- 解耦 RoPE 策略:為了整合位置信息,DeepSeek-V2(隨后是 DeepSeek-V3 和 DeepSeek-R1)采用了解耦 RoPE 方法。這涉及創建專門用于攜帶位置信息的額外查詢 (Q) 和密鑰 (K) 向量。
- 連接:這些 RoPE 增強的 Q 和 K 向量與上投影的 Q 和 K 向量連接。
這是 MLA 中比較棘手的部分。
我將嘗試按照我從 DeepSeek 的技術報告中理解的方式來解釋它。
在傳統的 Transformer 層中,RoPE 操作直接作用于 Q 和 K。它不改變 Q 和 K 的維度,而是改變 Q 和 K 中的語義表示(Q 和 K 中的數值)來編碼位置信息。因此,得到的 Q 和 K 同時具有語義和位置信息。
但是,在具有 MLA 的transformer層中,RoPE 被應用于分離新生成的查詢(Q)和鍵(K)嵌入,并將其連接到上投影的 Q 和 K。
步驟 3.1:為 Q 生成 RoPE 嵌入
傳統上,RoPE(旋轉位置嵌入)會根據查詢 (Q) 和鍵 (K) 向量在序列中的位置,對它們應用旋轉矩陣。此轉換會直接在 Q 和 K 中編碼相對位置信息,從而無需使用正弦或絕對編碼等顯式位置嵌入。
但是在 MLA 中,不是將 RoPE 應用于上投影的 Q( q t C q_t^C qtC?),而是從 c t Q c_t^Q ctQ? 生成新的 Q 嵌入( q t R q_t^R qtR?)并對其應用 RoPE。
通過將 c t Q c_t^Q ctQ? 與權重矩陣 W Q R W^{QR} WQR 相乘,可以生成完全獨立的查詢嵌入。這些新的獨立查詢嵌入經過 RoPE 轉換,為我們提供位置編碼查詢嵌入 ( q t R q_t^R qtR?)。
q t R q_t^R qtR? 的生成方式是,它們可以連接到每個注意力頭的輸入查詢嵌入,以便每個注意力頭都具有位置信息。 [從等式來看,這個說法似乎是正確的,但需要進一步驗證。]
步驟 3.2:為 K 生成 RoPE 嵌入
類似地,不是將 RoPE 應用于上投影的 K,而是生成新的 K 嵌入并對其應用 RoPE。
但是與 RoPE 嵌入的 q t R q_t^R qtR?有兩個關鍵區別:
新的 K 嵌入是由 h t h_t ht?(輸入嵌入)而不是向下投影的 K( c t K c_t^K ctK?)生成的。
相同的 RoPE 嵌入 K(鍵)連接到每個注意力頭的輸入。但是,單獨的 RoPE 嵌入 Q(查詢)被計算并連接到每個注意力頭,如步驟 3.1 所示。[從等式來看,這個說法似乎是正確的,但需要進一步驗證。]
為什么不從向上投影的 K 即 k t C k_t^C ktC? 生成?
DeepSeek-V2報告中的推理:
“如果我們將 RoPE 應用于鍵k _𝐶,𝑊𝑈𝐾 將與位置敏感的 RoPE 矩陣耦合。這樣,𝑊𝑈𝐾 在推理過程中就不能再被吸收到𝑊_𝑄 中,因為與當前生成的 token 相關的 RoPE 矩陣將位于 𝑊_𝑄 和 𝑊𝑈𝐾 之間,而矩陣乘法不遵循交換律。”
從下面的解釋截圖可以更好地理解這一點:
K 的 RoPE 嵌入:第 1 部分
K 的 RoPE 嵌入:第 2 部分
K 的 RoPE 嵌入:第 3 部分
因此,為了提高推理效率,位置嵌入的 K(關鍵)嵌入是從輸入嵌入 h t h_t ht? 生成的。
在 MLA 中引入額外的權重矩陣不會導致內存和計算效率低下嗎?
為了解決這些開銷,DeepSeek-V2 報告:
“此外,在推理過程中,由于 𝑊𝑈𝐾 可以被吸收到 𝑊𝑄 中,而 𝑊𝑈𝑉 可以被吸收到 𝑊𝑂 中,我們甚至不需要計算鍵和值來引起注意。”
為了進一步減少內存消耗:
“此外,為了減少訓練期間的激活內存,我們還對查詢執行低秩壓縮,即使它不能減少 KV 緩存”
步驟4:計算注意力輸出
連接過程會增加 Q 和 K 向量的維數。為了管理這種增加的維數,模型可以采取以下任一方式:
- 增加注意力頭的數量:這將保持原始的每個頭的維度,但需要更多的計算資源。
- 調整每個頭的維數:保持頭的數量不變,但增加每個頭的維數以適應連接的向量。
注意力輸出是使用這些標準注意力方程來計算的:
O_t_i 是注意力得分,u_t 是注意力輸出。W_o 表示輸出投影權重矩陣。輸出被投影回與輸入相同的維度(就像在我們的例子中:這個形狀將是 input_sequence_length x 2000)
🎭 6.混合專家(MoE)
什么是混合專家 (MoE)?
為了清楚地理解什么是 MoE,首先讓我們看看它在 Transformer 中的具體用途以及它的架構簡介。標準 Transformer 層中的 FFN 被 MoE 取代。
從本質上講,MoE 遵循標準 Transformer 設計,但通過引入多個并行專家網絡(FFN) 而不是單個密集 FFN來修改前饋層。其工作原理如下:
1. 多個 FFN(而非一個)
MoE 不使用單個共享的 FFN,而是使用多個并行訓練的FFN 層(專家) 。
2. 輸入處理和令牌路由
- 每個 token 都像往常一樣經過 transformer自注意力層。
- 它不是由單個 FFN 處理,而是被發送到路由器,由路由器決定哪些專家應該處理它。
3. 通過路由器選擇專家
- 一個小型的、可訓練的路由器決定哪個專家子集(FFN)應該處理每個標記。
- 通常,每個 token僅選擇 1 或 2 個專家以保持效率(例如, top-1 或 top-2 門控)。DeepSeek -V3(DeepSeek-R1)使用 9 個專家,其中 1 個是共享專家,其他 8 個是路由專家。
- 選擇通常基于softmax 評分機制,其中路由器為每個專家分配概率。具體來說,在 DeepSeek-V3 (DeepSeek-R1) 中,使用 Sigmoid 而不是 softmax。
4. 專家稀疏計算
- 只有選定的專家才能處理令牌,而其他人則保持不活動狀態。
- 專家輸出使用加權求和進行組合,并傳遞到下一個 Transformer 層。在 DeepSeek-V3/R1 中,權重是歸一化的 S 型輸出。
- 這種稀疏激活可確保任何時候僅使用模型的一小部分,從而保持計算可管理。
為什么要用 MoE 取代單一 FFN?
- 可擴展性— MoE 允許模型使用更多參數進行擴展,而無需線性增加計算量。
- 高效學習— 專家專注于數據的不同方面,從而提高泛化能力。
- 計算節省— 由于每個 token 僅使用專家子集,因此與相同大小的密集模型相比,MoE 模型的運行成本更低。DeepSeek-V3/R1 共有 6710 億個參數,其中每個 token 激活 370 億個參數。
MoE 在 DeepSeek-R1 中如何發揮作用?
以下來自 DeepSeek-V3 技術報告的公式顯示了每個 MoE 層中的計算。在 DeepSeek 系列模型中,MoE 架構首次在 DeepSeekMoE 模型中引入,并且正在 DeepSeek-V2、DeepSeek-V3 和 DeepSeek-R1 中使用。
路由器計算:
在 DeepSeek-V3 、 DeepSeek-R1 和其他一些現代混合專家 (MoE) 模型中,e_i? 表示學習到的質心,有助于將輸入路由到正確的專家。與傳統的 MoE 架構中基于 FFN 的路由器計算門控分數不同,此方法預定義了一組可學習向量e_i?,每個向量對應一位專家。
關鍵思想:
- 每個專家 i 都有一個相關的質心向量 e i e_i ei?。
- 我們不是將輸入 u t ? u_t? ut?? 傳遞給 FFN 來獲取專家概率,而是通過點積來計 u t u_t ut? 和每個 e i ? e_i? ei?? 之間的相似度:
- 該分數決定了專家與給定輸入的相關程度。
- 僅激活具有最高 s i , t s_{i,t} si,t?? 值的Top-K專家進行處理。
- 在 S 型輸出中添加了一個偏差項,以創建無輔助損失的 MoE 負載平衡。
DeepSeek-V3 論文中的這段描述進一步闡明了它的用途以及它在訓練過程中的計算方式:
- 使用選定的 top-k 值對輸出值進行標準化。
專家計算:
u t u_t ut?是 MoE 層的輸入。等式中的第二項表示輸入與共享專家相乘。每個專家由 FFN(前饋網絡)組成,因此用“FFN”表示。在 DeepSeek-R1 中,只有 1 個共享專家。因此,Ns=1。同樣,等式中的第三項表示輸入與活躍的個人專家相乘。在 DeepSeek-R1 中,總共有 256 個個人專家。但每個 token 只有 8 個活躍,因此 Nr=8。每個活躍的個人專家都將具有與等式 13 中關聯的 g i , t g_{i,t} gi,t?。它用于計算第三項。
輸出
h t h_t ht?表示 MoE 層的輸出。 u t u_t ut? 是 MoE 層的輸入。專家計算結果添加到輸入 u t u_t ut? 中,得到 MoE 層的輸出。
🔢 7. 多標記預測(MTP)
什么是多標記預測?
多標記預測是語言建模中的一種高級方法,其中模型不是一次預測一個序列中的下一個單詞,而是同時預測多個未來標記。此方法使模型能夠并行預測多個即將到來的單詞,從而提高學習效率并加速文本生成。
Meta 引入了一種多標記預測架構,可訓練語言模型同時預測多個未來標記,從而提高采樣效率并加快推理速度。在此概念的基礎上,DeepSeek-V3 整合了多標記預測 (MTP) 目標,使模型能夠同時預測多個標記。這種方法使訓練信號密集化,并能夠更好地預先規劃標記表示,從而提高復雜基準測試的性能。
DeepSeek-V3/R1 和 Meta 的多令牌預測有兩個關鍵區別:
“與 Gloeckle 等人(2024 年)[Meta Research] 使用獨立輸出頭并行預測 𝐷 個額外標記不同,我們按順序預測其他標記,并在每個預測深度保留完整的因果鏈。” — DeepSeek-V3
- Meta 的模型預測了4 個 token,而 DeepSeek-V3 預測了2 個 token。
- Meta 模型中的預測頭是獨立的,而 DeepSeek-V3 的預測頭是順序連接的。
MTP 在 DeepSeek-R1 中如何工作?
讓我們一步一步地看一下該圖表。
在訓練期間,輸入標記(位于左下角)穿過嵌入層,然后傳播到所有變壓器塊/層。
第一個預測頭(包括輸出頭)直接連接到主模型的最終 Transformer 層。輸出頭通常是前饋網絡 (FFN),其輸出維度與模型的詞匯量相匹配。該頭負責按順序預測下一個標記。給定輸入標記t?、t?、t?、t?,它會預測t?、t?、t?、t? 。但是,在推理過程中,只計算最終標記t? 。
第二個預測頭通過添加額外的可學習層擴展了這種方法。它從主模型的最終 Transformer 層獲取輸出,應用 RMSNorm 進行歸一化,然后將其與輸入嵌入連接起來。這些輸入嵌入是從主模型中使用的相同嵌入層獲得的。與第一個預測頭不同,這個頭從t?而不是t?開始處理輸入標記。然后使用線性投影層將連接的輸出投影到合適的嵌入大小,然后使用可學習的 Transformer 塊/層進行進一步處理。在訓練期間,這個頭將t?預測為t?,但在推理中,只計算t? 。
類似地,第三個預測頭從第二個預測頭的transformer器塊/層獲取輸入以及相應的輸入嵌入,現在從t?開始到t?。它遵循與前幾個頭相同的結構,在訓練期間預測t?到t?,但在推理期間僅計算t?。
每個預測頭使用交叉熵計算損失。然后,這些損失用因子λ加權,取其平均值作為最終損失值。
單獨預測頭損失
最終損失
在 DeepSeek-V3 和 R1 中,MTP 僅在訓練期間使用,而不在推理期間使用:
“推理中的 MTP:我們的 MTP 策略主要是為了提高主模型的性能,因此在推理過程中,我們可以直接丟棄 MTP 模塊,主模型可以獨立正常運行。”——DeepSeek-V3
參考資料
- https://arxiv.org/pdf/2412.19437
- https://arxiv.org/pdf/2405.04434
- https://arxiv.org/pdf/2402.03300
- https://arxiv.org/pdf/2401.02954
- https://arxiv.org/pdf/2401.06066
- https://arxiv.org/pdf/2404.19737