国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

對Transformer中位置編碼的可視化理解

發布于 2025-6-9 00:25
瀏覽
0收藏

了解位置編碼背后的數學原理和直覺

Transformer是一種深度學習架構,它利用注意力機制來學習數據元素之間的關系。它由一個編碼器和一個解碼器組成,與傳統的循環神經網絡(RNN)或卷積神經網絡(CNN)不同,它可以并行處理輸入序列,而不依賴于順序處理。Transformer模型的一個重要組成部分是位置編碼。這種方法能夠將位置信息添加到詞嵌入中,使模型能夠理解序列中單詞的順序。這一點至關重要,因為默認情況下,Transformer是并行處理模型,它本身并不理解語言的順序性。在本文中,我們將描述位置編碼背后的直覺。此外,我們旨在使用Python對位置編碼背后的數學概念進行可視化理解。。

位置編碼

在自然語言處理中,句子中單詞的位置或順序非常重要,因為它規定了句子的語法和語義。循環神經網絡(RNN)按順序處理句子,這使它們能夠考慮單詞的順序。然而,這種順序處理存在一些缺點。它可能會使訓練RNN的計算成本很高,特別是對于長句子。此外,RNN可能會受到梯度消失問題的影響,即在網絡處理更多單詞時,句子前面部分的信息會被稀釋或丟失。

相反,Transformer架構使用多頭自注意力機制,這使得它能夠同時處理句子中的所有單詞,而不是按順序處理。這種并行處理可以使訓練過程更快,并且不太容易受到梯度消失問題的影響。然而,由于所有單詞都是同時處理的,Transformer模型無法感知句子中單詞的順序,因此它需要一個額外的機制來跟蹤單詞的順序。

位置編碼是一種將單詞順序信息注入Transformer模型的關鍵機制。圖1顯示了位置編碼在Transformer架構中的位置。它分別應用于輸入和輸出嵌入,在它們進入編碼器和解碼器之前。

對Transformer中位置編碼的可視化理解-AI.x社區

它向每個嵌入添加一個向量,該向量表示單詞在句子中的位置,如圖2所示。輸入句子首先進行分詞,也就是說,它被分解為單個單詞或子詞單元。然后,每個詞元被轉換為一個嵌入向量,該向量表示該詞元的含義。接下來,對于每個詞元,生成一個位置編碼向量。這個向量僅由詞元在句子中的位置決定,因此,不同的位置會得到不同的唯一向量。

對Transformer中位置編碼的可視化理解-AI.x社區

嵌入向量和相應的位置編碼向量按元素相加。結果是一個具有位置感知的嵌入向量,它同時攜帶了詞元的含義和位置信息。這些具有位置感知的向量隨后被發送到Transformer的編碼器和解碼器部分(圖1)。

現在讓我們看看位置編碼是如何定義的。我們知道位置編碼是一個添加到詞元嵌入向量的向量。因此,它們應該具有相同數量的元素。讓我們假設嵌入向量的維度是一個由??d_model???表示的偶數。所以,位置編碼向量將具有相同的維度。假設??pos??是一個整數變量,表示序列中詞元的位置。我們還假設它從0開始(圖3)。

對Transformer中位置編碼的可視化理解-AI.x社區

設??PE_pos???為位置??pos???處詞元的位置編碼向量。我們知道它是一個具有??d_model???個元素的向量。假設??j???是這個向量中元素的索引,并且讓??j???從0開始。現在,??PE_pos???在索引??j = 2i???和??j = 2i + 1??處的元素定義如下:

對Transformer中位置編碼的可視化理解-AI.x社區

由于??j???從0開始,??i??的范圍是(0 \dots d_{model}/2 - 1)。使用這些公式,我們現在可以為詞元創建整個位置編碼向量:

對Transformer中位置編碼的可視化理解-AI.x社區

但是為什么我們要使用三角函數來構建位置編碼向量呢?為什么我們要在這個向量中配對正弦和余弦函數呢?三角函數具有周期性,這意味著它們在規則的間隔內重復其值。周期性可以用來設計一個計數器。

