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

一文詳解MHA、GQA、MQA原理 原創

發布于 2024-11-14 15:40
瀏覽
0收藏

前言

本文回顧一下MHA、GQA、MQA,詳細解讀下MHA、GQA、MQA這三種常見注意力機制的原理。

一文詳解MHA、GQA、MQA原理-AI.x社區

圖1 MHA、GQA、MQA一覽

self-attention

一文詳解MHA、GQA、MQA原理-AI.x社區

self-attention

在自注意力機制中,輸入通常是一個統一的輸入矩陣,而這個矩陣后續會通過乘以不同的權重矩陣來轉換成三個不同的向量集合:查詢向量Q、鍵向量K和值向量V。這三組向量是通過線性變換方式生成:

1.查詢向量 (Q): Q=XWQ

2.鍵向量 (K): K=XWK

3.值向量 (V): V=XWV

W,WK和WV可學習的權重矩陣,分別對應于查詢、鍵和值。這些矩陣的維度取決于模型的設計,通常它們的輸出維度(列數) 是預先定義的,以滿足特定的模型架構要求。 在Transformer模型中,使用不同的權重矩陣W,WK和WV來分別生成查詢向量Q、鍵向量K和值向量V的目的是為了允許模型在不同的表示空間中學習和抽取特征。這樣做增加了模型的靈活性和表達能力,允許模型分別優化用于匹配(Q 和K)和用于輸出信息合成(V)的表示。

在自注意力和多頭注意力機制中,使用

一文詳解MHA、GQA、MQA原理-AI.x社區

作為縮放因子進行縮放操作是為了防止在計算點積時由于維度較高導致的數值穩定性問題。這里的dk是鍵向量的維度。如果不進行縮放,當dk較大時,點積的結果可能會變得非常大,這會導致在應用softmax函數時產生的梯度非常小。因為softmax函數是通過指數函數計算的,大的輸入值會使得部分輸出接近于1,而其他接近于0,從而導致梯度消失,這會在反向傳播過程中造成梯度非常小,使得學習變得非常緩慢。

通過點積結果除以

一文詳解MHA、GQA、MQA原理-AI.x社區

 ,可以調整這些值的范圍,使得它們不會太大。這樣,softmax的輸入在一個合適的范圍內,有助于避免極端的指數運算結果,從而保持數值穩定性和更有效的梯度流。這個操作確保了即使在dk很大的情況下, 注意力機制也能穩定并有效地學習。

代碼實現

import torch
import torch.nn as nn
import torch.nn.functional as F


class SelfAttention(nn.Module):
    def __init__(self, seq_length):
        super(SelfAttention, self).__init__()
        self.input_size = seq_length
        # 定義三個權重矩陣:Wq、Wk、Wv
        self.Wq = nn.Linear(seq_length, seq_length)  # 線性變換
        self.Wk = nn.Linear(seq_length, seq_length)
        self.Wv = nn.Linear(seq_length, seq_length)

    def forward(self, input):
        # 計算Q,K,V 三個矩陣
        q = self.Wq(input)
        k = self.Wk(input)
        v = self.Wv(input)

        # 計算QK^T,即向量之間的相關度
        attention_scores = torch.matmul(q, k.transpose(-1, -2)) / torch.sqrt(torch.tensor(float(self.input_size)))
        # 計算向量權重,softmax歸一化
        attention_weight = F.softmax(attention_scores, dim=-1)
        # 計算輸出
        output = torch.matmul(attention_weight, v)
        return output


x = torch.randn(2, 3, 4)
Self_Attention = SelfAttention(4)  # 傳入輸入向量的維度
output = Self_Attention(x)
print(output.shape)

MHA(多頭注意力)

一文詳解MHA、GQA、MQA原理-AI.x社區

Transformer 編碼器塊內的縮放點積注意力機制和多頭注意力機制

一文詳解MHA、GQA、MQA原理-AI.x社區

MHA計算過程

一文詳解MHA、GQA、MQA原理-AI.x社區

