Prelude
一般 transformer blocks,先把輸入編成比較穩定的表示。這段只跑一次,產生後面 loop 會一直拿來參照的 encoded input `e`。
e = Prelude(x)`OpenMythos` 的做法,不是聲稱自己拿到了 Anthropic 的真實架構;它是先假設 Mythos 很可能是一種 Recurrent-Depth Transformer, 再把公開可查的幾個零件組起來:迴圈式深度、穩定注入、ACT 提前停止、MLA/GQA 注意力、MoE, 最後做成能跑的 PyTorch 模型。
一種「行為解釋模型」:試圖用已知研究,去解釋 Mythos 為什麼看起來有更深的內在推理。
不是官方權重、不是內部架構洩漏、也不是能證明 Anthropic 真的這樣實作。
把它當成「一份可執行研究假說」,而不是 Mythos 本體。
README 與 `open_mythos/main.py` 一致指向同一件事:整個專案的中心不是更多層,而是同一個 recurrent block 被反覆跑很多次。
一般 transformer blocks,先把輸入編成比較穩定的表示。這段只跑一次,產生後面 loop 會一直拿來參照的 encoded input `e`。
e = Prelude(x)真正的假說核心。不是堆很多不同層,而是把同一組 block 重複跑 `T` 次,讓模型在單次 forward 裡做更深的 latent refinement。
h(t+1) = A*h(t) + B*e + Block(h(t), e)每個位置不是一定都跑到同樣深度。若某些 token 早就收斂,可以提早停止累積更新,把運算留給更難的位置。
if cumulative_p >= threshold: halt再用一般 transformer blocks 收尾,把 recurrent loop 的結果整理成最後可投影成 logits 的表示。
logits = Head(Norm(Coda(h)))第一張圖講整體流程,第二張圖專門處理最容易搞混的地方:MoE experts 是每一輪重新選,不是某個 expert 自己反覆多跑。
把它當成一條主幹加一個會反覆打磨 hidden state 的回圈。真正被反覆執行的是中間的 recurrent block。
先把 token 表示整理成比較穩定的 encoded input e。這份 e 之後每一輪都會被注回去。
先告訴共享權重:現在是第幾輪。
這一輪做一次完整 block 計算。
用 A*h + B*e + out 更新 hidden state。
決定哪些位置已經夠了、哪些還要再算。
h 進入下一輪;不是把某個 expert 單獨重跑。把 recurrent block 打磨完的表示再收尾一次,最後投影成 logits 或下一個 token 分布。
這裡最容易誤解成「某些 experts 自己會要求再 forward 幾次」。OpenMythos 不是這樣。它是每輪 loop 都重新 routing 一次。
這輪沒被選到就不跑。
這輪被 router 選進 top-k。
這輪也被選到,跑一次。
每輪都固定啟動。
router 根據這一輪的 hidden state,替每個 token 選出 top-k routed experts。
被選中的 experts 在這一輪各自計算一次,沒有哪個 expert 自己再要求額外重跑。
把 top-k experts 的輸出依權重合併,再加上 shared experts 的輸出,形成這一輪的 FFN 結果。
如果進入下一輪,會基於更新後的 hidden state 再重新選 experts,所以第 2 輪和第 9 輪可能完全不是同一批 experts。
你可以把這個 repo 看成一條五段論證鏈:從現象猜機制,再從機制挑公開論文中的零件。
作者先假設 Mythos 在多步推理、組合泛化、長鏈思考上表現突出,而且這種能力像是「單次 forward 裡的隱性多步計算」。
若要讓模型在不暴增參數的情況下增加思考深度,最直接的候選就是 Looped / Recurrent-Depth Transformer。
只做 loop 會不穩,所以加進穩定注入 `A*h + B*e`、ACT、loop index 等機制,避免漂移、爆炸或每輪都長一樣。
若真的要做大模型,attention cache 和 FFN 計算會太重,所以再用 MLA/GQA 降 cache、用 MoE 提高參數量但保持稀疏啟動。
最後把這些拼到 `OpenMythos` 類別裡,讓它不只是敘事,而是可以 `forward`、`generate`、甚至嘗試 training script 的原型。
左邊選模組,右邊會顯示它在理論重建裡的工作。這一區最適合拿來理解「為什麼偏偏是這幾個零件」。
這是整個專案的主心骨:同一組 block 被重複執行,讓模型在不增加獨立層數的前提下,得到更深的內部計算深度。
專案的 README 與 class reference 都把 Mythos 的核心假設寫成 Recurrent-Depth Transformer。 它的意思不是「多輸出幾步思考文字」,而是把 hidden state 丟進同一個 block 反覆更新。如此一來,推理深度可以靠 loop 次數擴張,而參數量不需要跟著線性成長。
如果把它想成一次「安靜版 chain-of-thought」,下面這六步就是最容易記住的閱讀方式。
把 token ids 變成向量表示,準備進入 Prelude。
用標準 transformer layers 先理解輸入,凍結成之後每輪都會被注入的 `e`。
在每一輪把 loop index 編碼灌進 hidden state,讓共享權重知道自己目前是第幾輪。
跑 attention + FFN,再加 LoRA depth adapter,然後做 `A*h + B*e + transformer_out`。
ACT 對每個位置預測是否已經收斂。收斂的 token 可以停,沒收斂的繼續迭代。
最後再收尾一次,輸出 logits。整個過程都在 latent space 內部完成。
關鍵不是 expert 自己要求出場,而是每一輪 loop 都由 router 根據當下 hidden state 重新打分,選出 top-k experts。
在 `OpenMythos` 裡,expert routing 發生在 `RecurrentBlock` 裡的 `MoEFFN.forward()`。也就是說,每輪 recurrent loop 都會重新做一次 routing。
e 合在一起。
logits = self.router(flat),shape 是 (B*T, n_experts)。這代表每個 token 都各自有一份對所有 experts 的偏好分數。
topk_idx = (logits + router_bias).topk(self.topk)。被選進 top-k 的 experts,才會在這一輪真正跑 forward。
scores = softmax(logits),再把被選中的 top-k 分數抓出來重正規化。也就是說,router_bias 比較像在影響「誰比較容易被挑中」,不是直接改 mixture 權重。
如果你只抓核心,讀這幾行就夠了。它直接說明了「誰被選中」和「如何加權」其實是兩個步驟。
flat = x.view(B * T, D)
logits = self.router(flat)
scores = F.softmax(logits, dim=-1)
_, topk_idx = (logits + self.router_bias).topk(self.topk, dim=-1)
topk_scores = scores.gather(-1, topk_idx)
topk_scores = topk_scores / topk_scores.sum(dim=-1, keepdim=True)
for i in range(self.topk):
expert_ids = topk_idx[:, i]
token_scores = topk_scores[:, i].unsqueeze(-1)
...
out[mask] += token_scores[mask] * self.routed_experts[eid](flat[mask])
for shared in self.shared_experts:
out = out + shared(flat)
這是理解 OpenMythos 很重要的一道分界。重複計算可以提升「怎麼用知識」,但不會自動增加「模型本來裝進去多少知識」。
如果推論時權重不變,那 recurrent loop 比較像是在重複利用既有參數,讓同一份知識被更細地展開、重組、修正。這常常會改善多步推理、規劃、組合泛化,但不代表模型突然多知道了原本沒壓進去的事實。
可能把小參數的推理深度往上拉,但知識容量仍受限於原本權重。
同時有較高知識覆蓋與較強推理,通常也是最昂貴的配置。
知識存量有限,推理深度也有限。
可能記得更多,但未必更會把知識做深度組合。
如果只看 recurrent loop,你可以把它理解成「用計算換參數」。如果再把 MoE 算進來,作者其實是在同時補兩件不同的東西。
這裡是你最應該保留的判斷:它在工程上是真的,但在「是不是 Mythos 真相」這件事上仍然只是研究假說。
這些東西在 repo 內都有明確程式碼,不是口號:
這些是作者用公開研究去補的合理推測,不是官方證據:
如果你之後要自己往下看,不用從頭到尾啃完,照這個順序最快。