老式的汽油泵通常配備機械計數器來顯示已分配的燃油量。這些計數器使用齒輪和輪子等物理機制來跟蹤燃油流量,以加侖或升為單位顯示總量。計數器本身通常有一系列旋轉的輪子,其邊緣標有數字0到9。最右邊的輪子在每次事件發生時移動一個增量。當它完成一次旋轉時,它會回到0,但會使左邊的下一個輪子移動一個增量(圖4)。同樣,當每個輪子達到9并移動到0時,左邊相鄰的輪子會移動一個增量。因此,每個輪子在從9回到0時都表現出周期性行為。

對Transformer中位置編碼的可視化理解-AI.x社區

圖5展示了一個類似的機械計數器機制,其中使用指針而不是輪子來顯示每個數字。當然,所有指針都同時移動,類似于時鐘的指針。然而,每個指針的移動速度都比左邊相鄰的指針快。當每個指針完成一次旋轉并回到0時,左邊的下一個指針會移動一個增量。

對Transformer中位置編碼的可視化理解-AI.x社區

公式2中的位置編碼向量實現了一種類似的機制來對序列中的詞元進行計數。為了理解這種機制,我們首先繪制一個以原點為中心、半徑為1的單位圓,如圖6所示。

設(p_x)和(p_y)表示單位圓上一點(p)的坐標,并且設從原點到(p)的射線與正(x)軸形成一個角度(\theta)。現在我們可以使用(\theta)來找到(p)的坐標:

對Transformer中位置編碼的可視化理解-AI.x社區

對Transformer中位置編碼的可視化理解-AI.x社區

我們現在可以使用這個概念來理解位置編碼公式。在公式1中,每對余弦和正弦函數可以表示單位圓上一個點的位置(圖7)。因此,位置編碼向量在某種程度上類似于圖5中所示的機械計數器。在這里,每對正弦和余弦函數扮演著圖5中指針的角色。

對Transformer中位置編碼的可視化理解-AI.x社區

現在我們已經理解了位置編碼,我們可以在Python中實現它。清單1中的??positional_encoding()???函數創建給定序列的位置編碼向量。請注意,我們只需要知道序列的長度(由??max_len???表示的詞元數量)和嵌入向量的維度(??d_model??),就可以創建公式1中的位置編碼向量。詞元本身及其相應的嵌入向量不會改變位置編碼向量。

# 清單1
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle

def positional_encoding(d_model, max_len):
    pos_arr = np.arange(0, max_len).reshape(-1, 1)
    i_arr = np.arange(0, d_model, 2)
    w = 1 / 10000**(2*i_arr/d_model)
    pe = np.zeros((max_len, d_model))
    pe[:, 0::2] = np.sin(pos_arr*w)
    pe[:, 1::2] = np.cos(pos_arr*w)
    return pe

接下來,我們可以使用這個函數來創建一個有5個詞元且??d_model = 6??的序列的位置編碼向量。

# 清單2
pe = positional_encoding(6, 5)
np.round(pe, 4)

array([[ 0.    ,  1.    ,  0.    ,  1.    ,  0.    ,  1.    ],
       [ 0.8415,  0.5403,  0.0022,  1.    ,  0.    ,  1.    ],
       [ 0.9093, -0.4161,  0.0043,  1.    ,  0.    ,  1.    ],
       [ 0.1411, -0.99  ,  0.0065,  1.    ,  0.    ,  1.    ],
       [-0.7568, -0.6536,  0.0086,  1.    ,  0.    ,  1.    ]])

??positional_encoding()???的輸出是一個二維數組,其中每一行給出了序列中一個詞元的位置編碼向量。清單3可視化了一個長度為7且??d_model = 20??的給定序列的位置編碼向量。我們采用與圖7相同的可視化方法,結果如圖8所示。

# 清單3
d_model = 20
max_len = 7
pe = positional_encoding(d_model, max_len)
fig, ax = plt.subplots(nrows=max_len, ncols=int(d_model/2),
                       figsize=(12, 11), sharex=True,sharey=True)
fig.subplots_adjust(wspace=0.1, hspace=0.005)
ax = ax.flatten()
r_array = np.arange(1, d_model/2+1)
i = 0
for token in pe:
    points = token.reshape(-1,2)
    for j in range(len(points)):
        ax[i].axhline(0, color='grey', linewidth=0.5)
        ax[i].axvline(0, color='grey', linewidth=0.5)
        circle = Circle((0, 0), 1, facecolor='none',
                        edgecolor='black', linewidth=0.5)
        ax[i].add_patch(circle)
        ax[i].scatter(points[j, 0], points[j,1], s=15)
        ax[i].set_aspect('equal')
        ax[i].set_aspect('equal')
        i += 1
