transformer model architecture
https://www.datacamp.com/tutorial/how-transformers-work
動手寫
https://www.datacamp.com/tutorial/building-a-transformer-with-py-torch
Attention
https://www.cnblogs.com/jins-note/p/13056604.html
人類的視覺注意力
從注意力模型的命名方式看,很明顯其借鑑了人類的注意力機制,因此,我們首先簡單介紹人類視覺的選擇性注意力機制。
圖1 人類的視覺注意力
視覺注意力機制是人類視覺所特有的大腦訊號處理機制。人類視覺透過快速掃描全域性影像,獲得需要重點關注的目標區域,也就是一般所說的注意力焦點,而後對這一區域投入更多注意力資源,以獲取更多所需要關注目標的細節資訊,而抑制其他無用資訊。
這是人類利用有限的注意力資源從大量資訊中快速篩選出高價值資訊的手段,是人類在長期進化中形成的一種生存機制,人類視覺注意力機制極大地提高了視覺資訊處理的效率與準確性。
圖1形象化展示了人類在看到一副影像時是如何高效分配有限的注意力資源的,其中紅色區域表明視覺系統更關注的目標,很明顯對於圖1所示的場景,人們會把注意力更多投入到人的臉部,文字的標題以及文章首句等位置。
深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,核心目標也是從眾多資訊中選擇出對當前任務目標更關鍵的資訊。
https://blog.csdn.net/weixin_42392454/article/details/122478544
1、什麼是attention?
在人類的理解中,對待問題是有明顯的側重。具體舉個例子來說:“我喜歡踢足球,更喜歡打籃球。”,對於人類來說,顯然知道這個人更喜歡打籃球。但對於深度學習來說,在不知道”更“這個字的含義前,是沒辦法知道這個結果的。所以在訓練模型的時候,我們會加大“更”字的權重,讓它在句子中的重要性獲得更大的佔比。比如:
C ( s e q ) = F ( 0.1 ∗ d ( 我 ) , 0.1 ∗ d ( 喜 ) , . . . , 0.8 ∗ d ( 更 ) , 0.2 ∗ d ( 喜 ) , . . . ) C(seq) = F(0.1*d(我),0.1*d(喜),...,0.8*d(更),0.2*d(喜),...) C(seq)=F(0.1∗d(我),0.1∗d(喜),...,0.8∗d(更),0.2∗d(喜),...)
2、什麼是self-attention?
在知道了attention在機器學習中的含義之後(下文都稱之為注意力機制)。人為設計的注意力機制,是非常主觀的,而且沒有一個準則來評定,這個權重設定為多少才好。所以,如何讓模型自己對變數的權重進行自賦值成了一個問題,這個權重自賦值的過程也就是self-attention。
https://zhuanlan.zhihu.com/p/619154409
一、Self-Attention是什麼?
在理解Self-Attention之前,我們先通俗的解釋一下什麼是Attention。我們首先看一張圖:
我們大部分人第一眼注意到的一定是東方明珠,但是這圖其實還有旁邊的樓,下面的汽車等等。這其實就是一種Attention,我們關注的是最主要的東西,而刻意“忽視”那些次要的東西。
我們再來講解一個重要的概念,即query、key和value。這三個詞翻譯成中文就是查詢、鍵、值,看到這中文的意思,還是迷迷糊糊的。我們來舉個例子:小明想在b站搜尋深度學習,他把深度學習四個字輸入到搜尋欄,按下搜尋鍵。搜尋引擎就會將他的查詢query對映到資料庫中相關的標籤key,如吳恩達、神經網路等等,然後向小明展示最匹配的結果value。
最後我們來說說Self-Attention。和Attention類似,他們都是一種注意力機制。不同的是Attention是source對target,輸入的source和輸出的target內容不同。例如英譯中,輸入英文,輸出中文。而Self-Attention是source對source,是source內部元素之間或者target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的注意力機制。
訓練和推理 對應的 輸入 和 輸出?
在Transformer模型架構中,訓練階段和預測階段(也稱為推理階段)對應的輸入和輸出是有所不同的。以下是對這兩個階段輸入和輸出的詳細解釋:
訓練階段
輸入
- 源序列(Source Sequence):
- 這是模型的主要輸入,包含源語言的句子或文字序列。在機器翻譯任務中,源序列即為需要被翻譯的原文。
- 源序列首先會經過詞嵌入層(Embedding Layer)和位置編碼層(Positional Encoding Layer),將文字轉換為模型可以處理的數值形式。
- 目標序列字首(Target Sequence Prefix):
- 在訓練過程中,目標序列(即源序列的翻譯結果或任務目標輸出)會被分成兩部分:字首部分和剩餘部分。字首部分作為解碼器(Decoder)的輸入,而剩餘部分則用於與解碼器的輸出進行比較,以計算損失並更新模型引數。
- 例如,在機器翻譯任務中,如果目標序列是“I am a student”,則字首部分可能是“<start> I am a”,剩餘部分是“student”。
輸出
- 預測的目標序列:
- 解碼器基於源序列和目標序列字首生成預測的目標序列。在訓練階段,這個預測的目標序列會與真實的目標序列剩餘部分進行比較,以計算損失。
- 損失通常透過某種形式的損失函式(如交叉熵損失)來計算,用於評估模型預測的準確性。
預測階段(推理階段)
輸入
- 源序列(Source Sequence):
- 與訓練階段相同,預測階段的輸入也包含源序列。
- 源序列同樣會經過詞嵌入層和位置編碼層,以轉換為模型可以處理的數值形式。
- 解碼器初始輸入:
- 在預測階段,由於沒有真實的目標序列字首作為輸入,解碼器通常以一個特殊的起始標記(如“<start>”)作為初始輸入。
輸出
- 生成的目標序列:
- 解碼器基於源序列和自身的初始輸入(起始標記),逐步生成目標序列的單詞。
- 在每個時間步,解碼器都會基於當前的輸入(包括已生成的目標序列字首和源序列的編碼表示)來預測下一個單詞。
- 這個過程會一直持續到生成結束標記(如“<end>”)或達到預設的最大序列長度。
總結
訓練階段 預測階段(推理階段) 輸入 1. 源序列 <br> 2. 目標序列字首 1. 源序列 <br> 2. 解碼器初始輸入(起始標記) 輸出 預測的目標序列(與真實目標序列剩餘部分比較以計算損失) 生成的目標序列(無真實目標序列進行比較)
需要注意的是,在訓練階段,模型透過比較預測的目標序列和真實目標序列剩餘部分來更新模型引數,以提高預測的準確性。而在預測階段,模型則基於已學習的引數和源序列來生成目標序列,無需真實目標序列的參與。
https://www.zhihu.com/question/337886108/answer/2865094314
2. Transformer 整體結構
- transformer是由谷歌在同樣大名鼎鼎的論文《Attention Is All You Need》提出的,最基礎的結構就是先Enoder編碼再Decoder解碼
- 首先介紹 Transformer 的整體結構,下圖是 Transformer 用於中英文翻譯的整體結構:
- 可以看到 Transformer 由 Encoder 和 Decoder 兩個部分組成,Encoder 和 Decoder 都包含 6 個 block。Transformer 的工作流程大體如下:
- 第一步:獲取輸入句子的每一個單詞的表示向量 X
- X由單詞的 Embedding(Embedding就是從原始資料提取出來的Feature) 和單詞位置的 Embedding 相加得到。
- 從上圖可以看到,這個句子中是由單片語成的,每一個字都可以對映為一個內容Embedding以及一個位置Embedding,然後將這個內容Embedding和位置Embedding加起來,就可以得到這個詞的綜合Embedding了。
- 如上圖所示,每一行是一個單詞的表示 x
- 第二步:將得到的單詞表示向量矩陣 傳入 Encoder
- 每一行是一個單詞的表示 x,經過 6 個 Encoder block 後可以得到句子所有單詞的編碼資訊矩陣 C,如下圖。單詞向量矩陣用X_nxd表示,n 是句子中單詞個數,d 是表示向量的維度 (論文中 d=512)。每一個 Encoder block 輸出的矩陣維度與輸入 完全一致。
- 第三步:將 Encoder 輸出的編碼資訊矩陣 C傳遞到 Decoder 中
- Decoder 依次會根據當前已經翻譯過的單詞 i(I) 翻譯下一個單詞 i+1(have),如下圖所示。在使用的過程中,翻譯到單詞 i+1 的時候需要透過 Mask (掩蓋) 操作遮蓋住 i+1 之後的單詞。
- 上圖 Decoder 接收了 Encoder 的編碼矩陣 C,然後首先輸入一個翻譯開始符 "",預測第一個單詞 "I";然後輸入翻譯開始符 "" 和單詞 "I",預測單詞 "have",下一次預測的時候,用之前預測的結果作為輸入,再得到對應的輸出,以此類推。這是 Transformer 使用時候的大致流程,無論再複雜的網路都是這個流程。
- 簡單來理解的話,就是透過前I-1個詞來預測第i個詞,之後一直迴圈反覆這個過程,直到預測出來了 結束符 截止。
3. 名詞解釋
3.1. token
- 在電腦科學中,token(符號)通常指代文字中的一組字元,它們被視為一個獨立的單元,在進行文字分析
- 在自然語言處理中,token 通常指代單詞、片語或其他文字中獨立的語言單元。將文字分解為 token 的過程稱為 tokenization
張量, 它的最後一維將稱作詞向量等.
- (分詞),是自然語言處理中的一個重要預處理步驟,為後續的文字分析和處理提供了基礎。
- 一般情況下,對於英文來說,有幾個單詞就可以認為是有幾個token
- 例如,對於英文句子 "I love natural language processing",分詞後得到的 token 序列為 ["I", "love", "natural", "language", "processing"]。
- 中文沒有像英文那樣明確的單詞邊界,因此需要對中文文字進行分詞才能進行後續的文字分析和處理。
- 例如,對於中文句子 "我喜歡自然語言處理",分詞後得到的 token 序列為 ["我", "喜歡", "自然語言", "處理"]。其中,“自然語言”是一個片語,在分詞時被視為一個整體的 token。
- 在接下來的架構分析中, 我們將假設使用Transformer模型架構處理從一種語言文字到另一種語言文字的翻譯工作, 因此很多命名方式遵循NLP中的規則. 比如: Embeddding層將稱作文字嵌入層, Embedding層產生的張量稱為詞嵌入
https://blog.csdn.net/weixin_47129891/article/details/139878475
Transformer模型的輸入可以分為訓練階段和推理階段,在不同階段輸入的內容是不同的。
一、訓練階段的輸入
在訓練階段,Transformer模型的輸入通常包括以下幾部分:
1. 源序列(Source Sequence, X
)
這是模型的主要輸入,包括源語言的句子或文字序列。例如,在機器翻譯任務中,源序列是要翻譯的原文。
2. 目標序列(Target Sequence, Y
)
這是模型在訓練時使用的真實目標序列,包括目標語言的句子或文字序列。在機器翻譯任務中,目標序列是源序列的翻譯結果。
3. 目標序列的字首(Target Sequence Prefix, Y
)
在訓練過程中,目標序列會被分成兩個部分:目標序列的字首部分(即真實目標序列的前一部分)和目標序列的下一部分。目標序列的字首部分用於解碼器的輸入。例如,對於目標序列 "I am a student" ,其字首部分可能是 "\<start> I am a" ,下一部分是 "I am a student"。
二、訓練過程的輸入細節
在訓練過程中,輸入的目標序列會被偏移一位,用於教學訊號。具體步驟如下:
1.編碼器輸入
源序列 X
經過詞嵌入層和位置編碼,輸入到編碼器。
2. 解碼器輸入
目標序列的字首 Y
經過詞嵌入層和位置編碼,輸入到解碼器。
三、推理階段的輸入
在推理階段,模型的輸入有所不同,因為目標序列的真實值不可用,模型需要一步一步地生成目標序列:
1. 源序列(Source Sequence, X
)
與訓練階段相同,推理階段的源序列是模型的輸入。
2.解碼器輸入
解碼器的輸入在每一步是已生成的目標序列字首(初始化時是特殊的起始標記 \<start> )。隨著生成過程的進行,生成的單詞會逐步被新增到解碼器輸入中。
四、推理過程的輸入細節
在推理過程中,生成過程是逐步進行的:
1. 編碼器輸入
源序列 X
經過詞嵌入層和位置編碼,輸入到編碼器,並生成編碼器輸出。
2.解碼器輸入
解碼器在每個時間步接收已生成的序列,並基於編碼器輸出和自身狀態生成下一個單詞。這個過程一直持續到生成結束標記(\<end>)或達到最大長度。
五、輸入處理的總結
1. 訓練階段
源序列 X
目標序列字首 Y
2.推理階段
源序列 X
動態生成的目標序列字首(初始為 \<start>,然後逐步擴充套件)六、示例
假設源序列 X
為 "How are you?",目標序列 Y
為 "Comment ça va?"。
1.訓練階段
源序列: "How are you?"
目標序列字首: "\<start> Comment ça"
目標序列: "Comment ça va?"2.推理階段
源序列: "How are you?"
初始解碼器輸入: "\<start>"
生成過程: "\<start> Comment", "\<start> Comment ça", "\<start> Comment ça va", "Comment ça va \<end>"這種設計使得Transformer模型能夠在訓練時學習如何將源序列翻譯成目標序列,並在推理時逐步生成目標序列。