代碼實現

import torch
import torch.nn as nn


class MultiHeadAttention(nn.Module):
    def __init__(self, embed_dim, num_heads):
        super(MultiHeadAttention, self).__init__()
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads
        self.wq = nn.Linear(embed_dim, embed_dim)
        self.wk = nn.Linear(embed_dim, embed_dim)
        self.wv = nn.Linear(embed_dim, embed_dim)
        self.wo = nn.Linear(embed_dim, embed_dim)

    def mh_split(self, hidden):
        batch_size = hidden.shape[0]
        x = hidden.view(batch_size, -1, self.num_heads, self.head_dim).transpose(1, 2)
        return x

    def forward(self, hidden_states, mask=None):
        batch_size = hidden_states.size(0)

        # 線性變換
        q, k, v = self.wq(hidden_states), self.wk(hidden_states), self.wv(hidden_states)

        # 多頭切分
        q, k, v = self.mh_split(q), self.mh_split(k), self.mh_split(v)

        # 注意力計算
        scores = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))
        if mask is not None:
            scores = scores.masked_fill(mask == 0, float('-inf'))
        attention = torch.softmax(scores, dim=-1)
        output = torch.matmul(attention, v)

        # 拼接多頭
        output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.head_dim)

        # 線性變換
        output = self.wo(output)

        return output

x = torch.rand(2, 3, 36)
print(x)
output = MultiHeadAttention(36, 6)
y = output(x)
print(y.shape)

MHA 能夠理解輸入不同部分之間的關系。然而,這種復雜性是有代價的——對內存帶寬的需求很大,尤其是在解碼器推理期間。主要問題的關鍵在于內存開銷。在自回歸模型中,每個解碼步驟都需要加載解碼器權重以及所有注意鍵和值。這個過程不僅計算量大,而且內存帶寬也大。隨著模型規模的擴大,這種開銷也會增加,使得擴展變得越來越艱巨。

因此,多查詢注意 (MQA) 應運而生,成為緩解這一瓶頸的解決方案。其理念簡單而有效:使用多個查詢頭,但只使用一個鍵和值頭。這種方法顯著減少了內存負載,提高了推理速度。

MQA(多查詢注意力)

一文詳解MHA、GQA、MQA原理-AI.x社區

圖2 MHA和MQA的差別

MQA是MHA的一種變體,也是用于自回歸解碼的一種注意力機制。,圖1、圖2很形象的描繪了MHA和MQA的對比,與MHA 不同的是,MQA 讓所有的Head之間共享同樣的一份 K 和 V 矩陣(意味K和V的計算唯一),只讓 Q 保留了原始多頭的性質(每個Head存在不同的轉換),從而大大減少 K 和 V 矩陣的參數量以及KV Cache的顯存占用,以此來達到提升推理速度,但是會帶來精度上的損失。MQA被大量應用于LLM中,如ChatGLM2。

一文詳解MHA、GQA、MQA原理-AI.x社區

左 - 多頭注意力,中 - 多查詢注意力,右 - 將現有的 MHA 檢查點轉換為 MQA

如何將現有的預訓練多頭注意力模型轉換為多查詢注意力模型 (MQA)?從現有的多頭模型創建多查詢注意力模型涉及兩個步驟:模型結構的轉換和隨后的預訓練。

  • 模型結構的轉換:此步驟將多頭模型的結構轉換為多查詢模型。它是通過將原始模型的多個頭的鍵和值的投影矩陣(線性層)合并(均值池化)為鍵和值的單個投影矩陣來實現的。這種均值池化方法被發現比選擇現有鍵和值頭之一或從頭開始初始化新的鍵和值頭更有效。生成的結構具有合并的鍵和值投影,這是多查詢模型的特征。
  • 對轉換后的模型進行預訓練:結構轉換后,模型將接受額外的訓練。此訓練不像原始模型訓練那樣廣泛;它只是原始模型訓練步驟的一小部分(表示為 α)。此預訓練階段的目的是讓模型根據其新的簡化注意力機制調整和優化其性能。訓練遵循與原始相同的方法,確保學習動態的一致性。

