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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NLP】关于Transformer的常见问题及解答

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NLP】关于Transformer的常见问题及解答 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者?|?Adherer?

編輯?|?NewBeeNLP

PDF版文末自行下載哈~

寫在前面

前些時間,趕完論文,開始對 Transformer、GPT、Bert 系列論文來進行仔仔細細的研讀,然后順手把相關問題整理了一下,但是發現鮮有回答仔細的~所以自己就在網上針對每個問題收集了一些資料,并做了整理,有些問題還寫了一些自己的看法,可能會有紕漏,甚至還有錯誤,還請大家賜教 ????

模型總覽:

Transformer模型總覽

1.Transformer 的結構是什么樣的?

Transformer 本身還是一個典型的 encoder-decoder 模型,如果從模型層面來看,Transformer 實際上就像一個 seq2seq with attention 的模型,下面大概說明一下 Transformer 的結構以及各個模塊的組成。

1.1 Encoder 端 & Decoder 端總覽

  • Encoder 端由 N(原論文中「N=6」)個相同的大模塊堆疊而成,其中每個大模塊又由「兩個子模塊」構成,這兩個子模塊分別為多頭 self-attention 模塊,以及一個前饋神經網絡模塊;

    • 「需要注意的是,Encoder 端每個大模塊接收的輸入是不一樣的,第一個大模塊(最底下的那個)接收的輸入是輸入序列的 embedding(embedding 可以通過 word2vec 預訓練得來),其余大模塊接收的是其前一個大模塊的輸出,最后一個模塊的輸出作為整個 Encoder 端的輸出。」

  • Decoder 端同樣由 N(原論文中「N=6」)個相同的大模塊堆疊而成,其中每個大模塊則由「三個子模塊」構成,這三個子模塊分別為多頭 self-attention 模塊,「多頭 Encoder-Decoder attention 交互模塊」,以及一個前饋神經網絡模塊;

    • 同樣需要注意的是,Decoder端每個大模塊接收的輸入也是不一樣的,其中第一個大模塊(最底下的那個)訓練時和測試時的接收的輸入是不一樣的,并且每次訓練時接收的輸入也可能是不一樣的(也就是模型總覽圖示中的"shifted right",后續會解釋),其余大模塊接收的是同樣是其前一個大模塊的輸出,最后一個模塊的輸出作為整個Decoder端的輸出

    • 對于第一個大模塊,簡而言之,其訓練及測試時接收的輸入為:

      • 訓練的時候每次的輸入為上次的輸入加上輸入序列向后移一位的 ground truth(例如每向后移一位就是一個新的單詞,那么則加上其對應的 embedding),特別地,當 decoder 的 time step 為 1 時(也就是第一次接收輸入),其輸入為一個特殊的 token,可能是目標序列開始的 token(如),也可能是源序列結尾的 token(如),也可能是其它視任務而定的輸入等等,不同源碼中可能有微小的差異,其目標則是預測下一個位置的單詞(token)是什么,對應到 time step 為 1 時,則是預測目標序列的第一個單詞(token)是什么,以此類推;

        • 這里需要注意的是,在實際實現中可能不會這樣每次動態的輸入,而是一次性把目標序列的embedding通通輸入第一個大模塊中,然后在多頭attention模塊對序列進行mask即可

      • 而在測試的時候,是先生成第一個位置的輸出,然后有了這個之后,第二次預測時,再將其加入輸入序列,以此類推直至預測結束。

1.2 Encoder 端各個子模塊

「1.2.1 多頭 self-attention 模塊」

在介紹 self-attention 模塊之前,先介紹 self-attention 模塊,圖示如下:

self-attention

上述 attention 可以被描述為「將 query 和 key-value 鍵值對的一組集合映射到輸出」,其中 query,keys,values 和輸出都是向量,其中 query 和 keys 的維度均為,values 的維度為(論文中),輸出被計算為 values 的加權和,其中分配給每個 value 的權重由 query 與對應 key 的相似性函數計算得來。這種 attention 的形式被稱為“Scaled Dot-Product Attention”,對應到公式的形式為:

而多頭 self-attention 模塊,則是將通過參數矩陣映射后(給分別接一個全連接層),然后再做 self-attention,將這個過程重復(原論文中)次,最后再將所有的結果拼接起來,再送入一個全連接層即可,圖示如下:

multi-head attention

對應到公式的形式為:

其中

