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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

[深度学习] 自然语言处理---Transformer 位置编码介绍

發布時間:2023/12/15 pytorch 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [深度学习] 自然语言处理---Transformer 位置编码介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2017年來自谷歌的Vaswani等人提出了Transformer模型,一種新穎的純粹采用注意力機制實現的Seq2Seq架構,它具備并行化訓練的能力,擁有非凡的性能表現,這些特點使它深受NLP研究人員們的喜歡,成為NLP領域的標志性模型之一。因此,當人們提到Transformer模型時,多頭注意力機制(Multi-Head Attention)成為人們討論最多的創新點,正如前面所說,這種機制讓Transformer變得非常強大。

其實,原文使用到了一種非常有意思的技巧——Positional Encoding,中文翻譯為位置編碼。這個技巧,直觀上非常容易理解,就是對序列中的詞的位置進行編碼。但是,原文并沒有對這種新穎的位置編碼方式作細致的講解。

Positional Encoding(位置編碼)是Transformer模型中很重要的一個概念。與“RNN”和“LSTM”等順序算法不同,Transformer 沒有內置機制來捕獲句子中單詞的相對位置。 這很重要,因為單詞之間的距離提供了關鍵的上下文信息。 這是位置編碼介入的地方。其實位置編碼不是模型架構的一部分。 它實際上只是預處理的一部分。 生成的位置編碼向量與每個詞的嵌入向量大小維度相同。 經過計算,位置編碼向量被添加到嵌入向量中。

一? 為什么需要位置編碼?

引入位置編碼主要歸因于兩方面:

(1)對于任何一門語言,單詞在句子中的位置以及排列順序是非常重要的,它們不僅是一個句子的語法結構的組成部分,更是表達語義的重要概念。一個單詞在句子的位置或排列順序不同,可能整個句子的意思就發生了偏差。

句子1:我喜歡吃洋蔥

句子2:洋蔥喜歡吃我

上面兩句話所使用的的字完全一樣,但是所表達的句意卻截然相反。那么,引入詞序信息有助于區別這兩句話的意思。

(2)Transformer模型拋棄了RNN、CNN作為序列學習的基本模型。我們知道,循環神經網絡本身就是一種順序結構,天生就包含了詞在序列中的位置信息。當拋棄循環神經網絡結構,完全采用Attention取而代之,這些詞序信息就會丟失,模型就沒有辦法知道每個詞在句子中的相對和絕對的位置信息。因此,有必要把詞序信號加到詞向量上幫助模型學習這些信息,位置編碼就是用來解決這種問題的方法。

二 位置編碼是什么?

位置編碼(Positional Encoding)是一種用詞的位置信息對序列中的每個詞進行二次表示的方法。正如前文所述,Transformer模型本身不具備像RNN那樣的學習詞序信息的能力,需要主動將詞序信息喂給模型。那么,模型原先的輸入是不含詞序信息的詞向量,位置編碼需要將詞序信息和詞向量結合起來形成一種新的表示輸入給模型,這樣模型就具備了學習詞序信息的能力。

三 位置編碼分類

總的來說,位置編碼分為兩個類型:函數型和表格型

函數型:通過輸入token位置信息,得到相應的位置編碼

表格型:建立一個長度為L的詞表,按詞表的長度來分配位置id

表格型

方法一:使用[0,1]范圍分配

這個方法的分配方式是,將0-1這個范圍的,將第一個token分配0,最后一個token分配去1,其余的token按照文章的長度平均分配。具體形式如下:

我喜歡吃洋蔥 【0 0.16 0.32.....1】

我真的不喜歡吃洋蔥【0 0.125 0.25.....1】

問題:我們可以看到,如果句子長度不同,那么位置編碼是不一樣,所以無法表示句子之間有什么相似性。你無法知道在一個特定區間范圍內到底存在多少個單詞。換句話說,不同句子之間的時間步差值沒有任何的意義。

方法二:1-n正整數范圍分配

這個方法比較直觀,就是按照輸入的順序,一次分配給token所在的索引位置。具體形式如下:

我喜歡吃洋蔥 【1,2,3,4,5,6】

我真的不喜歡吃洋蔥【1,2,3,4,5,6,7】

問題:往往句子越長,后面的值越大,數字越大說明這個位置占的權重也越大,這樣的方式無法凸顯每個位置的真實的權重。這種方法帶來的問題是,不僅這些數值會變得非常大,而且模型也會遇到一些比訓練中的所有句子都要長的句子。此外,數據集中不一定在所有數值上都會包含相對應長度的句子,也就是模型很有可能沒有看到過任何一個這樣的長度的樣本句子,這會嚴重影響模型的泛化能力。

