從零手搓MoE大模型,大神級教程來了

傳說中GPT-4的“致勝法寶”——MoE(混合專家)架構,自己也能手搓了!

Hugging Face上有一位機器學習大神,分享瞭如何從頭開始建立一套完整的MoE系統。

這個項目被作者叫做MakeMoE,詳細講述了從注意力構建到形成完整MoE模型的過程。

作者介紹,MakeMoE是受到OpenAI創始成員Andrej Karpathy的makemore啓發並以之爲基礎編寫的。

makemore是一個針對自然語言處理和機器學習的教學項目,意在幫助學習者理解並實現一些基本模型。

同樣,MakeMoE也是在一步步的搭建過程中,幫助學習者更深刻地理解混合專家模型。

那麼,這份“手搓攻略”具體都講了些什麼呢?

和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