「1.2.2 前饋神經網絡模塊」

前饋神經網絡模塊(即圖示中的 Feed Forward)由兩個線性變換組成,中間有一個 ReLU 激活函數,對應到公式的形式為:

論文中前饋神經網絡模塊輸入和輸出的維度均為,其內層的維度.

1.3 Decoder 端各個子模塊

「1.3.1 多頭 self-attention 模塊」

Decoder 端多頭 self-attention 模塊與 Encoder 端的一致,但是「需要注意的是 Decoder 端的多頭 self-attention 需要做 mask,因為它在預測時,是“看不到未來的序列的”,所以要將當前預測的單詞(token)及其之后的單詞(token)全部 mask 掉。」

「1.3.2 多頭 Encoder-Decoder attention 交互模塊」

多頭 Encoder-Decoder attention 交互模塊的形式與多頭 self-attention 模塊一致,唯一不同的是其矩陣的來源,其矩陣來源于下面子模塊的輸出(對應到圖中即為 masked 多頭 self-attention 模塊經過 Add & Norm 后的輸出),而矩陣則來源于整個 Encoder 端的輸出,仔細想想其實可以發現,這里的交互模塊就跟 seq2seq with attention 中的機制一樣,目的就在于讓 Decoder 端的單詞(token)給予 Encoder 端對應的單詞(token)“更多的關注(attention weight)”

「1.3.3 前饋神經網絡模塊」

該部分與 Encoder 端的一致

1.4 其他模塊

「1.4.1 Add & Norm 模塊」

Add & Norm 模塊接在 Encoder 端和 Decoder 端每個子模塊的后面,其中 Add 表示殘差連接,Norm 表示 LayerNorm,殘差連接來源于論文Deep Residual Learning for Image Recognition[1],LayerNorm 來源于論文Layer Normalization[2],因此 Encoder 端和 Decoder 端每個子模塊實際的輸出為:LayerNorm ,其中Sublayer?為子模塊的輸出。

「1.4.2? Positional Encoding」

Positional Encoding 添加到 Encoder 端和 Decoder 端最底部的輸入 embedding。Positional Encoding 具有與 embedding 相同的維度

,因此可以對兩者進行求和。

具體做法是使用不同頻率的正弦和余弦函數,公式如下:

其中為位置,為維度,之所以選擇這個函數,是因為任意位置可以表示為的線性函數,這個主要是三角函數的特性:

需要注意的是,Transformer 中的 Positional Encoding 不是通過網絡學習得來的,而是直接通過上述公式計算而來的,論文中也實驗了利用網絡學習 Positional Encoding,發現結果與上述基本一致,但是論文中選擇了正弦和余弦函數版本,「因為三角公式不受序列長度的限制,也就是可以對 比所遇到序列的更長的序列 進行表示。」

2.Transformer Decoder 端的輸入具體是什么?

見上述 Encoder 端 & Decoder 端總覽中,對 Decoder 端的輸入有詳細的分析

3.Transformer 中一直強調的 self-attention 是什么?self-attention 的計算過程?為什么它能發揮如此大的作用?self-attention 為什么要使用 Q、K、V,僅僅使用 Q、V/K、V 或者 V 為什么不行?

3.1 self-attention是什么?

「self-attention」,也叫 「intra-attention」,是一種通過自身和自身相關聯的 attention 機制,從而得到一個更好的 representation 來表達自身,self-attention 可以看成一般 attention 的一種特殊情況。在 self-attention 中,,序列中的每個單詞(token)和該序列中其余單詞(token)進行 attention 計算。self-attention 的特點在于「無視詞(token)之間的距離直接計算依賴關系,從而能夠學習到序列的內部結構」,實現起來也比較簡單,值得注意的是,在后續一些論文中,self-attention 可以當成一個層和 RNN,CNN 等配合使用,并且成功應用到其他 NLP 任務。

3.2 關于 self-attention 的計算過程?

問題 1 中有詳細的解答

3.3 關于 self-attention 為什么它能發揮如此大的作用

在上述 self-attention 的介紹中實際上也有所提及,self-attention 是一種自身和自身相關聯的 attention 機制,這樣能夠得到一個更好的 representation 來表達自身,在多數情況下,自然會對下游任務有一定的促進作用,但是 Transformer 效果顯著及其強大的特征抽取能力是否完全歸功于其 self-attention 模塊,還是存在一定爭議的,參見論文:How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures[3],如下例子可以大概探知 self-attention 的效果:

圖 1 可視化 self-attention 實例圖 2 可視化 self-attention 實例

從兩張圖(圖 1、圖 2)可以看出,self-attention 可以捕獲同一個句子中單詞之間的一些句法特征(比如圖 1 展示的有一定距離的短語結構)或者語義特征(比如圖 1 展示的 its 的指代對象 Law)。

很明顯,引入 Self Attention 后會更容易捕獲句子中長距離的相互依賴的特征,因為如果是 RNN 或者 LSTM,需要依次序序列計算,對于遠距離的相互依賴的特征,要經過若干時間步步驟的信息累積才能將兩者聯系起來,而距離越遠,有效捕獲的可能性越小。

但是 Self Attention 在計算過程中會直接將句子中任意兩個單詞的聯系通過一個計算步驟直接聯系起來,所以遠距離依賴特征之間的距離被極大縮短,有利于有效地利用這些特征。除此外,Self Attention 對于增加計算的并行性也有直接幫助作用。這是為何 Self Attention 逐漸被廣泛使用的主要原因。

3.4 ?關于 self-attention 為什么要使用 Q、K、V,僅僅使用 Q、V/K、V 或者 V 為什么不行?

這個問題我覺得并不重要,self-attention 使用 Q、K、V,這樣三個參數獨立,模型的表達能力和靈活性顯然會比只用 Q、V 或者只用 V 要好些,當然主流 attention 的做法還有很多種,比如說 seq2seq with attention 也就只有 hidden state 來做相似性的計算,處理不同的任務,attention 的做法有細微的不同,但是主體思想還是一致的,不知道有沒有論文對這個問題有過細究,有空去查查~

「其實還有個小細節,因為 self-attention 的范圍是包括自身的(masked self-attention 也是一樣),因此至少是要采用 Q、V 或者 K、V 的形式,而這樣“詢問式”的 attention 方式,個人感覺 Q、K、V 顯然合理一些。」

4.Transformer 為什么需要進行 Multi-head Attention?這樣做有什么好處?Multi-head Attention 的計算過程?各方論文的觀點是什么?

4.1 Why Multi-head Attention

原論文中說到進行 Multi-head Attention 的原因是將模型分為多個頭,形成多個子空間,可以讓模型去關注不同方面的信息,最后再將各個方面的信息綜合起來。其實直觀上也可以想到,如果自己設計這樣的一個模型,必然也不會只做一次 attention,多次 attention 綜合的結果至少能夠起到增強模型的作用,也可以類比 CNN 中同時使用「多個卷積核」的作用,直觀上講,多頭的注意力「有助于網絡捕捉到更豐富的特征/信息」。

4.2 關于 Multi-head Attention 的計算過程

在 1 中也有詳細的介紹,但是需要注意的是,論文中并沒有對 Multi-head Attention 有很強的理論說明,因此后續有不少論文對 Multi-head Attention 機制都有一定的討論,一些相關工作的論文如下(還沒看,先攢著)

4.3 Multi-head Attention 機制相關的論文:

A Structured Self-attentive Sentence Embedding[4]

Analyzing Multi-Head Self-Attention: Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned[5]

Are Sixteen Heads Really Better than One?[6]

What Does BERT Look At? An Analysis of BERT's Attention[7]

A Multiscale Visualization of Attention in the Transformer Model[8]

Improving Deep Transformer with Depth-Scaled Initialization and Merged Attention[9]

5.Transformer 相比于 RNN/LSTM,有什么優勢?為什么?

5.1 RNN 系列的模型,并行計算能力很差

RNN 系列的模型時刻隱層狀態的計算,依賴兩個輸入,一個是時刻的句子輸入單詞,另一個是時刻的隱層狀態的輸出,這是最能體現 RNN 本質特征的一點,RNN 的歷史信息是通過這個信息傳輸渠道往后傳輸的。而 RNN 并行計算的問題就出在這里,因為時刻的計算依賴時刻的隱層計算結果,而時刻的計算依賴時刻的隱層計算結果,如此下去就形成了所謂的序列依賴關系。

5.2 Transformer 的特征抽取能力比 RNN 系列的模型要好

上述結論是通過一些主流的實驗來說明的,并不是嚴格的理論證明,具體實驗對比可以參見:

放棄幻想,全面擁抱 Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較[10]

