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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Transformer模型---encoder

發布時間:2023/12/15 综合教程 31 生活家
生活随笔 收集整理的這篇文章主要介紹了 Transformer模型---encoder 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡介

論文:《Attention is all you need》

作者:Google團隊(2017年發表在NIPS上)

簡介:Transformer 是一種新的、基于 attention 機制來實現的特征提取器,可用于代替 CNN 和 RNN 來提取序列的特征。 在該論文中 Transformer 用于 encoder - decoder 架構。事實上 Transformer 可以單獨應用于 encoder 或者單獨應用于 decoder 。

輸入自然語言序列到編碼器: Why do we work?(為什么要工作);
編碼器輸出的隱藏層, 再輸入到解碼器;
輸入$<start>$(起始)符號到解碼器;
得到第一個字"為";
將得到的第一個字"為"落下來再輸入到解碼器;
得到第二個字"什";
將得到的第二字再落下來, 直到解碼器輸出$<end>$(終止符), 即序列生成完成。

Transformer相比較LSTM等循環神經網絡模型的優點:

可以直接捕獲序列中的長距離依賴關系;
模型并行度高,使得訓練時間大幅度降低。

二、編碼器

1) 字向量與位置編碼

$X = EmbeddingLookup(X) + PositionalEncoding$
$X in mathbb{R}^{batch size * seq. len. * embed. dim.} $

2) 自注意力機制
$Q = Linear(X) = XW_{Q}$
$K = Linear(X) = XW_{K}$
$V = Linear(X) = XW_{V}$
$X_{attention} = SelfAttention(Q, K, V)$
3) 殘差連接與Layer Normalization
$X_{attention} = X + X_{attention}$
$X_{attention} = LayerNorm(X_{attention})$
4) $FeedForward$, 其實就是兩層線性映射并用激活函數激活, 比如說$ReLU$:
$X_{hidden} = Activate(Linear(Linear(X_{attention})))$
5) 重復3):
$X_{hidden} = X_{attention} + X_{hidden}$
$X_{hidden} = LayerNorm(X_{hidden})$
$X_{hidden} in mathbb{R}^{batch size * seq. len. * embed. dim.} $

1.positional encoding

  由于transformer模型沒有循環神經網絡的迭代操作,所以我們必須提供每個字的位置信息給transformer,才能識別出語言中的順序關系。

(1)字向量

每個字無論中英文都有一個唯一的數字與其對應,即有一個字典表。

字典表:{1:知,2:否,3:應,...}

(2)文本向量

假設一次性輸入文本為batch_size個句子,給encoder訓練,此時輸入文本就變為[batch_size,seq_len]矩陣數據。

文本向量:每個字都有一串embed_dim長度的數字來表示。

(3)位置向量positional encoding

買張北京到廣州的機票。

買張廣州到北京的機票。

  位置向量的維度為[max_seq_len,embed_dim],max_seq_len屬于超參數, 指的是限定的最大單個句長。
注意, 我們一般以字為單位訓練transformer模型, 也就是說我們不用分詞了,首先我們要初始化字向量為[vocab_size, embed_dim],vocab_size為總共的字庫數量,embed_dim為字向量的維度,也是每個字的數學表達。

下面畫一下位置嵌入, 可見縱向觀察, 隨著embed_dim增大, 位置嵌入函數呈現不同的周期變化。

注意力矩陣的三維圖如下:

論文中使用了$sine$和$cosine$函數的線性變換來提供給模型位置信息:

$PE_{(pos,2i)} = sin(frac{pos} {10000^{2i/d_{model}}})$

$PE_{(pos,2i+1)} = cos(frac{pos}{10000^{2i/d_{model}}})$

上式中$pos$指的是句中字的位置, 取值范圍是[0, max_seq_len),

$i$指的是詞向量的維度, 取值范圍是[0, embed_dim),

$d_{model}$指的是字向量的最大維度即embed_dim最大值,$d_{model}=512$。

上面有$sin$和$cos$一組公式, 也就是對應著embed_dim維度的一組奇數和偶數的序號的維度, 例如$0,1$一組,$2,3$一組, 分別用上面的$sin$和$cos$函數做處理,從而產生不同的周期性變化,而位置嵌入在embed_dim維度上隨著維度序號增大,周期變化會越來越慢,而產生一種包含位置信息的紋理,就像Transformer論文原文第六頁講的,位置嵌入函數的周期從$2 pi$到$10000 * 2 pi$變化,而每一個位置在embed_dim維度上都會得到不同周期的$sin$和$cos$函數的取值組合,從而產生獨一的紋理位置信息,模型從而學到位置之間的依賴關系和自然語言的時序特性。

