精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer 原創(chuàng)

發(fā)布于 2024-6-13 13:11
瀏覽
0收藏

本文是在The Annotated Transformer這篇文章基礎(chǔ)上的二次加工。

1.給代碼加了更詳細(xì)的注釋。

2.輸出詳細(xì)日志跟蹤數(shù)據(jù)。

原文地址:https://nlp.seas.harvard.edu/annotated-transformer/

或者后臺(tái)回復(fù)taf獲取pdf下載鏈接。

The Andnotated Transformer

Attention is All You Need

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

  • v2022: Austin Huang, Suraj Subramanian, Jonathan Sum, Khalid Almubarak, and Stella Biderman.
  • Original: Sasha Rush

閱讀方法

由于原文內(nèi)容過長(zhǎng),我沒有把原文拷貝過來,閱讀本文時(shí),請(qǐng)打開原文鏈接或者我添加注釋的notebook。

1、給代碼加了更詳細(xì)的注釋。

原文基于pytorch從0開始復(fù)現(xiàn)了transformer模型,我在原文代碼基礎(chǔ)上追加了更詳細(xì)的注釋,代碼可以在下面鏈接找到。https://github.com/AIDajiangtang/annotated-transformer/blob/master/AnnotatedTransformer_comment.ipynb

另外,我還在模型結(jié)構(gòu)上加了注釋,我將代碼中重要的類名或者函數(shù)名標(biāo)注在Transforner結(jié)構(gòu)的圖片上,閱讀代碼時(shí)請(qǐng)結(jié)合圖片上的名稱,這樣有助于快速理解代碼。

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

2、輸出日志跟蹤數(shù)據(jù)。

原文提供了一個(gè)訓(xùn)練德譯英模型的代碼,我在此基礎(chǔ)上加了一些日志,打印數(shù)據(jù)的維度來輔助對(duì)Transformer的理解。

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

我將按照?qǐng)D片上標(biāo)注數(shù)字順序來跟蹤數(shù)據(jù)。

原始論文中,Transformer是一種Encoder-Decoder架構(gòu),左邊是Encoder,用于提取源語(yǔ)言的表征,右邊是Decoder,根據(jù)表征結(jié)合目標(biāo)語(yǔ)言語(yǔ)法生成目標(biāo)語(yǔ)言。

先從Encoder這邊開始。

0、Inputs:

假設(shè)batch size為2,所以每個(gè)batch包含兩個(gè)樣本,每個(gè)樣本由(德語(yǔ),英語(yǔ))文本對(duì)組成。

[


 ('Eine gro?e Gruppe Jugendlicher in einem kleinen Unterhaltungsbereich.', 'A large group of young adults are crammed into an area for entertainment.'),


 ('Zwei Arbeiter stellen Laternen auf.', 'Two workers working on putting up lanterns.')


]

(batch size的意義:模型每次都是基于batch size個(gè)樣本的損失來更新參數(shù),batch size需要根據(jù)內(nèi)存,顯存大小確定)

對(duì)于Encoder而言,它只需要源語(yǔ)言,也就是德語(yǔ)。

'Eine gro?e Gruppe Jugendlicher in einem kleinen Unterhaltungsbereich.'

'Zwei Arbeiter stellen Laternen auf'

1、Embedding:

1.1.先將文本轉(zhuǎn)換成tokens,并添加起始和結(jié)束符token。

(load_tokenizers函數(shù),

tokenize函數(shù),

build_vocabulary函數(shù)}

["<s>", "</s>", "<blank>", "<unk>"]

起始符token id:0,結(jié)束符token id:1,padding token id:2

'Eine gro?e Gruppe Jugendlicher in einem kleinen Unterhaltungsbereich.'的tokens如下

torch.Size([11])
tensor([   0,   14,  176,   38,  683,    7,    6,  116, 7147,    4,    1],
       device='cuda:0')

(通過結(jié)果看是基于詞的tokenization方法)

1.2.因?yàn)槲谋鹃L(zhǎng)度不一致,通過padding的方式將序列長(zhǎng)度統(tǒng)一為72。

{collate_batch函數(shù)}

