日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你所不知道的 Transformer!

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你所不知道的 Transformer! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者 | 臺運(yùn)鵬


這是 Transformer 系列第一篇!

參考論文:https://arxiv.org/abs/1706.03762

章節(jié)

  • Reasons

  • Self-Attention

    • Multi-Head Attention

  • Positional Encoding

  • Add & Norm

  • Feed Forward

  • Residual Dropout

  • Encoder To Decoder

  • Shared Weights

  • Effect

Reasons For Transformer

新模型的產(chǎn)生往往是為了舊模型的問題所設(shè)計的。那么,原始模型的問題有哪些呢?

1、無法并行運(yùn)算

在transformer之前,大部分應(yīng)該都是RNN,下面簡單介紹一下RNN

可以看出,在計算X2加進(jìn)去吐出來的值的時候必須要先把X1得出的參數(shù)值與X2放在一起才行。換句話說,RNN的計算是必須一個接一個,并不存在并行運(yùn)算。如果不能并行運(yùn)算,那么時間和計算成本均會增加。

2、語義表述不清

傳統(tǒng)的word2vec通過將詞語轉(zhuǎn)換為坐標(biāo)形式,并且根據(jù)距離之遠(yuǎn)近決定兩個詞意思的相近程度。?但是在NLP任務(wù)中,盡管是同一個詞語,但在不同語境下代表的意思很有可能不同。例如,你今天方便的時候,來我家吃飯吧和我肚子不舒服,去廁所方便一下這兩句中方便的意思肯定不一樣。可是,word2vec處理之后坐標(biāo)形式就固定了。

3、突出對待

在一個句子中,當(dāng)我們需要強(qiáng)調(diào)某一個部分的時候,word2vec無法為我們做到這些。比如,

The cat doesn't eat the cake because it is not hungry.

The cat doesn't eat the cake because it smells bad.

第一個句子中it強(qiáng)調(diào)的是the cat,在第二個句子中it強(qiáng)調(diào)的是the cake。

4、長距離信息缺失

盡管RNN處理序列問題很拿手,但如果一個句子很長,那么我要一直把句首的信息攜帶到句尾,距離越長,信息缺失的可能性就會變大。

Self-Attention

attention的意思是我們給有意義的內(nèi)容配以較高的權(quán)重,那么自己與自己做attention是什么意思?

比如這個句中的"green",self的意思就是說拿這個詞與整個句子其他的詞語分別算相似程度。如此便考慮了詞與上下文和句子整體之間的關(guān)系。當(dāng)然,自己與自己肯定是聯(lián)系最緊密。我們的目的是讓機(jī)器能夠判定出某個詞語與整個句子之間的關(guān)系。

那么,如何計算self-attenion呢?

首先將詞編碼成向量,總不大可能直接將詞輸進(jìn)去。其次定義三個矩陣,??這三個矩陣分別代表了Query,Key,Value,分別代表去查詢的,被查詢的以及實(shí)際的特征信息。W的意思是權(quán)重的意思,可以類比于梯度下降,權(quán)重一般都是初始化一個參數(shù),然后通過訓(xùn)練得出。最后用詞向量與矩陣分別做點(diǎn)積即可得到q1,q2,k1,k2,v1,v2。

用q1,q2分別與k1,k2的轉(zhuǎn)置做點(diǎn)積,q代表的要查的,而k是被查的。如此便可得到兩者的關(guān)系了。

注意力一共分為additive attention和這里提到的dot product attention,那么為什么偏要用后者而非前者呢?

因?yàn)閮?nèi)積在實(shí)際中可以用高度優(yōu)化矩陣運(yùn)算,所以更快,同時空間利用率也很好。在此,簡要解釋一下內(nèi)積可以表示兩向量關(guān)系的原因,在坐標(biāo)系中,當(dāng)兩個向量垂直時,其關(guān)系最小,為0。其實(shí)就是cos為0。假如a1,a2兩個向量很接近,那么,它們之間的夾角會很小,可知cos就很大,代表聯(lián)系就越緊密。

