精品欧美一区二区三区在线观看 _久久久久国色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)推薦
国产精品99久久久久久久女警| 国产伦精品一区二区三区千人斩| 中文字幕一区二区在线观看| 91精品久久久久久综合乱菊| 91人妻一区二区三区蜜臀| 欧美日本三级| 婷婷国产v国产偷v亚洲高清| 奇米视频888战线精品播放| 中文字幕在线观看欧美| 欧美精品二区| 亚洲天堂影视av| 午夜一级免费视频| 欧美少妇精品| 国产精品成人一区二区三区夜夜夜| 动漫3d精品一区二区三区| 麻豆成人免费视频| 亚洲无中文字幕| 日韩精品久久久久久久玫瑰园| 国产高潮免费视频| av电影院在线看| 国产欧美日韩在线| 不卡日韩av| 日本视频www色| 激情成人综合| 久久精品国产免费观看| 亚洲av网址在线| 免费观看在线一区二区三区| 色菇凉天天综合网| 无码人妻少妇伦在线电影| 成人免费高清在线播放| 成人不卡免费av| 成人免费网视频| 国产精品乱子伦| 欧美 日韩 国产精品免费观看| 一本一本久久a久久精品综合小说| www.美色吧.com| 成人黄色91| 欧美日韩在线不卡| 日韩精品一区二区三区不卡 | 日韩av电影免费播放| 成人爽a毛片一区二区| 激情综合网天天干| 国产精品免费看久久久香蕉| 精品国产一区二区三区四| 激情久久久久| 欧美激情影音先锋| 老司机成人免费视频| 日韩电影在线视频| 亚洲天堂av图片| 亚洲黄色免费在线观看| 卡通动漫精品一区二区三区| 日韩西西人体444www| 欧美大片久久久| 偷拍自拍亚洲| 欧美日韩一二三| 久久99爱视频| 精品久久福利| 欧美人与性动xxxx| 欧美日韩理论片| 日韩视频一二区| 精品黑人一区二区三区久久| 超碰人人cao| 精品99re| 日韩精品一区二区三区在线播放 | 国产精品亚洲综合久久| 午夜精品视频在线| 国产做受高潮漫动| 亚洲专区免费| 国产精品福利小视频| 亚洲中文无码av在线| 久久精品999| 91亚洲一区精品| 精品国产亚洲一区二区麻豆| 国产成人三级在线观看| 国产精品区二区三区日本| 蜜桃视频污在线观看| 97久久久精品综合88久久| 精品亚洲一区二区三区四区五区高| 视频一区二区免费| 国产亚洲污的网站| 特级毛片在线免费观看| 色yeye免费人成网站在线观看| 亚洲一区电影777| 人妻有码中文字幕| 丁香久久综合| 日韩欧美高清dvd碟片| 国产69视频在线观看| 色综合www| 最近2019好看的中文字幕免费| 波多野结衣在线网址| 一区二区毛片| 国产精品美女网站| 性欧美8khd高清极品| 久久综合色鬼综合色| 亚洲永久激情精品| 激情在线视频播放| 日韩欧美在线观看视频| 亚洲精品综合在线观看| 欧美电影在线观看完整版| 一区二区三区四区精品| 国产黄色片在线免费观看| 国产精品五区| 91嫩草视频在线观看| 秋霞av在线| 亚洲毛片av在线| 日日碰狠狠丁香久燥| 日韩一区二区三区色| 亚洲精品中文字幕女同| av激情在线观看| 久久精品国语| 成人av资源网| 北岛玲一区二区三区| 一区二区三区四区高清精品免费观看| aa免费在线观看| 18国产精品| 在线成人中文字幕| 日本熟女一区二区| 加勒比av一区二区| 久久精品日产第一区二区三区精品版 | 国产免费av高清在线| 一区二区成人在线观看| 麻豆三级在线观看| 精品影片在线观看的网站| 欧美国产日韩一区二区| 91av国产精品| 日本一区二区三区在线不卡| 日本在线xxx| 一区二区三区国产好| www.亚洲一区| 波多野结衣激情视频| 99久久婷婷国产精品综合| 久久福利一区二区| 久久中文字幕一区二区| 最近2019年日本中文免费字幕 | 欧美午夜一区二区| aa一级黄色片| 亚洲高清av| 91久久国产综合久久蜜月精品 | 日韩成人在线看| 精品国产欧美一区二区五十路 | 1区2区3区在线观看| 色综合天天综合网国产成人综合天| 涩视频在线观看| 国产精品扒开腿做爽爽爽软件| 成人激情在线播放| 黄色免费在线观看网站| 欧美日本在线看| 在线看片中文字幕| 日韩av在线免费观看不卡| 免费成人av网站| 密臀av在线播放| 精品亚洲国产视频| 久久国产视频精品| 久久久午夜精品理论片中文字幕| 国产精品久久久久久久乖乖| 动漫av一区| 久久久久久久久久亚洲| 欧美一级淫片免费视频魅影视频| 一区二区三区欧美久久| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 国产亚洲午夜| 免费一区二区三区| 欧洲一级精品| 永久免费毛片在线播放不卡| 自拍偷拍色综合| 国产精品成人免费在线| 在线观看av免费观看| 欧美成人精品| 激情小说网站亚洲综合网| 深夜成人在线| 国产亚洲美女精品久久久| 中文字幕观看在线| 亚洲欧洲日本在线| 国产精品嫩草69影院| 亚洲电影在线| 日本一区二区视频| 国产一区二区三区免费在线| 色综合天天狠天天透天天伊人 | 成人中文字幕在线| 黄色动漫网站入口| 成人6969www免费视频| 91九色蝌蚪国产| 国产后进白嫩翘臀在线观看视频| 日韩精品高清在线观看| 国产三级理论片| 亚洲精品少妇30p| 欧美在线一级片| 青青草国产精品亚洲专区无| 最近免费观看高清韩国日本大全| 成人h动漫免费观看网站| 青青青国产精品一区二区| 成人不用播放器| 精品国产网站在线观看| 欧美成人一区二区三区四区| 中文字幕一区二区三区视频 | 7777精品| 日本最新高清不卡中文字幕| av大片在线| 精品视频久久久久久| 91黄色在线视频| 婷婷国产在线综合| 三上悠亚在线观看视频| 不卡一区中文字幕| 中文av一区二区三区| 亚洲二区精品| av动漫免费观看| 一区二区三区日本久久久 | 91小视频在线观看| 中文字幕一区二区在线观看视频| 宅男噜噜噜66一区二区| 中国一级黄色录像| 国产一区二区精品久| 国产精品av一区| 欧美成a人片免费观看久久五月天| 欧美精品videos| 午夜小视频在线| 亚洲免费视频在线观看| 精品国产伦一区二区三区| 最近2019中文字幕mv免费看| 国产第一页视频| 一二三区不卡| 欧美极品一区二区| 中文字幕日韩在线| 国产欧美 在线欧美| 特黄毛片在线观看| 欧美激情在线观看| 国产不卡在线| 日韩中文视频免费在线观看| 牛牛澡牛牛爽一区二区| 亚洲第一免费播放区| 国产精品特级毛片一区二区三区| 色噜噜偷拍精品综合在线| 黄色片视频网站| 亚洲最新在线观看| 免费在线观看一级片| 亚洲欧洲av色图| 亚洲综合久久av一区二区三区| 久久精品男人的天堂| 久久只有这里有精品| 99久久国产综合精品麻豆| 国产综合内射日韩久| 国产福利91精品| 麻豆精品国产传媒| 国产老肥熟一区二区三区| 国产精品探花在线播放| 精品一区二区免费| 9l视频白拍9色9l视频| 日韩极品在线观看| 亚洲一区二区蜜桃| 日韩中文字幕1| 凹凸日日摸日日碰夜夜爽1| 国产精品美女久久久| 鲁一鲁一鲁一鲁一澡| 国产农村妇女精品一二区| 精品少妇人妻av免费久久洗澡| 极品少妇一区二区三区| 毛片在线播放视频| 性久久久久久| 亚洲精品高清无码视频| 爽好久久久欧美精品| 亚洲人成无码www久久久| 日韩精彩视频在线观看| 亚洲视频一二三四| 国产乱一区二区| 国产精品99久久久精品无码| 成人综合婷婷国产精品久久蜜臀| 国产视频久久久久久| 久久久噜噜噜久噜久久综合| 日本人亚洲人jjzzjjz| 综合欧美一区二区三区| 欧美成人综合色| 亚洲大片在线观看| 国产女主播喷水视频在线观看 | 日本不卡一区二区三区在线观看 | 日韩免费一区二区三区| 日韩一级毛片| 亚洲一区 在线播放| 伊人成人网在线看| 国产福利一区视频| 久久电影网电视剧免费观看| 欧美一级片在线免费观看| av在线不卡电影| 精品熟妇无码av免费久久| 亚洲欧美综合在线精品| 日本视频www| 在线观看视频欧美| 精品黑人一区二区三区国语馆| 亚洲国产另类久久精品| wwwww在线观看免费视频| 久久人人爽人人爽爽久久| 操喷在线视频| 国产精品久久久久久久7电影| www.久久热| 久久免费看av| 艳女tv在线观看国产一区| 北条麻妃在线视频观看| 青椒成人免费视频| www.四虎精品| 国产精品天天看| 国产午夜视频在线播放| 欧美日韩综合不卡| 婷婷色在线观看| 久久精品国产一区| 在线观看欧美日韩电影| 999热视频| 精品国产日韩欧美| 国产人妻777人伦精品hd| 美女久久久精品| 免费日本黄色网址| 最新日韩在线视频| 无码人妻丰满熟妇精品| 日韩欧美中文一区| 888av在线| 日韩av电影院| 国内精品麻豆美女在线播放视频 | www 日韩| 4p变态网欧美系列| 亚洲精品在线国产| 在线观看欧美激情| 天堂蜜桃91精品| 黄色免费看视频| 一区二区三区加勒比av| 亚洲网站免费观看| 亚洲日韩中文字幕在线播放| free性护士videos欧美| 91视频婷婷| 婷婷久久国产对白刺激五月99| 激情五月开心婷婷| av在线不卡免费看| 动漫精品一区一码二码三码四码| 日韩一区二区三区在线观看| www视频在线观看免费| 国产成人激情视频| 妖精视频一区二区三区| 日韩激情免费视频| 成av人片一区二区| 国产在线拍揄自揄拍无码视频| 91精品国产综合久久久蜜臀粉嫩 | 中文字幕一区二区三区精品| 日韩三级.com| 在线中文字幕第一页| 亚洲一区二区三区在线免费观看| 欧美高清视频手机在在线| 日本美女高潮视频| 久久九九99视频| 台湾佬中文在线| 精品亚洲aⅴ在线观看| 英国三级经典在线观看| 久久伊人资源站| 久久午夜电影| 免费网站在线高清观看| 在线观看视频91| 自拍视频在线播放| 成人h片在线播放免费网站| 91亚洲自偷观看高清| 中文字幕永久有效| 亚洲欧美视频一区| 国产视频手机在线| 欧美黄色www| 99ri日韩精品视频| 波多野结衣乳巨码无在线| 91热门视频在线观看| 69成人免费视频| 国产一区二区三区视频 | 欧美日本一区二区视频在线观看 | 日韩三级免费看| 亚洲精品成a人在线观看| 中文字幕色婷婷在线视频| 欧洲高清一区二区| 精品一区二区日韩| 久久精品国产亚洲av麻豆色欲 | 曰本三级日本三级日本三级| 亚洲午夜在线电影| 外国精品视频在线观看| 日韩av成人在线观看| 欧美电影一二区| 伊人成人免费视频| 午夜久久久久久久久| 国产1区2区3区在线| 91啪国产在线| 亚洲精品孕妇| 长河落日免费高清观看| 欧美成人女星排名| 日韩在线免费| av电影一区二区三区| 成人av在线电影| 波多野结衣不卡| 久久久精品影院| 亚洲人成网77777色在线播放 | 一本一生久久a久久精品综合蜜| 国产精品主播直播| 国产精品久免费的黄网站| 久久精品最新地址| 欧美亚洲色图校园春色| 一级在线免费视频| 亚洲网友自拍偷拍| av免费观看一区二区| 国产亚洲欧美另类一区二区三区| 日韩激情在线观看| 国产成人啪精品午夜在线观看|