(padding不是必須的,只是出于方便和效率考慮,72是個(gè)經(jīng)驗(yàn)值,通過對(duì)訓(xùn)練數(shù)據(jù)的統(tǒng)計(jì)得出)

'Eine gro?e Gruppe Jugendlicher in einem kleinen Unterhaltungsbereich.'padding后的tokens如下

torch.Size([72])
[tensor([   0,   14,  176,   38,  683,    7,    6,  116, 7147,    4,    1,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2],
       device='cuda:0')]


一個(gè)batch下有兩個(gè)樣本,對(duì)另一個(gè)樣本的德語(yǔ)進(jìn)行同樣的轉(zhuǎn)換最終得到編碼器輸入:X,維度[2, 72]。

在訓(xùn)練過程中,無論是計(jì)算注意力還是交叉注意力,每個(gè)樣本是相互獨(dú)立的,所以可以將一個(gè)batch下所有數(shù)據(jù)組織成矩陣的形式輸入到模型進(jìn)行并行計(jì)算。

1.3.最后將上一步的tokens通過一個(gè)Embedding線性層轉(zhuǎn)換成詞嵌入,設(shè)置d_model=512,所以詞嵌入維度為512。

{Embeddings類}

Embedding層輸入就是前面的X;維度是torch.Size([2, 72])。

Embedding層的輸出維度是torch.Size([2, 72,512]),也就是每個(gè)token id都被轉(zhuǎn)換成512維的向量。

tensor([[[-0.6267, -0.0099,  0.3444,  ...,  0.5949, -0.4107, -0.6037],
         [ 0.4183, -0.1788, -0.3128,  ...,  0.5363, -0.5519,  0.4621],
         [ 0.4645, -0.2748, -0.4109,  ..., -0.6270,  0.4595, -0.4259],
         ...,
         [-0.1489,  0.6431, -0.0301,  ..., -0.0163,  0.4261,  0.3066],
         [-0.1489,  0.6431, -0.0301,  ..., -0.0163,  0.4261,  0.3066],
         [-0.1489,  0.6431, -0.0301,  ..., -0.0163,  0.4261,  0.3066]],




        [[-0.6267, -0.0099,  0.3444,  ...,  0.5949, -0.4107, -0.6037],
         [-0.2121,  0.4323, -0.0869,  ...,  0.1337, -0.2679, -0.4689],
         [ 0.0751, -0.1048, -0.1263,  ..., -0.5541, -0.4463,  0.5209],
         ...,
         [-0.1489,  0.6431, -0.0301,  ..., -0.0163,  0.4261,  0.3066],
         [-0.1489,  0.6431, -0.0301,  ..., -0.0163,  0.4261,  0.3066],
         [-0.1489,  0.6431, -0.0301,  ..., -0.0163,  0.4261,  0.3066]]],
       device='cuda:0', grad_fn=<MulBackward0>)

(Embedding過程相當(dāng)于用512個(gè)屬性值表示單詞的語(yǔ)義信息,經(jīng)過每個(gè)EncoderLayner時(shí)屬性值會(huì)被修改,使其充分吸收上下文信息,屬性越多,能表示的語(yǔ)音信息越豐富,但計(jì)算量和參數(shù)也會(huì)增加)

2、PositionalEncoding

{PositionalEncoding類}

在計(jì)算注意力分?jǐn)?shù)時(shí),如果調(diào)整單詞的位置,注意力的輸出結(jié)果不變,也就是自注意力這種計(jì)算方式?jīng)]有考慮單詞的位置信息。

所以需要通過一個(gè)額外的位置編碼,位置編碼與詞嵌入維度相同,也是512維向量,最后與詞嵌入相加。

前面Embedding層輸出維度torch.Size([2, 72, 512]),將其與位置編碼相加,輸出也是torch.Size([2, 72, 512])。

(位置編碼可以通過訓(xùn)練方法得到,也可以采用固定計(jì)算方式,本例采用固定計(jì)算方式)

所有樣本共用同一個(gè)位置編碼,本例序列長(zhǎng)度為72,可以提前計(jì)算好位置編碼備用。

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

pos表示位置,第一個(gè)詞位置是0,第二個(gè)詞位置是1....本例中就是0-71。