for i in range(0, max_len):
    ax[i*int(d_model/2)].set_ylabel('Pos='+str(i), labelpad=20,
                                     fnotallow=10, rotatinotallow=0)
for i in range(0, int(d_model/2)):
    ax[i].set_title('j={},{}'.format(2*i, 2*i+1), pad=12, fnotallow=10)
plt.show()

對Transformer中位置編碼的可視化理解-AI.x社區

如你所見,它是一個由圓圈組成的二維數組。這個數組中的每一行代表一個詞元的位置編碼向量。因此,第一行代表第一個詞元(??Pos=0???),第二行代表第二個詞元(??Pos=1???),依此類推。在每一行中,我們有10個圓圈(因為??d_model = 20???),并且每個圓圈代表位置編碼向量中的一對正弦和余弦函數(參考圖7)。例如,最左邊一列的圓圈代表詞元位置編碼向量的前兩個元素(圖7中??j = 0,1???),最左邊最后一列的圓圈代表這個向量的最后兩個元素(圖7中??j = d_model - 2, d_model - 1??)。

我們還觀察到,隨著詞元位置(??pos???)的增加,第一個圓圈上的點(對應于??j = 0,1???)開始移動,并且它的移動速度比第二個圓圈上的點(對應于??j = 2,3???)快。實際上,在每一列中,圓圈上的點的移動速度都比右邊相鄰列的點快。這是因為在公式1中,正弦和余弦參數與??i???成反比,并且增加??i??會降低正弦和余弦函數的頻率。

位置編碼的數學性質

公式2中定義的位置編碼向量具有一些有趣的數學性質,我們將在本節中討論。首先,讓我們計算位置編碼向量的長度。像

對Transformer中位置編碼的可視化理解-AI.x社區

這樣的向量的長度定義為:

對Transformer中位置編碼的可視化理解-AI.x社區

現在,我們可以計算位置編碼向量的長度,如公式2所示:

對Transformer中位置編碼的可視化理解-AI.x社區

其中使用了以下三角恒等式來推導公式3:

對Transformer中位置編碼的可視化理解-AI.x社區

結果表明,位置編碼向量的長度與??pos??無關,并且對于所有詞元都是相同的。由于所有向量的長度都相同,重要的是它們之間的角度。假設我們有兩個向量(\mathbf{u})和(\mathbf{v}),它們之間的角度是(\theta)。那么有:

對Transformer中位置編碼的可視化理解-AI.x社區

這里,(\mathbf{u} \cdot \mathbf{v})是(\mathbf{u})和(\mathbf{v})的點積,也可以寫成

對Transformer中位置編碼的可視化理解-AI.x社區

其中(\mathbf{u}^T)是(\mathbf{u})的轉置。(\cos(\theta))項稱為向量(\mathbf{u})和(\mathbf{v})的余弦相似度。現在,我們可以計算

對Transformer中位置編碼的可視化理解-AI.x社區

我們從公式4開始:

對Transformer中位置編碼的可視化理解-AI.x社區

為了計算這個公式的分子,我們可以寫:

對Transformer中位置編碼的可視化理解-AI.x社區

這個結果可以使用和差化積恒等式進行簡化:

對Transformer中位置編碼的可視化理解-AI.x社區

得到:

對Transformer中位置編碼的可視化理解-AI.x社區

我們得出結論,公式5的分子與??pos???無關。我們還看到它的分母與??pos???無關。因此,??PE_pos???和??PE_(pos + k)???之間的角度僅取決于??k???和??d_model???,而與??pos??無關:

對Transformer中位置編碼的可視化理解-AI.x社區

這意味著,對于給定的(k)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角始終保持不變,而與(pos)的值無關。讓我們來看一個例子以闡明這些結論。清單4將一個長度為12且(d_model = 2)的給定序列的位置編碼向量進行了可視化呈現。在這種情況下,每個詞元的位置編碼向量僅由兩個元素組成,這使得整個向量可以表示為單位圓上的一個點。這次,所有詞元對應的點都繪制在同一個圓上。結果如圖9所示。

