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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

图解Transformer-一篇文章看懂transformer

發布時間:2024/7/5 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解Transformer-一篇文章看懂transformer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文標題:The Illustrated Transformer

原文鏈接:https://jalammar.github.io/illustrated-transformer/

論文地址:https://arxiv.org/abs/1706.03762

前言

? ? ? Attention這種機制最開始應用于機器翻譯的任務中,并且取得了巨大的成就,因而在最近的深度學習模型中受到了大量的關注。在在這個基礎上,我們提出一種完全基于Attention機制來加速深度學習訓練過程的算法模型-Transformer。事實證明Transformer結構在特定任務上已經優于了谷歌的神經網絡機器翻譯模型。但是,Transformer最大的優勢在于其在并行化處理上做出的貢獻。谷歌也在利用Transformer的并行化方式來營銷自己的云TPU。所以,現在讓我們一步一步剖析Transformer的神秘面紗,讓我看看他是怎么一步一步訓練的。

? ? ?Transformer在Goole的一篇論文Attention is All You Need被提出,為了方便實現調用Transformer Google還開源了一個第三方庫,基于TensorFlow的Tensor2Tensor,一個NLP的社區研究者貢獻了一個Torch版本的支持:guide annotating the paper with PyTorch implementation。這里,我想用一些方便理解的方式來一步一步解釋Transformer的訓練過程,這樣即便你沒有很深的深度學習知識你也能大概明白其中的原理。

A High-Level Look

? ? ? ?我們先把Transformer想象成一個黑匣子,在機器翻譯的領域中,這個黑匣子的功能就是輸入一種語言然后將它翻譯成其他語言。如下圖:

掀起The Transformer的蓋頭,我們看到在這個黑匣子由2個部分組成,一個Encoders和一個Decoders。

我們再對這個黑匣子進一步的剖析,發現每個Encoders中分別由6個Encoder組成(論文中是這樣配置的)。而每個Decoders中同樣也是由6個Decoder組成。

對于Encoders中的每一個Encoder,他們結構都是相同的,但是并不會共享權值。每層Encoder有2個部分組成,如下圖:?

每個Encoder的輸入首先會通過一個self-attention層,通過self-attention層幫助Endcoder在編碼單詞的過程中查看輸入序列中的其他單詞。如果你不清楚這里在說什么,不用著急,之后我們會詳細介紹self-attention的。

Self-attention的輸出會被傳入一個全連接的前饋神經網絡,每個encoder的前饋神經網絡參數個數都是相同的,但是他們的作用是獨立的。

每個Decoder也同樣具有這樣的層級結構,但是在這之間有一個Attention層,幫助Decoder專注于與輸入句子中對應的那個單詞(類似與seq2seq models的結構)

Bringing The Tensors Into The Picture

? ? ? 在上一節,我們介紹了Transformer的網絡結構?,F在我們以圖示的方式來研究Transformer模型中各種張量/向量,觀察從輸入到輸出的過程中這些數據在各個網絡結構中的流動。

? ? ? 首先還是NLP的常規做法,先做一個詞嵌入:什么是文本的詞嵌入?

? ? ? 我們將每個單詞編碼為一個512維度的向量,我們用上面這張簡短的圖形來表示這些向量。詞嵌入的過程只發生在最底層的Encoder。但是對于所有的Encoder來說,你都可以按下圖來理解。輸入(一個向量的列表,每個向量的維度為512維,在最底層Encoder作用是詞嵌入,其他層就是其前一層的output)。另外這個列表的大小和詞向量維度的大小都是可以設置的超參數。一般情況下,它是我們訓練數據集中最長的句子的長度。

? ? ?上圖其實介紹到了一個Transformer的關鍵點。你注意觀察,在每個單詞進入Self-Attention層后都會有一個對應的輸出。Self-Attention層中的輸入和輸出是存在依賴關系的,而前饋層則沒有依賴,所以在前饋層,我們可以用到并行化來提升速率。

? ? 下面我用一個簡短的句子作為例子,來一步一步推導transformer每個子層的數據流動過程。

Now We’re Encoding!