對(duì)于512維向量,偶數(shù)位置和奇數(shù)位置的值分別用上面兩個(gè)公式計(jì)算。

tensor([[[ 0.0000e+00,  1.0000e+00,  0.0000e+00,  ...,  1.0000e+00,
           0.0000e+00,  1.0000e+00],
         [ 8.4147e-01,  5.4030e-01,  8.2186e-01,  ...,  1.0000e+00,
           1.0366e-04,  1.0000e+00],
         [ 9.0930e-01, -4.1615e-01,  9.3641e-01,  ...,  1.0000e+00,
           2.0733e-04,  1.0000e+00],
         ...,
         [-8.9793e-01,  4.4014e-01,  3.6763e-01,  ...,  9.9997e-01,
           7.0490e-03,  9.9998e-01],
         [-1.1478e-01,  9.9339e-01, -5.5487e-01,  ...,  9.9997e-01,
           7.1527e-03,  9.9997e-01],
         [ 7.7389e-01,  6.3332e-01, -9.9984e-01,  ...,  9.9997e-01,
           7.2564e-03,  9.9997e-01]]], device='cuda:0')

可視化出來就是下面效果。

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

(上圖每一行都是一個(gè)位置編碼向量,一共生成50個(gè)位置編碼,每個(gè)位置編碼是128維向量,而本例需要生成72個(gè),每個(gè)512維)

3.MultiHeadedAttention

{MultiHeadedAttention類,

attention函數(shù)}

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

MultiHeadedAttention類的輸入是query, key, value,維度都是torch.Size([2, 72, 512]),其實(shí)他們的內(nèi)容也是一樣的,就是上一步輸出的Embedding+位置編碼。

然后query, key, value分別經(jīng)過一個(gè)獨(dú)立的線性層,線性層的維度[512, 512],兩個(gè)樣本的[72, 512]分別與[512, 512]矩陣乘法,所以線性層的輸出維度仍是[2, 72, 512],最后經(jīng)過reshape和轉(zhuǎn)置將[2, 72, 512]轉(zhuǎn)換成torch.Size([2, 8, 72, 64]),8代表有8個(gè)頭,其實(shí)就是將512轉(zhuǎn)換成了8*64來實(shí)現(xiàn)多頭注意力機(jī)制。

(雖然是8個(gè)頭,但與一個(gè)頭的情況相比,參數(shù)并沒有增加)

接下來計(jì)算單個(gè)頭的注意力,Attention函數(shù)的輸入query, key, value的維度都是torch.Size([2, 8, 72, 64]),注意力分?jǐn)?shù)矩陣維度torch.Size([2, 8, 72, 72]),輸出torch.Size([2, 8, 72, 64])。

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

最后將多個(gè)頭的輸出拼接在一起,也就是通過reshape和轉(zhuǎn)置將torch.Size([2, 8, 72, 72])轉(zhuǎn)換成[2, 72, 512],最后經(jīng)過一個(gè)[512, 512]的線性層輸出[2, 72, 512]。


4、SublayerConnection

{SublayerConnection類}

將多頭注意力的輸出經(jīng)過層歸一化和輸入進(jìn)行殘差鏈接,不改變維度,輸入輸出都是[2, 72, 512]。

5、PositionwiseFeedForward

{PositionwiseFeedForward類}

The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

這其實(shí)是一個(gè)MLP層,輸入維度512,隱藏層維度2048,輸出層維度512,也就是2*72個(gè)tokens并行與[512, 2048]矩陣乘升維至[2, 72, 2048],然后再與矩陣[2048,512]乘恢復(fù)到原來維度[2, 72, 512]。最后再經(jīng)過層歸一化和殘差鏈接。

6、EncoderLayer

{EncoderLayer類}

將3,4,5重復(fù)6次,這里需要注意下,這6個(gè)EncoderLayer只是結(jié)構(gòu)一致,但參數(shù)是獨(dú)立的,原始的Embedding經(jīng)過6個(gè)EncoderLayer后維度是不變的,仍然是[2, 72, 512],只不過內(nèi)容被改變了。

7、LaynerNorm

{LayerNorm類}

