精品欧美一区二区三区在线观看 _久久久久国色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修改
收藏
回復
舉報
回復
相關推薦
亚洲 精品 综合 精品 自拍| 青青草原免费观看| 日本欧美韩国| 亚洲精品中文字幕在线观看| 国内外成人免费视频| 中文字幕在线观看视频免费| 亚洲澳门在线| 日韩精品高清在线| 欧美美女性视频| gratisvideos另类灌满| 久久影音资源网| 亚洲自拍偷拍网址| 国产剧情在线视频| 自拍欧美日韩| 一区二区三区天堂av| 成年人性生活视频| 99re66热这里只有精品4| 一区二区三区波多野结衣在线观看 | 欧美精品在欧美一区二区少妇| 青青在线视频免费观看| jyzzz在线观看视频| 不卡电影一区二区三区| 成人做爰www免费看视频网站| 男人的天堂一区二区| 欧美国产另类| 中文字幕日韩免费视频| 免费成人深夜夜行p站| 成人乱码手机视频| 欧美日精品一区视频| 国产精品沙发午睡系列| 亚洲精品白浆| 亚洲女同女同女同女同女同69| 日韩在线电影一区| 日韩毛片在线一区二区毛片| 国产.欧美.日韩| 95av在线视频| 国产美女无遮挡永久免费| 日韩—二三区免费观看av| 久久免费高清视频| 北条麻妃在线观看视频| 日韩欧美电影| 正在播放欧美一区| 天天躁日日躁aaaxxⅹ| 精品福利一区| 欧美精品一区二区三区四区| 亚洲一区和二区| 一区二区亚洲视频| 日韩欧美专区在线| 无码人妻一区二区三区在线视频| 日本午夜免费一区二区| 欧美日韩一卡二卡三卡| 美女网站免费观看视频| av免费在线一区| 91久久奴性调教| 玩弄japan白嫩少妇hd| 原纱央莉成人av片| 一道本成人在线| 精品中文字幕av| 欧美电影免费观看高清完整| 欧美色图在线视频| 精品久久久噜噜噜噜久久图片| 成人av观看| 在线看日本不卡| 宅男噜噜噜66国产免费观看| 黄色成人小视频| 欧美日本在线看| 伊人免费视频二| 综合视频一区| 日韩精品视频在线观看网址| 欧美狂猛xxxxx乱大交3| 欧美精品尤物在线观看| 色老头一区二区三区| 疯狂撞击丝袜人妻| 国产一区观看| 日韩免费在线观看视频| 中文字幕观看视频| 国产成人综合自拍| 国模精品一区二区三区| 精品视频二区| ●精品国产综合乱码久久久久| 99热这里只有精品7| 色呦呦在线视频| 欧美色欧美亚洲高清在线视频| 国产免费视频传媒| 国产精品亲子伦av一区二区三区| 欧美一区二区三区男人的天堂| 97中文字幕在线观看| 女厕嘘嘘一区二区在线播放| 日韩在线视频观看| 免费中文字幕视频| 老司机午夜精品视频| 91免费福利视频| 亚洲AV第二区国产精品| 国产精品国产三级国产三级人妇| 欧美国产视频一区| 欧美一区国产| 精品少妇一区二区三区日产乱码| 毛片网站免费观看| 最新国产精品久久久| 欧美有码在线视频| 国产三级视频在线播放| 久久久久九九视频| 日韩在线视频在线| 亚洲第一会所| 亚洲电影免费观看高清完整版在线| 91久久免费视频| 欧美国产先锋| 国产精品久久久久久久久久| 成人无码一区二区三区| 国产日韩v精品一区二区| 欧美一二三不卡| 99久久婷婷国产综合精品首页 | 成人h猎奇视频网站| 手机在线观看毛片| 亚洲视频一二三区| 日本www.色| 亚洲成aⅴ人片久久青草影院| 欧美精品在线免费| 怡红院成永久免费人全部视频| 99久久夜色精品国产网站| 日本特级黄色大片| 久久精品女人天堂av免费观看| 精品毛片乱码1区2区3区| 欧美aaa级片| 久久久水蜜桃av免费网站| 99久久综合狠狠综合久久止| 一区二区三区视频网站| 色综合一区二区| 国模无码视频一区| 中文字幕日韩一区二区不卡| 国产精品久久久久一区二区| 手机亚洲第一页| 午夜精品福利一区二区三区av | 99亚洲乱人伦aⅴ精品| 久久久99免费视频| 中文天堂在线资源| 国产日韩欧美综合在线| 三级4级全黄60分钟| 欧美性生活一级片| 午夜精品一区二区三区在线视频| 性中国古装videossex| 亚洲日本在线看| 一二三av在线| 我不卡伦不卡影院| 91精品美女在线| 亚洲精品传媒| 欧美三级一区二区| 国产农村妇女精品一区| 日韩中文字幕一区二区三区| 欧美日韩精品免费看| 欧美理论影院| 一区二区三区高清国产| 中文字幕免费播放| 国产精品高潮久久久久无| www.99r| 91偷拍一区二区三区精品| 国产精品自产拍在线观| 黄色网页在线免费观看| 宅男在线国产精品| 久久网免费视频| 成人91在线观看| 欧洲av无码放荡人妇网站| 蜜乳av综合| 国产精品丝袜白浆摸在线| 蜜桃视频网站在线观看| 日韩一区二区三区在线观看| 久久午夜无码鲁丝片午夜精品| 波多野结衣亚洲一区| 日韩激情免费视频| 九热爱视频精品视频| 国产日韩中文字幕| 青春草免费在线视频| 亚洲精品国产拍免费91在线| 日本免费精品视频| 亚洲欧洲日韩综合一区二区| 中文字幕永久免费| 亚洲中字在线| 正在播放一区| 国产精品高潮呻吟久久久久 | 成人黄色免费短视频| 日韩在线观看你懂的| 午夜精品久久久久久久96蜜桃| 天天综合色天天综合色h| 欧美熟妇激情一区二区三区| 国产麻豆视频一区| 亚洲国产精品久久久久婷蜜芽| 成人看的视频| 成人欧美一区二区| 桃子视频成人app| 美女av一区二区三区| 熟妇人妻一区二区三区四区 | 五月天亚洲视频| 国内精品久久久久久久影视蜜臀| 日本在线播放一区| 北条麻妃在线一区二区免费播放 | 国产一区精品二区| 欧美专区在线播放| 午夜dj在线观看高清视频完整版| 日韩精品极品在线观看| 国产日韩在线观看一区| 一本一道久久a久久精品综合蜜臀| 在线观看黄网址| 91免费视频网| 黄色片子免费看| 日韩av二区在线播放| 999一区二区三区| 久久国产亚洲| 欧美成人蜜桃| 成人看片爽爽爽| 91热精品视频| 天堂久久午夜av| 5566成人精品视频免费| 最新超碰在线| 色av吧综合网| 毛片免费在线播放| 亚洲精品久久在线| www视频在线| 欧美精品久久99久久在免费线 | 三级欧美韩日大片在线看| 黄色网在线视频| 欧美疯狂party性派对| 欧美日韩电影一区二区三区| 大香伊人久久精品一区二区| 91视频-88av| 日韩成人综合网站| 国产精品福利在线观看| 台湾佬中文娱乐网欧美电影| 久久久久久久97| 中文字幕资源网在线观看| 色偷偷偷综合中文字幕;dd| 久久av少妇| 亚洲人精品午夜在线观看| 无码精品人妻一区二区三区影院| 精品免费日韩av| 国内精品久久久久久久久久| 91精品福利在线一区二区三区| 一本久道久久综合无码中文| 色琪琪一区二区三区亚洲区| 日韩黄色在线播放| 都市激情亚洲色图| 青青国产在线观看| 精品国产乱码久久久久久婷婷| 天天操天天射天天爽| 亚洲妇熟xx妇色黄| 亚欧洲精品在线视频| 天天影视涩香欲综合网| 久久国产视频播放| 欧美色播在线播放| 国产女主播喷水视频在线观看| 色猫猫国产区一区二在线视频| 无码一区二区三区| 欧美日韩在线三级| 一级黄色免费看| 日韩午夜中文字幕| 亚洲精品18在线观看| 精品欧美一区二区久久| 在线观看xxx| 亚洲国产精品久久久| 神马精品久久| 一本大道亚洲视频| 精品孕妇一区二区三区| 久久中文字幕在线视频| 欧美精品videosex| 国产91精品久| 成人午夜毛片| 91观看网站| 欧美理伦片在线播放| 欧美伦理一区二区| 欧美大黑bbbbbbbbb在线| 亚洲五码在线观看视频| 亚洲精品日韩久久| 亚洲黄色a v| 国产精品一区二区免费不卡| 荫蒂被男人添免费视频| 国产日产欧产精品推荐色| 久久嫩草捆绑紧缚| 亚洲国产成人porn| 久久精品视频2| 91精品国产综合久久婷婷香蕉| 成人无码一区二区三区| 国产一区二区三区免费视频| 成人在线免费看片| 欧洲成人性视频| 国产精品3区| 蜜桃成人免费视频| 中文av一区| 免费av网址在线| 国产乱人伦精品一区二区在线观看| 成人性生活免费看| 一区二区中文视频| 亚洲 欧美 日韩 综合| 欧美猛男超大videosgay| 懂色av一区二区三区四区| 亚洲性生活视频| wwww在线观看免费视频| 国产精品视频地址| 国产成人精品福利| 亚洲精品成人三区| 99精品热6080yy久久| 黄色一级片免费的| 2024国产精品| 久久国产在线视频| 欧美精选一区二区| 全部免费毛片在线播放网站| 欧美国产日产韩国视频| 99riav视频一区二区| 久久一区二区三区av| 综合激情一区| 黄色手机在线视频| 91麻豆免费看片| 欧美极品aaaaabbbbb| 欧美日韩国产a| 蜜芽tv福利在线视频| 久久久久国色av免费观看性色| 欧美黄色a视频| 欧美日韩无遮挡| 夜夜嗨一区二区三区| 精品人妻人人做人人爽夜夜爽| 欧美激情一区二区三区四区| 99精品视频99| 亚洲精品在线免费播放| 成人免费网站在线观看视频| 国产精品偷伦视频免费观看国产| 伊人久久综合影院| 伊人成色综合网| 成人黄色综合网站| 男女免费视频网站| 日韩一级在线观看| www在线免费观看视频| 国产精选久久久久久| 成人91在线| 色一情一乱一伦一区二区三区日本| 97久久精品人人爽人人爽蜜臀| 18精品爽视频在线观看| 欧美一区永久视频免费观看| 免费在线观看黄色| 国产精品免费电影| 日韩在线观看一区| the porn av| 国产精品免费网站在线观看| 在线观看免费观看在线| 伊人伊人伊人久久| 青青在线精品| 色呦呦网站入口| 国产精品系列在线观看| 欧美日韩大片在线观看| 欧美不卡在线视频| www.8ⅹ8ⅹ羞羞漫画在线看| 风间由美久久久| 激情五月***国产精品| 免费不卡的av| 疯狂做受xxxx欧美肥白少妇| 四虎影视精品成人| 欧美又大又粗又长| 日本一区二区免费高清| 中文字幕在线综合| 中文字幕日本不卡| 精品国产乱码一区二区三| 欧美高清在线播放| 老司机成人在线| 激情婷婷综合网| 国产精品久久久久久久裸模| 91麻豆一区二区| 久久久久久九九九| 综合国产视频| 国产喷水theporn| 亚洲精选视频免费看| 天堂网在线中文| 国产国产精品人在线视| 91精品精品| 亚洲欧美日韩偷拍| 欧美最猛黑人xxxxx猛交| 欧美人xxx| 国产日韩精品推荐| 日本中文在线一区| 亚洲av鲁丝一区二区三区| 欧美精品一区二区三区高清aⅴ| 欧美aa免费在线| 一区国产精品| 成人黄色777网| 成人黄色免费网| 欧美黑人xxxⅹ高潮交| 羞羞色国产精品网站| 一路向西2在线观看| 亚洲影视在线播放| 国产高清自拍视频在线观看| 亚洲xxxx3d| 美女日韩在线中文字幕| www.5588.com毛片| 亚洲乱码av中文一区二区| 亚洲一区二区三区久久久| 成人午夜免费在线视频| 国产午夜精品久久久久久久| a天堂视频在线| 国产91色在线播放| 国内精品亚洲| 久久国产精品国语对白| 亚洲日本中文字幕| 91精品短视频| 天天摸天天舔天天操|