# 清單4
margin = 0.03
pe = positional_encoding(2, 12)  
fig = plt.figure(figsize=(7,7))
ax = fig.add_subplot(1, 1, 1) 
circle = Circle((0, 0), 1, facecolor='none', edgecolor='black', linewidth=0.5)
ax.add_patch(circle)
for i in range(len(pe)):
    plt.scatter(pe[i, 0], pe[i,1], s=50, label=str(i))
    plt.plot([0, pe[i, 0]],[0,pe[i,1]])
    plt.text(pe[i, 0]+margin, pe[i,1]+margin, "PE"+str(i), fnotallow=14)
ax.set_aspect('equal')
plt.xlim([-1.2, 1.2])
plt.ylim([-1.2, 1.2])
plt.show()

對Transformer中位置編碼的可視化理解-AI.x社區

對于每一個位置編碼向量,我們可以看到:

對Transformer中位置編碼的可視化理解-AI.x社區

我們還發現,對于所有的(pos)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角都是相同的。例如,(PE_0)和(PE_1)之間的夾角與(PE_3)和(PE_4)之間的夾角是一樣的。同樣,(PE_0)和(PE_2)之間的夾角等于(PE_1)和(PE_3)之間的夾角。當(d_model>2)時,我們無法繪制位置編碼向量。然而,本節中得到的結論仍然是有效的。

(PE_{pos})和(PE_{(pos + k)})之間的夾角取決于(k)且與(pos)無關這一事實,使得Transformer模型能夠通過相對位置來學習關注。例如,當前詞元與下一個詞元之間的夾角總是相同的,無論當前詞元的位置或者整個序列的長度如何。以下是引入Transformer模型的原始論文[1]中的一段引用:

對Transformer中位置編碼的可視化理解-AI.x社區

但是這句話的數學含義是什么呢?假設我們有公式2中給出的位置編碼向量。我們知道這個向量有(d_model)個元素。現在,基于上述結論,存在一個(d_model×d_model)的矩陣(M_k),它取決于(k)(以及(d_model)),但與(pos)無關,并且滿足以下等式:

對Transformer中位置編碼的可視化理解-AI.x社區

這個矩陣就是上述引用中提到的線性函數。我們可以很容易地證明,這個結論也可以推導出公式6。實際上,公式7表明,對于給定的(k)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角保持不變,而與(pos)的值無關。在公式7中,(M_k)是一個旋轉矩陣,它將(PE_{pos})旋轉一定的角度(該角度取決于(k)),并將其轉換為(PE_{pos + k})。圖10展示了一個例子。在這里,矩陣(M_2)將(PE_0)旋轉到(PE_2)。由于這個矩陣與(pos)無關,它會以相同的角度旋轉任何其他位置編碼向量。例如,它以相同的角度旋轉(PE_3)來得到(PE_5)。因此,(PE_{pos})和(PE_{pos + 2})之間的夾角總是相同的。

對Transformer中位置編碼的可視化理解-AI.x社區

清單5創建了一個熱圖,展示了一個長度為20且(d_model = 64)的給定序列中所有位置編碼向量的成對點積。該熱圖如圖9所示。

# 清單5
pe = positional_encoding(64, 20)  
dist = pe @ pe.T
plt.imshow(dist, cmap='jet', interpolatinotallow='nearest')  
plt.colorbar()
plt.title('Heatmap of Pairwise Dot Products')
plt.xlabel('Pos')
plt.ylabel('Pos')
plt.xticks(np.arange(0, 20, step=2))
plt.yticks(np.arange(0, 20, step=2))
plt.show()

對Transformer中位置編碼的可視化理解-AI.x社區

這個熱圖是公式6的一種體現。由于所有的位置編碼向量長度相同,我們從公式5可以得出:

對Transformer中位置編碼的可視化理解-AI.x社區

因此,一對位置編碼向量的點積與它們之間的夾角成反比(因為(\cos(\theta))與(\theta)成反比)。我們可以看到,熱圖矩陣中每條對角線上的元素顏色是相同的。這是因為對于特定的(k)值,(PE_{pos})和(PE_{(pos + k)})之間的夾角保持不變,所以它們的點積也不變。如圖12所示,每條對角線代表一個特定的(k)值。

對Transformer中位置編碼的可視化理解-AI.x社區

