1. Transformer細(xì)節(jié)解讀

        共 2902字,需瀏覽 6分鐘

         ·

        2021-04-02 23:48

        本系列將對(duì)Transformer的關(guān)鍵細(xì)節(jié)進(jìn)行解讀,盡可能用數(shù)學(xué)語言闡述,要讀懂本系列的讀者,只需具備基礎(chǔ)的線性代數(shù)知識(shí)即可。

        self-attention

        attention定義如公式(1)所示:

        44a925a315d50b4f01c6f0464bad7b67.webp

        當(dāng)?b43a3acdd78894e69330416fe0514605.webp?時(shí),就是所謂的“self-attention”。在主流深度學(xué)習(xí)框架中,只要求?619f05ebda42d526cb68d083412485e3.webp?。

        不妨設(shè)?02676bfdc6f4e1892a3ef15f2d391822.webp?,這里?5d156832c6e78555f24433824e6429b8.webp?表示詞序列?04cab03d376b815ba6d9d4cc222007c4.webp?的長度,?e26af73c9a3fed080a61f28b80a1bc45.webp?表示詞序列?bb1a4782c556a182d85296be926bde4a.webp?的長度,840295dc97478038c271d442a20ebe06.webp?表示每個(gè)詞向量的維度,那么公式(1)中的?d1355083409502f5bbe35f6fdb65892e.webp?。首先將?6a0b5b85e7f7ecc52e1e92b01a1d4e21.webp?展開來寫:

        c0233a35f4fe38a518a759490c89c39f.webp

        其中,?fe053e166c7d269dff84d0c4ecdbd6b4.webp?,表示單個(gè)詞向量。接下來對(duì)?b0f7a62fa8e353b538decf671d9fa599.webp?進(jìn)行展開:

        b4b430793d44473fdb6de08fc1660f24.webp

        其中,?be0fe761c3f44bae4a28f49f85740437.webp?表示向量的內(nèi)積,用來衡量向量adeef56fe8a2e53a48551979b834be4f.webp?和 向量f70480b3d0d2f84461102fbe908f6134.webp的相似度,3cf92168e971d8a6a4fa68dd53ec6727.webp?越大則表示 向量adeef56fe8a2e53a48551979b834be4f.webp?和 向量f70480b3d0d2f84461102fbe908f6134.webp?越相似。?6d4684ad7fe3242958a89f0400a3f440.webp?表示 按行?aed6c20084ee263eaefa8ce697eb3817.webp?依次對(duì)?d883db5f44e7d0e632e6ff10909d0043.webp?中每行所在位置的元素進(jìn)行?dd97849d88f5f0d9b091fdf56c6b18d9.webp?操作,即:

        3d492f52d08593b6b8813a8dfca62dab.webp

        dd97849d88f5f0d9b091fdf56c6b18d9.webp?是單增函數(shù),即?3cf92168e971d8a6a4fa68dd53ec6727.webp?越大,?06651326ecc76f1ab68ba4e6afdbed64.webp?越大。

        最后對(duì)?d66a6aaf503dbdb9f2e7fbdf3893379e.webp?展開:

        d3634ad82b5a3418e40caa8d06349609.webp

        公式(5)中任一行向量?229c3c7721f14f372344fb5ae7cc688b.webp?表明,?f70480b3d0d2f84461102fbe908f6134.webp?和?adeef56fe8a2e53a48551979b834be4f.webp?越相似,?af41e8e924a96a93a13bfc3c823e2a0a.webp?的系數(shù)越大,即?af41e8e924a96a93a13bfc3c823e2a0a.webp?在結(jié)果行向量?abac7d70ca3f2ba3dc32758e912bf8d9.webp?貢獻(xiàn)的比例越大。換另一種角度理解,?229c3c7721f14f372344fb5ae7cc688b.webp?建模了詞序列?bb1a4782c556a182d85296be926bde4a.webp?中各個(gè)詞向量?097eb99d8b73c4c6a683634e74b5015f.webp?和詞向量?adeef56fe8a2e53a48551979b834be4f.webp?的相關(guān)關(guān)系。

        softmax padding mask

        由于詞序列是不定長的,所以需要在后面進(jìn)行零填充固定到統(tǒng)一長度,因此才會(huì)出現(xiàn)所謂的"padding mask"。

        對(duì)?9d87749ba43035b4b11a6cb6a25b6b31.webp?分析(這里還沒有進(jìn)行softmax操作)。假定?30d30ecef3416e4d411972abc823047b.webp?,即零填充向量,那么?612685ef0b8cf9bdc0e972dab8ef2174.webp?。由于?3fbd2de77e66862db991293381f757f5.webp?表示向量adeef56fe8a2e53a48551979b834be4f.webp?和 向量f70480b3d0d2f84461102fbe908f6134.webp的相似度。往往假定,零填充向量和向量?adeef56fe8a2e53a48551979b834be4f.webp?是最不相關(guān)的。因此,在進(jìn)行softmax操作前,我們需要將?7ef21b2dc9cb740e43f879b834d80d1c.webp?,那么?80ba6c0fd9d679281eedd122bd786d8a.webp?。

        常規(guī)的做法

        假設(shè)詞序列?04cab03d376b815ba6d9d4cc222007c4.webp?的padding mask矩陣為?20d8c78e0c63b850592c0454fe0fe424.webp?詞序列?455b828e901463446dc25dfc80bd0782.webp?的padding mask矩陣為?4a11b81fc4d25d888694e0b1f84678fe.webp?記?8e3405c54b4e94eb09c4aeb8a2dd83fd.webp?,先將?dc8e201cf6e42af027b41dce74005032.webp?取反,然后乘以?68bc8ff8a66e0bd1c78afc485d93e835.webp?,其次加上?b0f7a62fa8e353b538decf671d9fa599.webp?,最后進(jìn)行?dd97849d88f5f0d9b091fdf56c6b18d9.webp?操作。

        快速的做法

        由于后面還要做query padding mask,所以詞序列?04cab03d376b815ba6d9d4cc222007c4.webp?的padding mask矩陣是怎么樣的,在這里沒有任何關(guān)系,不妨假定為全?0c62b2b0a69dcb1da5f6a35056c453f9.webp?矩陣。換句話說,只需要知道詞序列455b828e901463446dc25dfc80bd0782.webp?的padding mask矩陣?28d8a99089d3cdf951905335fdda1254.webp?,直接對(duì)28d8a99089d3cdf951905335fdda1254.webp?取反,然后乘以?68bc8ff8a66e0bd1c78afc485d93e835.webp?,其次加上?b0f7a62fa8e353b538decf671d9fa599.webp?,最后進(jìn)行?dd97849d88f5f0d9b091fdf56c6b18d9.webp?操作即可。

        query padding mask

        query padding mask只需:113dd84bab704d79feb7beff6be22e54.webp?。但實(shí)際上,Transformer是不需要每次都做query padding mask,因?yàn)門ransformer中的各個(gè)詞向量是獨(dú)立操作的,互不干擾了,即論文中的“并行”,所以只需在輸出之前的最后一步做query padding mask即可。

        關(guān)于 縮放因子10b19983ad97950b64711b07e1671db3.webp

        縮放因子10b19983ad97950b64711b07e1671db3.webp是為了防止?3fbd2de77e66862db991293381f757f5.webp?不至于過大或過?。凑蹈?,負(fù)值更大),那么?4bd6204fc6ecbccd42eb2857add60df3.webp?做?dd97849d88f5f0d9b091fdf56c6b18d9.webp?就比較平均。




        multi-head self-attention (MHSA)

        MHSA

        不妨設(shè)?4f99e7d5477fc9288008bc4fd7ae752e.webp?,SA如公式(1)所示:

        1a08b0f4d48a25d3b6a16216d1d6977b.webp

        MHSA則分別先對(duì)?6a0b5b85e7f7ecc52e1e92b01a1d4e21.webp?進(jìn)行線性升維操作(即全連接操作,參數(shù)不共享),輸出?d9720988d69a51da4119a3f95c45acd6.webp?,然后按“頭”做?7a79df41fad5eba76d2e53dce30f49ed.webp?次,最后把結(jié)果拼接起來。如公式(2)所示:

        46d540daa093c28d888d14c2dbe445a8.webp

        其中,?500f3d78dab98edaa946dedbd064abc6.webp

        說白了,MHSA就是分別先把?6a0b5b85e7f7ecc52e1e92b01a1d4e21.webp?進(jìn)行線性升維,然后對(duì)每個(gè)“頭”并行做?f68156bfa8e70679e9b2a59c7e02f7d2.webp?,總共?7a79df41fad5eba76d2e53dce30f49ed.webp?個(gè)“頭”,最后把結(jié)果拼接起來。

        時(shí)間復(fù)雜度分析

        假定單個(gè)矩陣的運(yùn)算使用常規(guī)做法,那么純?f68156bfa8e70679e9b2a59c7e02f7d2.webp?的時(shí)間復(fù)雜度如公式(4)所示:

        c9b68efecc385caafdcedb4e34cbc3ef.webp

        MHSA的時(shí)間復(fù)雜度如公式(5)所示:

        4be98468171d8cb24b228c10312cd14d.webp

        公式(5)中的?cdc0da9f1d922adebc0e1169222aa20c.webp?表示MHSA做線性升維并行的開銷時(shí)間,?4a076c77645e185ac62c4fbfb1630ec8.webp?表示做多“頭”并行的開銷時(shí)間。

        假定忽略并行開銷的時(shí)間,且?f3522ee11f4efbcf111aa2b8017545e5.webp?,那么有公式(6):

        1ceb58b1acd685b682cd0eeb01fd1d08.webp

        公式(6)表明MHSA總可以通過調(diào)節(jié)?06c80c8a30a0ab0cfd6545e531eaa4df.webp?來獲得比?f68156bfa8e70679e9b2a59c7e02f7d2.webp?更少的時(shí)間復(fù)雜度。通常,?03f991928c1d97a1fa1108ab6b7dfe5e.webp?,因此總有:?011b6b0c08fbcb83e2b24584df0a9ccd.webp?。

        優(yōu)勢在哪里?

        假定?08765176ad293bc5217bfb7ca0b1f048.webp?,那么MHSA既能用更少的時(shí)間復(fù)雜度,又能獲得更好的性能。因?yàn)楦呔S信息總是不劣于低維信息,比如:低維空間不可分的問題,高維空間可分;低維空間很難優(yōu)化的,高維空間更容易優(yōu)化,所以神經(jīng)網(wǎng)絡(luò)的向量維度都要逐步上升的。如果?c5a15979dccfa9ce46d1c8a1f862a11b.webp?,MHSA的性能會(huì)低于SA,因?yàn)椤跋确趾缶邸钡淖龇ǎ€是會(huì)有損性能的。

        但是仔細(xì)一想,不管是線性升維還是并行,都需要更多的內(nèi)存開銷,因此MHSA也屬于用空間復(fù)雜度換時(shí)間復(fù)雜度的例子吧。

        總結(jié)來說,MHSA的優(yōu)勢:

        “分治的思想,充分利用顯卡的并行性,通過空間復(fù)雜度換取時(shí)間復(fù)雜度。如果?739612df47aa34d65a2bcd88be7ea58a.webp?,那么還能有更好的性能”

        值得注意的是,并行在移動(dòng)終端和嵌入設(shè)備,表現(xiàn)得不好~


        通常來說,基于Transformer的神經(jīng)網(wǎng)絡(luò)模型只在兩處做padding mask,一處是在多頭注意力中做softmax padding mask(當(dāng)然,有多個(gè)Transformer就有多個(gè)softmax padding mask),另一處是loss前的最后一步做padding mask。

        為什么Transformer只在多頭注意力中做softmax padding mask?其他層呢?不是說padding mask很重要嗎?

        不急,一步一步來回答。列舉一下Transformer的組件:多頭注意力層、全連接層、Dropout層、激活函數(shù)層、LN層和add層。

        首先,Dropout層、激活函數(shù)層和add層對(duì)詞序列中的各個(gè)詞向量是獨(dú)立操作的,顯然成立,那么本應(yīng)被零填充的詞向量是什么,無關(guān)緊要,因?yàn)椴粫?huì)影響其他非零填充向量,所以只需在loss前的最后一步做padding mask。

        其次,全連接層對(duì)詞序列中的各個(gè)詞向量也是獨(dú)立操作的,因?yàn)槿B接層會(huì)給每個(gè)詞向量都獨(dú)立分配一個(gè)向量權(quán)重和偏置參數(shù),也是易得(有興趣的讀者,自己可以推導(dǎo)一下),那么本應(yīng)被零填充的詞向量是什么,無關(guān)緊要,因?yàn)椴粫?huì)影響其他非零填充向量的參數(shù)訓(xùn)練,所以也只需在loss前的最后一步做padding mask。

        最后,就只剩下LN層了。大部分深度學(xué)習(xí)框架都是沿著詞向量維度做標(biāo)準(zhǔn)化,然后參數(shù)也是沿著詞向量維度。換句話說,所有詞向量共享一個(gè)?b890eb104d49954f2bd0f6f5888e418c.webp?向量參數(shù)和一個(gè)?b00083dd63cc6d3002c09884b1078dbf.webp?向量參數(shù)。那么本應(yīng)零填充卻沒有零填充,會(huì)不會(huì)影響共享向量參數(shù)的更新呢?

        LN層的獨(dú)立

        答案是不一定會(huì)。要看場景,比如:A、B、C共用一臺(tái)電腦,C每次使用電腦,都恢復(fù)電腦原樣,那么在A和B看來,電腦只被A和B共用,因?yàn)镃不會(huì)改變電腦。

        對(duì)應(yīng)到神經(jīng)網(wǎng)絡(luò)中,“C每次使用電腦,都恢復(fù)電腦原樣”對(duì)應(yīng)只在loss前的最后一步做padding mask,“C不會(huì)改變電腦”對(duì)應(yīng)零填充向量不改變共享參數(shù)的更新。

        那么,只在loss前的最后一步做padding mask,零填充向量是否會(huì)改變共享參數(shù)的更新,即是否參與共享參數(shù)的梯度計(jì)算呢?答案是不會(huì)。這里筆者就直接把最后的結(jié)果寫出來,推導(dǎo)還是比較繁瑣的,具體可以參考BN的反向傳播推導(dǎo):

        bbb1f95eafbf8857ef3274d88ae565bc.webp

        其中,?59e3511592907bd36eca3a1c6ee0b9ab.webp表示詞序列,994978aa30de026bb8dbbd6652a111b2.webp?表示?c75619a57d61d574d647f35106defc2c.webp?mask向量,所在位置為0,那么?59e3511592907bd36eca3a1c6ee0b9ab.webp?該位置為零填充。由公式(1)表示,只需在loss前的最后一步做padding mask,那么零填充不會(huì)參與共享參數(shù)梯度的計(jì)算。當(dāng)然,公式(1)不是嚴(yán)謹(jǐn)?shù)耐茖?dǎo),只是大概表達(dá)了零填充向量不參與共享參數(shù)的梯度計(jì)算。

        結(jié)論

        共享,不等價(jià)于一定不能相互獨(dú)立。要看場景。就好比,對(duì)所有進(jìn)程,CPU是共享的,但當(dāng)某進(jìn)程使用時(shí),就是獨(dú)占CPU的,所以感覺就是,每個(gè)進(jìn)程獨(dú)立使用一個(gè)CPU。


        瀏覽 74
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 亚洲无码视频在线看 | 国产成人三级在线观看 | 一区二区三区四区欧美精品 | 影音先锋伦理电影 | 免费一级婬片AA片观看 |