為了計(jì)算穩(wěn)定,整個(gè)Encoder的輸出會(huì)再次經(jīng)過層歸一化處理,然后輸入到Decoder層作為key和value,維度仍然是[2, 72, 512]。

Encoder把key和value傳遞給Decoder,它的使命就算完成了。剩下的就是根據(jù)那邊的損失等著更新參數(shù)了。

讓我們來到Decoder這邊。

0、Inputs:

[
('Eine gro?e Gruppe Jugendlicher in einem kleinen Unterhaltungsbereich.', 'A large group of young adults are crammed into an area for entertainment.'),
('Zwei Arbeiter stellen Laternen auf.', 'Two workers working on putting up lanterns.')
]


對(duì)于Decoder,除了Encoder的key和value,還要有query,這個(gè)query就是目標(biāo)語(yǔ)言,也就是英語(yǔ)。

'A large group of young adults are crammed into an area for entertainment.'

'Two workers working on putting up lanterns.'

1、Embedding

Decoder和Encoder的Embedding幾乎一致,也是先轉(zhuǎn)換成tokens。

'A large group of young adults are crammed into an area for entertainment.'->tokens

torch.Size([16])
tensor([   0,    6,   62,   39,   13,   25,  348,   17, 5318,   71,   28,  179,
          55, 4285,    5,    1], device='cuda:0')

然后進(jìn)行padding。

'A large group of young adults are crammed into an area for entertainment.'->padding tokens

torch.Size([72])
[tensor([   0,    6,   62,   39,   13,   25,  348,   17, 5318,   71,   28,  179,
          55, 4285,    5,    1,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2],
       device='cuda:0')]

對(duì)另一個(gè)樣本進(jìn)行同樣的操作得到編碼器的輸入Y,維度[2, 72]。

最后將其轉(zhuǎn)換成Embedding,維度是torch.Size([2, 72, 512])。

但有一點(diǎn)需要注意。

Decoder在訓(xùn)練時(shí)輸入的是整個(gè)batch的英語(yǔ)文本,也就是torch.Size([2, 72, 512])。

但在訓(xùn)練過程中預(yù)測(cè)當(dāng)前token的輸出時(shí),為了讓其只能看到當(dāng)前以及之前位置的輸入,避免看到后面的內(nèi)容,需要采用遮罩的方式,也就是要構(gòu)造一個(gè)mask。

torch.Size([2, 72, 72])
tensor([[[ True, False, False,  ..., False, False, False],
         [ True,  True, False,  ..., False, False, False],
         [ True,  True,  True,  ..., False, False, False],
         ...,
         [ True,  True,  True,  ..., False, False, False],
         [ True,  True,  True,  ..., False, False, False],
         [ True,  True,  True,  ..., False, False, False]],




        [[ True, False, False,  ..., False, False, False],
         [ True,  True, False,  ..., False, False, False],
         [ True,  True,  True,  ..., False, False, False],
         ...,
         [ True,  True,  True,  ..., False, False, False],
         [ True,  True,  True,  ..., False, False, False],
         [ True,  True,  True,  ..., False, False, False]]], device='cuda:0')


The Annotated Transformer注釋加量版,讀懂代碼就真的懂了Transformer -AI.x社區(qū)

2、PositionalEncoding

與Encoder一樣,輸入輸出都是[2, 72, 512]

3、MultiHeadedAttention

Decoder中的DecoderLayner有兩個(gè)MultiHeadedAttention,第一個(gè)是Mask MultiHeadedAttention,與Encoder中的計(jì)算一致,只不過使用了上一步計(jì)算的Mask。

另一個(gè)MultiHeadedAttention中的key和value來自Encoder,我們稱之為交叉注意力,與自注意力要區(qū)分開,query來自前一層的輸出,維度都是[2, 72, 512]。

4,5,9,7和Encoder都是一樣的。

同樣輸入Embedding經(jīng)過6個(gè)DecoderLayner后維度不變[2, 72, 512]。

4、Generator

{Generator類}

這其實(shí)是一個(gè)沒有隱藏層的MLP,輸入維度512,輸出維度vocab,2*72個(gè)token的Embedding與矩陣[512,vocab]相乘,輸出[2, 72, vocab],vocab為詞表的單詞個(gè)數(shù),本例中英語(yǔ)單詞個(gè)數(shù)為6291。經(jīng)過softmax后輸出一個(gè)概率分布,最大概率對(duì)應(yīng)的位置的詞就是模型預(yù)測(cè)的下一個(gè)詞。