代碼實現

import torch
import torch.nn as nn


class MultiQuerySelfAttention(nn.Module):
    def __init__(self, embed_dim, num_heads):
        super(MultiQuerySelfAttention, self).__init__()
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads

        self.wq = nn.Linear(embed_dim, embed_dim)

        # MHA
        # self.wk = nn.Linear(embed_dim, embed_dim)
        # self.wv = nn.Linear(embed_dim, embed_dim)

        # MQA
        self.wk = nn.Linear(embed_dim, self.head_dim)
        self.wv = nn.Linear(embed_dim, self.head_dim)
        self.wo = nn.Linear(embed_dim, embed_dim)

    def q_h_split(self, hidden, head_num=None):
        batch_size, seq_len = hidden.size()[:2]
        # q拆分多頭
        if head_num == None:
            x = hidden.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
            return x
        else:
            # 這是MQA: 需要拆分k和v,這里面的head_num =1 的
            # 最終返回維度(batch_size, 1, seq_len, head_dim)
            return hidden.view(batch_size, seq_len, head_num, self.head_dim).transpose(1, 2)

    def forward(self, hidden_states, mask=None):
        batch_size = hidden_states.size(0)

        # 線性變換
        q, k, v = self.wq(hidden_states), self.wk(hidden_states), self.wv(hidden_states)

        # 多頭切分
        # 這是MHA的
        # q, k ,v  = self.split(q), self.split(k), self.split(v)
        # 這是MQA的
        q, k, v = self.q_h_split(q), self.q_h_split(k, 1), self.q_h_split(v, 1)

        # 注意力計算
        scores = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))
        print("scores:", scores.shape)
        if mask is not None:
            scores = scores.masked_fill(mask == 0, float('-inf'))
        attention = torch.softmax(scores, dim=-1)
        output = torch.matmul(attention, v)

        # 多頭合并
        output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.head_dim)
        # 線性變換
        output = self.wo(output)
        return output


x = torch.rand(3, 12, 512)
atten = MultiQuerySelfAttention(512, 8)
y = atten(x)
print(y.shape)

GQA(分組查詢注意力)

一文詳解MHA、GQA、MQA原理-AI.x社區

雖然MQA方式大幅減小了參數數量,但是,帶來推理加速的同時會造成模型性能損失,且在訓練過程使得模型變得不穩定(復雜度的降低可能會導致質量下降和訓練不穩定),因此在此基礎上提出了GQA,它將Query進行分組,每個組內共享一組Key、Value。(GQA在LLaMA-2 和 Mistral7B得到應用)

GQA 的數學原理

分組:在 GQA 中,傳統多頭模型中的查詢頭 (Q) 被分成 G 組。每組分配一個鍵 (K) 和值 (V) 頭。此配置表示為 GQA-G,其中 G 表示組數。

GQA 的特殊情況

  • GQA-1 = MQA:只有一個組(G = 1),GQA 等同于 MQA,因為所有查詢頭只有一個鍵和值頭。
  • GQA-H = MHA:當組數等于頭數(G = H)時,GQA 退化為 MHA,每個查詢頭都有其唯一的鍵和值頭。

對每個組中原始頭部的鍵和值投影矩陣進行均值池化,以將MHA模型轉換為 GQA 模型。此技術對組中每個頭部的投影矩陣進行平均,從而為該組生成單個鍵和值投影。

通過利用 GQA,該模型在 MHA 質量和 MQA 速度之間保持平衡。由于鍵值對較少,內存帶寬和數據加載需求被最小化。G 的選擇代表了一種權衡:更多的組(更接近 MHA)可帶來更高的質量但性能較慢,而更少的組(接近 MQA)可提高速度但有犧牲質量的風險。此外,隨著模型規模的擴大,GQA 允許內存帶寬和模型容量按比例減少,與模型規模相對應。相比之下,對于更大的模型,在 MQA 中減少到單個鍵和值頭可能會過于嚴重。

