克雷西 發自 凹非寺
量子位 | 公衆号 QbitAI
傳說中 GPT-4 的 " 緻勝法寶 " —— MoE(混合專家)架構,自己也能手搓了!
Hugging Face 上有一位機器學習大神,分享了如何從頭開始建立一套完整的 MoE 系統。
這個項目被作者叫做 MakeMoE,詳細講述了從注意力構建到形成完整 MoE 模型的過程。
作者介紹,MakeMoE 是受到 OpenAI 創始成員 Andrej Karpathy 的 makemore 啓發并以之爲基礎編寫的。
makemore 是一個針對自然語言處理和機器學習的教學項目,意在幫助學習者理解并實現一些基本模型。
同樣,MakeMoE 也是在一步步的搭建過程中,幫助學習者更深刻地理解混合專家模型。
那麽,這份 " 手搓攻略 " 具體都講了些什麽呢?
從頭開始搭建 MoE 模型
和 Karpathy 的 makemore 相比,MakeMoE 用稀疏的專家混合體代替了孤立的前饋神經網絡,同時加入了必要的門控邏輯。
同時,由于過程中需要用到 ReLU 激活函數,makemore 中的默認初始化方式被替換成了 Kaiming He 方法。
想要創建一個 MoE 模型,首先要理解自注意力機制。
模型首先通過線性變換,将輸入序列變換成用查詢(Q)、鍵(K)和值(V)表示的參數。
這些參數随後被用于計算注意力分數,這些分數決定了在生成每個 token 時,模型對序列中每個位置的關注程度。
爲了确保模型在生成文本時的自回歸特性,即隻能基于已經生成的 token 來預測下一個 token,作者使用了多頭因果自注意力機制。
這種機制通過一個掩碼來實現将未處理的位置的注意力分數設置爲負無窮大,這樣這些位置的權重就會變爲零。
多頭因果則是讓模型并行地執行多個這樣的注意力計算,每個頭關注序列的不同部分。
完成自注意力機制的配置後,就可以創建專家模塊了,這裏的 " 專家模塊 " 是一種多層感知器。
每個專家模塊包含一個線性層,它将嵌入向量映射到一個更大的維度,然後通過非線性激活函數(如 ReLU),再通過另一個線性層将向量映射回原始的嵌入維度。
這樣的設計使得每個專家能夠專注于處理輸入序列的不同部分,并通過門控網絡來決定在生成每個 token 時應該激活哪些專家。
于是,接下來就要開始構建分配和管理專家的組件——門控網絡。
這裏的門控網絡同樣是通過一個線性層實現,該層将自注意力層的輸出映射到專家模塊的數量。
這個線性層的輸出是一個分數向量,每個分數代表了對應專家模塊對于當前處理的 token 的重要性。
門控網絡會計算這個分數向量的 top-k 值并記錄其索引,然後從中選擇 top-k 個最大的分數,用來加權對應的專家模塊輸出。
爲了在訓練過程中增加模型的探索性,作者還引入了噪聲,避免所有 token 都傾向于被相同的專家處理。
這種噪聲通常通過在分數向量上添加随機的高斯噪聲實現。
獲得結果後,模型有選擇地将前 k 個值與相應 token 的前 k 個專家的輸出相乘,然後相加形成加權和,構成模型的輸出。
最後,将這些模塊在一起,就得到一個 MoE 模型了。
針對以上的整個過程,作者都提供了相應的代碼,可以到原文中具體了解。
另外,作者還制作了端到端的 Jupyter 筆記,可以在學習各模塊的同時直接運行。
感興趣的話,就趕快學起來吧!
原文地址:
https://huggingface.co/blog/AviSoori1x/makemoe-from-scratch
筆記版本(GitHub):
https://github.com/AviSoori1x/makeMoE/tree/main
— 完 —
點這裏關注我,記得标星哦~
一鍵三連「分享」、「點贊」和「在看」
科技前沿進展日日相見 ~