博客專欄

        EEPW首頁 > 博客 > 小白看得懂的 Transformer (圖解)(1)

        小白看得懂的 Transformer (圖解)(1)

        發布人:數據派THU 時間:2023-03-19 來源:工程師 發布文章
        1.導語


        谷歌推出的BERT模型在11項NLP任務中奪得SOTA結果,引爆了整個NLP界。而BERT取得成功的一個關鍵因素是Transformer的強大作用。谷歌的Transformer模型最早是用于機器翻譯任務,當時達到了SOTA效果。Transformer改進了RNN最被人詬病的訓練慢的缺點,利用self-attention機制實現快速并行。并且Transformer可以增加到非常深的深度,充分發掘DNN模型的特性,提升模型準確率。在本文中,我們將研究Transformer模型,理解它的工作原理。


        出處:https://blog.csdn.net/longxinchen_ml/article/details/86533005原作者:Jay Alammar原鏈接:https://jalammar.github.io/illustrated-transformer


        2.正文開始


        Transformer由論文《Attention is All You Need》提出,現在是谷歌云TPU推薦的參考模型。論文相關的Tensorflow的代碼可以從GitHub獲取,其作為Tensor2Tensor包的一部分。哈佛的NLP團隊也實現了一個基于PyTorch的版本,并注釋該論文。


        在本文中,我們將試圖把模型簡化一點,并逐一介紹里面的核心概念,希望讓普通讀者也能輕易理解。


        Attention is All You Need:

        https://arxiv.org/abs/1706.03762


        從宏觀的視角開始 首先將這個模型看成是一個黑箱操作。在機器翻譯中,就是輸入一種語言,輸出另一種語言。


        圖片


        那么拆開這個黑箱,我們可以看到它是由編碼組件、解碼組件和它們之間的連接組成。


        圖片


        編碼組件部分由一堆編碼器(encoder)構成(論文中是將6個編碼器疊在一起——數字6沒有什么神奇之處,你也可以嘗試其他數字)。解碼組件部分也是由相同數量(與編碼器對應)的****(decoder)組成的。


        圖片


        所有的編碼器在結構上都是相同的,但它們沒有共享參數。每個****都可以分解成兩個子層。

        圖片

        從編碼器輸入的句子首先會經過一個自注意力(self-attention)層,這層幫助編碼器在對每個單詞編碼時關注輸入句子的其他單詞。我們將在稍后的文章中更深入地研究自注意力。


        自注意力層的輸出會傳遞到前饋(feed-forward)神經網絡中。每個位置的單詞對應的前饋神經網絡都完全一樣(譯注:另一種解讀就是一層窗口為一個單詞的一維卷積神經網絡)。


        ****中也有編碼器的自注意力(self-attention)層和前饋(feed-forward)層。除此之外,這兩個層之間還有一個注意力層,用來關注輸入句子的相關部分(和seq2seq模型的注意力作用相似)。

        圖片

        將張量引入圖景


        我們已經了解了模型的主要部分,接下來我們看一下各種向量或張量(譯注:張量概念是矢量概念的推廣,可以簡單理解矢量是一階張量、矩陣是二階張量。)是怎樣在模型的不同部分中,將輸入轉化為輸出的。


        像大部分NLP應用一樣,我們首先將每個輸入單詞通過詞嵌入算法轉換為詞向量。


        圖片

        每個單詞都被嵌入為512維的向量,我們用這些簡單的方框來表示這些向量。


        詞嵌入過程只發生在最底層的編碼器中。所有的編碼器都有一個相同的特點,即它們接收一個向量列表,列表中的每個向量大小為512維。在底層(最開始)編碼器中它就是詞向量,但是在其他編碼器中,它就是下一層編碼器的輸出(也是一個向量列表)。向量列表大小是我們可以設置的超參數——一般是我們訓練集中最長句子的長度。


        將輸入序列進行詞嵌入之后,每個單詞都會流經編碼器中的兩個子層。圖片

        接下來我們看看Transformer的一個核心特性,在這里輸入序列中每個位置的單詞都有自己獨特的路徑流入編碼器。在自注意力層中,這些路徑之間存在依賴關系。而前饋(feed-forward)層沒有這些依賴關系。因此在前饋(feed-forward)層時可以并行執行各種路徑。


        然后我們將以一個更短的句子為例,看看編碼器的每個子層中發生了什么。


        現在我們開始“編碼”


        如上述已經提到的,一個編碼器接收向量列表作為輸入,接著將向量列表中的向量傳遞到自注意力層進行處理,然后傳遞到前饋神經網絡層中,將輸出結果傳遞到下一個編碼器中。圖片

        輸入序列的每個單詞都經過自編碼過程。然后,他們各自通過前向傳播神經網絡——完全相同的網絡,而每個向量都分別通過它。


        從宏觀視角看自注意力機制


        不要被我用自注意力這個詞弄迷糊了,好像每個人都應該熟悉這個概念。其實我之也沒有見過這個概念,直到讀到Attention is All You Need 這篇論文時才恍然大悟。讓我們精煉一下它的工作原理。


        例如,下列句子是我們想要翻譯的輸入句子:


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


        這個“it”在這個句子是指什么呢?它指的是street還是這個animal呢?這對于人類來說是一個簡單的問題,但是對于算法則不是。


        當模型處理這個單詞“it”的時候,自注意力機制會允許“it”與“animal”建立聯系。


        隨著模型處理輸入序列的每個單詞,自注意力會關注整個輸入序列的所有單詞,幫助模型對本單詞更好地進行編碼。


        如果你熟悉RNN(循環神經網絡),回憶一下它是如何維持隱藏層的。RNN會將它已經處理過的前面的所有單詞/向量的表示與它正在處理的當前單詞/向量結合起來。而自注意力機制會將所有相關單詞的理解融入到我們正在處理的單詞中。

        圖片當我們在編碼器#5(棧中最上層編碼器)中編碼“it”這個單詞的時,注意力機制的部分會去關注“The Animal”,將它的表示的一部分編入“it”的編碼中。


        請務必檢查Tensor2Tensor notebook ,在里面你可以下載一個Transformer模型,并用交互式可視化的方式來檢驗。


        從微觀視角看自注意力機制


        首先我們了解一下如何使用向量來計算自注意力,然后來看它實怎樣用矩陣來實現。


        計算自注意力的第一步就是從每個編碼器的輸入向量(每個單詞的詞向量)中生成三個向量。也就是說對于每個單詞,我們創造一個查詢向量、一個鍵向量和一個值向量。這三個向量是通過詞嵌入與三個權重矩陣后相乘創建的。


        可以發現這些新向量在維度上比詞嵌入向量更低。他們的維度是64,而詞嵌入和編碼器的輸入/輸出向量的維度是512. 但實際上不強求維度更小,這只是一種基于架構上的選擇,它可以使多頭注意力(multiheaded attention)的大部分計算保持不變。


        圖片

        X1與WQ權重矩陣相乘得到q1, 就是與這個單詞相關的查詢向量。最終使得輸入序列的每個單詞的創建一個查詢向量、一個鍵向量和一個值向量。


        什么是查詢向量、鍵向量和值向量向量?


        它們都是有助于計算和理解注意力機制的抽象概念。請繼續閱讀下文的內容,你就會知道每個向量在計算注意力機制中到底扮演什么樣的角色。


        計算自注意力的第二步是計算得分。假設我們在為這個例子中的第一個詞“Thinking”計算自注意力向量,我們需要拿輸入句子中的每個單詞對“Thinking”打分。這些分數決定了在編碼單詞“Thinking”的過程中有多重視句子的其它部分。


        這些分數是通過打分單詞(所有輸入句子的單詞)的鍵向量與“Thinking”的查詢向量相點積來計算的。所以如果我們是處理位置最靠前的詞的自注意力的話,第一個分數是q1和k1的點積,第二個分數是q1和k2的點積。

        圖片

        第三步和第四步是將分數除以8(8是論文中使用的鍵向量的維數64的平方根,這會讓梯度更穩定。這里也可以使用其它值,8只是默認值),然后通過softmax傳遞結果。softmax的作用是使所有單詞的分數歸一化,得到的分數都是正值且和為1。

        圖片

        這個softmax分數決定了每個單詞對編碼當下位置(“Thinking”)的貢獻。顯然,已經在這個位置上的單詞將獲得最高的softmax分數,但有時關注另一個與當前單詞相關的單詞也會有幫助。


        第五步是將每個值向量乘以softmax分數(這是為了準備之后將它們求和)。這里的直覺是希望關注語義上相關的單詞,并弱化不相關的單詞(例如,讓它們乘以0.001這樣的小數)。


        第六步是對加權值向量求和(譯注:自注意力的另一種解釋就是在編碼某個單詞時,就是將所有單詞的表示(值向量)進行加權求和,而權重是通過該詞的表示(鍵向量)與被編碼詞表示(查詢向量)的點積并通過softmax得到。),然后即得到自注意力層在該位置的輸出(在我們的例子中是對于第一個單詞)。圖片

        這樣自自注意力的計算就完成了。得到的向量就可以傳給前饋神經網絡。然而實際中,這些計算是以矩陣形式完成的,以便算得更快。那我們接下來就看看如何用矩陣實現的。


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: AI

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 正安县| 漳州市| 饶平县| 富平县| 玛曲县| 宣武区| 德阳市| 长春市| 泸州市| 根河市| 吴堡县| 海城市| 夏津县| 会东县| 独山县| 呈贡县| 广平县| 安乡县| 梓潼县| 崇州市| 孟村| 石河子市| 台南市| 札达县| 武夷山市| 化州市| 突泉县| 临漳县| 桂林市| 鄂托克前旗| 阿城市| 乌鲁木齐市| 丹凤县| 滕州市| 三原县| 江华| 阿拉善左旗| 天柱县| 加查县| 遂川县| 竹溪县|