但是值得注意的是,并不是說 Transformer 就能夠完全替代 RNN 系列的模型了,任何模型都有其適用范圍,同樣的,RNN 系列模型在很多任務上還是首選,熟悉各種模型的內部原理,知其然且知其所以然,才能遇到新任務時,快速分析這時候該用什么樣的模型,該怎么做好。

6.Transformer 是如何訓練的?測試階段如何進行測試呢?

6.1 訓練

Transformer 訓練過程與 seq2seq 類似,首先 Encoder 端得到輸入的 encoding 表示,并將其輸入到 Decoder 端做交互式 attention,之后在 Decoder 端接收其相應的輸入(見 1 中有詳細分析),經過多頭 self-attention 模塊之后,結合 Encoder 端的輸出,再經過 FFN,得到 Decoder 端的輸出之后,最后經過一個線性全連接層,就可以通過 softmax 來預測下一個單詞(token),然后根據 softmax 多分類的損失函數,將 loss 反向傳播即可,所以從整體上來說,Transformer 訓練過程就相當于一個有監督的多分類問題。

  • 需要注意的是,「Encoder 端可以并行計算,一次性將輸入序列全部 encoding 出來,但 Decoder 端不是一次性把所有單詞(token)預測出來的,而是像 seq2seq 一樣一個接著一個預測出來的。」

6.2 測試

而對于測試階段,其與訓練階段唯一不同的是 Decoder 端最底層的輸入,詳細分析見問題 1。

7.Transformer 中的 Add & Norm 模塊,具體是怎么做的?

見 1 其他模塊的敘述,對 Add & Norm 模塊有詳細的分析

8.為什么說 Transformer 可以代替 seq2seq?

這里用代替這個詞略顯不妥當,seq2seq 雖已老,但始終還是有其用武之地,seq2seq 最大的問題在于「將 Encoder 端的所有信息壓縮到一個固定長度的向量中」,并將其作為 Decoder 端首個隱藏狀態的輸入,來預測 Decoder 端第一個單詞(token)的隱藏狀態。在輸入序列比較長的時候,這樣做顯然會損失 Encoder 端的很多信息,而且這樣一股腦的把該固定向量送入 Decoder 端,Decoder 端不能夠關注到其想要關注的信息。

上述兩點都是 seq2seq 模型的缺點,后續論文對這兩點有所改進,如著名的Neural Machine Translation by Jointly Learning to Align and Translate[11],雖然確確實實對 seq2seq 模型有了實質性的改進,但是由于主體模型仍然為 RNN(LSTM)系列的模型,因此模型的并行能力還是受限,而 transformer 不但對 seq2seq 模型這兩點缺點有了實質性的改進(多頭交互式 attention 模塊),而且還引入了 self-attention 模塊,讓源序列和目標序列首先“自關聯”起來,這樣的話,源序列和目標序列自身的 embedding 表示所蘊含的信息更加豐富,而且后續的 FFN 層也增強了模型的表達能力(ACL 2018 會議上有論文對 Self-Attention 和 FFN 等模塊都有實驗分析,見論文:How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures[12]),并且 Transformer 并行計算的能力是遠遠超過 seq2seq 系列的模型,因此我認為這是 transformer 優于 seq2seq 模型的地方。

9.Transformer 中句子的 encoder 表示是什么?如何加入詞序信息的?

Transformer Encoder 端得到的是整個輸入序列的 encoding 表示,其中最重要的是經過了 self-attention 模塊,讓輸入序列的表達更加豐富,而加入詞序信息是使用不同頻率的正弦和余弦函數,具體見 1 中敘述。

10.Transformer 如何并行化的?

Transformer 的并行化我認為主要體現在 self-attention 模塊,在 Encoder 端 Transformer 可以并行處理整個序列,并得到整個輸入序列經過 Encoder 端的輸出,在 self-attention 模塊,對于某個序列,self-attention 模塊可以直接計算的點乘結果,而 RNN 系列的模型就必須按照順序從計算到。

11.self-attention 公式中的歸一化有什么作用?

首先說明做歸一化的原因,隨著的增大,點積后的結果也隨之增大,這樣會將 softmax 函數推入梯度非常小的區域,使得收斂困難(可能出現梯度消失的情況)