代碼實現

import torch
import torch.nn as nn


class GroupedQueryAttention(nn.Module):
    def __init__(self, embed_dim, num_heads):
        super(GroupedQueryAttention, self).__init__()
        self.num_heads = num_heads
        self.head_dim = embed_dim // num_heads

        self.wq = nn.Linear(embed_dim, embed_dim)

        # 這是MHA的
        # self.wk = nn.Linear(embed_dim, embed_dim)
        # self.wv = nn.Linear(embed_dim, embed_dim)

        # 這是MQA的
        # self.wk = nn.Linear(embed_dim, self.head_dim)
        # self.wv = nn.Linear(embed_dim, self.head_dim)

        # 這是GQA的
        self.group_num = 4  # 這是4個組
        self.wk = nn.Linear(embed_dim, self.group_num * self.head_dim)
        self.wv = nn.Linear(embed_dim, self.group_num * self.head_dim)

        self.wo = nn.Linear(embed_dim, embed_dim)

    def split(self, hidden, group_num=None):
        batch_size, seq_len = hidden.size()[:2]
        # q需要拆分多頭
        if group_num == None:
            x = hidden.view(batch_size, seq_len, self.num_heads, self.head_dim).transpose(1, 2)
            return x
        else:
            # 這是kv需要拆分的多頭
            x = hidden.view(batch_size, seq_len, group_num, self.head_dim).transpose(1, 2)
            x = x[:, :, None, :, :].expand(batch_size, group_num, self.num_heads // group_num, seq_len,
                                           self.head_dim).reshape(batch_size, self.num_heads, seq_len, self.head_dim)
            return x

    def forward(self, hidden_states, mask=None):
        batch_size = hidden_states.size(0)

        # 線性變換
        q, k, v = self.wq(hidden_states), self.wk(hidden_states), self.wv(hidden_states)

        # 多頭切分
        # 這是MHA的
        # q, k ,v  = self.split(q), self.split(k), self.split(v)
        # 這是MQA的
        # q, k ,v  = self.split(q), self.split(k, 1), self.split(v, 1)
        # 這是GQA的
        q, k, v = self.split(q), self.split(k, self.group_num), self.split(v, self.group_num)

        # 注意力計算
        scores = torch.matmul(q, k.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))
        print("scores:", scores.shape)
        if mask is not None:
            scores = scores.masked_fill(mask == 0, float('-inf'))
        attention = torch.softmax(scores, dim=-1)
        output = torch.matmul(attention, v)

        # 合并多頭
        output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.num_heads * self.head_dim)

        # 線性變換
        output = self.wo(output)

        return output


x = torch.ones(3, 12, 512)
atten = GroupedQueryAttention(512, 8)
y = atten(x)
print(y.shape)

參考文獻

  • GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints,https://arxiv.org/pdf/2305.13245
  • Attention Is All You Need,https://arxiv.org/pdf/1706.03762
  • Fast Transformer Decoding: One Write-Head is All You Need,https://arxiv.org/pdf/1911.02150v1


本文轉載自公眾號大模型自然語言處理  作者:余俊暉