? ? ? ?正如之前所說,Transformer中的每個Encoder接收一個512維度的向量的列表作為輸入,然后將這些向量傳遞到‘self-attention’層,self-attention層產生一個等量512維向量列表,然后進入前饋神經網絡,前饋神經網絡的輸出也為一個512維度的列表,然后將輸出向上傳遞到下一個encoder。

? ? ?如上圖所示,每個位置的單詞首先會經過一個self attention層,然后每個單詞都通過一個獨立的前饋神經網絡(這些神經網絡結構完全相同)。

Self-Attention at a High Level

? ? ? Self attention這個單詞看起來好像每個人都知道是什么意思,但實質上他是算法領域中新出的概念,你可以通過閱讀:Attention is All You Need?來理解self attention的原理。

? ? ??假設下面的句子就是我們需要翻譯的輸入句:

”The animal didn't cross the street because it was too tired”

? ? ? 這句話中的"it"指的是什么?它指的是“animal”還是“street”?對于人來說,這其實是一個很簡單的問題,但是對于一個算法來說,處理這個問題其實并不容易。self attention的出現就是為了解決這個問題,通過self attention,我們能將“it”與“animal”聯系起來。

? ? ? 當模型處理單詞的時候,self attention層可以通過當前單詞去查看其輸入序列中的其他單詞,以此來尋找編碼這個單詞更好的線索。

? ? ? 如果你熟悉RNNs,那么你可以回想一下,RNN是怎么處理先前單詞(向量)與當前單詞(向量)的關系的?RNN是怎么計算他的hidden state的。self-attention正是transformer中設計的一種通過其上下文來理解當前詞的一種辦法。你會很容易發現...相較于RNNs,transformer具有更好的并行性。

如上圖,是我們第五層Encoder針對單詞'it'的圖示,可以發現,我們的Encoder在編碼單詞‘it’時,部分注意力機制集中在了‘animl’上,這部分的注意力會通過權值傳遞的方式影響到'it'的編碼。

更多細節可以查看?Tensor2Tensor notebook?

Self-Attention in Detail

? ? 這一節我們先介紹如何用向量的方式來計算self attention,然后再來看看它是如何使用矩陣來實現的。

? ? ?計算self attention的第一步是從每個Encoder的輸入向量上創建3個向量(在這個情況下,對每個單詞做詞嵌入)。所以,對于每個單詞,我們創建一個Query向量,一個Key向量和一個Value向量。這些向量是通過詞嵌入乘以我們訓練過程中創建的3個訓練矩陣而產生的。

? ? ?注意這些新向量的維度比嵌入向量小。我們知道嵌入向量的維度為512,而這里的新向量的維度只有64維。新向量并不是必須小一些,這是網絡架構上的選擇使得Multi-Headed Attention(大部分)的計算不變。

我們將乘以的權重矩陣得到新向量,既是“query”的向量。同理,最終我們可以對輸入句子的每個單詞創建“query”,
“key”,“value”的新向量表示形式。

對了..“query”,“key”,“value”是什么向量呢?有什么用呢?

這些向量的概念是很抽象,但是它確實有助于計算注意力。不過先不用糾結去理解它,后面的的內容,會幫助你理解的。

? ? ??計算self attention的第二步是計算得分。以上圖為例,假設我們在計算第一個單詞“thinking”的self attention。我們需要根據這個單詞對輸入句子的每個單詞進行評分。當我們在某個位置編碼單詞時,分數決定了對輸入句子的其他單詞的關照程度。

? ? ? ?通過將query向量和key向量點擊來對相應的單詞打分。所以,如果我們處理開始位置的的self attention,則第一個分數為和的點積,第二個分數為和的點積。如下圖

第三步和第四步的計算,是將第二部的得分除以8()(論文中使用key向量的維度是64維,其平方根=8,這樣可以使得訓練過程中具有更穩定的梯度。這個并不是唯一值,經驗所得)。然后再將得到的輸出通過softmax函數標準化,使得最后的列表和為1。

這個softmax的分數決定了當前單詞在每個句子中每個單詞位置的表示程度。很明顯,當前單詞對應句子中此單詞所在位置的softmax的分數最高,但是,有時候attention機制也能關注到此單詞外的其他單詞,這很有用。

第五步是將每個Value向量乘以softmax后的得分。這里實際上的意義在于保存對當前詞的關注度不變的情況下,降低對不相關詞的關注。

