MLNLP 社區是國內外知名的機器學習與自然語言處理社區,受眾覆蓋國內外 NLP 碩博生、高校老師以及企業研究人員。
社區的願景 是促進國內外自然語言處理,機器學習學術界、產業界和廣大愛好者之間的交流和進步,特別是初學者同學們的進步。
來源 | 機器之心
擴散語言模型(Diffusion Language Models, DLLMs)因其多種潛在的特性而備受關注,如能加速的非自迴歸並行生成特性,能直接起草編輯的特性,能數據增強的特性。然而,其模型能力往往落後於同等規模的強力自迴歸(AR)模型。
近日,華中科技大學和字節跳動聯合推出了 Stable-DiffCoder。這不僅僅是一個新的擴散程式碼模型,更是一次關於「擴散訓練能否提升模型能力上限」的深度探索。
Stable-DiffCoder 在完全復用 Seed-Coder 架構、數據的條件下,透過引入 Block Diffusion 持續預訓練(CPT)及一系列穩定性優化策略,成功實現了性能反超。在多個程式碼主流榜單上(如 MBPP,BigCodeBench 等),它不僅擊敗了其 AR 原型,更在 8B 規模下超越了 Qwen2.5-Coder,Qwen3,DeepSeek-Coder 等一眾強力開源模型,證明了擴散訓練範式本身就是一種強大的數據增強手段。
論文標題:Stable-DiffCoder: Pushing the Frontier of Code Diffusion Large Language Model
Github 連結: https://github.com/ByteDance-Seed/Stable-DiffCoder
模型連結: https://huggingface.co/collections/ByteDance-Seed/stable-diffcoder
擴散過程難以高效學習樣本知識
擴散過程雖然表面上可以擴充很多數據,可以作為一個數據增強的手段,但是實際上會引入很多噪聲甚至錯誤知識的學習。
例如下面的例子:
將其 mask 成
可以發現對於最後一個 mask_n,其只能在看見 a=1,b=2 的情況下去學習 a+b=7,會形成錯誤的知識映射。最後充其量也只能學到,a=3,b=4 在 a+b = 這個語境下的共現機率更大一點,不能學到明確的加法規則。
token 推理的知識和流程設計
論文透過建模這個知識的學習來解釋這個現象:
假設 c 是當前可見的樣本,根據真實分佈透過這些樣本在當前位置能夠推理出的 token 集合為 C (c),大小為 K (c)(這裡多個 token 同時推理的情景一致,因此只簡單的考慮單個 token 推理)。由於使用的真实分佈來定義的,所以 c 越多越乾淨的時候,K (c) 越小。
可以知道模型最後希望學習的分佈是 ,而要學好這個過程需要滿足兩個條件:(1)K (c) 比較小;(2)從數據中採樣的 c 要儘可能多。
因此,如果用純雙向的擴散過程,在 mask 比例較大的時候,當前 token 見到的 c 變小,不乾淨的機率變大,導致 K (c) 變大,難以映射到清晰的規則。同時其會產生會產生各種各樣的 c,平均每個 c 的學習量會減小。另外,還要保證訓練採樣的 c 跟推理用的 c 是一致的,才能更好的使用訓練學習的知識。
接下來論文透過在 2.5B 的模型設計實驗來進一步闡釋並證明這個結論。論文從一個 AR model 初始化,然後訓練一段新的知識。論文設計了 3 個訓練方式來探索:
(1)AR->BiDLLM: 用 AR 的方式繼續訓練,在 100k step 的時候 CPT 成雙向的 DLLM。
(2)ARDLLM->BiDLLM: 用 AR 的結構,但是使用純雙向的採樣模式來訓練。然後 100k step CPT 成 BiDLLM。
(3)BiDLLM:使用純雙向的 DLLM 訓練。
可以發現,最後效果是(1)>(2)>(3),這也符合前面的理論。不用隨機 [MASK] 的(1)方案對於知識有更快的壓縮速度,並且轉換成 BiDLLM 也保持著最佳性能,這可以證明在要高效的學好一個 DLLM,可以用 AR 或者小 block size 的 block diffusion 來進行知識壓縮。另外有趣的是,在 block=32 時(1)和(2)的表現比(3)差,但是在 100k 之後表現比(3)好。100k 之前可以說明,AR 採樣的 c 跟 block size=32 推理過程的 c 不太匹配,但是由於 AR 壓縮了大量有用的知識,稍微 CPT 一下就能適配這種推理過程。同時也可以說明,AR 這種結構的先驗,可能更適合 prompt+response 這種從左側開始推理的過程。
因此我們將訓練流程設計為,先用 AR 壓縮一遍知識,然後用 AR 退火的前一個 checkpoint 繼續 CPT 成小 block 的 block diffusion,來探索擴散過程的數據增強能力。
穩定的 DLLM warmup 策略持續預訓練設計
擴散模型的持續預訓練通常對超參數的設計(如學習率)非常敏感,容易出現 grad norm 的異常變高,這也會受到各種訓練架構的影響。為了保持各種訓練架構的學習穩定,以及繁雜的調參過程,團隊設計了一種適配的 warmup 策略。
DLLM 的 CPT 過程不穩定主要受到下面 3 個原因影響:
(1)Attention 從單向變成雙向
(2)Mask 變多導致任務變得很難
(3)為了對齊 ELBO,會在交叉熵前面乘上加權係數。比如只 mask 了一個 token,會等價於只計算了這個 token 的 loss,會大幅增大這個 token 對於梯度的影響,進而影響 grad norm 和 loss。
由於退火 attention 的方式難以靈活適配 flash attention 等架構,該團隊針對(2)(3)來設計 warmup 過程。具體的,在 warmup 階段將 mask 比例上界逐漸 warmup 到最大值,從而使得一開始任務從易變難。
其次,在 warmup 階段去掉交叉熵中加權的係數,從而讓每個 token 對 loss 的影響更平穩:
Block-wise 截斷的噪聲調度
在使用 block diffusion 時,由於透過 cross attention 拼接了乾淨的前綴,可以使得每個 token 都產生有用的 loss。然而如果使用傳統的 noise schedule 會使得有些塊不產生 loss 信號,透過求解積分可以算出 block 不產生信號的機率如下,這在小 block 時會特別明顯:
因此團隊做了兩個設計:(1)強制每個塊都採樣一個 token(2)將 noise 採樣下界設置為 1/B,這樣可以使得至少期望採樣一個 token。同時可以避免強制採樣 1 個 token 之後,原本對應的 t 過小,從而使得交叉熵加權過大的問題。
實驗結果:多個程式碼 benchmark 在 8B 左右的模型保持領先
對於 Base 模型
Stable-DiffCoder-8B-Base 在程式碼生成,多程式碼語言生成,程式碼推理上表現出色。超過一系列 AR 和 diffusion-based 的模型。另外可以發現模型在稀疏程式碼語言上(如 C#,PHP 等,預訓練中數據較少),相比於 AR baseline 得到了大幅增強,可以證明 DLLM 的訓練過程起到了一定的數據增強的效果。同時在程式碼推理能力上也得到了增強。
對於 Instruct 模型
Stable-DiffCoder-8B-Instruct 在程式碼生成,程式碼編輯,程式碼推理等任務上做了綜合評測,並有著優越的表現。其中在常用的任務(humaneval,mbpp)上大幅超過原有 AR baseline 和其他 8B 左右的 DLLM model。在測試集閉源的 MHPP 達到 qwen32B 的水平,BigCodeBench 上更是超過一系列模型並僅次於 DeepSeek236B 的模型。同時在程式碼編輯 CanItEdit 任務上更是有著驚豔的效果。
總結與展望
Stable-DiffCoder 的發布,打破了「擴散模型只能做並行加速」的刻板印象。它證明了:擴散訓練範式本身就是一種極佳的表徵學習手段。透過合理的課程設計及穩定性優化,擴散模型完全可以在程式碼理解和生成質量上超越傳統的 AR 模型。
對於未來的大模型演進,Stable-DiffCoder 提示了一條新路徑:也許我們不需要拋棄 AR,而是將 AR 作為高效的知識壓縮器,再利用 Diffusion 作為「強化劑」,進一步推高模型的智慧上限。
△長按添加小助手
掃描二維碼添加小助手微信
請備註:姓名-學校/公司-研究方向(如:小張-哈工大-對話系統)即可申請加入自然語言處理/Pytorch 等技術交流群
關於我們
MLNLP 社區 是由國內外機器學習與自然語言處理學者聯合構建的民間學術社區,目前已經發展為國內外知名的機器學習與自然語言處理社區,旨在促進機器學習,自然語言處理學術界、產業界和廣大愛好者之間的進步。
社區可以為相關從業者的深造、就業及研究等方面提供開放交流平台。歡迎大家關注和加入我們。