在K的維度很小的時候,兩種注意力機(jī)制幾乎一致,但是當(dāng)K的維度上升之后,發(fā)現(xiàn)內(nèi)積效果開始變差。其實(shí),可以聯(lián)系一下Softmax圖像,當(dāng)值變得很大的時候,梯度變化量幾乎很難觀察到,又被稱為梯度消失問題,這是為什么做scale的第一個原因。

在論文中提到

兩者做點(diǎn)積之后還需要除以矩陣K的維度開根號,Q,K,V矩陣維度是q x d_k,p x d_k,p x d_v,softmax是沿著p維進(jìn)行的,但是很多時候大方差會導(dǎo)致數(shù)值分布不均勻,經(jīng)過softmax之后就會大的愈大,小的愈小,這里除以一個矩陣K的維度其實(shí)類似于一個歸一化,讓它的方差趨向于1,分布均勻一點(diǎn),這是第二個原因,所以在原paper里面又叫做Scaled Dot-Product Attention。

那為什么除以一個矩陣K的維度開根號能使方差變?yōu)?呢?首先對于隨機(jī)分布的q,k,方差均為1,期望均為0。我們把特定的一個q_i,k_i看成X,Y。

那么q與k做點(diǎn)積之后的結(jié)果均值為0,方差為d_k。方差太大不穩(wěn)定,所以除以矩陣K的維度開根號,參照鏈接(https://www.zhihu.com/question/339723385) 。

例如 v = 0.36v1 + 0.64v2,v1,v2是矩陣V里的。

既然都是矩陣運(yùn)算,那么都是可以并行加速的。

self-attention除了可以捕獲到句子語法特征外,還可以在長序列中捕獲各個部分的依賴關(guān)系,而同樣的處理用RNN和LSTM需要進(jìn)行按照次序運(yùn)算,迭代幾次之后才有可能得到信息,而且距離越遠(yuǎn),可能捕獲到的可能性就越小。而self-attention極大程度上縮小了距離,更有利于利用特征。


Multi-head Attention

理解了自注意力,那么什么是多頭注意力呢?

類比一下CNN,當(dāng)我們不斷提取特征的時候會用到一個叫卷積核的東西(filter),我們?yōu)榱俗畲蠡崛∮行卣?#xff0c;通常選擇一組卷積核來提取,因?yàn)椴煌木矸e核對圖片的不同區(qū)域的注意力不同。比如,我們要識別一張鳥的圖片,可能第一個卷積核更關(guān)注鳥嘴,第二個卷積核更關(guān)注鳥翅膀等等。

在Transformer中也是如此,不同的Q,K,V矩陣得出的特征關(guān)系也不相同,同樣,不一定一組Q,K,V提取到的關(guān)系能解決問題,所以保險起見,我們用多組。這里可以把一組Q,K,V矩陣類比為一個卷積核,最后再通過全連接層進(jìn)行拼接降維。

Positional Encoding

為什么要進(jìn)行位置編碼呢?

我上面闡述的注意力機(jī)制是不是只說了某個詞與它所處的句子之間的關(guān)系,但是在實(shí)際自然語言處理中,只知道這個詞與句子的關(guān)系而不知道它在哪個位置是不行的。

在這篇論文中,用到了正余弦函數(shù),pos代表的是位置,i是位置編碼的維度,d_model是輸入的維度,因?yàn)槲恢镁幋a要和輸入加在一起,所以兩者維度一致。那么,為什么用正余弦呢?原論文中說對于一個已知的PE_pos,對于一個確定的k,PE_pos+k都可以被表示為PE_pos的線性組合。

那么,既然有了公式,那位置編碼是算出來的還是學(xué)出來的呢?其實(shí)算出來和學(xué)出來的效果差不多,但是考慮到算出來的可以接受更長的序列長度而不必受訓(xùn)練的干擾,所以在這個模型中,位置編碼是通過公式算出來的。

Add & Norm