第六步是 累加加權值的向量。 這會在此位置產生self-attention層的輸出(對于第一個單詞)。

總結self-attention的計算過程,(單詞級別)就是得到一個我們可以放到前饋神經網絡的矢量。?然而在實際的實現過程中,該計算會以矩陣的形式完成,以便更快地處理。下面我們來看看Self-Attention的矩陣計算方式。

Matrix Calculation of Self-Attention

第一步是去計算Query,Key和Value矩陣。我們將詞嵌入轉化成矩陣X中,并將其乘以我們訓練的權值矩陣(,,)

X矩陣中的每一行對應于輸入句子中的一個單詞。 我們看到的X每一行的方框數實際上是詞嵌入的維度,圖中所示的和論文中是有差距的。X(圖中的4個方框論文中為512個)和q / k / v向量(圖中的3個方框論文中為64個)

最后,由于我們正在處理矩陣,我們可以在一個公式中濃縮前面步驟2到6來計算self attention層的輸出。

?

The Beast With Many Heads

本文通過使用“Multi-headed”的機制來進一步完善self attention層?!癕ulti-headed”主要通過下面2中方式改善了attention層的性能:

1. 它拓展了模型關注不同位置的能力。在上面例子中可以看出,”The animal didn't cross the street because it was too tired”,我們的attention機制計算出“it”指代的為“animal”,這在對語言的理解過程中是很有用的。

2.它為attention層提供了多個“representation subspaces”。由下圖可以看到,在self attention中,我們有多個個Query / Key / Value權重矩陣(Transformer使用8個attention heads)。這些集合中的每個矩陣都是隨機初始化生成的。然后通過訓練,用于將詞嵌入(或者來自較低Encoder/Decoder的矢量)投影到不同的“representation subspaces(表示子空間)”中。

? ? 通過multi-headed attention,我們為每個“header”都獨立維護一套Q/K/V的權值矩陣。然后我們還是如之前單詞級別的計算過程一樣處理這些數據。

? ? 如果對上面的例子做同樣的self attention計算,而因為我們有8頭attention,所以我們會在八個時間點去計算這些不同的權值矩陣,但最后結束時,我們會得到8個不同的矩陣。如下圖:

? ? 瞧瞧,這會給我們后續工作造成什么問題?

? ? 我們知道在self-attention后面緊跟著的是前饋神經網絡,而前饋神經網絡接受的是單個矩陣向量,而不是8個矩陣。所以我們需要一種辦法,把這8個矩陣壓縮成一個矩陣。

? ? 我們怎么做??

? ?我們將這8個矩陣連接在一起然后再與一個矩陣相乘。步驟如下圖所示:

這樣multi-headed self attention的全部內容就介紹完了。之前可能都是一些過程的圖解,現在我將這些過程連接在一起,用一個整體的框圖來表示一下計算的過程,希望可以加深理解。

? ? ? 現在我們已經觸及了attention的header,讓我們重新審視我們之前的例子,看看例句中的“it”這個單詞在不同的attention?header情況下會有怎樣不同的關注點。

? ? ? 如圖:當我們對“it”這個詞進行編碼時,一個注意力的焦點主要集中在“animal”上,而另一個注意力集中在“tired”?

但是,如果我們將所有注意力添加到圖片中,那么事情可能更難理解:

?

Representing The Order of The Sequence Using Positional Encoding

# 使用位置編碼表示序列的順序

我們可能忽略了去介紹一個重要的內容,就是怎么考慮輸入序列中單詞順序的方法。

為了解決這個問題,transformer為每個輸入單詞的詞嵌入上添加了一個新向量-位置向量。

為了解決這個問題,變換器為每個輸入嵌入添加了一個向量。這些位置編碼向量有固定的生成方式,所以獲取他們是很方便的,但是這些信息確是很有用的,他們能捕捉大奧每個單詞的位置,或者序列中不同單詞之間的距離。將這些信息也添加到詞嵌入中,然后與Q/K/V向量點擊,獲得的attention就有了距離的信息了。

為了讓模型捕捉到單詞的順序信息,我們添加位置編碼向量信息(POSITIONAL ENCODING)-位置編碼向量不需要訓練,它有一個規則的產生方式。

