我们可以无损放大一个Transformer模型吗?
?PaperWeekly 原創(chuàng) ·?作者?|?蘇劍林
單位?|?追一科技
研究方向?|?NLP、神經(jīng)網(wǎng)絡(luò)
看了標(biāo)題,可能讀者會有疑惑,大家不都想著將大模型縮小嗎?怎么你想著將小模型放大了?其實(shí)背景是這樣的:通常來說更大的模型加更多的數(shù)據(jù)確實(shí)能起得更好的效果,然而算力有限的情況下,從零預(yù)訓(xùn)練一個(gè)大的模型時(shí)間成本太大了,如果還要調(diào)試幾次參數(shù),那么可能幾個(gè)月就過去了。
這時(shí)候“窮人思維”就冒出來了(土豪可以無視):能否先訓(xùn)練一個(gè)同樣層數(shù)的小模型,然后放大后繼續(xù)訓(xùn)練? 這樣一來,預(yù)訓(xùn)練后的小模型權(quán)重經(jīng)過放大后,就是大模型一個(gè)起點(diǎn)很高的初始化權(quán)重,那么大模型階段的訓(xùn)練步數(shù)就可以減少了,從而縮短整體的訓(xùn)練時(shí)間。
那么,小模型可以無損地放大為一個(gè)大模型嗎?本文就來從理論上分析這個(gè)問題。
含義
有的讀者可能想到:這肯定可以呀,大模型的擬合能力肯定大于小模型呀。的確,從擬合能力角度來看,這件事肯定是可以辦到的,但這還不是本文關(guān)心的“無損放大”的全部。
以 BERT 為例,預(yù)訓(xùn)練階段主要就是一個(gè) MLM 模型,那么“無損放大”的含義就是:是否可以通過某種變換,把一個(gè)小模型直接變換成一個(gè)大模型,并且輸出完全不改變?
這里的變換,指的是對權(quán)重做一些確定性的變換,而不用通過梯度下降來繼續(xù)訓(xùn)練;輸出完全不改變,指的是對于同一個(gè)輸入,小模型和大模型給出的預(yù)測結(jié)果是完全一致的,也就是說它們表面上看起來不一樣,但數(shù)學(xué)上它們是完全一致的函數(shù),所以稱為“無損放大”。由于是無損放大,我們至少可以保證大模型不差于小模型,所以繼續(xù)預(yù)訓(xùn)練理論上有正的收益。至于先小后大這樣預(yù)訓(xùn)練在效果上能不能比得上一開始就從大訓(xùn)練,這個(gè)需要實(shí)驗(yàn)來確定,并不是本文關(guān)心的問題。
直覺來想,這種放大也不困難,比如通過“重復(fù)”、“補(bǔ)零”等操作就可以實(shí)現(xiàn)模型權(quán)重的自然放大。事實(shí)上嘗試的方向也是如此,但難點(diǎn)在于我們需要仔細(xì)分析模型的每一個(gè)模塊在被放大之后所產(chǎn)生的后果,以確保最終的結(jié)果是無損的。
嘗試
下面我們以“將一個(gè) BERT 放大為 2 倍”為例子進(jìn)行分析嘗試,來確定最終的變換形式。這里的“放大”指的是僅僅擴(kuò)大隱層向量的維度,并不改變模型的層數(shù),也不改變多頭注意力機(jī)制的頭數(shù)。
2.1 Embedding
首先,輸入層是 Embedding 層,因此先要解決的是 Embedding 層的放大問題。這也是其中最簡單的一環(huán),就是直接將每個(gè) token 的向量維度都放大為 2 倍即可,主要就是“重復(fù)”、“補(bǔ)零”兩種操作:
兩種方案都可以作為候選方案,但直覺上來想,補(bǔ)零這種方式引入了太多的零,會導(dǎo)致過度稀疏和同一個(gè)值重復(fù)次數(shù)過多,不利于權(quán)重的多樣性,因此我們還是選擇了重復(fù)這種方案。不過,就算只看重復(fù),也不指上述一種方式,比如 也是一種方案,但后面關(guān)于 Attention 層的分析表明,后一種方案是不可取的。
除此之外,我們通常還希望變換是正交的,這通常能最大程度上保證模型的穩(wěn)定性,具體來說,正交變換的最基本性質(zhì)是不改變向量的模型,所以我們將最終的重復(fù)變換調(diào)整為:
或者簡記成 ,其中 是上取整運(yùn)算,我們稱之為“重復(fù)再除以 ”。
2.2 LayerNorm
Embedding 的下一層就是 LayerNorm 了,變換前,LayerNorm 的運(yùn)算為:
而變換后,我們有:
這也就是說,“減均值除以標(biāo)準(zhǔn)差”這一步自動幫我們消去了 這個(gè)因子,其結(jié)果是放大前結(jié)果的直接重復(fù)。如果我們將參數(shù)向量 也按照公式(2)進(jìn)行變換,那么結(jié)果將是 ,跟 Embedding 層的變換結(jié)果一致,而我們就是要盡量使得每一層“凈變換”都是同樣的一個(gè)簡單變換:“重復(fù)再除以 ”。
2.3 FeedForward
按照順序,接下來本來應(yīng)該分析 Attention 層才對,不過 FeedForward 層相對簡單一點(diǎn),并且 FeedForward 層的分析結(jié)果也對后面理解 Attention 層的變換有所幫助,因此這里先來考慮 FeedForward 層的變換。
FeedForward 層只是兩個(gè)全連接層的復(fù)合,所以我們只需要分析單個(gè)全連接層:
這里的 是激活函數(shù)。鑒于之前的經(jīng)驗(yàn),我們嘗試如下變換:
也就是將 按照式(2)進(jìn)行變換,而對于 則嘗試使用形式下述變換:
這里的 D 就是輸出維度大小,這里我們假設(shè)模型放大 2 倍后,D 也放大 2 倍。不難看出,該變換其實(shí)就是對變換矩陣 行列兩個(gè)方向都分別執(zhí)行變換(2)。此時(shí):
這說明變換(6)對于線性變換層來說,能夠滿足我們的理想追求——放大后的結(jié)果就是“重復(fù)再除以 ”。然而,這還不夠,因?yàn)槿B接層還有個(gè)激活函數(shù) ,現(xiàn)在的問題在于 未必等于 ,而如果不等,我們就沒法讓整體的變換等價(jià)于“重復(fù)再除以 ”。
事實(shí)上,BERT 用的 GeLU 激活函數(shù)就不滿足該恒等式;線性激活函數(shù)(不加激活函數(shù))顯然是滿足這個(gè)等式的,而滿足這個(gè)等式一個(gè)常見的非線性激活函數(shù)便是?ReLU(也包括 LeakyReLU)函數(shù),因此一個(gè)直接的解決方式就是 FeedForward 層換用 ReLU 激活函數(shù)。事實(shí)上,這也已經(jīng)是預(yù)訓(xùn)練模型的一個(gè)常見選擇了,百度的 Ernie 和 Google 的 T5 模型,它們的 FeedForward 層激活函數(shù)都是用 ReLU。
那么,像 BERT 這樣的非 ReLU 激活函數(shù)的 FeedForward 層就沒辦法了嗎?那也不至于,因?yàn)?FeedForward 層是兩個(gè)全連接層的復(fù)合,我們只需要在變換第一個(gè)全連接的時(shí)候少除以一個(gè) ,變換第二個(gè)全連接的時(shí)候多除以一個(gè) 就行了。具體來說,第一個(gè)全連接權(quán)重變?yōu)?#xff1a;
此時(shí)就有:
此時(shí)結(jié)果就是原結(jié)果的直接重復(fù),沒有除以 ,既然如此,后面緊接著的全連接層多除以一個(gè) 就行了,即后面的全連接層權(quán)重變換為:
這樣整個(gè) FeedForward 層的效果就等價(jià)于“重復(fù)再除以 ”了。
2.4 Attention
現(xiàn)在到了最難啃的“硬骨頭”——Attention 層的變換。Attention 層首先通過三個(gè)線性層將每個(gè)輸入向量變換為 q,k,v:
根據(jù)前面對 FeedForward 層的分析可以得知,如果要想 q,k,v 都達(dá)到“重復(fù)再除以 ”的效果,只需要按照變換(6)進(jìn)行。但 Attention 層不是單純的全連接層,變換完之后,我們要檢查 Attention 矩陣是否不變,我們來算內(nèi)積:
其中 d' 是對應(yīng)的 head_size。這個(gè)結(jié)果告訴我們,上述變換保持了內(nèi)積不變,所以應(yīng)該也保持 Attention 矩陣不變。但是,這里有一個(gè)陷阱!如果是 T5 這樣的模型,它的內(nèi)積之后是沒有尺度縮放的,所以這樣的確完事了;然而像 BERT 這樣的模型,它是內(nèi)積之后除了個(gè) 再做 Softmax 的,,而一旦放大模型后,除以 變成了除以 ,內(nèi)積不變也不能保持 Attention 矩陣不變,而應(yīng)當(dāng)還需要往 q,k 的權(quán)重分別再乘個(gè) ,所以最終的變換應(yīng)該是:
經(jīng)過這樣變換后,Attention 矩陣不變,而 ,所以最終的輸出結(jié)果也是 。
上述內(nèi)容只是針對 Attention 的單個(gè)頭進(jìn)行分析,事實(shí)上 Attention 有多個(gè)頭,多個(gè)頭的輸出結(jié)果還要拼接起來再接一個(gè)全連接層。當(dāng)然,由于每個(gè)頭都是平等的、獨(dú)立的,因此上述結(jié)論基本不變,最后全連接層也只需要按照式(6)進(jìn)行變換,就可以讓 Attention 的變換效果。但是,多頭帶來的一個(gè)效應(yīng)是,我們在重復(fù)的時(shí)候,必須局部地進(jìn)行重復(fù)。
具體來說,我們在實(shí)現(xiàn)多頭的時(shí)候,并非是真的做了多個(gè)全連接運(yùn)算,而是做了一個(gè)大的全連接運(yùn)算后再 reshape,這樣一來我們可以比較兩種不同的重復(fù)方式的 reshape 結(jié)果:
注意放大前 reshape 結(jié)果是 ,所以對比兩種不同的重復(fù)方式的 reshape 結(jié)果,我們發(fā)現(xiàn)第二種重復(fù)方式 reshape 之后的結(jié)果全亂了,不等價(jià)于每個(gè)頭分別重復(fù)。因此我們只能選擇前一種重復(fù)方式。
2.5 輸出概率分布
通過以上分析,我們可以使得整個(gè) Encoder 在放大到 2 倍之后,實(shí)現(xiàn)“重復(fù)再除以 ”的效果。最后剩下的就是輸出部分,即將 Encoder 的輸出向量轉(zhuǎn)化為 token 的概率分布,這里邊包含幾種情況。
像 GPT、T5 等模型,它們是直接在 Encoder 輸出后面乘以了 Embedding 矩陣的轉(zhuǎn)置來做作為概率分布的 logits(當(dāng)然有可能還有個(gè)偏置),由于 Embedding 矩陣本身就包含了“重復(fù)再除以 ”的操作,而 Encoder 的輸出也是“重復(fù)再除以 ”,兩者結(jié)合剛好抵消,所以從概率分布角度看,輸出是完全不變的。
不過 BERT 多了一層全連接,也就是說它先接了一個(gè) GeLU 激活的全連接層,然后才乘以 Embedding 矩陣的轉(zhuǎn)置并加上偏置項(xiàng)作為 logitis。在“FeedForward”那一節(jié)我們已經(jīng)討論了,非 ReLU 激活的全連接層無法實(shí)現(xiàn)“重復(fù)再除以 ”的效果,而只能通過變換(9)來實(shí)現(xiàn)單純的“重復(fù)”效果,這時(shí)候乘以 Embedding 矩陣的轉(zhuǎn)置的話,得到的是原來的 logits 乘以 的效果,輸出會有所改變。
當(dāng)然,由于只是乘以了一個(gè)常數(shù)倍,所以分布雖然改變了,但是每個(gè) token 的概率大小順序并沒有改變,這也就意味著,如果只看 MLM 的準(zhǔn)確率,那么是完全沒有改變的,所以問題應(yīng)該不大。
當(dāng)然,如果是 ReLU 激活,那么按照式(6)來變換,那么可以實(shí)現(xiàn)完全不改變了。此外,如果是像 mT5 那樣,最后轉(zhuǎn)為 logits 的變換矩陣跟 Embedding 層不共享,那么可以同時(shí)調(diào)整最后的變換矩陣,也能實(shí)現(xiàn)輸出的完全不變。
2.6 RoPE位置編碼
前面的分析都只適用于每個(gè)神經(jīng)元都是不相關(guān)的情形,也就是說向量的任意兩個(gè)分量 是沒啥關(guān)聯(lián)的。但如果我們在模型中用了“旋轉(zhuǎn)式位置編碼(RoPE)”,那么這個(gè)假設(shè)就不成立了,因?yàn)?RoPE 是以每兩個(gè)分量為一組進(jìn)行變換的,即 為一組、 為一組,依此類推。
如果還是按照之前式(2)進(jìn)行重復(fù)變換,那么變換之后就變成了 為一組、 為一組、...,跟原來的分組不一致,所以會帶來很大的偏差。這種情況下,重復(fù)的時(shí)候也應(yīng)當(dāng)按照兩個(gè)為一組來進(jìn)行:
當(dāng)然,由于默認(rèn)的 RoPE 是沒有可訓(xùn)練權(quán)重的,它是按照固定的方式進(jìn)行漸變的,所以哪怕按照該方式進(jìn)行重復(fù),那不能完全保證結(jié)果一致。也就是說,如果使用了 RoPE,那么基本上不能實(shí)現(xiàn)無損放大。不過實(shí)際測試結(jié)果表明,按照該方式進(jìn)行重復(fù)放大后,對應(yīng)的 RoFormer 雖然性能有所損失,但不多,可以很快通過繼續(xù)訓(xùn)練恢復(fù)。
結(jié)論
現(xiàn)在我們可以確認(rèn),對于 BERT 來說,如果非線性激活函數(shù)用 ReLU,那么 BERT 是可以直接無損放大的,如果非線性激活函數(shù)不是 ReLU,那么可以實(shí)現(xiàn) MLM 準(zhǔn)確率無損的放大(事實(shí)上經(jīng)過更精細(xì)的調(diào)整,也可以實(shí)現(xiàn)完全無損放大,但每個(gè)層的變換有點(diǎn)不統(tǒng)一了,不夠優(yōu)雅);對于 GPT、T5 等模型來說,不管激活函數(shù)用啥(包括 mT5 用的 GLU 激活,也可以定制適當(dāng)),其實(shí)都可以實(shí)現(xiàn)無損放大。
其中,將 BERT 權(quán)重進(jìn)行放大為 2 倍的變換匯總?cè)缦?#xff1a;
如果是其他略有不同的模型,那么就模仿前面的思想進(jìn)行類似的分析即可。如果是 RoPE,那么將重復(fù)的方案改為式(15)就好;如果是擴(kuò)大k倍,那么將表格中的多數(shù) 2 換為 k 就好。簡單來說,如果 Attention 沒有尺度縮放(除以 ),以及 FeedForward 的激活函數(shù)是 ReLU(或者 LeakyReLU),那么放大 k 倍的變換就最簡單的,將權(quán)重的每一維都執(zhí)行“重復(fù) k 次并除以 ”就好了。
小結(jié)
本文從數(shù)學(xué)上分析了直接放大 Transformer 模型的可能性,得到了若干可用的變換,在部分情況下可以無損放大 Transformer 模型,另外一些情況則可以將損失降到很小(比如保持 MLM 的準(zhǔn)確率完全不變)。而研究 Transformer 模型的無損放大操作,可以為我們實(shí)現(xiàn)漸進(jìn)式地訓(xùn)練大模型提供參考思路。
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識的人。
總有一些你不認(rèn)識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)術(shù)熱點(diǎn)剖析、科研心得或競賽經(jīng)驗(yàn)講解等。我們的目的只有一個(gè),讓知識真正流動起來。
?????稿件基本要求:
? 文章確系個(gè)人原創(chuàng)作品,未曾在公開渠道發(fā)表,如為其他平臺已發(fā)表或待發(fā)表的文章,請明確標(biāo)注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發(fā)送,要求圖片清晰,無版權(quán)問題
? PaperWeekly 尊重原作者署名權(quán),并將為每篇被采納的原創(chuàng)首發(fā)稿件,提供業(yè)內(nèi)具有競爭力稿酬,具體依據(jù)文章閱讀量和文章質(zhì)量階梯制結(jié)算
?????投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時(shí)聯(lián)系方式(微信),以便我們在稿件選用的第一時(shí)間聯(lián)系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
????
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結(jié)
以上是生活随笔為你收集整理的我们可以无损放大一个Transformer模型吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 祖名豆腐皮自带咸味吗?
- 下一篇: WSDM 2021 | 基于双向推理的多