因此,一種好的位置編碼方案需要滿足以下幾條要求:

  • 它能為每個時間步輸出一個獨一無二的編碼;
  • 不同長度的句子之間,任何兩個時間步之間的距離應該保持一致;
  • 模型應該能毫不費力地泛化到更長的句子。它的值應該是有界的;
  • 它必須是確定性的。

相對位置的關系-函數型

相對位置編碼的特點,關注一個token與另一個token距離的相對位置(距離差幾個token)。位置1和位置2的距離比位置3和位置10的距離更近,位置1和位置2與位置3和位置4都只相差1。

還是按照上面"我喜歡吃洋蔥"中的“我”為例,看看相對位置關系是什么樣子的:

使用相對位置的方法,我們可以清晰的知道單詞之間的距離遠近的關系。

Transformer的作者們提出了一個簡單但非常創新的位置編碼方法,能夠滿足上述所有的要求。

首先,這種編碼不是單一的一個數值,而是包含句子中特定位置信息的d維向量(非常像詞向量)第二,這種編碼沒有整合進模型,而是用這個向量讓每個詞具有它在句子中的位置的信息。換句話說,通過注入詞的順序信息來增強模型輸入。、

首先給一個定義:Transformer的位置信息是函數型的。在GPT-3論文中給出的公式如下:

首先需要注意的是,上個公式給出的每一個Token的位置信息編碼不是一個數字,而是一個不同頻率分割出來,和文本一樣維度的向量。向量如下:

得到位置向量P之后,將和模型的embedding向量相加,得到進入Transformer模型的最終表示。

這里的 t 就是每個token的位置,比如說是位置1,位置2,以及位置n

為了保證這種相加操作正確,讓位置向量(PE)的維度等于詞向量(WE)的維度

?

?

?

?

為什么周期函數能夠引入位置信息?

那么怎么在保存這個數的含義的情況下用更小的數表示,一種很簡單的方式就是轉換進制,這樣就能夠使用多維數據表示相同含義。用二進制舉個例子,? 我們將數字用二進制表示出來。可以發現,每個比特位的變化率是不一樣的,越低位的變化越快,紅色位置0和1每個數字會變化一次,而黃色位,每8個數字才會變化一次。

?不同頻率的sin和cosin組合其實也是同樣的道理,通過調整三角函數的頻率,我們可以實現這種低位到高位的變化,這樣的話,位置信息就表示出來了。

上表中維度0,維度1,維度2,維度3拼成的數字就是該位置對應的二進制表示。可以看到每個維度(也就是每一列)其實都是有周期的,并且周期是不同的,這也就能夠說明使用多個周期不同的周期函數組成的多維度編碼和遞增序列編碼其實是可以等價的。這也就回答了為什么周期函數能夠引入位置信息。

為什么選擇三角函數引入位置信息?

理解了上面的內容就很容易想通這個問題了。

理想中的位置編碼應該滿足以下兩個條件:

  • 單個維度取值別太大(太大則又會有使用原始1,2,3...這樣的編碼方式遇到的問題)
  • 可以輕易得到多個周期不同的函數(位置編碼要求每個維度周期不同)

三角函數恰好就滿足以上兩點要求,取值范圍[-1,1],并且能夠輕易得到多個周期不同的函數,所以三角函數是一個不錯的選擇。

?

為什么這里使用向量相加而不是拼接的形式?

?詞向量 E 和位置向量 P 相加再經過后續的線性變換,可以理解為 而當兩個向量拼接后經過后續的線性變換,可以理解為 當二者的效果是等價的。我們可以由此發現,拼接總是不會比相加差的,但是由于參數量的增加,其學習難度也會進一步上升.

無論拼接還是相加,最終都要經過多頭注意力的各個頭入口處的線性變換,進行特征重新組合與降維,其實每一維都變成了之前所有維向量的線性組合。所以這個決定看上去是根據效果決定的,參數少效果好的相加自然成了模型的選擇。

還按照前面的標記,在Transformer方案中,每一個注意力頭都先將輸入特征使用某個參數矩陣 W線性映射到一個更低維的向量,這時:無論使用向量相加 還是向量拼接 ,在線性變換后得到的向量,都是 和 兩個向量中所有元素的線性組合。也就是說,在任意一個注意力頭中,輸入的特征都已經被重組(求和)了。因此,使用拼接和相加應該差別不大,而拼接方法又使用了額外的參數量。

?

?

?

?Transformer使用position encoding會影響輸入embedding的原特征嗎? - 知乎

如何理解Transformer論文中的positional encoding,和三角函數有什么關系? - 知乎

一文讀懂Transformer模型的位置編碼 - 知乎

面經:什么是Transformer位置編碼? - 知乎
transformer中的位置嵌入_scu-liu的博客-CSDN博客_位置嵌入

總結

以上是生活随笔為你收集整理的[深度学习] 自然语言处理---Transformer 位置编码介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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