如果我們的嵌入維度為4,那么實際上的位置編碼就如下圖所示:


那么生成位置向量需要遵循怎樣的規則呢?

觀察下面的圖形,每一行都代表著對一個矢量的位置編碼。因此第一行就是我們輸入序列中第一個字的嵌入向量,每行都包含512個值,每個值介于1和-1之間。我們用顏色來表示1,-1之間的值,這樣方便可視化的方式表現出來:

這是一個20個字(行)的(512)列位置編碼示例。你會發現它咋中心位置被分為了2半,這是因為左半部分的值是一由一個正弦函數生成的,而右半部分是由另一個函數(余弦)生成。然后將它們連接起來形成每個位置編碼矢量。
?

位置編碼的公式在論文(3.5節)中有描述。你也可以在中查看用于生成位置編碼的代碼get_timing_signal_1d()。這不是位置編碼的唯一可能方法。然而,它具有能夠擴展到看不見的序列長度的優點(例如,如果我們訓練的模型被要求翻譯的句子比我們訓練集中的任何句子都長)。

The Residuals

這一節我想介紹的是encoder過程中的每個self-attention層的左右連接情況,我們稱這個為:layer-normalization?步驟。如下圖所示:

?

?

在進一步探索其內部計算方式,我們可以將上面圖層可視化為下圖:

?Decoder的子層也是同樣的,如果我們想做堆疊了2個Encoder和2個Decoder的Transformer,那么它可視化就會如下圖所示:

The Decoder Side

? ? ?我們已經基本介紹完了Encoder的大多數概念,我們基本上也可以預知Decoder是怎么工作的。現在我們來仔細探討下Decoder的數據計算原理,

? ? ?當序列輸入時,Encoder開始工作,最后在其頂層的Encoder輸出矢量組成的列表,然后我們將其轉化為一組attention的集合(K,V)。(K,V)將帶入每個Decoder的“encoder-decoder attention”層中去計算(這樣有助于decoder捕獲輸入序列的位置信息)


完成encoder階段后,我們開始decoder階段,decoder階段中的每個步驟輸出來自輸出序列的元素(在這種情況下為英語翻譯句子)。

上面實際上已經是應用的階段了,那我們訓練階段是如何的呢?

我們以下圖的步驟進行訓練,直到輸出一個特殊的符號<end of sentence>,表示已經完成了。?The output of each step is fed to the bottom decoder in the next time step, and the decoders bubble up their decoding results just like the encoders did. 對于Decoder,和Encoder一樣,我們在每個Decoder的輸入做詞嵌入并添加上表示每個字位置的位置編碼

Decoder中的self attention與Encoder的self attention略有不同:

? ? ? ?在Decoder中,self attention只關注輸出序列中的較早的位置。這是在self attention計算中的softmax步驟之前屏蔽了特征位置(設置為 -inf)來完成的。

? ? ?“Encoder-Decoder Attention”層的工作方式與"Multi-Headed Self-Attention"一樣,只是它從下面的層創建其Query矩陣,并在Encoder堆棧的輸出中獲取Key和Value的矩陣。

?

The Final Linear and Softmax Layer

? ? ? ? ?Decoder的輸出是浮點數的向量列表。我們是如何將其變成一個單詞的呢?這就是最終的線性層和softmax層所做的工作。

線性層是一個簡單的全連接神經網絡,它是由Decoder堆棧產生的向量投影到一個更大,更大的向量中,稱為對數向量

? ? ? 假設實驗中我們的模型從訓練數據集上總共學習到1萬個英語單詞(“Output Vocabulary”)。這對應的Logits矢量也有1萬個長度-每一段表示了一個唯一單詞的得分。在線性層之后是一個softmax層,softmax將這些分數轉換為概率。選取概率最高的索引,然后通過這個索引找到對應的單詞作為輸出。

?上圖是從Decoder的輸出開始到最終softmax的輸出。一步一步的圖解。

Recap Of Training

現在我們已經講解了transformer的訓練全過程了,讓我們回顧一下。

在訓練期間,未經訓練的模型將通過如上的流程一步一步計算的。而且因為我們是在對標記的訓練數據集進行訓練(機器翻譯可以看做雙語平行語聊),那么我們可以將模型輸出與實際的正確答案相比較,來進行反向傳播。