為了說明點積變大的原因,假設和的分量是具有均值 0 和方差 1 的獨立隨機變量,那么它們的點積均值為 0,方差為,因此為了抵消這種影響,我們將點積縮放,對于更詳細的分析,參見(有空再來總結,哈哈~):transformer 中的 attention 為什么 scaled?[13]

寫在后面

17 年提出的 Transformer 模型,在當時確實引起了很大的轟動,但是到現在事后看來,Transformer 模型也確實能力很強,但是我覺得并不像論文題目說的那樣《attention is all you need》,反而我覺得論文最大的貢獻在于它第一次做到了在自然語言處理任務中把網絡的深度堆疊上去還能取得很好的效果,而機器翻譯恰好也是一個目前數據量非常豐富且問題本身難度不大的一個任務了,這樣充分發揮了 Transformer 的優勢。另外,self-attention 其實并不是 Transformer 的全部,實際上從深度 CNN 網絡中借鑒而來的 FFN 可能更加重要。所以,理智看待 Transformer,面對不同的任務,選擇最合適自己任務的模型就好了~[14][15][16][17][18][19][20][21][22][23][24]

這篇有點長,手機閱讀可能不太舒服,特意為大家準備了PDF版本,老規矩后臺回復"TS"獲取吧,記得隨手轉分享噢

一起交流

想和你一起學習進步!『NewBeeNLP』目前已經建立了多個不同方向交流群(機器學習 / 深度學習 / 自然語言處理 / 搜索推薦 / 圖網絡 / 面試交流 /?等),名額有限,趕緊添加下方微信加入一起討論交流吧!(注意一定要備注信息才能通過)

本文參考資料

[1]

Deep Residual Learning for Image Recognition: https://arxiv.org/abs/1512.03385

[2]

Layer Normalization: https://arxiv.org/abs/1607.06450

[3]

How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures: http://aclweb.org/anthology/P18-1167

[4]

A Structured Self-attentive Sentence Embedding: https://arxiv.org/abs/1703.03130

[5]

Analyzing Multi-Head Self-Attention: Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned: https://arxiv.org/abs/1905.09418

[6]

Are Sixteen Heads Really Better than One?: https://arxiv.org/abs/1905.10650

[7]

What Does BERT Look At? An Analysis of BERT's Attention: https://arxiv.org/abs/1906.04341

[8]

A Multiscale Visualization of Attention in the Transformer Model: https://arxiv.org/abs/1906.05714

[9]

Improving Deep Transformer with Depth-Scaled Initialization and Merged Attention: https://arxiv.org/abs/1908.11365

[10]

放棄幻想,全面擁抱 Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較: https://zhuanlan.zhihu.com/p/54743941

[11]

Neural Machine Translation by Jointly Learning to Align and Translate: https://arxiv.org/abs/1409.0473

[12]

How Much Attention Do You Need?A Granular Analysis of Neural Machine Translation Architectures: http://aclweb.org/anthology/P18-1167

[13]

transformer 中的 attention 為什么 scaled?: https://www.zhihu.com/question/339723385

[14]

The Illustrated Transformer: https://jalammar.github.io/illustrated-transformer/

[15]

The Annotated Transformer: http://nlp.seas.harvard.edu/2018/04/03/attention.html

[16]

BERT 大火卻不懂 Transformer?讀這一篇就夠了: https://zhuanlan.zhihu.com/p/54356280

[17]

放棄幻想,全面擁抱 Transformer:自然語言處理三大特征抽取器(CNN/RNN/TF)比較: https://zhuanlan.zhihu.com/p/54743941

[18]

為什么 Transformer 需要進行 Multi-head Attention?: https://www.zhihu.com/question/341222779

[19]

transformer 中的 attention 為什么 scaled?: https://www.zhihu.com/question/339723385

[20]

【NLP】Transformer 詳解: https://zhuanlan.zhihu.com/p/44121378

[21]

transformer 和 LSTM 對比的設想?: https://www.zhihu.com/question/311377593

[22]

目前主流的 attention 方法都有哪些?: https://www.zhihu.com/question/68482809

[23]

谷歌論文《Attention is all you need》里 Transformer 模型的一些疑問?: https://www.zhihu.com/question/269481411

[24]

《Attention is All You Need》淺讀(簡介+代碼): https://spaces.ac.cn/archives/4765

-?END?-

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 本站qq群851320808,加入微信群請掃碼:

總結

以上是生活随笔為你收集整理的【NLP】关于Transformer的常见问题及解答的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。