相對位置編碼與絕對位置編碼:

你好,買張北京到廣州的機票。(絕對,BERT

買張北京到廣州的機票。(相對)

2. self-attention mechanism

(1)為什么用self-attention?

(2)什么是self-attention?

1.Encoder

2.Decoder

3.Encoder-Decoder

(3)怎么計算self-attention?

Attention Mask

  注意, 在上面self attention的計算過程中, 我們通常使用mini batch來計算, 也就是一次計算多句話, 也就是X的維度是[batch_size, seq_len], seq_len是句長, 而一個mini batch是由多個不等長的句子組成的, 我們就需要按照這個mini batch中最大的句長對剩余的句子進行補齊長度, 我們一般用0來進行填充, 這個過程叫做padding。
  但這時在進行softmax的時候就會產生問題, 回顧softmax函數$sigma (mathbf {z} )_{i}={frac {e^{z_{i}}}{sum _{j=1}^{K}e^{z_{j}}}}$, $e^0$是1, 是有值的, 這樣的話softmax中被padding的部分就參與了運算, 就等于是讓無效的部分參與了運算, 會產生很大隱患, 這時就需要做一個mask讓這些無效區域不參與運算, 我們一般給無效區域加一個很大的負數的偏置, 也就是:
$z_{illegal} = z_{illegal} + bias_{illegal}$
$bias_{illegal} o -infty$
$e^{z_{illegal}} o 0 $
經過上式的masking我們使無效區域經過softmax計算之后還幾乎為0, 這樣就避免了無效區域參與計算。

(4)多頭自注意力機制

綜合CNN和self-attention,考慮不同類型的關系。

3. 殘差連接和層標準化

(1)殘差連接residual connection

我們在上一步得到了經過注意力矩陣加權之后的$V$, 也就是$Attention(Q, K, V)$, 我們對它進行一下轉置, 使其和$X_{embedding}$的維度一致, 也就是[batch_size, seq_len, embed_dim], 然后把他們加起來做殘差連接, 直接進行元素相加, 因為他們的維度一致:
$X_{embedding} + Attention(Q, K, V)$
在之后的運算里, 每經過一個模塊的運算, 都要把運算之前的值和運算之后的值相加, 從而得到殘差連接, 訓練的時候可以使梯度直接走捷徑反傳到最初始層:
$X + SubLayer(X)$

(2)層標準化layer normalization

$Layer Normalization$的作用是把神經網絡中隱藏層歸一為標準正態分布, 也就是$i.i.d$獨立同分布, 以起到加快訓練速度, 加速收斂的作用:
$mu_{i}=frac{1}{m} sum^{m}_{i=1}x_{ij}$
上式中以矩陣的行$(row)$為單位求均值;
$sigma^{2}_{j}=frac{1}{m} sum^{m}_{i=1}(x_{ij}-mu_{j})^{2}$
上式中以矩陣的行$(row)$為單位求方差;
$LayerNorm(x)=alpha odot frac{x_{ij}-mu_{i}}{sqrt{sigma^{2}_{i}+epsilon}} + eta$
然后用每一行的每一個元素減去這行的均值, 再除以這行的標準差, 從而得到歸一化后的數值, $epsilon$是為了防止除0;
之后引入兩個可訓練參數$alpha, eta$來彌補歸一化的過程中損失掉的信息, 注意$odot$表示元素相乘而不是點積, 我們一般初始化$alpha$為全1, 而$eta$為全0

4. 訓練tips

5.總結

參考文獻:

【1】大師級的a_journey_into_math_of_ml / 04_transformer_tutorial_2nd_part·濃縮咖啡/濃咖啡/ a_journey_into_math_of_ml

【2】The Illustrated Transformer(可視化講解)

【3】The Annotated Transformer(代碼講解)

【4】TensorFlow實戰BERT

【5】臺大《應用深度學習》國語課程(2020) by 陳蘊儂

【6】帶注釋的變壓器

總結

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

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