原文鏈接:??https://mp.weixin.qq.com/s/72fGm-qYV5DdCGz-bNjuXQ??


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2024-11-28 18:52:23修改
收藏
回復
舉報
回復
相關推薦
日韩88av| 国产91欧美| 91浏览器在线视频| 国产精品亚洲精品| 欧美日韩精品在线观看视频| 欧美有码在线| 欧美精品粉嫩高潮一区二区| 丰满的少妇愉情hd高清果冻传媒| 九色视频成人自拍| 国产精品99久久久久久久vr| 啪一啪鲁一鲁2019在线视频| 国产精品精品软件男同| 日本午夜精品| 日韩一区二区在线看| 男人舔女人下面高潮视频| av免费在线观看网址| 久久精品一区蜜桃臀影院| 国产精品网站大全| 日韩伦理在线视频| 亚洲蜜桃视频| 在线成人免费网站| 中文字幕在线观看网址| 日韩精品一区二区三区中文| 欧美体内she精视频| 99色这里只有精品| 成年人黄视频在线观看| 国产女同互慰高潮91漫画| 国产精品一区二区三区免费观看| 91中文字幕在线播放| 国产精品亚洲综合久久| 久久99青青精品免费观看| 91导航在线观看| 四虎884aa成人精品最新| 日韩欧美精品在线视频| 日本中文字幕精品—区二区| 久久青青视频| 精品国产1区2区| 成年丰满熟妇午夜免费视频| 麻豆最新免费在线视频| 国产欧美一区二区三区鸳鸯浴| 国内视频一区二区| 蜜臀久久99精品久久久| 国产成人99久久亚洲综合精品| 成人激情视频在线观看| 中文人妻熟女乱又乱精品| 六月婷婷一区| 欧美在线视频导航| 999这里只有精品| 在线欧美日韩| 久久久日本电影| 久热精品在线观看| 国产综合久久| 久久久女女女女999久久| 欧美成人精品欧美一级私黄| 亚洲先锋影音| 欧美精品亚州精品| 毛片aaaaa| 亚洲视频中文| 国语自产精品视频在免费| 久久午夜无码鲁丝片| 好看的日韩av电影| 午夜精品在线视频| 五月婷婷激情视频| 日韩综合在线视频| 国产欧美日韩中文| 国产麻豆精品一区| 风间由美性色一区二区三区| 国产伦精品一区二区三区四区视频| 亚洲高清精品视频| 99久久夜色精品国产网站| 久久精彩视频| 国产美女视频一区二区三区 | 久久精品综合| 国产精品久久久久久av福利| 91精品人妻一区二区三区果冻| 久久成人精品无人区| 成人在线小视频| 亚洲精品无码专区| 久久综合国产精品| 在线免费观看成人| 超碰在线最新网址| 色综合久久久久综合| 中文字幕永久有效| 精品自拍偷拍| 中文字幕日韩欧美精品在线观看| 亚洲女同二女同志奶水| 欧美午夜一区| 日本一欧美一欧美一亚洲视频| 中文字幕av片| 国产91在线观看| 欧美日韩国产免费一区二区三区| www.在线视频.com| 夜夜精品浪潮av一区二区三区| 欧美日韩精品在线一区二区| 99久久婷婷国产综合精品首页| 欧美成人性战久久| 天天干天天舔天天操| 牛牛国产精品| 国产精品扒开腿做| 亚洲av无码国产精品永久一区| 久久噜噜亚洲综合| 久久综合亚洲精品| 日韩在线免费| 欧美精品一区二区三| 少妇av片在线观看| 亚洲第一精品影视| 91精品视频在线看| 国产毛片在线看| 香港成人在线视频| 成人综合久久网| 竹菊久久久久久久| 色在人av网站天堂精品| 国产成人精品一区二区色戒| 99视频精品全部免费在线| 一区二区三区四区免费视频| 一二三四视频在线中文| 日韩欧美一二区| 国产小视频你懂的| 久久精品麻豆| 九九九九九九精品| 天堂va在线| 欧美二区三区91| www.99热| 久久国产99| 精品一区日韩成人| 欧美xxxx做受欧美88bbw| 欧美日产在线观看| 91l九色lporny| 亚洲欧美日韩国产一区| 国产亚洲第一区| 欧美人与牲禽动交com| 欧美日韩亚洲国产综合| 91l九色lporny| 老司机午夜精品视频| 久久一区二区三区av| av岛国在线| 精品国产免费人成在线观看| 欧美成人一二三区| 韩国av一区二区| 中文字幕在线乱| 四虎国产精品永久在线国在线| 在线不卡国产精品| 中文字幕 亚洲视频| 国产午夜精品福利| 午夜视频在线瓜伦| 深夜福利久久| 国产精品精品国产| 91在线品视觉盛宴免费| 91福利视频久久久久| 国产免费看av| 日日欢夜夜爽一区| 亚洲综合视频一区| av一级久久| 久色乳综合思思在线视频| 国产美女精品视频国产| 欧美男男video| 亚洲第一图区| 国产91丝袜在线观看| 欧美美女黄色网| 视频成人永久免费视频| 欧美国产在线电影| 人妻精品无码一区二区| 精品久久久久人成| 亚洲理论片在线观看| 蜜桃传媒麻豆第一区在线观看| 亚洲精品日韩成人| 国产日韩一区二区三免费高清| 不卡毛片在线看| 丰满熟妇人妻中文字幕| 天天免费综合色| 亚洲精品国产一区黑色丝袜| 男人的j进女人的j一区| 天天成人综合网| 福利片在线一区二区| 8x拔播拔播x8国产精品| 啊v视频在线| 制服丝袜亚洲网站| 国产在线观看免费av| 91老师片黄在线观看| 九九热免费在线观看| 欧美日本三区| 欧美日韩国产高清视频| 日本成人在线网站| 欧美夫妻性视频| 全色精品综合影院| 欧美日产国产精品| 日本少妇做爰全过程毛片| 国产三级精品在线| 特种兵之深入敌后| 久久久精品五月天| 青草全福视在线| 台湾色综合娱乐中文网| 91精品视频在线播放| 在线高清av| 久久av红桃一区二区小说| 亚洲日本香蕉视频| 欧美一级专区免费大片| 久久久久久久久久久影院 | 男人av资源站| 久久综合九色综合欧美亚洲| 999热精品视频| 国产午夜精品一区二区三区欧美 | 亚洲一区国产一区| 中文字幕一区二区三区在线乱码 | 黄瓜视频免费观看在线观看www| 国产精品毛片久久久| 国产女同一区二区| 中文字幕21页在线看| 免费91麻豆精品国产自产在线观看 | 蜜臀91精品一区二区三区| 日韩伦理在线免费观看| 久久精品一区二区不卡| 欧美国产视频在线观看| 91午夜精品| 91精品免费久久久久久久久| 欧美男女交配| 91福利视频网| 麻豆av在线播放| 久久九九全国免费精品观看| 国产在线91| 日韩激情第一页| 亚洲黄色一级大片| 欧美精品亚洲一区二区在线播放| 精产国品一区二区| 精品久久久久久久久久| 久草国产在线观看| 亚洲人吸女人奶水| 日韩亚洲欧美中文字幕| 国产午夜精品福利| 爱爱免费小视频| 不卡高清视频专区| 无码人妻一区二区三区一| 国产自产视频一区二区三区| 一本色道久久亚洲综合精品蜜桃 | 国产成人一区二区三区| 黄在线观看免费网站ktv| 久久理论片午夜琪琪电影网| 国产精品69xx| 欧美极品第一页| 国语对白在线刺激| 海角国产乱辈乱精品视频| 免费在线国产视频| 久久久久久久爱| av在线理伦电影| 久久久亚洲天堂| 182在线视频观看| 国内精品视频一区| 国产粉嫩在线观看| 66m—66摸成人免费视频| 白浆视频在线观看| 午夜剧场成人观在线视频免费观看| 爱搞国产精品| 日韩av理论片| 国产成人精品一区二区三区视频 | 欧美日韩中文不卡| 极品少妇xxxx偷拍精品少妇| 精品国产乱码久久久久久1区二区| 精品午夜久久福利影院| 欧美体内she精高潮| 高清成人在线观看| 国产精品伦子伦| 国产亚洲一区二区三区| 中文字幕91视频| 亚洲视频每日更新| 在线看成人av| 色婷婷久久久综合中文字幕| 最新国产中文字幕| 91.成人天堂一区| 亚洲av永久无码国产精品久久| 亚洲第一区第一页| 精品美女视频在线观看免费软件| 一道本无吗dⅴd在线播放一区| 日本黄色片在线观看| 久久久久久高潮国产精品视| jizz内谢中国亚洲jizz| 国产日韩欧美91| 高清一区二区三区| 日韩经典在线视频| 一区二区三区四区日韩| 国产日韩av网站| 蜜臀av亚洲一区中文字幕| 日本女人性视频| 91麻豆福利精品推荐| 日韩精品一区二区三区在线视频| 一区二区三区在线视频观看58| 日韩精品一区二区在线播放| 欧美视频在线一区| 六月婷婷综合网| 亚洲色图色老头| 在线你懂的视频| 日本一区二区三区四区视频| 国产成人久久精品一区二区三区| 精品一区二区三区视频日产| 欧美韩日一区| 毛片在线视频播放| 久久99热这里只有精品| 亚洲精品乱码久久久久久不卡| 亚洲欧洲日产国产综合网| 亚洲免费黄色网址| 日韩一区二区在线看片| 国产区视频在线| 国语自产偷拍精品视频偷| 亚洲精品一区av| 欧美人与性禽动交精品| 欧美三级小说| 少妇网站在线观看| 91玉足脚交白嫩脚丫在线播放| 成人在线观看小视频| 欧美午夜片在线看| 无码精品一区二区三区在线| 久久久久999| 久久91超碰青草在哪里看| 久久国产精品久久| 亚洲高清自拍| 欧美视频亚洲图片| 国产精品私房写真福利视频| 天堂在线免费观看视频| 欧美精品一区二区三区久久久| 最新国产露脸在线观看| 91精品国产自产在线观看永久| 精品影片在线观看的网站| 日韩欧美精品免费| 国产成人av影院| 精国产品一区二区三区a片| 欧美精品tushy高清| 97电影在线| 国产精品永久免费| 成人激情视频| 波多野结衣xxxx| 国产精品网曝门| 亚洲av人无码激艳猛片服务器| 日韩精品极品毛片系列视频| 九九精品调教| 97久久精品午夜一区二区| 91av精品| 992kp免费看片| 亚洲视频香蕉人妖| 国产男男gay体育生网站| 久久精品国产欧美激情| 欧美综合影院| 综合网五月天| 国产一区视频网站| 全网免费在线播放视频入口| 欧美一区二区三区四区五区| 巨大荫蒂视频欧美大片| 91精品国产综合久久香蕉的用户体验 | 日韩精品视频中文字幕| 欧美极品少妇无套实战| 大桥未久av一区二区三区中文| 久久9999久久免费精品国产| 精品国产凹凸成av人导航| 波多野结依一区| 好吊妞www.84com只有这里才有精品 | 欧美精品第三页| 国产农村妇女精品| 亚洲熟妇无码久久精品| xxx欧美精品| 日本少妇精品亚洲第一区| 亚洲精品无码国产| 91在线高清观看| 中文字幕在线视频第一页| www.久久久久久.com| 色播一区二区| 波多野结衣家庭教师在线| 国产无人区一区二区三区| 91免费视频播放| 欧美大片在线影院| 丝袜美腿综合| 成人黄色一级大片| 亚洲第一福利视频在线| 青青九九免费视频在线| 国产日韩精品视频| 一区二区亚洲| 欧美成人国产精品一区二区| 欧美二区在线观看| caoporn视频在线| 视频一区三区| 国产成人av电影在线| 波多野结衣人妻| 久久国产精品影视| 亚洲尤物av| www.51色.com| 欧美日韩激情视频| 调教视频免费在线观看| 国产偷久久久精品专区| 日本大胆欧美人术艺术动态| 成人免费毛片东京热| 亚洲精品一区二区在线| 96sao精品免费视频观看| 又粗又黑又大的吊av| 亚洲色图制服诱惑| 日本1级在线| 成人免费视频网站| 久久精品国产秦先生| 久久久久久久极品| 日韩日本欧美亚洲| 国产欧美日韩精品一区二区三区 | 91亚洲视频在线观看| 欧美在线观看网站| 亚洲欧美伊人|