這樣就得到了Decoder的最終輸出,輸出可以是[2, 72],里面是英語(yǔ)詞表下的id。也可以是[2, 72, vocab]直接輸出概率分布,輸出形式不同,損失函數(shù)也是不同的。

對(duì)于其中一個(gè)樣本,訓(xùn)練過程中Decoder的輸入是:

'A large group of young adults are crammed into an area for entertainment.'

torch.Size([72])
[tensor([   0,    6,   62,   39,   13,   25,  348,   17, 5318,   71,   28,  179,
          55, 4285,    5,    1,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2],
       device='cuda:0')]

如果想更新參數(shù)就必須計(jì)算損失,計(jì)算損失就必須有標(biāo)簽,那標(biāo)簽是什么?

對(duì)于Decoder,輸入也是輸出,標(biāo)簽就是將輸入向左移動(dòng)了一位:

[tensor([ 6,   62,   39,   13,   25,  348,   17, 5318,   71,   28,  179,


          55, 4285,    5,    1,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,2],
       device='cuda:0')]

也就是起始符0對(duì)應(yīng)的標(biāo)簽是A:6,輸入A對(duì)應(yīng)的標(biāo)簽是large:62,Decoder輸出維度[2, 72],標(biāo)簽維度也是[2, 72],最后通過均方誤差計(jì)算損失,或者輸出概率分布,通過KL損失函數(shù)計(jì)算損失來更新Decoder和Encoder的參數(shù)。

再?gòu)?qiáng)調(diào)一下,整個(gè)batch下所有數(shù)據(jù)是一起輸入到模型的,也就是通過將數(shù)據(jù)組織成矩陣實(shí)現(xiàn)了整個(gè)batch的數(shù)據(jù)并行計(jì)算。

訓(xùn)練完成后,就可以用它進(jìn)行德譯英翻譯了。

假設(shè)輸入這么一句德語(yǔ)。

'Eine gro?e Gruppe Jugendlicher in einem kleinen Unterhaltungsbereich.'

德語(yǔ)先經(jīng)過Encoder進(jìn)行并行編碼,輸出[1, 72, 512]作為Decoder的value和key。

在推理過程中就Deocder就不能并行計(jì)算了,只能自回歸的方式每次前向計(jì)算只產(chǎn)生一個(gè)token。

剛開始只有一個(gè)起始符token 0輸入到Deocder。

[tensor([   0,    1,   2,   2,   2,   2,  2,   2, 2,   2,   2,  2,
           2, 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2],
       device='cuda:0')]

decoder輸出6,將6加到0后面再次輸入到decoder。

[tensor([   0,    6,   1,   2,   2,   2,  2,   2, 2,   2,   2,  2,
           2, 2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,
           2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2,    2],
       device='cuda:0')]

decoder輸出62,以此類推,直到輸出終止符token 1。

人的大腦在學(xué)習(xí)復(fù)雜事物時(shí),往往習(xí)慣使用一種整體到細(xì)節(jié),抽象到具體的漸進(jìn)的方式。

雖然我在作者的源代碼添加了更多的注釋和維度信息,但它仍然是細(xì)節(jié),為了更好地理解大模型的工作原理,我建議先閱讀我之前的圖解和動(dòng)畫Transformer系列,以次獲得對(duì)Transformer有一個(gè)高層次的認(rèn)知。

另外,如果你如果弄明白了Encoder-Decoder架構(gòu),那么就能輕松搞懂GPT和BERT了,因?yàn)樗鼈円粋€(gè)只用了Encoder,另一個(gè)只用了Decoder。



本文轉(zhuǎn)載自公眾號(hào)人工智能大講堂 

原文鏈接:??https://mp.weixin.qq.com/s/QX61OSGDRdBkceUKTQiqNQ??