這個熱圖還有另一個有趣的特征。當兩個詞元的位置距離變遠時,我們預期它們的位置編碼向量之間的夾角會增大,而它們的點積會減小(點積與(\cos(\theta))成正比,而(\cos(\theta))與(\theta)成反比)。然而,熱圖顯示,兩個詞元的位置編碼向量的點積并不總是隨著它們位置距離的變遠而減小。

圖13展示了一個例子。如果我們沿著熱圖矩陣的第一行觀察,點積呈現出周期性變化,并且會表現出振蕩行為。這意味著這些向量之間的夾角會反復增大和減小。這可能看起來有悖直覺,但原因在于正弦和余弦函數的周期性。

對Transformer中位置編碼的可視化理解-AI.x社區

為了解釋原因,我們繪制了圖8中位置編碼向量的成對點積的熱圖,其中序列長度為7,且(d_model = 20)。在這里,對應于((j = 0,1))的圓上的點移動得很快。在(PE_3)中,這個點與它在(PE_0)中的原始位置相距很遠,因此,(PE_0)和(PE_3)的點積很小(向量之間的夾角很大)。然而,在(PE_6)中,這個點幾乎回到了它的原始位置,而第二個圓((j = 2,3))上的點并沒有移動那么多。結果,(PE_0)和(PE_6)之間的夾角變小了,并且它們的點積相比(PE_0)和(PE_3)的點積增大了。

對Transformer中位置編碼的可視化理解-AI.x社區

增大(d_model)可以減輕這種周期性行為。圖15展示了一個長度為20且(d_model = 512)的給定序列中所有位置編碼向量的成對點積的熱圖。現在,當兩個向量的(pos)差值增大時,它們的點積會持續減小。

對Transformer中位置編碼的可視化理解-AI.x社區

參考文獻

[1] Vaswani, Ashish; Shazeer, Noam; Parmar, Niki; Uszkoreit, Jakob; Jones, Llion; Gomez, Aidan N; Kaiser, ?ukasz; Polosukhin, Illia. 2017.Attention is All you Need .In Advances in Neural Information Processing Systems . Vol. 30. Curran Associates, Inc.arXiv :1706.03762.

本文轉載自????柏企閱文???,作者:tailet

