日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【NLP】图解Transformer(完整版)

發布時間:2025/3/8 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NLP】图解Transformer(完整版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

譯者:張賢,哈爾濱工程大學,Datawhale原創作者

本文約16000字,是NLP專欄第一篇,建議收藏閱讀

審稿人:Jepson,Datawhale成員,畢業于中國科學院,目前在騰訊從事推薦算法工作。


結構總覽

前言

本文翻譯自http://jalammar.github.io/illustrated-transformer,是筆者看過的把 Transformer 講解得最好的文章。這篇文章從輸入開始,一步一步演示了數據在 Transformer 中的流動過程。由于看過一些中文翻譯的文章,感覺不夠好,所以我自己翻譯了一個版本,在一些難以直譯的地方,我加入了一些原文沒有的文字說明,來更好地解釋概念。另外,我添加了一些簡單的代碼,實現了一個基本的 Self Attention 以及 multi-head attention 的矩陣運算。

Transformer 依賴于 Self Attention 的知識。Attention 是一種在深度學習中廣泛使用的方法,Attention的思想提升了機器翻譯的效果。如果你還沒學習 Attention,請查看這篇 Attention 的精彩講解:https://zhuanlan.zhihu.com/p/265182368。

2017 年,Google 提出了 Transformer 模型,用 Self Attention 的結構,取代了以往 NLP 任務中的 RNN 網絡結構,在 WMT 2014 Englishto-German 和 WMT 2014 English-to-French兩個機器翻譯任務上都取得了當時 SOTA 的效果。

這個模型的其中一個優點,就是使得模型訓練過程能夠并行計算。在 RNN 中,每一個 time step 的計算都依賴于上一個 time step 的輸出,這就使得所有的 time step 必須串行化,無法并行計算,如下圖所示。

而在 Transformer 中,所有 time step 的數據,都是經過 Self Attention 計算,使得整個運算過程可以并行化計算。

這篇文章的目的是從上到下,一步一步拆解 Transformer 的各種概念,希望有助于初學者更加容易地理解 Transformer 到底是什么。

Transformer 使用了 Seq2Seq任務中常用的結構——包括兩個部分:Encoder 和 Decoder。一般的結構圖,都是像下面這樣。

如果你看到上圖不知所措,不要擔心,下面我們來一步步拆解 Transformer。

一、從整體宏觀來理解 Transformer

首先,我們將整個模型視為黑盒。在機器翻譯任務中,接收一種語言的句子作為輸入,然后將其翻譯成其他語言輸出。

中間部分的 Transformer 可以拆分為 2 部分:左邊是編碼部分(encoding component),右邊是解碼部分(decoding component)。

其中編碼部分是多層的編碼器(Encoder)組成(Transformer 的論文中使用了 6 層編碼器,這里的層數 6 并不是固定的,你也可以根據實驗效果來修改層數)。同理,解碼部分也是由多層的解碼器(Decoder)組成(論文里也使用了 6 層的解碼器)。

每一個編碼器 在結構上都是一樣的,但它們的權重參數是不同的。每一個編碼器里面,可以分為 2 層
  • Self-Attention Layer

  • Feed Forward Neural Network(前饋神經網絡,縮寫為 FFNN)

輸入編碼器的文本數據,首先會經過一個 Self Attention 層,這個層處理一個詞的時候,不僅會使用這個詞本身的信息,也會使用句子中其他詞的信息(你可以類比為:當我們翻譯一個詞的時候,不僅會只關注當前的詞,也會關注這個詞的上下文的其他詞的信息)。本文后面將會詳細介紹 Self Attention 的內部結構。

接下來,Self Attention 層的輸出會經過前饋神經網絡。

同理,解碼器也具有這兩層,但是這兩層中間還插入了一個 Encoder-Decoder Attention 層,這個層能幫助解碼器聚焦于輸入句子的相關部分(類似于 seq2seq 模型 中的 Attention)。

二、從細節來理解 Transformer

上面,我們從宏觀理解了 Transformer 的主要部分。下面,我們來看輸入的張量數據,在 Transformer 中運算最終得到輸出的過程。

2.1 Transformer 的輸入

和通常的 NLP 任務一樣,我們首先會使用詞嵌入算法(embedding algorithm),將每個詞轉換為一個詞向量。實際中向量一般是 256 或者 512 維。為了簡化起見,這里將每個詞的轉換為一個 4 維的詞向量

那么整個輸入的句子是一個向量列表,其中有 3 個詞向量。在實際中,每個句子的長度不一樣,我們會取一個適當的值,作為向量列表的長度。如果一個句子達不到這個長度,那么就填充全為 0 的詞向量;如果句子超出這個長度,則做截斷。句子長度是一個超參數,通常是訓練集中的句子的最大長度,你可以嘗試不同長度的效果。

編碼器(Encoder)接收的輸入都是一個向量列表,輸出也是大小同樣的向量列表,然后接著輸入下一個編碼器。

第一個編碼器的輸入是詞向量,而后面的編碼器的輸入是上一個編碼器的輸出

下面,我們來看這個向量列表在編碼器里面是如何流動的。

這里我們可以注意到 Transformer 的一個重要特性:每個位置的詞向量經過編碼器都有自己單獨的路徑。具體來說,在 Self Attention 層中,這些路徑之間是有依賴關系的;而在 Feed Forward (前饋神經網絡)層中,這些路徑之間是沒有依賴關系的。因此這些詞向量在經過 Feed Forward 層中可以并行計算(這句話會造成困擾,我認為在 Self Attention 層中,也能并行計算,沒有必要單獨說 Feed Forward 層也可以并行計算)。

下面我們用一個更短的句子,來說明數據在編碼器的編碼過程。

2.2 Encoder(編碼器)

上面我們提到,一個編碼器接收的輸入是一個向量列表,它會把向量列表輸入到 Self Attention 層,然后經過 feed-forward neural network (前饋神經網絡)層,最后得到輸出,傳入下一個編碼器。

每個位置的詞都經過 Self Attention 層,得到的每個輸出向量都單獨經過前饋神經網絡層,每個向量經過的前饋神經網絡都是一樣的

三、 Self-Attention 整體理解

別被“Self-Attention”這么高大上的詞給唬住了,乍一聽好像每個人都應該對這個詞熟悉一樣。但我在讀論文《Attention is All You Need》 之前就沒有聽過這個詞。下面來分析 Self-Attention 的具體機制。

假設我們想要翻譯的句子是:

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

這個句子中的 it 是一個指代詞,那么 it 指的是什么呢?它是指animal還是street?這個問題對人來說,是很簡單的,但是對算法來說并不是那么容易。

當模型在處理(翻譯)it 的時候,Self Attention機制能夠讓模型把it和animal關聯起來。

同理,當模型處理句子中的每個詞時,Self Attention機制使得模型不僅能夠關注這個位置的詞,而且能夠關注句子中其他位置的詞,作為輔助線索,進而可以更好地編碼當前位置的詞。

如果你熟悉 RNN,回憶一下:RNN 在處理一個詞時,會考慮前面傳過來的hidden state,而hidden state就包含了前面的詞的信息。而 Transformer 使用Self Attention機制,會把其他單詞的理解融入處理當前的單詞。

當我們在第五層編碼器中(編碼部分中的最后一層編碼器)編碼“it”時,有一部分注意力集中在“The animal”上,并且把這兩個詞的信息融合到了"it"這個單詞中。

你可以查看 【Tensor2Tensor notebook】。在這個 notebook 里,你可以加載 Transformer 模型,并通過交互式的可視化,來理解 Self Attention。

四、Self-Attention 的細節

4.1 計算Query 向量,Key 向量,Value 向量

下面我們先看下如何使用向量來計算 Self Attention,然后再看下如何使用矩陣來實現 Self Attention。(矩陣運算的方式,使得 Self Attention 的計算能夠并行化,這也是 Self Attention 最終的實現方式)。

計算 Self Attention 的第 1 步是:對輸入編碼器的每個詞向量,都創建 3 個向量,分別是:Query 向量,Key 向量,Value 向量。這 3 個向量是詞向量分別和 3 個矩陣相乘得到的,而這個矩陣是我們要學習的參數。

注意,這 3 個新得到的向量一般比原來的詞向量的長度更小。假設這 3 個向量的長度是?,而原始的詞向量或者最終輸出的向量的長度是 512(這 3 個向量的長度,和最終輸出的向量長度,是有倍數關系的)。關于 Multi-head Attention,后面會給出實際代碼。這里為了簡化,假設只有一個 head 的 Self-Attention。

上圖中,有兩個詞向量:Thinking 的詞向量 x1 和 Machines 的詞向量 x2。以 x1 為例,X1 乘以 WQ 得到 q1,q1 就是 X1 對應的 Query 向量。同理,X1 乘以 WK 得到 k1,k1 是 X1 對應的 Key 向量;X1 乘以 WV 得到 v1,v1 是 X1 對應的 Value 向量。

Query 向量,Key 向量,Value 向量是什么含義呢?

其實它們就是 3 個向量,給它們加上一個名稱,可以讓我們更好地理解 Self-Attention 的計算過程和邏輯含義。繼續往下讀,你會知道 attention 是如何計算出來的,Query 向量,Key 向量,Value 向量又分別扮演了什么角色。

4.2 計算 Attention Score(注意力分數)

第 2 步,是計算 Attention Score(注意力分數)。假設我們現在計算第一個詞 Thinking 的 Attention Score(注意力分數),需要根據 Thinking 這個詞,對句子中的其他每個詞都計算一個分數。這些分數決定了我們在編碼Thinking這個詞時,需要對句子中其他位置的每個詞放置多少的注意力。

這些分數,是通過計算 "Thinking" 對應的 Query 向量和其他位置的每個詞的 Key 向量的點積,而得到的。如果我們計算句子中第一個位置單詞的 Attention Score(注意力分數),那么第一個分數就是 q1 和 k1 的內積,第二個分數就是 q1 和 k2 的點積。

第 3 步就是把每個分數除以?( 是 Key 向量的長度)。你也可以除以其他數,除以一個數是為了在反向傳播時,求取梯度更加穩定。

第 4 步,接著把這些分數經過一個 Softmax 層,Softmax可以將分數歸一化,這樣使得分數都是正數并且加起來等于 1。

這些分數決定了在編碼當前位置(這里的例子是第一個位置)的詞時,對所有位置的詞分別有多少的注意力。很明顯,在上圖的例子中,當前位置(這里的例子是第一個位置)的詞會有最高的分數,但有時,關注到其他位置上相關的詞也很有用。

第 5 步,得到每個位置的分數后,將每個分數分別與每個 Value 向量相乘。這種做法背后的直覺理解就是:對于分數高的位置,相乘后的值就越大,我們把更多的注意力放到了它們身上;對于分數低的位置,相乘后的值就越小,這些位置的詞可能是相關性不大的,這樣我們就忽略了這些位置的詞。

第 6 步是把上一步得到的向量相加,就得到了 Self Attention 層在這個位置(這里的例子是第一個位置)的輸出。

上面這張圖,包含了 Self Attention 的全過程,最終得到的當前位置(這里的例子是第一個位置)的向量會輸入到前饋神經網絡。但這樣每次只能計算一個位置的輸出向量,在實際的代碼實現中,Self Attention 的計算過程是使用矩陣來實現的,這樣可以加速計算,一次就得到所有位置的輸出向量。下面讓我們來看,如何使用矩陣來計算所有位置的輸出向量。

五、使用矩陣計算 Self-Attention

第一步是計算 Query,Key,Value 的矩陣。首先,我們把所有詞向量放到一個矩陣 X 中,然后分別和 3 個權重矩陣,, 相乘,得到 Q,K,V 矩陣。

矩陣 X 中的每一行,表示句子中的每一個詞的詞向量,長度是 512。Q,K,V 矩陣中的每一行表示 Query 向量,Key 向量,Value 向量,向量長度是 64。

接著,由于我們使用了矩陣來計算,我們可以把上面的第 2 步到第 6 步壓縮為一步,直接得到 Self Attention 的輸出。

六、多頭注意力機制(multi-head attention)

Transformer 的論文通過增加多頭注意力機制(一組注意力稱為一個 attention head),進一步完善了 Self Attention 層。這種機制從如下兩個方面增強了 attention 層的能力:

  • 它擴展了模型關注不同位置的能力。在上面的例子中,第一個位置的輸出 z1 包含了句子中其他每個位置的很小一部分信息,但 z1 可能主要是由第一個位置的信息決定的。當我們翻譯句子:The animal didn’t cross the street because it was too tired時,我們想讓機器知道其中的it指代的是什么。這時,多頭注意力機制會有幫助。

  • 多頭注意力機制賦予 attention 層多個“子表示空間”。下面我們會看到,多頭注意力機制會有多組?,, 的權重矩陣(在 Transformer 的論文中,使用了 8 組注意力(attention heads)。因此,接下來我也是用 8 組注意力頭 (attention heads))。每一組注意力的?,,的權重矩陣都是隨機初始化的。經過訓練之后,每一組注意力可以看作是把輸入的向量映射到一個”子表示空間“。


  • 在多頭注意力機制中,我們為每組注意力維護單獨的 WQ, WK, WV 權重矩陣。將輸入 X 和每組注意力的WQ, WK, WV 相乘,得到 8 組 Q, K, V 矩陣。

    接著,我們把每組 K, Q, V 計算得到每組的 Z 矩陣,就得到 8 個 Z 矩陣。

    接下來就有點麻煩了,因為前饋神經網絡層接收的是 1 個矩陣(其中每行的向量表示一個詞),而不是 8 個矩陣。所以我們需要一種方法,把 8 個矩陣整合為一個矩陣。

    怎么才能做到呢?我們把矩陣拼接起來,然后和另一個權重矩陣? 相乘。

  • 把 8 個矩陣 {Z0,Z1...,Z7} 拼接起來

  • 把拼接后的矩陣和 WO 權重矩陣相乘

  • 得到最終的矩陣 Z,這個矩陣包含了所有 attention heads(注意力頭) 的信息。這個矩陣會輸入到 FFNN (Feed Forward Neural Network)層。

  • 這就是多頭注意力的全部內容。我知道,在上面的講解中,出現了相當多的矩陣。下面我把所有的內容都放到一張圖中,這樣你可以總攬全局,在這張圖中看到所有的內容。

    既然我們已經談到了多頭注意力,現在讓我們重新回顧之前的翻譯例子,看下當我們編碼單詞it時,不同的 attention heads (注意力頭)關注的是什么部分。

    當我們編碼單詞"it"時,其中一個 attention head (注意力頭)最關注的是"the animal",另外一個 attention head 關注的是"tired"。因此在某種意義上,"it"在模型中的表示,融合了"animal"和"word"的部分表達。

    然而,當我們把所有 attention heads(注意力頭) 都在圖上畫出來時,多頭注意力又變得難以解釋了。

    七、代碼實現矩陣計算 Attention

    下面我們是用代碼來演示,如何使用矩陣計算 attention。首先使用 PyTorch 庫提供的函數實現,然后自己再實現。

    7.1 使用 PyTorch 庫的實現

    PyTorch 提供了 MultiheadAttention 來實現 attention 的計算。

    torch.nn.MultiheadAttention(embed_dim, num_heads, dropout=0.0, bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None)

    參數說明如下:

    • embed_dim:最終輸出的 K、Q、V 矩陣的維度,這個維度需要和詞向量的維度一樣

    • num_heads:設置多頭注意力的數量。如果設置為 1,那么只使用一組注意力。如果設置為其他數值,那么 num_heads 的值需要能夠被 embed_dim 整除

    • dropout:這個 dropout 加在 attention score 后面

    現在來解釋一下,為什么 ?num_heads 的值需要能夠被 embed_dim 整除。這是為了把詞的隱向量長度平分到每一組,這樣多組注意力也能夠放到一個矩陣里,從而并行計算多頭注意力。

    例如,我們前面說到,8 組注意力可以得到 8 組 Z 矩陣,然后把這些矩陣拼接起來,得到最終的輸出。如果最終輸出的每個詞的向量維度是 512,那么每組注意力的向量維度應該是?。

    如果不能夠整除,那么這些向量的長度就無法平均分配。

    下面的會有代碼示例,如何使用矩陣實現多組注意力的并行計算。

    定義 MultiheadAttention 的對象后,調用時傳入的參數如下。

    forward(query, key, value, key_padding_mask=None, need_weights=True, attn_mask=None)
    • query:對應于 Key 矩陣,形狀是 (L,N,E) 。其中 L 是輸出序列長度,N 是 batch size,E 是詞向量的維度

    • key:對應于 Key 矩陣,形狀是 (S,N,E) 。其中 S 是輸入序列長度,N 是 batch size,E 是詞向量的維度

    • value:對應于 Value 矩陣,形狀是 (S,N,E) 。其中 S 是輸入序列長度,N 是 batch size,E 是詞向量的維度

    • key_padding_mask:如果提供了這個參數,那么計算 attention score 時,忽略 Key 矩陣中某些 padding 元素,不參與計算 attention。形狀是 (N,S)。其中 N 是 batch size,S 是輸入序列長度。

      • 如果 key_padding_mask 是 ByteTensor,那么非 0 元素對應的位置會被忽略

      • 如果 key_padding_mask 是 BoolTensor,那么 ?True 對應的位置會被忽略

    • attn_mask:計算輸出時,忽略某些位置。形狀可以是 2D ?(L,S),或者 3D (N?numheads,L,S)。其中 L 是輸出序列長度,S 是輸入序列長度,N 是 batch size。

      • 如果 attn_mask 是 ByteTensor,那么非 0 元素對應的位置會被忽略

      • 如果 attn_mask 是 BoolTensor,那么 ?True 對應的位置會被忽略

    需要注意的是:在前面的講解中,我們的 K、Q、V 矩陣的序列長度都是一樣的。但是在實際中,K、V 矩陣的序列長度是一樣的,而 Q 矩陣的序列長度可以不一樣。

    這種情況發生在:在解碼器部分的Encoder-Decoder Attention層中,Q 矩陣是來自解碼器下層,而 K、V 矩陣則是來自編碼器的輸出。


    在完成了編碼(encoding)階段之后,我們開始解碼(decoding)階段。解碼(decoding )階段的每一個時間步都輸出一個翻譯后的單詞(這里的例子是英語翻譯)。

    輸出是:

    • attn_output:形狀是 (L,N,E)

    • attn_output_weights:形狀是 (N,L,S)

    代碼示例如下:

    ## nn.MultiheadAttention 輸入第0維為length # batch_size 為 64,有 12 個詞,每個詞的 Query 向量是 300 維 query = torch.rand(12,64,300) # batch_size 為 64,有 10 個詞,每個詞的 Key 向量是 300 維 key = torch.rand(10,64,300) # batch_size 為 64,有 10 個詞,每個詞的 Value 向量是 300 維 value= torch.rand(10,64,300)embed_dim = 299 num_heads = 1 # 輸出是 (attn_output, attn_output_weights) multihead_attn = nn.MultiheadAttention(embed_dim, num_heads) attn_output = multihead_attn(query, key, value)[0] # output: torch.Size([12, 64, 300]) # batch_size 為 64,有 12 個詞,每個詞的向量是 300 維 print(attn_output.shape)

    7.2 手動實現計算 Attention

    在 PyTorch 提供的 MultiheadAttention ?中,第 1 維是句子長度,第 2 維是 batch size。這里我們的代碼實現中,第 1 維是 batch size,第 2 維是句子長度。代碼里也包括:如何用矩陣實現多組注意力的并行計算。代碼中已經有詳細注釋和說明。

    class MultiheadAttention(nn.Module):# n_heads:多頭注意力的數量# hid_dim:每個詞輸出的向量維度def __init__(self, hid_dim, n_heads, dropout):super(MultiheadAttention, self).__init__()self.hid_dim = hid_dimself.n_heads = n_heads# 強制 hid_dim 必須整除 hassert hid_dim % n_heads == 0# 定義 W_q 矩陣self.w_q = nn.Linear(hid_dim, hid_dim)# 定義 W_k 矩陣self.w_k = nn.Linear(hid_dim, hid_dim)# 定義 W_v 矩陣self.w_v = nn.Linear(hid_dim, hid_dim)self.fc = nn.Linear(hid_dim, hid_dim)self.do = nn.Dropout(dropout)# 縮放self.scale = torch.sqrt(torch.FloatTensor([hid_dim // n_heads]))def forward(self, query, key, value, mask=None):# K: [64,10,300], batch_size 為 64,有 12 個詞,每個詞的 Query 向量是 300 維# V: [64,10,300], batch_size 為 64,有 10 個詞,每個詞的 Query 向量是 300 維# Q: [64,12,300], batch_size 為 64,有 10 個詞,每個詞的 Query 向量是 300 維bsz = query.shape[0]Q = self.w_q(query)K = self.w_k(key)V = self.w_v(value)# 這里把 K Q V 矩陣拆分為多組注意力,變成了一個 4 維的矩陣# 最后一維就是是用 self.hid_dim // self.n_heads 來得到的,表示每組注意力的向量長度, 每個 head 的向量長度是:300/6=50# 64 表示 batch size,6 表示有 6組注意力,10 表示有 10 詞,50 表示每組注意力的詞的向量長度# K: [64,10,300] 拆分多組注意力 -> [64,10,6,50] 轉置得到 -> [64,6,10,50]# V: [64,10,300] 拆分多組注意力 -> [64,10,6,50] 轉置得到 -> [64,6,10,50]# Q: [64,12,300] 拆分多組注意力 -> [64,12,6,50] 轉置得到 -> [64,6,12,50]# 轉置是為了把注意力的數量 6 放到前面,把 10 和 50 放到后面,方便下面計算Q = Q.view(bsz, -1, self.n_heads, self.hid_dim //self.n_heads).permute(0, 2, 1, 3)K = K.view(bsz, -1, self.n_heads, self.hid_dim //self.n_heads).permute(0, 2, 1, 3)V = V.view(bsz, -1, self.n_heads, self.hid_dim //self.n_heads).permute(0, 2, 1, 3)# 第 1 步:Q 乘以 K的轉置,除以scale# [64,6,12,50] * [64,6,50,10] = [64,6,12,10]# attention:[64,6,12,10]attention = torch.matmul(Q, K.permute(0, 1, 3, 2)) / self.scale# 把 mask 不為空,那么就把 mask 為 0 的位置的 attention 分數設置為 -1e10if mask is not None:attention = attention.masked_fill(mask == 0, -1e10)# 第 2 步:計算上一步結果的 softmax,再經過 dropout,得到 attention。# 注意,這里是對最后一維做 softmax,也就是在輸入序列的維度做 softmax# attention: [64,6,12,10]attention = self.do(torch.softmax(attention, dim=-1))# 第三步,attention結果與V相乘,得到多頭注意力的結果# [64,6,12,10] * [64,6,10,50] = [64,6,12,50]# x: [64,6,12,50]x = torch.matmul(attention, V)# 因為 query 有 12 個詞,所以把 12 放到前面,把 5 和 60 放到后面,方便下面拼接多組的結果# x: [64,6,12,50] 轉置-> [64,12,6,50]x = x.permute(0, 2, 1, 3).contiguous()# 這里的矩陣轉換就是:把多組注意力的結果拼接起來# 最終結果就是 [64,12,300]# x: [64,12,6,50] -> [64,12,300]x = x.view(bsz, -1, self.n_heads * (self.hid_dim // self.n_heads))x = self.fc(x)return x# batch_size 為 64,有 12 個詞,每個詞的 Query 向量是 300 維 query = torch.rand(64, 12, 300) # batch_size 為 64,有 12 個詞,每個詞的 Key 向量是 300 維 key = torch.rand(64, 10, 300) # batch_size 為 64,有 10 個詞,每個詞的 Value 向量是 300 維 value = torch.rand(64, 10, 300) attention = MultiheadAttention(hid_dim=300, n_heads=6, dropout=0.1) output = attention(query, key, value) ## output: torch.Size([64, 12, 300]) print(output.shape)

    7.3 關鍵代碼

    其中用矩陣實現多頭注意力的關鍵代碼如下所示, K、Q、V 矩陣拆分為多組注意力,變成了一個 4 維的矩陣。

    # 這里把 K Q V 矩陣拆分為多組注意力,變成了一個 4 維的矩陣# 最后一維就是是用 self.hid_dim // self.n_heads 來得到的,表示每組注意力的向量長度, 每個 head 的向量長度是:300/6=50# 64 表示 batch size,6 表示有 6組注意力,10 表示有 10 個詞,50 表示每組注意力的詞的向量長度# K: [64,10,300] 拆分多組注意力 -> [64,10,6,50] 轉置得到 -> [64,6,10,50]# V: [64,10,300] 拆分多組注意力 -> [64,10,6,50] 轉置得到 -> [64,6,10,50]# Q: [64,12,300] 拆分多組注意力 -> [64,12,6,50] 轉置得到 -> [64,6,12,50]# 轉置是為了把注意力的數量 6 放到前面,把 10 和 50 放到后面,方便下面計算Q = Q.view(bsz, -1, self.n_heads, self.hid_dim //self.n_heads).permute(0, 2, 1, 3)K = K.view(bsz, -1, self.n_heads, self.hid_dim //self.n_heads).permute(0, 2, 1, 3)V = V.view(bsz, -1, self.n_heads, self.hid_dim //self.n_heads).permute(0, 2, 1, 3) 經過 attention 計算得到 x 的形狀是 `[64,12,6,50]`,64 表示 batch size,6 表示有 6組注意力,10 表示有 10 個詞,50 表示每組注意力的詞的向量長度。把這個矩陣轉換為 `[64,12,300]`的矩陣,就是相當于把多組注意力的結果拼接起來。 e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e ee這里的矩陣轉換就是:把多組注意力的結果拼接起來,最終結果就是 [64,12,300],x: [64,12,6,50] -> [64,12,300] x = x.view(bsz, -1, self.n_heads * (self.hid_dim // self.n_heads))

    八、使用位置編碼來表示序列的順序

    到目前為止,我們闡述的模型中缺失了一個東西,那就是表示序列中單詞順序的方法。

    為了解決這個問題,Transformer 模型對每個輸入的向量都添加了一個向量。這些向量遵循模型學習到的特定模式,有助于確定每個單詞的位置,或者句子中不同單詞之間的距離。這種做法背后的直覺是:將這些表示位置的向量添加到詞向量中,得到了新的向量,這些新向量映射到 Q/K/V,然后計算點積得到 attention 時,可以提供有意義的信息。

    為了讓模型了解單詞的順序,我們添加了帶有位置編碼的向量--這些向量的值遵循特定的模式。

    如果我們假設詞向量的維度是 4,那么帶有位置編碼的向量可能如下所示:

    上圖為帶有位置編碼的向量長度為 4 的例子。

    那么帶有位置編碼的向量到底遵循什么模式?

    在下圖中,每一行表示一個帶有位置編碼的向量。所以,第一行對應于序列中第一個單詞的位置編碼向量。每一行都包含 512 個值,每個值的范圍在 -1 和 1 之間。我對這些向量進行了涂色可視化,你可以從中看到向量遵循的模式。

    這是一個真實的例子,包含了 20 個詞,每個詞向量的維度是 512。你可以看到,它看起來像從中間一分為二。這是因為左半部分的值是由 sine 函數產生的,而右半部分的值是由 cosine 函數產生的,然后將他們拼接起來,得到每個位置編碼向量。

    你可以在get_timing_signal_1d()上查看生成位置編碼的代碼。這種方法來自于Tranformer2Transformer 的實現。

    而論文中的方法和上面圖中的稍有不同,它不是直接拼接兩個向量,而是將兩個向量交織在一起。如下圖所示。

    此為生成位置編碼的公式,在 Transformer 論文的 3.5 節中有詳細說明。

    這不是唯一一種生成位置編碼的方法。但這種方法的優點是:可以擴展到未知的序列長度。例如:當我們的模型需要翻譯一個句子,而這個句子的長度大于訓練集中所有句子的長度,這時,這種位置編碼的方法也可以生成一樣長的位置編碼向量。

    九、殘差連接

    在我們繼續講解之前,編碼器結構中有一個需要注意的細節是:編碼器的每個子層(Self Attention 層和 FFNN)都有一個殘差連接和層標準化(layer-normalization)。

    將 Self-Attention 層的層標準化(layer-normalization)和向量都進行可視化,如下所示:

    在解碼器的子層里面也有層標準化(layer-normalization)。假設一個 Transformer 是由 2 層編碼器和兩層解碼器組成的,如下圖所示。

    十、Decoder(解碼器)

    現在我們已經介紹了解碼器中的大部分概念,我們也基本知道了解碼器的原理。現在讓我們來看下, 編碼器和解碼器是如何協同工作的。

    上面說了,編碼器一般有多層,第一個編碼器的輸入是一個序列,最后一個編碼器輸出是一組注意力向量 K 和 V。這些注意力向量將會輸入到每個解碼器的Encoder-Decoder Attention層,這有助于解碼器把注意力集中中輸入序列的合適位置。

    在完成了編碼(encoding)階段之后,我們開始解碼(decoding)階段。解碼(decoding )階段的每一個時間步都輸出一個翻譯后的單詞(這里的例子是英語翻譯)。

    接下來會重復這個過程,直到輸出一個結束符,Transformer 就完成了所有的輸出。每一步的輸出都會在下一個時間步輸入到下面的第一個解碼器。Decoder 就像 Encoder 那樣,從下往上一層一層地輸出結果。正對如編碼器的輸入所做的處理,我們把解碼器的輸入向量,也加上位置編碼向量,來指示每個詞的位置。

    解碼器中的 Self Attention 層,和編碼器中的 Self Attention 層不太一樣:在解碼器里,Self Attention 層只允許關注到輸出序列中早于當前位置之前的單詞。具體做法是:在 Self Attention 分數經過 Softmax 層之前,屏蔽當前位置之后的那些位置。

    Encoder-Decoder Attention層的原理和多頭注意力(multiheaded Self Attention)機制類似,不同之處是:Encoder-Decoder Attention層是使用前一層的輸出來構造 Query 矩陣,而 Key 矩陣和 Value 矩陣來自于解碼器最終的輸出。

    十一、 最后的線性層和 Softmax 層

    Decoder 最終的輸出是一個向量,其中每個元素是浮點數。我們怎么把這個向量轉換為單詞呢?這是由 Softmax 層后面的線性層來完成的。

    線性層就是一個普通的全連接神經網絡,可以把解碼器輸出的向量,映射到一個更長的向量,這個向量稱為 logits 向量。

    現在假設我們的模型有 10000 個英語單詞(模型的輸出詞匯表),這些單詞是從訓練集中學到的。因此 logits 向量有 10000 個數字,每個數表示一個單詞的分數。我們就是這樣去理解線性層的輸出。

    然后,Softmax 層會把這些分數轉換為概率(把所有的分數轉換為正數,并且加起來等于 1)。然后選擇最高概率的那個數字對應的詞,就是這個時間步的輸出單詞。

    在上圖中,最下面的向量,就是編碼器的輸出,這個向量輸入到線性層和 Softmax 層,最終得到輸出的詞。

    十二、 Transformer 的訓練過程

    現在我們已經了解了 Transformer 的前向傳播過程,下面講講 Transformer 的訓練過程,這也是非常有用的知識。

    在訓練過程中,模型會經過上面講的所有前向傳播的步驟。但是,當我們在一個標注好的數據集上訓練這個模型的時候,我們可以對比模型的輸出和真實的標簽。

    為了可視化這個對比,讓我們假設輸出詞匯表只包含 6 個單詞(“a”, “am”, “i”, “thanks”, “student”, and “<eos>”(“<eos>”表示句子末尾))。

    我們模型的輸出詞匯表,是在訓練之前的數據預處理階段構造的。當我們確定了輸出詞匯表,我們可以用向量來表示詞匯表中的每個單詞。這個表示方法也稱為 ?one-hot encoding。例如,我們可以把單詞 “am” 用下面的向量來表示:

    介紹了訓練過程,我們接著討論模型的損失函數,這我們在訓練時需要優化的目標,通過優化這個目標來得到一個訓練好的、非常精確的模型。

    十三、 損失函數

    用一個簡單的例子來說明訓練過程,比如:把“merci”翻譯為“thanks”。

    這意味著我們希望模型最終輸出的概率分布,會指向單詞 ”thanks“(在“thanks”這個詞的概率最高)。但模型還沒訓練好,它輸出的概率分布可能和我們希望的概率分布相差甚遠。

    由于模型的參數都是隨機初始化的。模型在每個詞輸出的概率都是隨機的。我們可以把這個概率和正確的輸出概率做對比,然后使用反向傳播來調整模型的權重,使得輸出的概率分布更加接近震數輸出。

    那我們要怎么比較兩個概率分布呢?我們可以簡單地用一個概率分布減去另一個概率分布。關于更多細節,你可以查看交叉熵(cross-entropy)]和KL 散度(Kullback–Leibler divergence)的相關概念。

    但上面的例子是經過簡化的,因為我們的句子只有一個單詞。在實際中,我們使用的句子不只有一個單詞。例如--輸入是:“je suis étudiant” ,輸出是:“i am a student”。這意味著,我們的模型需要輸出多個概率分布,滿足如下條件:

    • 每個概率分布都是一個向量,長度是 vocab_size(我們的例子中,向量長度是 6,但實際中更可能是 30000 或者 50000)

    • 第一個概率分布中,最高概率對應的單詞是 “i”

    • 第二個概率分布中,最高概率對應的單詞是 “am”

    • 以此類推,直到第 5 個概率分布中,最高概率對應的單詞是 “<eos>”,表示沒有下一個單詞了

    我們用例子中的句子訓練模型,希望產生圖中所示的概率分布

    我們的模型在一個足夠大的數據集上,經過足夠長時間的訓練后,希望輸出的概率分布如下圖所示:

    希望經過訓練,模型會輸出我們希望的正確翻譯。當然,如果你要翻譯的句子是訓練集中的一部分,那輸出的結果并不能說明什么。我們希望的是模型在沒見過的句子上也能夠準確翻譯。需要注意的是:概率分布向量中,每個位置都會有一點概率,即使這個位置不是輸出對應的單詞--這是 Softmax 中一個很有用的特性,有助于幫助訓練過程。

    現在,由于模型每個時間步只產生一個輸出,我們可以認為:模型是從概率分布中選擇概率最大的詞,并且丟棄其他詞。這種方法叫做貪婪解碼(greedy decoding)。另一種方法是每個時間步保留兩個最高概率的輸出詞,然后在下一個時間步,重復執行這個過程:假設第一個位置概率最高的兩個輸出的詞是”I“和”a“,這兩個詞都保留,然后根據第一個詞計算第二個位置的詞的概率分布,再取出 2 個概率最高的詞,對于第二個位置和第三個位置,我們也重復這個過程。這種方法稱為集束搜索(beam search),在我們的例子中,beam_size 的值是 2(含義是:在所有時間步,我們保留兩個最高概率),top_beams 的值也是 2(表示我們最終會返回兩個翻譯的結果)。beam_size ?和 top_beams 都是你可以在實驗中嘗試的超參數。

    更進一步理解

    我希望上面講的內容,可以幫助你理解 Transformer 中的主要概念。如果你想更深一步地理解,我建議你可以參考下面這些:

    • 閱讀 Transformer 的論文:
      《Attention Is All You Need》
      鏈接地址:https://arxiv.org/abs/1706.03762

    • 閱讀Transformer 的博客文章:
      《Transformer: A Novel Neural Network Architecture for Language Understanding》
      鏈接地址:https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html

    • 閱讀《Tensor2Tensor announcement》
      鏈接地址:https://ai.googleblog.com/2017/06/accelerating-deep-learning-research.html

    • 觀看視頻 【?ukasz Kaiser’s talk】來理解模型和其中的細節
      鏈接地址:https://www.youtube.com/watch?v=rBCqOTEfxvg

    • 運行這份代碼:【Jupyter Notebook provided as part of the Tensor2Tensor repo】
      鏈接地址:https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb。

    • 查看這個項目:【Tensor2Tensor repo】
      鏈接地址:https://github.com/tensorflow/tensor2tensor

    往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯

    獲取一折本站知識星球優惠券,復制鏈接直接打開:

    https://t.zsxq.com/y7uvZF6

    本站qq群704220115。

    加入微信群請掃碼:

    總結

    以上是生活随笔為你收集整理的【NLP】图解Transformer(完整版)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲欧美综合精品久久成人 | 亚洲电影一区二区 | 国产黄色免费在线观看 | 天堂av网在线 | 国产偷国产偷亚洲清高 | av网址最新 | 天天射射天天 | av综合网址| 人人超碰在线 | 国产在线精品国自产拍影院 | 国产精品区免费视频 | 色在线高清 | 久久99久久99精品免视看婷婷 | 日日夜夜av | 91在线精品一区二区 | 中文字幕久久精品 | av大片免费 | 日韩欧美精品在线 | 在线之家免费在线观看电影 | 日日夜夜天天人人 | 亚洲永久精品一区 | 日日爽天天操 | 99久久爱 | 四虎4hu永久免费 | 国产成人久久 | 欧美做受高潮电影o | 久久精品国产免费看久久精品 | 国产精品久久影院 | 二区中文字幕 | 国产精品一区二区吃奶在线观看 | 精选久久 | 国产美腿白丝袜足在线av | 欧美日韩视频一区二区三区 | 欧美午夜精品久久久久久孕妇 | 黄色小说免费在线观看 | 伊人色综合久久天天 | 国产人成精品一区二区三 | 99这里只有 | 在线观看日韩专区 | 久久精品久久精品久久精品 | 日本精品视频一区 | 欧美日韩中文在线观看 | 国产99久久久久久免费看 | 在线一二区 | 97色免费视频 | 91精品色 | 特级黄色视频毛片 | 国产一区免费观看 | 亚洲国产精品999 | 久久精品一区二区三区国产主播 | 日韩一区二区三区免费视频 | 在线观看中文字幕av | 综合精品久久 | 99免费看片 | 波多野结衣小视频 | 久久在线视频精品 | 亚洲影院天堂 | 久久久久久久亚洲精品 | 久免费视频 | 国产亚洲精品成人av久久影院 | 婷婷在线网站 | 午夜精品久久 | 欧美999| 嫩草91影院| 激情综合国产 | 国产成人一区三区 | 国产精品久久久久久麻豆一区 | 午夜.dj高清免费观看视频 | 亚洲欧美日韩在线看 | 亚洲色五月 | av片中文字幕 | 91九色porny在线 | 很污的网站 | 天天狠狠干 | 成人h电影| 国产欧美高清 | 日韩久久精品一区二区三区下载 | 久久视频国产 | 天天精品视频 | 欧洲亚洲国产视频 | 狠狠干夜夜爱 | 久久er99热精品一区二区三区 | 久久久久亚洲国产 | 青青河边草免费观看完整版高清 | 青草草在线视频 | 日韩av电影手机在线观看 | 天堂av官网| 欧美日韩精品区 | 久久免费视频在线 | 亚洲一区二区三区毛片 | 免费看黄在线看 | 永久免费毛片 | 玖玖爱在线观看 | 日韩av一区二区在线影视 | 亚洲成av人影片在线观看 | 国产在线观看午夜 | 久久久久人人 | 中文字幕综合在线 | 在线激情影院一区 | 国产精品久久久久永久免费看 | 日韩精品中文字幕一区二区 | 久久精品欧美视频 | 久草在线视频新 | 亚洲手机av | 国产色就色 | a极黄色片 | 国产自在线观看 | 一本大道久久精品懂色aⅴ 五月婷社区 | 精品一区 在线 | 欧美精品国产综合久久 | 丁香花在线观看视频在线 | 亚洲视频分类 | 成人国产精品av | 91麻豆福利| 中文字幕一区二区三区乱码在线 | 免费观看视频的网站 | 日本久久久久久久久久久 | av成人黄色 | 国产精品乱码久久 | 日韩精品一区二区三区在线播放 | 成年人在线免费看片 | 久久久久久久久久免费 | a在线一区 | 91中文字幕永久在线 | 免费在线视频一区二区 | 99久久夜色精品国产亚洲96 | 999一区二区三区 | 中文字幕亚洲不卡 | 国产在线不卡视频 | 亚洲欧洲精品一区 | 成人中文字幕在线 | 一区二区三区韩国免费中文网站 | 五月天中文在线 | 国产69精品久久99不卡的观看体验 | 亚洲色五月 | 日本中文在线观看 | 91完整版观看 | av线上免费看 | 一区二区三区在线播放 | 精品国产一区二区三区在线 | 欧美日韩国产高清视频 | 国产精品白浆 | 亚洲综合射| 99精品影视| 一区二区三区在线免费观看 | a资源在线 | 日韩免费播放 | 亚洲精品五月天 | 伊人成人激情 | 国产麻豆果冻传媒在线观看 | 欧美激情第一区 | 亚洲精品影视在线观看 | 色操插 | 亚州精品一二三区 | 国产色在线视频 | 插久久| av一级片 | 在线观看一区视频 | 亚州欧美视频 | 国产视频精品网 | 国产最新精品视频 | 欧美一级免费高清 | 欧美日韩亚洲第一 | 亚洲国产精品视频 | 久久综合九色 | 我要色综合天天 | 激情开心色 | 久久99精品久久久久蜜臀 | 国产99久久久国产精品成人免费 | 国产最新在线 | 亚洲国产97在线精品一区 | 久久久观看 | 激情综合网五月激情 | 欧美国产高清 | 久草在线欧美 | 偷拍区另类综合在线 | 久久久高清一区二区三区 | 成人午夜电影久久影院 | 日本一区二区不卡高清 | 亚洲国产一区在线观看 | 五月天网站在线 | 久久综合九色综合久99 | 亚洲精品久久久蜜臀下载官网 | 国产激情电影综合在线看 | 在线观看精品黄av片免费 | 亚洲一区网 | 国产精品爽爽久久久久久蜜臀 | 一级性视频 | 免费麻豆网站 | 国产精品久久伊人 | 91麻豆精品国产自产在线 | 97视频资源 | 91亚洲网站| 超碰在线人 | 久久国产精品色av免费看 | 国产96在线观看 | 国产午夜激情视频 | 国产精品成人久久久久 | 久久久久久久久电影 | 成年人视频免费在线 | www四虎影院 | 91久久国产露脸精品国产闺蜜 | 国色天香在线观看 | 婷婷精品视频 | 免费黄av | 婷婷免费在线视频 | 久久综合久久综合九色 | 日韩精品一区二区在线视频 | 成人免费在线观看电影 | 国产午夜精品一区二区三区嫩草 | 欧美日韩久久一区 | 99色在线观看 | 97色涩| 99热这里只有精品在线观看 | 韩国av在线播放 | 日韩有码在线观看视频 | 天天草视频 | 国产亚洲精品久久久久动 | caobi视频| 久久情侣偷拍 | 久久九九影视网 | 狠狠色伊人亚洲综合网站色 | 欧美激情综合网 | 日韩欧美高清视频在线观看 | 丰满少妇在线观看资源站 | 日韩成人免费在线观看 | 日韩欧美综合视频 | 超碰97人人射妻 | 色妞色视频一区二区三区四区 | 在线观看中文字幕dvd播放 | 中文资源在线播放 | 日日摸日日碰 | 久久婷婷色 | 91精品国自产在线观看欧美 | 青青河边草免费观看 | 超碰在线天天 | 青青看片 | 久久精品一区二区三区四区 | 亚洲精品国产日韩 | 在线草| 99精品黄色片免费大全 | 天天曰天天 | av黄免费看 | 国产精品成人av久久 | 国产一区二区不卡视频 | 亚洲精品午夜国产va久久成人 | 97香蕉视频 | 免费日韩 精品中文字幕视频在线 | 狠狠狠的干| 999久久久精品视频 日韩高清www | 免费色视频网址 | 久久精品成人 | 国产精品成 | 黄色片网站 | 91麻豆精品国产自产在线 | 久久激情久久 | 草久久影院 | 国产亚洲精品久久久久久无几年桃 | 婷婷色综合网 | 一区二区三区手机在线观看 | 少妇bbbb搡bbbb搡bbbb | 久久久久亚洲天堂 | 狠狠狠色狠狠色综合 | 欧美精品亚洲精品日韩精品 | 国产精品18久久久久久vr | 日韩欧美在线影院 | av在线电影网站 | 日日夜av| 中文一区二区三区在线观看 | 国产美女视频一区 | 丁香在线观看完整电影视频 | 99爱这里只有精品 | 97精品国产手机 | 九草视频在线观看 | 一区二区三区在线免费 | 9999在线视频 | 黄在线免费看 | 中文字幕色在线视频 | 97精品国产一二三产区 | 丁香视频在线观看 | 69久久夜色精品国产69 | 久草爱| av免费黄色| 最近中文字幕完整视频高清1 | 成人av电影免费观看 | 成人精品国产 | 日本爱爱免费视频 | 一区二区三区日韩精品 | 中文字幕av日韩 | 日韩免费一区二区在线观看 | 粉嫩av一区二区三区四区在线观看 | 在线免费高清一区二区三区 | 国语麻豆 | 欧美日韩伦理在线 | 天天干天天操av | 日日干网 | 夜夜夜草 | a视频在线观看免费 | 成全免费观看视频 | 蜜桃视频日韩 | 怡红院成人在线 | 欧美伦理一区二区 | 久久久久久久久久网站 | 国产精品免费在线播放 | 欧美日韩免费一区二区三区 | 一区二区三区 中文字幕 | 色婷婷激婷婷情综天天 | 99爱在线| 美女网站在线免费观看 | 欧美激情亚洲综合 | 天天干天天操天天入 | 国产另类av| 国产区 在线 | 亚洲专区在线播放 | 五月天丁香视频 | 成人一区在线观看 | 超碰97中文 | 久久国产视频网 | 色综合亚洲精品激情狠狠 | 99电影| 久久99精品国产99久久6尤 | 97网在线观看 | 二区中文字幕 | 天天干婷婷| 精品在线一区二区 | 久久精品第一页 | 久久精品99国产精品亚洲最刺激 | 亚洲视频在线免费看 | 日韩一区二区三区在线看 | 欧美福利视频 | 十八岁免进欧美 | 欧美肥妇free | 伊人射 | 婷婷丁香在线 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 五月婷婷在线播放 | 一级片免费在线 | 久久精品理论 | 在线免费观看视频一区二区三区 | 日韩r级电影在线观看 | 丰满少妇麻豆av | 久久久精品成人 | 91麻豆精品国产91久久久无需广告 | 国产精品高潮在线观看 | 99在线国产 | 亚洲人在线 | 国产999精品久久久久久绿帽 | 在线观看中文字幕一区 | 在线成人中文字幕 | 91亚洲国产| 91香蕉久久 | 九九九九九精品 | 国产成本人视频在线观看 | 国产一区二区三区四区在线 | 亚洲综合色婷婷 | 五月婷婷激情综合网 | 欧美与欧洲交xxxx免费观看 | 亚洲精品影院在线观看 | 久久精品国产精品 | 九九热在线视频 | 九九免费视频 | 五月婷婷综合激情网 | 亚洲最大免费成人网 | 欧美日韩国产亚洲乱码字幕 | 精品人妖videos欧美人妖 | 亚洲精品国产精品久久99 | 日韩电影一区二区三区 | 亚洲深夜影院 | 日韩在线视频二区 | 亚洲国产经典视频 | 亚洲午夜精品一区二区三区电影院 | 免费a视频在线观看 | 国产精品一区二区在线播放 | 一区二区成人国产精品 | 亚洲精品字幕在线 | 国产99视频在线观看 | 国产高清中文字幕 | 精品1区二区 | 综合网中文字幕 | 国际精品久久久久 | 国产精品资源 | 91精品国自产在线观看欧美 | av在线激情 | 欧美视频一区二 | 91久久精品一区 | 中文字幕在线免费看线人 | 国产亚洲视频中文字幕视频 | a天堂一码二码专区 | 久久久久免费精品 | 天天色天 | 狠狠操精品 | av观看久久久 | 狠狠狠色丁香综合久久天下网 | 999国内精品永久免费视频 | 色婷婷色| 狠狠操综合 | 国产特级毛片 | 久久婷婷一区二区三区 | 国产成人av电影在线 | 日韩在线视频免费观看 | 国产精品黄网站在线观看 | 91黄视频在线观看 | 久色免费视频 | 婷婷精品 | 日韩免费在线观看网站 | av三级在线免费观看 | 高清有码中文字幕 | 在线影院中文字幕 | 国产精品99久久久精品免费观看 | 国产露脸91国语对白 | 97超碰福利久久精品 | 草久久久久久 | 日韩欧美精品一区二区 | 超碰人人国产 | 999在线视频| 99亚洲国产精品 | 国产精品一区一区三区 | 日日日爽爽爽 | 午夜天使 | 欧美人体xx | 亚洲天天在线日亚洲洲精 | 午夜丰满寂寞少妇精品 | 国产精品嫩草在线 | 亚洲成人家庭影院 | 91成品视频 | 久久人人爽人人 | 亚洲国产中文在线观看 | 六月色 | 色综合天天狠狠 | 日本午夜在线观看 | 欧美亚洲国产一卡 | 国产丝袜高跟 | 国产精品毛片一区视频播不卡 | 亚洲日本精品视频 | www五月天婷婷 | 国产美女免费观看 | 国产麻豆视频免费观看 | 中文久久精品 | 日韩av二区 | 国产精品成人久久 | 伊人天堂久久 | 久久久久久久久毛片精品 | 五月婷婷伊人网 | 天天天操天天天干 | 婷婷丁香色综合狠狠色 | 欧美日比视频 | 久久久久久久久久久久电影 | 国产高清视频免费在线观看 | 成人网在线免费视频 | 国产尤物在线 | 少妇bbw撒尿| 久久国产精品色婷婷 | 人人爽人人看 | 午夜视频久久久 | 成人在线播放免费观看 | 欧美性精品 | 久久手机在线视频 | 国产亚洲一区二区三区 | 亚洲亚洲精品在线观看 | 99在线看| 在线观看精品国产 | 日韩视频免费看 | 五月开心婷婷网 | 国产在线看一区 | 精品久久久久国产免费第一页 | 手机看片国产 | 亚洲一区日韩精品 | 最近中文字幕久久 | 97免费| 国产亚洲欧美精品久久久久久 | 国产不卡视频在线 | 亚洲精品99久久久久中文字幕 | 久久黄色精品视频 | 亚洲另类交 | 一区免费视频 | 三级视频国产 | 久久精品国产久精国产 | 欧美性生活久久 | 天天操天天爽天天干 | 婷婷夜夜 | 亚洲专区 国产精品 | 六月丁香色婷婷 | 日本精品一区二区在线观看 | 嫩草91影院| 成人福利在线观看 | 国产精品手机在线播放 | 色婷婷激情电影 | 日韩在线观看视频一区二区三区 | 国产色道 | 最新国产精品拍自在线播放 | 免费aa大片 | 日韩网页| 成人国产精品免费观看 | 久久人人精| 成人四虎 | 中文乱幕日产无线码1区 | 国内视频在线观看 | 久亚洲 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 欧美粗又大 | 日韩一二区在线观看 | 91福利视频久久久久 | 日日操日日插 | 黄色在线观看网站 | 狠狠的干 | 国产精品免费一区二区 | 精品国产aⅴ麻豆 | 国产精品婷婷午夜在线观看 | 不卡视频一区二区三区 | 97碰碰视频 | 天天干天天搞天天射 | 久久久久 免费视频 | 国产麻豆果冻传媒在线观看 | 国产精品18videosex性欧美 | 久久久精品日本 | 国产福利一区二区三区在线观看 | 国偷自产视频一区二区久 | 午夜久久久久 | 亚洲免费婷婷 | 亚洲视频电影在线 | 久久精品视频中文字幕 | 狠狠躁天天躁 | 久久午夜电影网 | 欧美日韩啪啪 | 91精品国产99久久久久久红楼 | 福利区在线观看 | 日本狠狠干 | 波多野结衣在线中文字幕 | 在线观看韩国av | 麻豆一二三精选视频 | 日韩在线视频观看免费 | 亚欧日韩成人h片 | 久久久网| 中文字幕的 | 欧美日韩一区二区在线观看 | 免费在线国产精品 | 五月激情婷婷丁香 | 九九久久免费视频 | 在线中文日韩 | 亚a在线| 日本高清dvd| 成年人在线看视频 | 国产精品视频你懂的 | 韩国av电影在线观看 | 91大神在线看| av福利超碰网站 | 91香蕉久久 | 伊人影院得得 | 91在线操| 96久久久 | 欧洲激情在线 | 亚洲精品在线观看的 | 欧美 国产 视频 | 成人91在线 | 在线观看视频国产 | 在线国产精品视频 | 91欧美精品 | 国产成人久久久77777 | 久久国产精品免费一区二区三区 | 亚洲在线精品视频 | 日韩欧美xx| 在线观看日本韩国电影 | 在线观看视频免费播放 | 成人黄色免费在线观看 | 久久免费精品国产 | 国际精品久久久 | 91精品国产亚洲 | 国产精品嫩草影视久久久 | 国产精品久久久一区二区 | 欧美一区二区三区在线视频观看 | 97电影手机| 青青河边草手机免费 | 成片视频免费观看 | 久久99精品久久只有精品 | 日本中文字幕电影在线免费观看 | 超碰在线天天 | 欧美色图30p | 在线免费观看视频a | 国产裸体无遮挡 | 国产精品v欧美精品v日韩 | 色wwwww| 国产综合激情 | 日韩羞羞 | 中文字幕资源网 | 亚洲国产成人久久 | 在线视频 影院 | 又黄又刺激的网站 | 精品国产成人在线 | 超碰电影在线观看 | 成人免费看电影 | 免费在线日韩 | 久久久久亚洲精品成人网小说 | 精品国产精品一区二区夜夜嗨 | 亚洲欧美观看 | 日韩高清免费在线 | 亚洲欧美精品在线 | 欧美精品色| 久久久久久福利 | 亚洲中字幕 | 三级午夜片 | 在线激情av电影 | 国产免费一区二区三区最新 | 日本精品视频网站 | 五月天综合色激情 | 国产精品一区二区在线观看免费 | 91亚洲永久精品 | 色噜噜狠狠色综合中国 | 亚洲aⅴ在线观看 | 免费国产黄线在线观看视频 | 97精品国产97久久久久久粉红 | 亚洲国产wwwccc36天堂 | 在线视频一二三 | 2019av在线视频 | 国产成人性色生活片 | 日日精品 | 亚洲人人av | 91精品伦理 | 国产精品mm | 精品久久国产精品 | 在线看片日韩 | 97国产超碰 | 久久一区国产 | 福利一区在线视频 | 91网址在线| 99热99热 | 黄色aa久久| 亚洲无线视频 | 久久精品视频2 | 午夜久久福利影院 | 国产一级高清 | 国产精品免费久久久久久久久久中文 | 日韩在线国产精品 | 国产亚洲精品美女 | 国产视频在线观看一区二区 | 成人久久久久久久久久 | 天天干天天干天天干天天干天天干天天干 | 五月婷婷中文字幕 | 国产精品美女久久久久久网站 | 在线观看黄av | 国产福利精品一区二区 | 99免费在线播放99久久免费 | 久久综合九九 | 婷婷在线精品视频 | 五月天激情开心 | 人人插人人插 | 午夜精品久久久久久久99 | 日韩欧美国产精品 | 亚洲成av人影片在线观看 | 亚洲 欧美 变态 国产 另类 | 免费在线成人 | 男女男视频 | 国产97在线看 | avove黑丝| 成人免费在线观看电影 | 久久免费视频5 | 日本99热| 99色亚洲 | 激情婷婷六月 | 天堂久色 | 欧美精品久久久久久久久老牛影院 | 日韩欧美一区视频 | 免费看三级黄色片 | 成人免费视频免费观看 | 日本爱爱免费视频 | 免费成人在线网站 | 国产亚洲欧美一区 | 亚洲精品乱码久久久一二三 | 中文在线免费一区三区 | 久久久久久欧美二区电影网 | 国产裸体无遮挡 | 日韩色区 | 久久96国产精品久久99漫画 | 亚洲婷婷在线视频 | 五月天婷婷在线观看视频 | 久久久久久国产精品 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 伊人狠狠色丁香婷婷综合 | 不卡av在线 | 天天爽天天做 | 欧美伦理一区二区三区 | 在线观看aaa| 最近2019好看的中文字幕免费 | av.com在线| 欧美色图88 | 免费观看成人 | 蜜臀av夜夜澡人人爽人人桃色 | 中文字幕在线视频免费播放 | 三级av黄色| 免费aa大片| 亚洲国产av精品毛片鲁大师 | 久久艹欧美 | 欧美巨乳网 | 婷婷六月丁 | 日韩色视频在线观看 | 久久成人黄色 | 日韩精品免费在线视频 | 久草免费资源 | 国产精品理论片在线播放 | 黄色毛片一级 | 三级av在线播放 | 日本女人在线观看 | 国产美女在线免费观看 | 色婷婷免费视频 | 国产在线观看污片 | 欧美在线久久 | h视频在线看 | 亚洲aⅴ一区二区三区 | 成人免费一区二区三区在线观看 | 91九色视频 | 久久激情片| 日本中文字幕网站 | 丁香花中文字幕 | 久久中文字幕在线视频 | 日韩午夜电影院 | 天堂va在线观看 | 91片黄在线观看动漫 | 在线一区av| 波多野结衣电影一区 | 国产日本亚洲高清 | 日日插日日干 | 在线观看日本高清mv视频 | 狠狠狠色丁香婷婷综合激情 | 国产录像在线观看 | 国产香蕉97碰碰碰视频在线观看 | 福利av影院 | 欧美日韩亚洲精品在线 | 夜夜骑日日 | 精品视频久久久 | 1区2区视频 | 国产在线观看一 | 久久国产综合视频 | 免费黄色在线 | 久久人人做 | 丁香在线 | 欧美成人h版 | 五月天视频网 | www.色国产 | 东方av免费在线观看 | 亚洲精品午夜久久久久久久久久久 | 精品免费视频 | 国产精品久久久久毛片大屁完整版 | 国产精品99页 | 日韩在线免费观看视频 | 国产精品影音先锋 | 香蕉91视频| 国产精品破处视频 | 久久久免费看视频 | 黄色毛片视频免费 | 久久久国产99久久国产一 | 婷婷色在线视频 | 国产精品手机在线 | 九九免费视频 | 色99中文字幕 | 九九爱免费视频 | 在线播放视频一区 | 国产精品久久网 | 国产精品日韩在线 | 色综合天天在线 | 久久精品91视频 | 免费福利在线观看 | 久久字幕| 成片免费观看视频大全 | 免费男女羞羞的视频网站中文字幕 | 亚洲无吗天堂 | 欧美色综合 | 手机在线观看国产精品 | 国产色网站 | 免费色网 | 在线观看日韩视频 | 欧美一级黄大片 | 久久成人黄色 | 天天干天天玩天天操 | 2019中文字幕第一页 | 99热精品视 | 99精品在线看 | 黄色免费大全 | 亚洲欧美在线观看视频 | 91成人亚洲 | 99久久日韩精品视频免费在线观看 | 国产精品久久久久久久久久直播 | 欧美看片 | 中文字幕在线播出 | 亚洲精品免费在线观看视频 | 国产精品一区二区 91 | 国产亚洲精品久 | 国产特级毛片 | 成人动漫一区二区三区 | 中文字幕人成乱码在线观看 | 午夜视频99 | 国产精品一区二区三区在线播放 | 国产伦理一区二区 | 在线观看韩国av | 免费在线播放av电影 | av免费在线免费观看 | 精品女同一区二区三区在线观看 | 91禁在线观看 | 亚洲激情婷婷 | 亚洲国产精品久久 | 最近2019中文免费高清视频观看www99 | 国产美女免费观看 | 日韩中文三级 | 成人观看 | 天堂资源在线观看视频 | 国产视频在线一区二区 | 一区二区三区四区免费视频 | 丁香六月在线 | 欧美日韩免费在线观看视频 | 日本黄色a级大片 | 国产视频一二三 | 手机看片午夜 | 久久久久久久国产精品影院 | 国产区网址 | 9在线观看免费高清完整版在线观看明 | 亚洲第一区精品 | www.69xx | 欧美成年人在线观看 | 日韩有码欧美 | 免费男女羞羞的视频网站中文字幕 | 爱情影院aqdy鲁丝片二区 | 啪啪免费视频网站 | 五月天天在线 | 国产人成在线视频 | 亚洲.www| 欧美精品亚州精品 | 久草电影在线观看 | av免费电影网站 | av丝袜制服| av高清一区二区三区 | 美女网站黄在线观看 | 日韩免费电影在线观看 | 在线观看亚洲专区 | 天天激情站| 色www精品视频在线观看 | www.黄色片.com | 天天搞天天干天天色 | 五月天丁香亚洲 | 国产丝袜制服在线 | 国产成人精品一区二区三区在线 | 91夜夜夜| 国产亚洲精品美女久久 | 欧美国产日韩一区二区三区 | 免费日韩视 | 久久久久久久99精品免费观看 | 午夜精品一区二区三区免费视频 | 99九九视频 | 热久在线 | 国产综合在线观看视频 | 一区二区三区在线播放 | 99精品视频播放 | 狠狠色噜噜狠狠狠 | 日韩在线三区 | 中文字幕日韩一区二区三区不卡 | 五月激情久久久 | 亚洲九九爱 | 99亚洲国产精品 | 亚洲视频h | 亚洲国产中文字幕在线视频综合 | 伊人国产在线观看 | 久久无码av一区二区三区电影网 | 国产精品国产三级国产aⅴ入口 | 久久久久久国产精品久久 | 色偷偷88888欧美精品久久久 | 国产精品福利午夜在线观看 | av大片网址 | 狂野欧美激情性xxxx欧美 | 中文字幕在线播放一区二区 | 狠狠网站 | 亚洲在线综合 | 日韩激情精品 | 亚洲在线 | 在线一区电影 | 亚洲综合爱 | 日本xxxx.com | 日韩精品高清不卡 | 久久精品国产免费看久久精品 | 久久99久久99精品免观看软件 | 日韩一区二区三区免费视频 | 99精品国产高清在线观看 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 成人黄色小视频 | 国产精品99久久免费观看 | 亚洲视频电影在线 | 天天操天天色天天 | av黄色免费看 | 欧美成天堂网地址 | 在线免费观看的av网站 | 久久久久久久久久久久久久免费看 | 久久人人爽| 精品久久精品 | 欧美另类高清 videos | 日韩av成人 | 精品91视频 | 天天综合91| www欧美日韩| 天天鲁天天干天天射 | 久久午夜视频 | 人人爽人人爽人人片av免 | 狠狠色噜噜狠狠狠狠2021天天 | 成人av在线网址 | 久久综合爱 | 久久婷婷五月综合色丁香 | 伊人中文字幕在线 | 欧美日韩国产区 | 国产999精品久久久 免费a网站 | 欧美性受极品xxxx喷水 | 99精品亚洲 | 美女视频免费精品 | 不卡电影一区二区三区 | 久久99国产精品久久 | 五月婷婷久草 | 色悠悠久久综合 | 麻豆91精品视频 | 日韩免费三级 | 东方av免费在线观看 | 天天曰天天曰 | 欧美亚洲成人免费 | 天天干天天天天 | 特级黄色一级 | 天天干天天操天天做 | 91精品国产91久久久久 | 六月色婷 | 成人资源网 | 日精品在线观看 | 久久久国际精品 | 国产91在| 久久99国产精品视频 | 日韩在线观看的 | 色播激情五月 | 日韩精品一区二区在线视频 | 亚洲成aⅴ人在线观看 | 久久精品一级片 | 在线观看免费版高清版 | 国产成人精品一区在线 | 天天干天天射天天插 | 成人在线播放av | 欧美一区二区三区在线 | 精品天堂av | 性色av一区二区三区在线观看 | 国产伦理久久精品久久久久_ | 超碰97中文 | 成人91av | 日韩免费一区二区 | 日韩免费播放 | 伊人超碰在线 | 三级黄色片在线观看 | av在线电影网站 | 毛片黄色一级 | 国产黄视频在线观看 | 岛国av在线| 免费91在线观看 | 国产一区二区在线观看免费 | 成人av在线影视 | 天天艹天天 | 久久久久综合网 | 久久精品中文字幕一区二区三区 | 伊人伊成久久人综合网站 | 久久91网 | 久久久久久久久久久网 | 最新黄色av网址 | 天天射网 | 国产午夜一区二区 | 亚洲最大在线视频 | 日韩欧美精品一区二区 | 久草精品电影 | 亚洲精品中文字幕视频 | 久久精品欧美一 | 亚洲国产三级在线观看 | a色视频| 国产成人免费网站 | 日韩欧美一区二区在线播放 | 国产资源在线观看 | 日韩精品国产一区 | 四虎影视欧美 | 手机看片中文字幕 | 中文在线www | 国产精品久久久久久久99 | 国产美女免费视频 | 日本超碰在线 | 四虎在线永久免费观看 | www.99在线观看| 国产女教师精品久久av | 国产1区2区 | 亚洲精品国偷拍自产在线观看蜜桃 | 婷婷日| 亚洲丁香日韩 | 91精品国产91久久久久久三级 | 精品久久久久久久久久久院品网 | 欧美aⅴ在线观看 | 久久人91精品久久久久久不卡 | 特黄一级毛片 | 一区二区三区免费在线观看 | 久久综合婷婷综合 | 成人av电影在线观看 | 97av视频 | av在线免费不卡 | 日韩二区精品 | 国产精品一区二区三区四区在线观看 | 欧美激情片在线观看 |