?著作權(quán)歸作者所有,如需轉(zhuǎn)載,請(qǐng)注明出處,否則將追究法律責(zé)任
標(biāo)簽
收藏
回復(fù)
舉報(bào)
回復(fù)
相關(guān)推薦
欧美日韩精品一区二区视频| 草莓视频丝瓜在线观看丝瓜18| 日韩激情一区二区| 影音先锋日韩有码| 又黄又爽又色的视频| sqte在线播放| 日本一区二区三区在线不卡| 成人网址在线观看| 日韩女同强女同hd| 日韩精品91| 亚洲国产日韩欧美在线图片| 嫩草影院国产精品| 97人人爽人人澡人人精品| 国产日产欧美一区| 国产精品久久波多野结衣| 波多野结衣一区二区三区四区| 中文一区一区三区免费在线观看| 亚洲国产天堂久久综合网| www.久久久精品| 人人草在线视频| 一区二区三区四区亚洲| 日韩免费中文专区| 五月天激情婷婷| 国产一区二区美女诱惑| 国产成人一区三区| 国产乡下妇女做爰毛片| 91综合久久| 国产视频在线观看一区二区| 国产高潮失禁喷水爽到抽搐| 91成人在线| 欧美性猛交xxxx乱大交3| 欧美 亚洲 视频| avtt亚洲| 久久日韩粉嫩一区二区三区| 国产精华一区二区三区| 国产美女自慰在线观看| 热久久免费视频| 欧美一区二区三区图| 亚洲国产精品免费在线观看| 色婷婷色综合| 一区二区欧美亚洲| 国产成人无码精品久久二区三| 超碰精品在线观看| 制服视频三区第一页精品| 美女网站视频黄色| av在线不卡精品| 色婷婷综合久久久中文字幕| 美女日批免费视频| segui88久久综合9999| 一区二区三区资源| 天堂а√在线中文在线| 国产在线激情| 亚洲视频一区二区在线观看| 亚洲日本精品| 日本精品在线| ㊣最新国产の精品bt伙计久久| 日韩欧美亚洲日产国| 嫩草研究院在线| 国产午夜精品久久久久久久| 欧美一级日本a级v片| 亚洲av激情无码专区在线播放| 成人动漫一区二区在线| 国产伦精品一区二区三区视频孕妇 | 中文字幕 国产| 视频一区中文字幕国产| 国产91露脸中文字幕在线| 麻豆精品久久久久久久99蜜桃| 久久aⅴ乱码一区二区三区| 欧美一区第一页| 欧美一级做a爰片免费视频| 日产国产高清一区二区三区| 国产精品综合久久久| 国产又大又粗又硬| 狠狠久久亚洲欧美| 99免费在线视频观看| 国产 欧美 自拍| 91视频观看视频| 日韩国产精品一区二区| 欧美69xxxx| 亚洲亚洲人成综合网络| 成熟老妇女视频| 国产资源一区| 精品国产免费视频| 久久精品老司机| 日韩在线第七页| 欧美巨大黑人极品精男| 日韩xxx高潮hd| 日韩激情视频网站| 91精品国产一区二区三区动漫 | 91色porny在线视频| 天天好比中文综合网| a级片国产精品自在拍在线播放| 亚洲一区二区五区| 精品久久久久久久免费人妻| 久久亚洲人体| 亚洲成人激情在线| 四虎国产成人精品免费一女五男| 欧美阿v一级看视频| 欧美中文字幕在线| 中文字幕在线2019| 成人动漫在线一区| 欧美一级免费在线观看| 女人高潮被爽到呻吟在线观看| 欧美中文字幕一二三区视频| 中文写幕一区二区三区免费观成熟| 婷婷精品在线观看| 久久久www成人免费精品| 日韩欧美一区二区一幕| 久久精品99久久久| 欧美日韩三区四区| 在线不卡日本v二区707| 在线看一区二区| 深田咏美中文字幕| 婷婷精品进入| 国产精彩精品视频| 人成网站在线观看| 中文字幕在线不卡| 国产一级做a爰片久久| 久久精品色播| 欧美精品做受xxx性少妇| 中国a一片一级一片| 99re66热这里只有精品3直播| 在线观看视频黄色| 国内精品伊人| 中文字幕日韩欧美| 中国a一片一级一片| 久久精品一区二区三区不卡牛牛 | 日韩久久免费av| av资源在线免费观看| 久久永久免费| 久久爱av电影| 日产福利视频在线观看| 欧美精品一区二区在线播放| 国产探花在线免费观看| 韩国欧美一区二区| 午夜视频久久久| 电影久久久久久| 国产一区二区三区精品久久久| 欧美精品一二三四区| 99国产精品国产精品毛片| www.射射射| 欧美电影免费网站| 97精品在线观看| 秋霞网一区二区| 亚洲a一区二区| 黄色片久久久久| 欧美成人一区在线观看| 久久久久亚洲精品国产| 精品黑人一区二区三区国语馆| 成人免费在线播放视频| 高潮一区二区三区| 久久精品国产68国产精品亚洲| 日韩美女视频免费在线观看| www.国产免费| 午夜欧美视频在线观看| 亚洲精品鲁一鲁一区二区三区| 国产精品不卡| 成人黄色激情网| 东凛在线观看| 在线电影一区二区三区| 国产伦理片在线观看| 蜜桃av综合| 欧美久久电影| 青青热久免费精品视频在线18| 伊人精品在线观看| 国产一级片一区二区| 日本一区二区动态图| 在线免费视频a| 精品免费av| 成人欧美一区二区三区在线湿哒哒 | 亚洲视频一二| 久久久久天天天天| 在线免费三级电影网站| 亚洲毛片在线观看| 国产一区二区视频网站| 国产精品水嫩水嫩| 亚洲成人福利视频| 91久久亚洲| 欧美韩国日本精品一区二区三区| 午夜伦理福利在线| 亚洲色图五月天| 久久精品视频2| 国产精品久久久久久久蜜臀| 成人黄色一级大片| 国产精品久久观看| 高清视频在线观看一区| 亚洲美女炮图| 亚洲免费一在线| 97在线公开视频| 亚洲国产成人精品视频| 欧美日韩高清丝袜| 精品在线免费观看| 欧美黑人经典片免费观看| 激情婷婷综合| av蓝导航精品导航| 亚洲人体影院| 精品国产一区二区三区久久| 无码国产色欲xxxx视频| 在线欧美日韩国产| 欧美成人综合色| 久久亚洲一区二区三区明星换脸| 国产精品igao网网址不卡| 在线日韩欧美| 亚洲午夜久久久影院伊人| 亚洲一区 二区| 国产成人综合精品| 国产丝袜在线播放| 中文字幕亚洲综合| 人成网站在线观看| 欧美日本一区二区三区四区| 欧美成人三级在线观看| 国产精品毛片久久久久久| 黄色国产在线视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产一二三四区在线观看| 欧美色爱综合| 精品国产一区二区三区麻豆免费观看完整版 | 亚洲综合小说图片| 97人摸人人澡人人人超一碰| 欧美自拍电影| 久久久久久综合网天天| 国产在线日本| 国产午夜精品理论片a级探花| 91女人18毛片水多国产| 欧美性极品xxxx做受| 国产精品久久久久久久精| 自拍偷拍国产亚洲| 手机av免费看| 丁香激情综合五月| 亚洲免费av一区| 欧美激情性爽国产精品17p| 自拍另类欧美| 日韩精品免费一区二区在线观看 | 日本亚洲不卡| 国产乱码精品一区二区三区卡 | 91久久国产最好的精华液| 日本系列第一页| 亚洲精品日韩专区silk| 30一40一50老女人毛片| 成人av资源站| 国产清纯白嫩初高中在线观看性色| 美洲天堂一区二卡三卡四卡视频| 日韩欧美视频网站| 国产精品久久久久毛片大屁完整版 | 欧美一区二区.| aaa在线播放视频| 国内精品久久久久影院 日本资源| 麻豆网站在线观看| 日韩在线欧美在线| 日本在线视频观看| 欧美精品在线免费播放| 国产精品剧情| 久热精品视频在线观看一区| a天堂在线资源| 亚洲男人天天操| 国产经典自拍视频在线观看| 亚洲嫩模很污视频| 黄色片视频在线观看| 亚洲第一色在线| 日本不卡免费播放| 国产偷亚洲偷欧美偷精品| 日本大片在线观看| 亚洲欧美制服综合另类| 在线观看精品一区二区三区| 中文字幕欧美日韩va免费视频| 国产女主播在线写真| 亚洲一二三在线| 美女隐私在线观看| 久久香蕉频线观| 综合图区亚洲| 欧美国产日韩一区二区在线观看| av在线最新| 日本成人激情视频| 国精产品一区一区三区四川| 国产精品视频一| 精品久久毛片| 国产精品久久久久久久小唯西川| 久久男人av| 欧美亚洲另类在线一区二区三区| 日本国产精品| 男人天堂成人网| 亚洲韩日在线| 日本新janpanese乱熟| 久久久久久网| 两女双腿交缠激烈磨豆腐| 成人在线视频一区二区| www.超碰97| 久久久国产综合精品女国产盗摄| fc2ppv在线播放| 亚洲第一福利一区| 91丝袜一区二区三区| 欧美日韩不卡一区二区| 黄色小视频免费在线观看| 亚洲视屏在线播放| 成人在线网址| 久久久久久久999| 国产激情久久| 国产精品视频免费一区| 国际精品欧美精品| 日本福利视频一区| 美女网站色91| 日本黄色录像片| 国产精品久久久久婷婷| 黄色污污网站在线观看| 91.麻豆视频| 四虎成人免费在线| 国产一区二区三区高清在线观看| 丁香花在线观看完整版电影| 国产成人精品免高潮费视频| 日韩有吗在线观看| 日韩视频精品| 一区二区影院| 亚洲天堂av线| 99视频国产精品| 亚洲午夜精品久久久久久高潮| 亚洲尤物视频在线| 中文字幕a级片| 精品亚洲精品福利线在观看| 久草在线视频网站| 国产精品人成电影| 乱中年女人伦av一区二区| aaa免费在线观看| 免费人成精品欧美精品| av网站有哪些| 亚洲制服丝袜av| 亚洲一级片免费看| 亚洲美女又黄又爽在线观看| av黄色在线| 国产不卡在线观看| 一区二区美女| 欧美日韩不卡在线视频| 激情综合网天天干| 免费看一级大片| 欧美日韩精品专区| 国模精品一区二区| 97久久伊人激情网| 欧美大胆视频| 国产色一区二区三区| 国产成人av电影| 久久久久国产精品夜夜夜夜夜| 欧美女孩性生活视频| 国产精品99999| 91精品国产色综合久久不卡98| 国产一区调教| 国产一区二区片| 国产精品一区二区久久精品爱涩| 久久久久亚洲av无码专区体验| 欧美巨大另类极品videosbest| 岛国在线大片| 国产精品欧美日韩一区二区| 全球成人免费直播| 亚洲一区在线不卡| 国产亚洲1区2区3区| 在线观看中文字幕2021| 色先锋资源久久综合5566| 巨胸喷奶水www久久久免费动漫| 国内精品国语自产拍在线观看| 激情综合激情| 久久久国产精品无码| 五月天激情综合| 免费国产在线观看| 国产成人精品网站| jlzzjlzz亚洲女人| 伊人成人免费视频| 亚洲欧美日韩电影| 国产成人三级在线播放 | 国产精品久久久久久免费观看 | 美女av一区二区| 激情五月综合婷婷| 97超碰人人澡| 久久蜜桃一区二区| 亚洲天堂一二三| 欧美激情第99页| 青草久久视频| 激情网站五月天| 亚洲美女视频一区| 不卡的日韩av| 亚洲**2019国产| 成人中文在线| 丰满少妇一区二区三区专区| 亚洲国产美国国产综合一区二区| 久久精品a一级国产免视看成人 | 香蕉成人影院| 午夜啪啪福利视频| 久久一二三国产| 国产又黄又大又爽| 国内成人精品视频| 欧洲视频一区| 中文字幕久久久久久久| 污片在线观看一区二区| av大全在线免费看| 99中文字幕| 日韩中文字幕一区二区三区| 欧美成欧美va| 亚洲欧美国产视频| 亚洲老司机网| 香港三级韩国三级日本三级| 国产精品天干天干在线综合| 成人午夜视频一区二区播放| 91精品久久久久久久久久久久久 |