聲明:本文來(lái)自于微信公眾號(hào) AIGC開(kāi)放社區(qū),作者:AIGC開(kāi)放社區(qū),授權(quán)站長(zhǎng)之家轉(zhuǎn)載發(fā)布。
今天凌晨3點(diǎn),全球社交巨頭Meta分享了一個(gè)創(chuàng)新研究——Memory layers(記憶層)。
目前,Transformer架構(gòu)的預(yù)訓(xùn)練大模型在存儲(chǔ)、查詢(xún)數(shù)據(jù)時(shí),隨著參數(shù)的變大對(duì)算力的需求呈指數(shù)級(jí)增長(zhǎng)?!坝洃泴印碧岢隽诵碌母咝Р樵?xún)機(jī)制替代了傳統(tǒng)的查詢(xún)方法,通過(guò)比較查詢(xún)鍵與兩個(gè)較小集合中的鍵,可以快速找到最相關(guān)的鍵,而無(wú)需遍歷模型的整個(gè)記憶層。
這也就是說(shuō),可以在不增加算力的情況下顯著增加大模型的參數(shù)。例如,研究人員在僅有1.3億參數(shù)的模型中添加了128億額外的記憶參數(shù),其性能與Meta開(kāi)源的Llama2-70相當(dāng),而算力卻比它低了10倍左右。
開(kāi)源地址:https://github.com/facebookresearch/memory
Product - Key Lookup
在傳統(tǒng)的鍵值查找中,每個(gè)查詢(xún)都需要與記憶層中的每個(gè)鍵進(jìn)行比較,以找到最匹配的值。該方法在鍵的數(shù)量較少時(shí)是可行的,但隨著記憶層規(guī)模的增長(zhǎng),這種暴力搜索的方式變得非常低效,需要消耗巨大算力和時(shí)間。
給大家舉一個(gè)簡(jiǎn)單的例子,你想在一個(gè)巨大的圖書(shū)館里找一本書(shū)。這個(gè)圖書(shū)館有成千上萬(wàn)本書(shū),每本書(shū)都有一個(gè)唯一的編號(hào)(相當(dāng)于記憶層中的“鍵”)。如果你要找到一本特定的書(shū)(相當(dāng)于查詢(xún)),傳統(tǒng)的方法是逐個(gè)檢查每一本書(shū)的編號(hào)來(lái)查找你要的那一本。
這種方法在圖書(shū)館只有幾百本本書(shū)時(shí)可能還行得通,當(dāng)圖書(shū)館藏書(shū)量達(dá)到數(shù)萬(wàn)時(shí),逐本查找方法就變得極其耗時(shí)和低效了。
Product - Key Lookup是“記憶層”的核心算法之一,使用了一種分而治之的策略,將傳統(tǒng)的單一鍵集合分解為兩個(gè)較小的鍵集合,通過(guò)兩個(gè)階段的查找來(lái)減少必要的比較次數(shù),從而提高查找效率。
首先,查詢(xún)鍵被分割為兩個(gè)子查詢(xún),每個(gè)子查詢(xún)分別與兩個(gè)半鍵集合進(jìn)行比較。由于每個(gè)半鍵集合的大小只有原始鍵集合的平方根大小,因此這個(gè)階段的計(jì)算量大幅減少。在第一階段,每個(gè)半鍵集合中找到與子查詢(xún)最相似的k個(gè)鍵,這個(gè)過(guò)程稱(chēng)為top-k查找。
在第二階段,兩個(gè)半鍵集合中找到的top-k鍵被合并,以確定最終的top-k鍵。這一步驟涉及到對(duì)兩個(gè)半鍵集合中找到的鍵進(jìn)行綜合評(píng)分,以確定它們與原始查詢(xún)鍵的整體相似度。需要考慮到兩個(gè)半鍵集合中的鍵的組合,以找到最佳的匹配。
除了計(jì)算效率之外,Product-Key Lookup模塊還優(yōu)化了內(nèi)存和帶寬的使用。由于每個(gè)GPU只需要處理一半的鍵,因此內(nèi)存的使用量減少了一半。由于每個(gè)GPU只需要返回與自己處理的鍵相關(guān)的值,所以?xún)?nèi)存帶寬的需求也得到了優(yōu)化。
Product-Key Lookup算法不僅提高了記憶層的查詢(xún)效率,還為記憶層的應(yīng)用開(kāi)辟了新的可能性,使得記憶層可以被應(yīng)用于更大規(guī)模的數(shù)據(jù)集和更復(fù)雜的任務(wù)中,包括大規(guī)模知識(shí)圖譜的查詢(xún)、長(zhǎng)文本的語(yǔ)義檢索等。
并行記憶層和共享記憶參數(shù)
并行記憶層主要是用于對(duì)硬件GPU的優(yōu)化。在傳統(tǒng)的Transformer架構(gòu)模型中,隨著模型規(guī)模的增加,計(jì)算和內(nèi)存需求也隨之增長(zhǎng)。特別是在處理大規(guī)模數(shù)據(jù)集時(shí),單一的計(jì)算單元很難滿(mǎn)足這種需求。并行記憶層通過(guò)在多個(gè)GPU之間分配任務(wù),有效解決這一難題。
在并行記憶層的設(shè)計(jì)中,每個(gè)計(jì)算單元只負(fù)責(zé)處理一部分?jǐn)?shù)據(jù),這樣可以減少單個(gè)計(jì)算單元的負(fù)擔(dān),同時(shí)提高整體的處理速度。這種設(shè)計(jì)允許模型在保持單個(gè)計(jì)算單元負(fù)載合理的同時(shí),處理更大規(guī)模的記憶層。使得模型可以擴(kuò)展到數(shù)十億甚至數(shù)百億的參數(shù),而不會(huì)受到單個(gè)計(jì)算單元性能的限制。
共享記憶參數(shù)則是另外一個(gè)重要優(yōu)化方法,允許不同層的記憶層共享同一個(gè)參數(shù)集合。這種設(shè)計(jì)的優(yōu)勢(shì)在于,它減少了模型的總參數(shù)數(shù)量,同時(shí)提高了參數(shù)的利用率。
當(dāng)一個(gè)記憶層接收到輸入后,它會(huì)先從共享記憶池中查找最相似的記憶單元,然后根據(jù)查詢(xún)結(jié)果生成輸出。由于所有記憶層都指向同一個(gè)記憶池,因此它們可以在不影響彼此的情況下同時(shí)進(jìn)行操作。
為了應(yīng)對(duì)訓(xùn)練期間可能出現(xiàn)的變化,研究人員開(kāi)發(fā)了一套動(dòng)態(tài)調(diào)整策略。每當(dāng)有新的鍵加入或舊有的鍵被更新時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)整相應(yīng)的子集,而無(wú)需對(duì)整個(gè)記憶池進(jìn)行全面改造。這樣的設(shè)計(jì)既簡(jiǎn)化了維護(hù)流程,又提高了系統(tǒng)的靈活性和適應(yīng)性。
(舉報(bào))