Add 的意思是殘差相連,思路來源于論文Deep residual learning for image recognition(https://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html),Norm指的是Layer Normalization,來源于論文Layer normalization(https://arxiv.org/abs/1607.06450)。

論文中指出

That is, the output of each sub-layer is LayerNorm(x + Sublayer(x)), where Sublayer(x) is the function implemented by the sub-layer itself

意思是上一層的輸入和輸出結(jié)果相拼接,然后進(jìn)行歸一化,這樣可以更加穩(wěn)定??隙〞凶x者好奇為什么不直接將輸出結(jié)果歸一化,偏要把輸入結(jié)果拼接到輸出結(jié)果然后再歸一化。?

如果還有讀者不明白Backprogation,建議看BP,這里簡要說明一下,求后向傳播的過程中,設(shè)殘差相連之后輸入的層為L層,那么,肯定要求這一層對殘差相連的時候的偏導(dǎo)數(shù),而這時x是作為自變量的,所以對于F(x)+ x,求偏導(dǎo)后x就會變?yōu)?,那么無論什么時候都會加上這個常數(shù)1,這樣會一定程度上緩解梯度消失這個問題。?

這里選取的是層歸一化(Layer Normalization),用CNN舉例,假如我們的輸入是??,分別代表樣本數(shù)量(每一個神經(jīng)元對應(yīng)著一個樣本),通道數(shù),高度和寬度,那么LN就是對于單獨(dú)的每一個樣本做歸一化,計算??個值的均值和標(biāo)準(zhǔn)差然后應(yīng)用到這個樣本里面。歸一化的公式如下:

Feed Forward

Feed-Forward Network究竟做了啥呢?

首先它會引入RELU進(jìn)行非線性變化,也就是公式前半部分所為,而且經(jīng)過這一層之后會被升維,之后把這一層的結(jié)果連接到下一層進(jìn)行線性變化,同時進(jìn)行降維,保證輸入輸出維度一致。

Residual Dropout

在此模型中還在輸入,輸出層和位置編碼拼接中采用了dropout,這里的比例是0.1。

Encoder To Decoder

接下來要把左側(cè)的編碼器和右側(cè)的解碼器進(jìn)行相連,細(xì)心觀察圖會發(fā)現(xiàn)只有兩個箭頭到了右邊,這兩個箭頭代表的是K,V矩陣,Q矩陣由右側(cè)解碼器提供。

另外,解碼器會MASK掉序列的某些部分,因?yàn)槿绻袛鄼C(jī)器是否真正理解了整段句子的意思,可以把后面遮掉,它如果猜的出來,那么說明機(jī)器理解了。具體來說,對于位置i,通常會將i+1后面的全都MASK掉,這樣機(jī)器就是從前面學(xué)到的,它沒有提前看到后面的結(jié)果。

其他結(jié)構(gòu)與編碼器一致,最后再進(jìn)行線性變化,最終用softmax映射成概率。

Shared Weights

我們需要把輸入和輸出轉(zhuǎn)換為向量表示,而向量表示的方法是提前學(xué)到的。此外,最后用的線性轉(zhuǎn)換以及softmax都是學(xué)出來的。和常規(guī)的序列模型一致,輸入輸出以及線性轉(zhuǎn)換用的權(quán)重矩陣是共享的,只不過在輸入輸出層用的時候乘以模型維度開根號。

Effect

一般來說,維度d肯定比序列長度n大很多,所以每一層的復(fù)雜度此模型吊打RNN。模型結(jié)果對比沒多說的,幾乎是碾壓式的。


推薦閱讀

(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

干貨 | 公眾號歷史文章精選

我的深度學(xué)習(xí)入門路線

我的機(jī)器學(xué)習(xí)入門路線圖

重磅

AI有道年度技術(shù)文章電子版PDF來啦!

掃描下方二維碼,添加?AI有道小助手微信,可申請入群,并獲得2020完整技術(shù)文章合集PDF(一定要備注:入群?+ 地點(diǎn) + 學(xué)校/公司。例如:入群+上海+復(fù)旦。?

長按掃碼,申請入群

(添加人數(shù)較多,請耐心等待)

感謝你的分享,點(diǎn)贊,在看三??

總結(jié)

以上是生活随笔為你收集整理的你所不知道的 Transformer!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。