收藏
回復
舉報
回復
相關推薦
亚洲熟妇国产熟妇肥婆| 欧美激情亚洲另类| 黑人糟蹋人妻hd中文字幕 | 成人在线免费电影网站| 亚洲第一成人在线| 日本a级片在线观看| 日韩av中文在线观看| 欧美成人精品xxx| 国产高清在线a视频大全| 欧美日韩第一区日日骚| 性欧美孕妇孕交| 成人在线影视| 欧美专区在线观看一区| 一区二区三区视频国产日韩 | 久久婷婷五月综合色国产香蕉| 可以免费看不卡的av网站| 99精彩视频| 99人久久精品视频最新地址| 亚洲伊人第一页| 蜜桃av色综合| 国产亚洲精品久久久| 91久久在线视频| 国产精区一区二区| 美女国内精品自产拍在线播放| 亚洲黄色中文字幕| 亚洲国产成人久久综合| 视频在线这里都是精品| 亚洲欧美综合图区| 91综合久久爱com| 91高清免费在线观看| 浪潮色综合久久天堂| 亚洲精品国精品久久99热 | www在线免费观看视频| 91国产成人在线| 黄污视频在线观看| 最新亚洲国产精品| 超碰这里只有精品| 奇米一区二区三区四区久久| 91精品国产自产在线观看永久∴ | av免费看网址| 亚洲视频一区在线| 理论片午午伦夜理片在线播放| 亚洲国产精彩中文乱码av| 中文字幕系列一区| 国产欧美一区二区三区在线看 | 国产精品久久久久久久美男| 欧美福利网址| 美女爽到高潮91| www.亚洲人.com| 99久久99久久精品国产片果冰| 久久久久久亚洲精品不卡4k岛国 | 欧美一级日韩免费不卡| 日本另类视频| 91精品国产一区二区三区动漫| 激情五月婷婷综合网| 草久在线视频| 欧美丰满少妇xxxbbb| 美女毛片在线看| 日韩中文字幕不卡视频| 婷婷亚洲综合| 116极品美女午夜一级| 日本高清不卡视频| 香蕉久久一区| 色视频一区二区三区| 亚洲在线观看免费视频| 超薄肉色丝袜脚交一区二区| 91精品黄色| 亚洲韩国一区二区三区| 盗摄系列偷拍视频精品tp| 美女黄色片网站| 欧美老女人第四色| 911精品美国片911久久久| av网站在线不卡| 一本一道久久a久久精品逆3p | 亚洲国产一区二区三区a毛片| 一女被多男玩喷潮视频| 亚洲男人7777| 国产精品1区二区.| 不卡视频观看| 中文字幕一区二区三区5566| 欧美人xxxx| 人人狠狠综合久久亚洲| tube8在线hd| 日本一区二区三区四区五区六区| 亚洲第一精品电影| 裸体在线国模精品偷拍| 手机在线理论片| 成年女人18级毛片毛片免费| 一本色道久久88综合亚洲精品ⅰ | 亚洲成在线观看| 国产精品一区视频| 午夜成人免费视频| 99精品国产在热久久| 国产www.大片在线| 亚洲v欧美v另类v综合v日韩v| 亚洲精品美女久久久久| 成人精品一区二区三区四区| 亚洲精品在线国产| 久久白虎精品| 热re99久久精品国产99热| 亚洲欧美在线播放| 亚洲综合在线观看视频| 亚洲精品社区| 精品久久在线| 亚洲男人天堂| 菠萝蜜视频在线观看入口| 97在线看福利| 欧美岛国在线观看| 国产亚洲精品资源在线26u| 中文字幕亚洲精品乱码 | 日日骚久久av| 日韩欧美成人精品| 久久99精品久久久| 亚洲影院天堂中文av色| 国产乱理伦片a级在线观看| 欧美 亚洲 视频| 91视频最新| 久久久久成人精品| 亚洲国产精品中文| 亚洲成人激情自拍| 久久亚洲综合色| 免费视频一区| 国产精品99视频| 亚洲日韩中文字幕一区| 2021国产在线| 日本一级在线观看| www.com黄色片| 9l视频自拍9l视频自拍| www.av一区视频| 麻豆精品蜜桃视频网站| 无人区乱码一区二区三区| 午夜伦理福利在线| a视频在线播放| 欧美香蕉爽爽人人爽| 日本免费专区| aaa大片免费观看| 激情六月丁香婷婷| 妞干网这里只有精品| 五月天亚洲综合情| 久久久久久九九| 国产不卡一区二区三区在线观看| 欧美整片在线观看| 国产精品www色诱视频| 国语自产精品视频在免费| 日韩中文在线中文网三级| 亚洲国产精品高清久久久| 亚洲精品一区在线观看| 日韩高清免费观看| av国产精品| 国产一区一区| 日韩欧美ww| 婷婷伊人综合| 欧美视频福利| 肉色丝袜一区二区| 蜜臀a∨国产成人精品| 狠狠狠色丁香婷婷综合久久五月| 国产成人久久精品77777最新版本| 国产一区二区在线观看视频| 久久综合五月天婷婷伊人| 亚洲日本va午夜在线影院| 天天综合天天做天天综合| 天堂中文在线播放| 视频欧美一区| 97精品一区| 成人午夜免费电影| 午夜视频在线观看一区二区三区| 91麻豆精品国产自产在线| 伊人久久精品视频| 国产精品久久久久久久7电影| 久久精品成人一区二区三区蜜臀| 4444在线观看| 4480yy私人影院高清不卡| xxxx另类黑人| 五月天久久久| aa级大片欧美| 在线免费亚洲电影| 2019亚洲日韩新视频| 亚洲一区三区| 欧美3p视频在线观看| 午夜精品久久久久久毛片| 国模吧视频一区| 亚洲国产精品黑人久久久| 精品国精品自拍自在线| 国产欧美亚洲精品| 日韩一级免费在线观看| a√中文在线观看| 午夜久久黄色| 亚洲一区二区三区四区在线免费观看| 亚洲国产精品成人va在线观看| 国产美女91呻吟求| 欧美一级裸体视频| 亚洲欧洲日韩精品在线| 国产农村妇女精品一区二区| 精品久久久香蕉免费精品视频| 欧美成人激情视频| 女人天堂av手机在线| 国产精品国模大尺度私拍| 中文字幕在线导航| 在线三级中文| 天堂影院一区二区|