為了更好的理解這部分內容,我們假設我們輸出的詞匯只有(“a”,“am”,“i”,“thanks”,“student”和“<eos>”(“句末”的縮寫))

在我們開始訓練之前,我們模型的輸出詞匯是在預處理階段創建的。

一旦我們定義了輸出的詞匯表,那么我們就可以使用相同寬度的向量來表示詞匯表中的每個單詞。稱為one-hot編碼。例如,我們可以使用下面向量來表示單詞“am”:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?示例:我們的輸出詞匯表的one-hot編碼

下一節我們再討論一下模型的損失函數,我們優化的指標,引導一個訓練有素且令人驚訝的精確模型。

The Loss Function

假設我們正在訓練一個模型,比如將“merci”翻譯成“謝謝”。這意味著我們希望模型計算后的輸出為“謝謝”,但由于這種模式還沒有接受過訓練,所以這種情況不太可能發生。


這是因為模型的參數(權重)都是隨機初始化的,因此(未經訓練的)模型對每個單詞產生的概率分布是具有無限可能的,但是我們可以通過其余實際我們期望的輸出進行比較,然后利用反向傳播調整所有模型的權重,使得輸出更接近所需的輸出。

那么如何比較算法預測值與真實期望值呢?

實際上,我們對其做一個簡單的減法即可。你也可以了解交叉熵和Kullback-Leibler散度來掌握這種差值的判斷方式。

但是,需要注意的是,這只是一個很簡單的demo,真實情況下,我們需要輸出一個更長的句子,例如。輸入:“je suis étudiant”和預期輸出:“I am a student”。這樣的句子輸入,意味著我們的模型能夠連續的輸出概率分布。其中:

  • 每個概率分布由寬度為vocab_size的向量表示(在我們的示例中vocab_size為6,但實際上可能為3,000或10,000維度)
  • 第一概率分布在與單詞“i”相關聯的單元處具有最高概率
  • 第二概率分布在與單詞“am”相關聯的單元格中具有最高概率
  • 依此類推,直到第五個輸出分布表示'?<end of sentence>'符號,意味著預測結束。


上圖為:輸入:“je suis étudiant”和預期輸出:“I am a student”的期望預測概率分布情況。

在算法模型中,雖然不能達到期望的情況,但是我們需要在訓練了足夠長時間之后,我們的算法模型能夠有如下圖所示的概率分布情況:

? ? 現在,因為模型一次生成一個輸出,我們可以理解為這個模型從該概率分布(softmax)矢量中選擇了具有最高概率的單詞并丟棄了其余的單詞。? ? ? ? ? ??

? ?現在,因為模型一次生成一個輸出,我們可以假設模型從該概率分布中選擇具有最高概率的單詞并丟棄其余的單詞。

這里有2個方法:一個是貪婪算法(greedy decoding),一個是波束搜索(beam search)。波束搜索是一個優化提升的技術,可以嘗試去了解一下,這里不做更多解釋。

Go Forth And Transform

如果你想更深入了解,可以嘗試下面幾個步驟:

  • 閱讀?Attention Is All You Need?這篇論文, the Transformer 的博客?(Transformer: A Novel Neural Network Architecture for Language Understanding) 和?Tensor2Tensor announcement公告
  • 觀看??ukasz Kaiser’s talk?這個視頻,了解更多細節。
  • 試著通過?Jupyter Notebook provided as part of the Tensor2Tensor repo?以編程的角度學習
  • 探索?Tensor2Tensor repo.

后續工作:

  • Depthwise Separable Convolutions for Neural Machine Translation
  • One Model To Learn Them All
  • Discrete Autoencoders for Sequence Models
  • Generating Wikipedia by Summarizing Long Sequences
  • Image Transformer
  • Training Tips for the Transformer Model
  • Self-Attention with Relative Position Representations
  • Fast Decoding in Sequence Models using Discrete Latent Variables
  • Adafactor: Adaptive Learning Rates with Sublinear Memory Cost

總結

以上是生活随笔為你收集整理的图解Transformer-一篇文章看懂transformer的全部內容,希望文章能夠幫你解決所遇到的問題。

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