日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【大语言模型基础】60行Numpy教你实现GPT-原理与代码详解

發(fā)布時間:2023/12/29 windows 35 coder
生活随笔 收集整理的這篇文章主要介紹了 【大语言模型基础】60行Numpy教你实现GPT-原理与代码详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

本文主要是對博客 https://jaykmody.com/blog/gpt-from-scratch/ 的精簡整理,并加入了自己的理解。
中文翻譯:https://jiqihumanr.github.io/2023/04/13/gpt-from-scratch/#circle=on
項目地址:https://github.com/jaymody/picoGPT

本文最終將用60行代碼實現一個GPT。它可以加載OpenAI預訓練的GPT-2模型權重,并生成一些文本。 注:本文僅實現了GPT模型的推理(無batch,不能訓練)

一、GPT簡介

GPT(Generative Pre-trained Transformer)基于Transformer解碼器自回歸地預測下一個Token,從而進行了語言模型的建模。

只要能夠足夠好地預測下一個Token,語言模型便可能具備足夠地潛力,從而實現人工智能。


以上就是關于GPT和它的能力的一個高層次概述。讓我們深入了解更多具體細節(jié)。

輸入 / 輸出

GPT的函數簽名大致如下:

def gpt(inputs: list[int]) -> list[list[float]]:
	""" GPT代碼,實現預測下一個token
	inputs:List[int], shape為[n_seq],輸入文本序列的token id的列表
	output:List[List[int]], shape為[n_seq, n_vocab],預測輸出的logits列表
	"""
    output = # 需要實現的GPT內部計算邏輯 
    return output
輸入

輸入是一些由整數表示的文本序列,每個整數都與文本中的token一一對應。例如:

text  = "robot must obey orders"
tokens = ["robot", "must", "obey", "orders"]
inputs = [1, 0, 2, 4]

token, 即詞元,是文本的子片段,使用某種分詞器生成。

分詞器將文本分割為不可分割的詞元單位,實現文本的高效表示,且方便模型學習文本的結構和語義。

分詞器對應一個詞匯表,我們可用詞匯表將token映射為整數:

# 詞匯表中的token索引表示該token的整數ID
# 例如,"robot"的整數ID為1,因為vocab[1] = "robot"
vocab = ["must", "robot", "obey", "the", "orders", "."]

# 一個根據空格進行分詞的分詞器tokenizer
tokenizer = WhitespaceTokenizer(vocab)

# encode()方法將str字符串轉換為list[int]
ids = tokenizer.encode("robot must obey orders") # ids = [1, 0, 2, 4]

# 通過詞匯表映射,可以看到實際的token是什么
tokens = [tokenizer.vocab[i] for i in ids] # tokens = ["robot", "must", "obey", "orders"]

# decode()方法將list[int] 轉換回str
text = tokenizer.decode(ids) # text = "robot must obey orders"

簡而言之:

  • 通過語料數據集和分詞器tokenizer可以構造一個包含文本中的所有token的詞匯表vocab。
  • 使用tokenizer將文本text分割為token序列,再使用詞匯表vocab將token映射為token id整數,從而得到輸入文本token序列。

最后,可以通過vocab將token id序列再轉換回文本。

輸出

output是一個二維數組,其中output[i][j]表示文本序列的第i個位置的token(inputs[i])是詞匯表的第j個token(vocab[j])的概率(實際為未歸一化的logits得分)。例如:

inputs = [1, 0, 2, 4]  # "robot" "must" "obey" "orders"
vocab = ["must", "robot", "obey", "the", "orders", "."]
output = gpt(inputs)

# output[0] = [0.75, 0.1, 0.15, 0.0, 0.0, 0.0]
# 給定 "robot",模型預測 "must" 的概率最高

# output[1] = [0.0, 0.0, 0.8, 0.1, 0.0, 0.1]
# 給定序列 ["robot", "must"],模型預測 "obey" 的概率最高

# output[-1] = [0.0, 0.0, 0.1, 0.0, 0.85, 0.05]
# 給定整個序列["robot", "must", "obey"],模型預測 "orders" 的概率最高
next_token_id = np.argmax(output[-1])  # next_token_id = 4
next_token = vocab[next_token_id]      # next_token = "orders"

在上述例子中,輸入序列為["robot", "must", "obey"],GPT模型根據輸入,預測序列的下一個token是 "output",因為 output[-1][4]的值為0.85,是詞表中最高的一個。

  • output[0] 表示給定輸入token "robot",模型預測下一個token可能性最高的是"must",為0.75。
  • output[-1] 表示給定整個輸入序列 ["robot", "must", "obey"],模型預測下一個token是"orders"的可能性最高,為0.85。

為預測序列的下一個token,只需在output的最后一個位置中選擇可能性最高的token。那么,通過迭代地將上一輪的輸出拼接到輸入,并送入模型,從而持續(xù)地生成token。

這種生成方式稱為貪心采樣。實際可以對類別分布用溫度系數T進行蒸餾(放大或減小分布的不確定性),并截斷類別分布的按top-k,再進行類別分布采樣。

具體地,在每次迭代中,將上一輪預測出的token添加到輸入末尾,然后預測下一個位置的值,如此往復,就是整個自回歸的預測過程:

def generate(inputs, n_tokens_to_generate):
	""" GPT生成代碼
	inputs: list[int], 輸入文本的token ids列表
	n_tokens_to_generate:int, 需要生成的token數量
	"""
    # 自回歸式解碼循環(huán)
    for _ in range(n_tokens_to_generate): 
        output = gpt(inputs)            # 模型前向推理,輸出預測詞表大小的logits列表
        next_id = np.argmax(output[-1]) # 貪心采樣
        inputs.append(int(next_id))     # 將預測添加回輸入
    return inputs[len(inputs) - n_tokens_to_generate :]  # 只返回生成的ids

# 隨便舉例
input_ids = [1, 0, 2]                          # ["robot", "must", "obey"]
output_ids = generate(input_ids, 1)            #  output_ids = [1, 0, 2, 4]
output_tokens = [vocab[i] for i in output_ids] # ["robot", "must", "obey", "orders"]

二、GPT結構與實現

2.1 基本組成部分

首先,導入相關可視化函數

import random
import numpy as np
import matplotlib.pyplot as plt

def plot(x, y, x_axis=None, y_axis=None):
    plt.plot(x, y) 
    if x_axis and isinstance(x_axis, tuple):    
        plt.xlim(x_axis[0], x_axis[1])
    if y_axis and isinstance(y_axis, tuple): 
        plt.ylim(y_axis[0], y_axis[1])
    plt.show()

def plotHot(w):
    plt.figure()
    plt.imshow(w, cmap='hot', interpolation='nearest')
    plt.show()
GELU

GPT-2選擇的FFN中的非線性激活函數是GELU(高斯誤差線性單元),是ReLU的對比的一種替代方法。它由以下函數近似表示:

def gelu(x):
    return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))

def relu(x):
    return np.maximum(0, x)

GELU與ReLU的對比

print(gelu(np.array([1, 2, -2, 0.5])))
print(relu(np.array([1, 2, -2, 0.5])))

x = np.linspace(-4, 4, 100) 
plot(x, np.array([gelu(x), relu(x)]).transpose())

Softmax

原始Softmax公式:$$\text{softmax}(x)_i = \frac{e^{x_i}}{\sum_j e^{x_j}}$$

相比原始Softmax, 這里使用了減去最大值max(x)技巧來保持數值穩(wěn)定性。

def softmax(x):
    # 減去最大值,避免溢出,不影響分布
    exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True))
    return exp_x / np.sum(exp_x, axis=-1, keepdims=True)

def rawSoftmax(x):
    exp_x = np.exp(x)
    return exp_x / np.sum(exp_x)
num = 100  # 生成不重復的隨機數,比較 原始值、原始softmax和修正后的softmax
numbers = []
for i in range(num):
    number = random.uniform(1, 3)
    while number in numbers:
        number = random.uniform(1, 3)
    numbers.append(number)
plot(np.array(range(num)), np.array([numbers, rawSoftmax(numbers), softmax(numbers)]).transpose()) 


在輸入在合理范圍時,兩者輸出基本相同。

raw_x = np.array([[-200, 100, -300, 0, 70000000]])
x1 = softmax(raw_x)
x2 = rawSoftmax(np.array(raw_x))
print(x1, x1.sum(axis=-1), softmax(x1))
print(x2, x2.sum(axis=-1), softmax(x2))

在輸入存在異常值時,輸出結果比較(原始softmax出現nan)

[[0. 0. 0. 0. 1.]] [1.] [[0.14884758 0.14884758 0.14884758 0.14884758 0.40460968]]
[[ 0.  0.  0.  0. nan]] [nan] [[nan nan nan nan nan]]
tmp.py:7: RuntimeWarning: overflow encountered in exp exp_x = np.exp(x)
tmp.py:8: RuntimeWarning: invalid value encountered in divide return exp_x / np.sum(exp_x)
層歸一化

層歸一化(Layer Normalization)是基于特征維度將數據進行標準化(均值為0方差為1),同時乘以縮放系數、加上平移系數,保留其非線性能力:

\[\text{LayerNorm}(x) = \gamma \cdot \frac{x - \mu}{{\sigma}} + \beta \]

層歸一化可以有效地緩解優(yōu)化過程中潛在的不穩(wěn)定、收斂速度慢等問題。

def layer_norm(x, g, b, eps: float = 1e-5):
    """ 層歸一化操作
    x: np.array, 輸入
    g: float, 可學習的縮放參數 gamma
    b: float, 可學習的平移參數 beta
	eps: float, 避免方差為0從而除零的極小值
    """
    mean = np.mean(x, axis=-1, keepdims=True)
    variance = np.var(x, axis=-1, keepdims=True)
    x = (x - mean) / np.sqrt(variance + eps)  # 將x沿著最后一個軸,進行標準化
    return g * x + b                          # 將標準化后的x進行重新縮放和平移

可視化例子

num, dim = 5, 5
x = np.array([[random.randint(-10, 10) for _ in range(dim)] for _ in range(num)] )
g, b = 1, 0 # 不縮放和平移
x_norm = layer_norm(x, g, b)
print(x)
print(x_norm)
plotHot(x)
plotHot(x_norm)

輸出結果

# 層歸一化前
[[ -9   3  -2  -6  -6]
 [-10  -6 -10   8   4]
 [ -1   5  -4  -3  -5]
 [  8   7  -5  -5   9]
 [ 10  -1  -5   3   9]]
 
# 層歸一化后
[[-1.2056067   1.68784939  0.48224268 -0.48224268 -0.48224268]
 [-0.96768591 -0.43008263 -0.96768591  1.45152886  0.91392558]
 [ 0.16876312  1.8563943  -0.67505247 -0.39378061 -0.95632434]
 [ 0.8124999   0.65624992 -1.21874985 -1.21874985  0.96874988]
 [ 1.18444594 -0.73156955 -1.42830246 -0.03483665  1.01026272]]

層歸一化前

層歸一化后(每行數據經過標準化后,分布差異變小了,從而輸入網絡的數據的分布得到了限制)

通過折線圖可視化(每條折線代表一個行向量),可以更明顯地看到變化:

axis = np.array(range(x.shape[0]))
plot(axis, x)
plot(axis, x_norm)

層歸一化前

層歸一化后

線性(仿射變換)層

標準的矩陣乘法+偏置:

def linear(x, w, b):  # [m, in], [in, out], [out] -> [m, out]
    return x @ w + b

例子

n_num = 3
in_dim, hid_dim = 4, 4
x = np.random.normal(size=(n_num, in_dim))
w = np.random.normal(size=(in_dim, hid_dim))
b = np.random.normal(size=(hid_dim,))
h = linear(x, w, b)
print(f"shape of w: {w.shape}")
print(f"input shape: {x.shape}, output shape: {h.shape}")
plotHot(w)

shape of w: (4, 4)
input shape: (3, 4), output shape: (3, 4)
權重可視化

2.2 GPT架構

從整體上來看,GPT架構分為三個部分:

  • 嵌入表示層:文本詞元嵌入(token embeddings) + 位置嵌入(positional embeddings)
  • transformer解碼器堆棧:多層decoder block堆疊
  • 預測:輸出投影回詞匯表(projection to vocab)

代碼層GPT實現

def gpt2(inputs, wte, wpe, blocks, ln_f, n_head):  
    """ GPT2模型實現
        輸入輸出tensor形狀: [n_seq] -> [n_seq, n_vocab]
        n_vocab, 詞表大小
        n_seq, 輸入token序列長度
        n_layer, 自注意力編碼器的層數
        n_embd, 詞表的詞元嵌入大小
        n_ctx, 輸入最大序列長度(位置編碼支持的長度,可用ROPE旋轉位置編碼提升外推長度) 
    params:
        inputs: List[int], token ids, 輸入token ids
        wte: np.ndarray[n_vocab, n_embd], token嵌入矩陣 (與輸出分類器共享參數)
        wpe: np.ndarray[n_ctx, n_embd], 位置編碼嵌入矩陣
        blocks:object, n_layer層因果自注意力編碼器
        ln_f:tuple[float], 層歸一化參數
        n_head:int, 注意力頭數
    """
    # 1、在詞元嵌入中添加位置編碼信息:token + positional embeddings
    x = wte[inputs] + wpe[range(len(inputs))]  # [n_seq] -> [n_seq, n_embd]

    # 2、前向傳播n_layer層Transformer blocks
    for block in blocks:
        x = transformer_block(x, **block, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]

    # 3、Transformer編碼器塊的輸出投影到詞匯表概率分布上
    # 預測下個詞在詞表上的概率分布[ 輸出語言模型的建模的條件概率分布p(x_t|x_t-1 ... x_1) ]
    x = layer_norm(x, **ln_f)  # [n_seq, n_embd] -> [n_seq, n_embd]
    # 就是和嵌入矩陣進行內積(編碼器塊的輸出相當于預測值,內積相當于求相似度最大的詞匯)
    return x @ wte.T  # [n_seq, n_embd] -> [n_seq, n_vocab]
嵌入表示層

Token embeddings
wte是一個[n_vocab, n_embd]可學習參數矩陣,它充當一個token嵌入查找表,其中矩陣的第\(i\)
行對應于我們詞匯表中第 \(i\)個token的embedding。
wte[inputs] 使用整數數組索引來檢索與輸入中每個token對應的向量。

Positional embeddings
為了編碼序列的順序信息,通過在輸入表示中添加位置編碼(positional encoding)嵌入來注入位置信息。
位置編碼可以通過學習得到也可以直接固定得到。

大小為[n_ctx, n_embd]的wpe即可學習的位置嵌入矩陣,其中矩陣的第\(i\)行對應輸入序列中第\(i\)個token的位置embedding,編碼了對應的位置信息。

n_ctx代表最大序列長度,限制了模型外推的最大范圍。n_ctx代表最大序列長度,限制了模型外推的最大范圍。

在GPT中,位置嵌入矩陣wpe和token embeddings類似,先隨機初始化,后通過訓練學習得到。wpe[inputs] 使用整數數組索引inputs來檢索與輸入中每個token對應的位置嵌入。

將token嵌入與位置嵌入聯(lián)合為一個組合嵌入,這個嵌入將token信息和位置信息都編碼進來了。

Token + Positional embeddings
將Tokene mbeddings與位置嵌入拼接后的嵌入,將token信息和位置信息都編碼進來了,它將作為transoformer decoder blocks的實際輸入。

x = wte[inputs] + wpe[range(len(inputs))]  # [n_seq] -> [n_seq, n_embd]

解碼層

transformer解碼器模塊由兩個子層組成:

  • 多頭因果自注意力(Multi-head causal self attention)
  • 逐位置前饋神經網絡(Position-wise feed forward neural network)

transformer解碼器中,堆疊了num_layers個如下的transformer_block:

def transformer_block(x, mlp, attn, ln_1, ln_2, n_head):  
    """ 自注意力編碼器層實現 (只實現邏輯,各個子模塊參數需傳入)
        輸入輸出tensor形狀: [n_seq, n_embd] -> [n_seq, n_embd]
        n_seq, 輸入token序列長度
        n_embd, 詞表的詞元嵌入大小
    params:
        x: np.ndarray[n_seq, n_embd], 輸入token嵌入序列
        mlp: object, 前饋神經網絡
        attn: object, 注意力編碼器層
        ln1: object, 線性層1
        ln2: object, 線性層2
        n_head:int, 注意力頭數
    """
    # Multi-head Causal Self-Attention (層歸一化 + 多頭自注意力 + 殘差連接 )
    x = x + mha(layer_norm(x, **ln_1), **attn, n_head=n_head)  # [n_seq, n_embd] -> [n_seq, n_embd]

    # Position-wise Feed Forward Network
    x = x + ffn(layer_norm(x, **ln_2), **mlp)  # [n_seq, n_embd] -> [n_seq, n_embd]

    return x

Self-Attention中的層規(guī)一化和殘差連接用于提升訓練的穩(wěn)定性。

殘差連接
殘差連接引入輸入直接到輸出的通路,便于梯度回傳從而緩解在優(yōu)化過程中由于網絡過深引起的梯度消失問題。

\[\mathbf{x}^{l+1} = f(\mathbf{x}^l) + \mathbf{x}^l \]

位置感知的前饋網絡
對序列中的所有位置的表示進行變換時使用的是同一個2層隱藏層的MLP,故稱其為position-wise的前饋網絡(Position-wise Feed Forward Network)。

\[{FFN}(\mathbf x) = Gelu(\mathbf{x} \mathbf{W}_1 + \mathbf{b}_1)\mathbf{W}_2 + \mathbf{b}_2 \]

def ffn(x, c_fc, c_proj):  
    """ 2層前饋神經網絡實現 (只實現邏輯,各個子模塊參數需傳入)
        輸入輸出tensor形狀: [n_seq, n_embd] -> [n_seq, n_embd]
        n_seq, 輸入token序列長度
        n_embd, 詞表的詞元嵌入大小
        n_hid, 隱藏維度
    params:
        x: np.ndarray[n_seq, n_embd], 輸入token嵌入序列
        c_fc: np.ndarray[n_embd, n_hid], 升維投影層參數, 默認:4*n_embd
        c_proj: np.ndarray[n_hid, n_embd], 降維投影層參數
    """
    # project up:將n_embd投影到一個更高的維度 4*n_embd
    a = gelu(linear(x, **c_fc))  # [n_seq, n_embd] -> [n_seq, 4*n_embd]

    # project back down:投影回n_embd
    x = linear(a, **c_proj)  # [n_seq, 4*n_embd] -> [n_seq, n_embd]

    return x

這里僅僅是升維再降維,具體地將n_embd投影到一個更高的維度4*n_embd,然后再將其投影回n_embd。

多頭因果自注意力
這里將通過分別解釋“多頭因果自注意力”的每個詞,來一步步理解“多頭因果自注意力”:

  • 注意力(Attention)
  • 自(Self)
  • 因果(Causal)
  • 多頭(Multi-Head)

縮放點積注意力(scaled dot-product attention)

\[\mathbf{H} = \mathrm{softmax}\left(\frac{\mathbf Q \mathbf K^\top }{\sqrtozvdkddzhkzd}\right) \mathbf V \in \mathbb{R}^{T\times d} \]

其中,查詢向量\(\mathbf Q\in\mathbb R^{T\times d}\)、 鍵向量\(\mathbf K \in\mathbb R^{T\times d}\)、值向量\(\mathbf V\in\mathbb R^{T\times d}\)\(T\)為序列長度。

注意力得分除以\(\sqrtozvdkddzhkzd\)進行縮放, 是考慮到在\(d\)過大時,點積值較大會使得后續(xù)Softmax操作溢出導致梯度爆炸,不利于模型優(yōu)化。

def attention_raw(q, k, v):  
    """ 原始縮放點積注意力實現
        輸入輸出tensor形狀: [n_q, d_k], [n_k, d_k], [n_k, d_v] -> [n_q, d_v]
    params:
        q: np.ndarray[n_seq, n_embd], 查詢向量
        k: np.ndarray[n_seq, n_embd], 鍵向量
        v: np.ndarray[n_seq, n_embd], 值向量
    """
    return softmax(q @ k.T / np.sqrt(q.shape[-1])) @ v

# 以通過對q、k、v進行投影變換來增強自注意效果
def self_attention_raw(x, w_k, w_q, w_v, w_proj): 
    """ 自注意力原始實現
        輸入輸出tensor形狀: [n_seq, n_embd] -> [n_seq, n_embd]
    params:
        x: np.ndarray[n_seq, n_embd], 輸入token嵌入序列
        w_k: np.ndarray[n_embd, n_embd], 查詢向量投影層參數
        w_q: np.ndarray[n_embd, n_embd], 鍵向量投影層參數
        w_v: np.ndarray[n_embd, n_embd], 值向量投影層參數
        w_proj: np.ndarray[n_embd, n_embd], 自注意力輸出投影層參數
    """
    # qkv projections
    q = x @ w_k # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]
    k = x @ w_q # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]
    v = x @ w_v # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]

    # perform self attention
    x = attention(q, k, v) # [n_seq, n_embd] -> [n_seq, n_embd]

    # out projection
    x = x @ w_proj # [n_seq, n_embd] @ [n_embd, n_embd] -> [n_seq, n_embd]

    return x

# 將w_q、w_k和w_v組合成一個單獨的矩陣w_fc,執(zhí)行投影操作,然后拆分結果,我們就可以將矩陣乘法的數量從4個減少到2個
def self_attention(x, c_attn, c_proj): 
    """ 自注意力優(yōu)化后實現(w_q 、w_k 、w_v合并成一個矩陣w_fc進行投影,再拆分結果)
        同時GPT-2的實現:加入偏置項參數(所以使用線性層,進行仿射變換)
        輸入輸出tensor形狀: [n_seq, n_embd] -> [n_seq, n_embd]
    params:
        x: np.ndarray[n_seq, n_embd], 輸入token嵌入序列
        w_fc: np.ndarray[n_embd, 3*n_embd], 查詢向量投影層參數
        w_proj: np.ndarray[n_embd, n_embd], 自注意力輸出投影層參數
    """
    # qkv projections
    x = linear(x, **c_attn) # [n_seq, n_embd] -> [n_seq, 3*n_embd]

    # split into qkv
    q, k, v = np.split(x, 3, axis=-1) # [n_seq, 3*n_embd] -> 3 of [n_seq, n_embd]

    # perform self attention
    x = attention(q, k, v) # [n_seq, n_embd] -> [n_seq, n_embd]

    # out projection
    x = linear(x, **c_proj) # [n_seq, n_embd] @ [n_embd, n_embd] = [n_seq, n_embd]

    return x

因果
為了防止序列建模時出現信息泄露,需要修改注意力矩陣(增加Mask)以隱藏或屏蔽我們的輸入,從而避免模型在訓練階段直接看到后續(xù)的文本序列(信息泄露)進而無法得到有效地訓練。

# 輸入是 ["not", "all", "heroes", "wear", "capes"] 

# 原始自注意力
        not    all   heroes  wear  capes
   not 0.116  0.159  0.055  0.226  0.443
   all 0.180  0.397  0.142  0.106  0.175
heroes 0.156  0.453  0.028  0.129  0.234
  wear 0.499  0.055  0.133  0.017  0.295
 capes 0.089  0.290  0.240  0.228  0.153

 # 因果自注意力 (行為j, 列為i)
 # 為防止輸入的所有查詢都能預測未來,需要將所有j>i位置設置為0 :
        not    all   heroes  wear  capes
   not 0.116  0.     0.     0.     0.
   all 0.180  0.397  0.     0.     0.
heroes 0.156  0.453  0.028  0.     0.
  wear 0.499  0.055  0.133  0.017  0.
 capes 0.089  0.290  0.240  0.228  0.153

 # 在應用 softmax 之前,我們需要修改我們的注意力矩陣,得到掩碼自注意力
 # 即,在softmax之前將要屏蔽項的注意力得分設置為 ?∞(歸一化系數為0)
 # mask掩碼矩陣
 0 -1e10 -1e10 -1e10 -1e10
 0   0   -1e10 -1e10 -1e10
 0   0     0   -1e10 -1e10
 0   0     0     0   -1e10
 0   0     0     0     0

 使用 -1e10 而不是 -np.inf ,因為 -np.inf 可能會導致 nans

加入掩碼矩陣的注意力實現:

def attention(q, k, v, mask):  
    """ 縮放點積注意力實現
        輸入輸出tensor形狀: [n_q, d_k], [n_k, d_k], [n_k, d_v] -> [n_q, d_v]
    params:
        q: np.ndarray[n_seq, n_embd], 查詢向量
        k: np.ndarray[n_seq, n_embd], 鍵向量
        v: np.ndarray[n_seq, n_embd], 值向量
        mask: np.ndarray[n_seq, n_seq], 注意力掩碼矩陣
    """
    return softmax(q @ k.T / np.sqrt(q.shape[-1]) + mask) @ v

因果注意力掩碼矩陣可視化

x = np.array([1, 1, 1, 1, 1])
causal_mask = (1 - np.tri(x.shape[0], dtype=x.dtype))* -1e10   
print(causal_mask)
plotHot(causal_mask) 
[[-0.e+00 -1.e+10 -1.e+10 -1.e+10 -1.e+10]
 [-0.e+00 -0.e+00 -1.e+10 -1.e+10 -1.e+10]
 [-0.e+00 -0.e+00 -0.e+00 -1.e+10 -1.e+10]
 [-0.e+00 -0.e+00 -0.e+00 -0.e+00 -1.e+10]
 [-0.e+00 -0.e+00 -0.e+00 -0.e+00 -0.e+00]]

注意力可視化

def causal_self_attention(x, c_attn, c_proj): 
    """ 因果自注意力優(yōu)化后實現(w_q 、w_k 、w_v合并成一個矩陣w_fc進行投影,再拆分結果)
        同時GPT-2的實現:加入偏置項參數(所以使用線性層,進行仿射變換)
        輸入輸出tensor形狀: [n_seq, n_embd] -> [n_seq, n_embd]
    params:
        x: np.ndarray[n_seq, n_embd], 輸入token嵌入序列
        c_attn: np.ndarray[n_embd, 3*n_embd], 查詢向量投影層參數
        c_proj: np.ndarray[n_embd, n_embd], 自注意力輸出投影層參數
    """
    # qkv projections
    x = linear(x, **c_attn) # [n_seq, n_embd] -> [n_seq, 3*n_embd]

    # split into qkv
    q, k, v = np.split(x, 3, axis=-1) # [n_seq, 3*n_embd] -> 3 of [n_seq, n_embd]

    # causal mask to hide future inputs from being attended to
    causal_mask = (1 - np.tri(x.shape[0], dtype=x.dtype))* -1e10   # [n_seq, n_seq]

    # perform causal self attention
    x = attention(q, k, v, causal_mask) # [n_seq, n_embd] -> [n_seq, n_embd]

    # out projection
    x = linear(x, **c_proj) # [n_seq, n_embd] @ [n_embd, n_embd] = [n_seq, n_embd]

    return x

實際,用-1e10替換-np.inf, 因為-np.inf會導致nans錯誤。

多頭自注意力(Multi-Head-self-Attention)

def mha(x, c_attn, c_proj, n_head):
    """ 多頭自注意力實現
        輸入輸出tensor形狀: [n_seq, n_embd] -> [n_seq, n_embd]
        每個注意力計算的維度從n_embd降低到 n_embd/n_head。
        通過降低維度,模型利用多個子空間進行建模
    params:
        x: np.ndarray[n_seq, n_embd], 輸入token嵌入序列
        c_attn: np.ndarray[n_embd, 3*n_embd], 查詢向量投影層參數
        c_proj: np.ndarray[n_embd, n_embd], 自注意力輸出投影層參數
    """  
    # qkv投影變換
    x = linear(x, **c_attn)  # [n_seq, n_embd] -> [n_seq, 3*n_embd]

    # 劃分為qkv
    qkv = np.split(x, 3, axis=-1)  # [n_seq, 3*n_embd] -> [3, n_seq, n_embd]

    # 將n_embd繼續(xù)劃分為_head個注意力頭
    qkv_heads = list(map(lambda x: np.split(x, n_head, axis=-1), qkv))  # [3, n_seq, n_embd] -> [3, n_head, n_seq, n_embd/n_head]

    # 構造causal mask矩陣
    causal_mask = (1 - np.tri(x.shape[0], dtype=x.dtype))* -1e10  # [n_seq, n_seq]

    # 單獨執(zhí)行每個頭的因果自注意力(可多核多線程并行執(zhí)行)
    out_heads = [attention(q, k, v, causal_mask) for q, k, v in zip(*qkv_heads)]  # [3, n_head, n_seq, n_embd/n_head] -> [n_head, n_seq, n_embd/n_head]

    # 合并多個heads的結果
    x = np.hstack(out_heads)  # [n_head, n_seq, n_embd/n_head] -> [n_seq, n_embd]

    # 多頭因果自注意力輸出projection
    x = linear(x, **c_proj)  # [n_seq, n_embd] -> [n_seq, n_embd]

    return x

將所有代碼組合起來
將所有代碼組合起來就得到了gpt2.py,總共的代碼只有120行(如果你移除注釋、空格之類的,那就只有60行)。

二、項目實戰(zhàn)

可以通過以下代碼測試:

python gpt2.py "Alan Turing theorized that computers would one day become" --n_tokens_to_generate 8

其輸出是:the most powerful machines on the planet.

ToDO

參考鏈接

【1】配圖部分來自,https://jalammar.github.io/illustrated-gpt2/

總結

以上是生活随笔為你收集整理的【大语言模型基础】60行Numpy教你实现GPT-原理与代码详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

丁香花五月 | 国产成年免费视频 | 国产精品久久中文字幕 | 中文高清av | 97色se| 中文字幕在线观看1 | 91香蕉视频好色先生 | 国产福利久久 | 国产精品 中文在线 | 国产精品一区二区久久国产 | 91精品入口 | 国产在线观看高清视频 | 久久视频在线视频 | 日韩大陆欧美高清视频区 | 国产亚洲精品久久久久久移动网络 | 在线精品国产 | 欧洲亚洲女同hd | 成人在线你懂得 | 免费a级观看 | 黄色日本免费 | 国产精品初高中精品久久 | 亚洲成a人片77777kkkk1在线观看 | 欧美性精品 | 99久久久成人国产精品 | 欧美性一级观看 | 中国一级片在线播放 | 成在人线av| 欧美日韩18 | 欧美一区二区三区在线播放 | 中文字幕中文字幕在线一区 | 手机av在线免费观看 | 少妇高潮流白浆在线观看 | 天堂av在线免费 | 99久久电影| 欧美日本日韩aⅴ在线视频 插插插色综合 | 狠狠干激情 | 国产福利中文字幕 | 综合网天天 | 国产不卡网站 | 成人国产精品电影 | 日本中文字幕一二区观 | 五月丁香| 亚洲第一区在线观看 | 人人爽影院| 亚洲人av免费网站 | 99久久精品国产系列 | 天天躁日日躁狠狠 | 99久久婷婷国产综合亚洲 | 四虎永久国产精品 | 激情综合色播五月 | 国产精品一区二区在线播放 | 国产视频久 | 色综合狠狠干 | www.亚洲| 成人在线网站观看 | 亚洲成人av在线播放 | 天天天天射| 久久草网站| av一区在线播放 | 国产日产精品一区二区三区四区的观看方式 | 亚洲国产片 | 九九九免费视频 | 九九精品久久 | 2019精品手机国产品在线 | 亚洲影视资源 | 日韩免费一区二区三区 | 九九视频精品在线 | 日韩av免费一区二区 | 丝袜美腿在线 | 超碰在线人人爱 | 中文字幕在线观看第一页 | 亚洲一区二区精品 | 五月天亚洲婷婷 | 99精品欧美一区二区三区黑人哦 | 久久久久欠精品国产毛片国产毛生 | 中文字幕高清免费日韩视频在线 | 成人黄大片视频在线观看 | 亚洲精品久久久久中文字幕二区 | 欧美日韩在线观看一区 | 成人高清在线观看 | 日韩高清一区 | 99在线观看 | 日韩在线免费观看视频 | 日本久久综合视频 | 国产午夜精品视频 | 免费在线观看成人av | 国产成人一区二区三区电影 | 亚洲黄网站 | 色综合天天综合网国产成人网 | 自拍超碰在线 | 99久久99久久免费精品蜜臀 | 在线免费观看视频a | 国产999| 精品国产一区二区三区久久久蜜臀 | 久久成人黄色 | 日韩精品在线免费播放 | 国产精品18久久久久久首页狼 | 国产韩国精品一区二区三区 | 91麻豆精品国产91久久久久 | 一区二区三区久久精品 | 成年人毛片在线观看 | 中文字幕在线观看不卡 | 亚洲国产视频网站 | 天天爱天天干天天爽 | 久久久久久久福利 | 最近中文字幕第一页 | 亚洲国产午夜视频 | 人人人爽 | 2022久久国产露脸精品国产 | 伊人开心激情 | 精品中文字幕在线播放 | 国产精品久久久久久久久软件 | 天天干.com| 在线观看www视频 | 久操视频在线免费看 | av资源免费观看 | 91精品国产自产老师啪 | 91精品国产综合久久福利不卡 | 麻豆激情电影 | 国产精品久久久久久久婷婷 | 日韩在线一二三区 | www黄色软件 | 国内精品久久久久影院一蜜桃 | 国产成人一区二区精品非洲 | 成人av免费| 国产原创中文在线 | 久久se视频| 免费看麻豆 | 在线观看免费91 | 欧美日韩久久久 | 国产精品久久久一区二区三区网站 | 丁香婷婷久久 | 成人九九视频 | 久久综合中文字幕 | 91av中文字幕| 久久久999 | 久久久久国产精品免费网站 | 国产日韩av在线 | 国产一级三级 | 国产精品av在线免费观看 | 欧美性色黄 | 六月激情久久 | 99综合电影在线视频 | 久久免费一 | 91传媒免费观看 | 99精品免费视频 | 91成人精品国产刺激国语对白 | 国产区av在线 | 激情综合网色播五月 | aaa日本高清在线播放免费观看 | 天天综合色网 | 黄av免费在线观看 | 日韩欧美在线综合网 | 欧美极品少妇xbxb性爽爽视频 | 国产精品白丝jk白祙 | 日韩在线免费观看视频 | 精品在线二区 | 五月天综合色 | 久久国产精品视频 | 午夜视频免费 | 五月的婷婷 | 中文字幕成人在线观看 | 亚洲综合国产精品 | 亚洲精品久久久久久中文传媒 | 国产精品国产三级在线专区 | 人人爽爽人人 | 亚洲综合一区二区精品导航 | 911免费视频| www.xxx.性狂虐| 精品国产乱码久久久久久天美 | 日韩一级网站 | 国产精品久久久久久久久大全 | 国产在线观看免费 | 日日夜夜综合网 | 亚洲三级黄色 | 成人免费在线观看入口 | 国产视频一级 | 国产精品国产三级国产aⅴ9色 | 精品亚洲男同gayvideo网站 | 麻豆一区二区 | 天天操夜操 | 91成人在线观看喷潮 | 亚洲国产免费网站 | 操操操操网 | 国产精品一区二区久久 | 国产精品 亚洲精品 | 天天色天 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产在线专区 | 欧美在线观看视频一区二区三区 | 久久免费观看视频 | 四川bbb搡bbb爽爽视频 | 日韩欧美在线观看 | 免费在线电影网址大全 | 国产精品麻豆视频 | 在线视频你懂 | 日韩天堂网 | 2023亚洲精品国偷拍自产在线 | 国产一区二区三区午夜 | 中文字幕在线观看完整 | 婷婷色中文网 | 激情五月婷婷综合网 | 五月激情电影 | 91理论片午午伦夜理片久久 | 三级黄色在线观看 | sesese图片 | 国产一二区在线观看 | 精久久久久 | 亚洲精品在线观看的 | 日韩在线免费高清视频 | 日本中文字幕视频 | 91免费观看国产 | 中文字幕在线播放一区 | 麻豆影视在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 日韩精品首页 | 精品国产美女在线 | 欧美精品乱码久久久久 | 97超碰超碰久久福利超碰 | 久久久国产精品一区二区三区 | 婷婷激情在线 | 久久国产精品网站 | 毛片网站免费 | 97精品国产手机 | 亚洲最大免费成人网 | 国产一区欧美一区 | 色夜影院 | 精品国产99国产精品 | 国产亚洲婷婷免费 | 成人免费在线观看入口 | 在线观看国产www | 国产精品女 | 久久免费视频这里只有精品 | 久久网站av | 日本精品小视频 | 国产亚洲精品无 | 久久国产精品99久久久久久老狼 | 免费看久久 | 色偷偷人人澡久久超碰69 | 久久综合狠狠综合久久综合88 | 日韩免费在线观看 | 日韩视频在线播放 | 日韩中文字幕免费在线播放 | 免费看成人av | 免费av福利 | av不卡中文字幕 | 99九九视频 | 欧美另类xxx | 天天爱天天操 | 中文字幕中文字幕中文字幕 | 日韩高清免费观看 | 蜜桃传媒一区二区 | 亚洲国产中文字幕 | 国产精品久久久久久久久软件 | 日本公乱妇视频 | 操高跟美女 | 91成人精品一区在线播放69 | 久久国产色| 天天干人人干 | 日本婷婷色 | 精品亚洲欧美无人区乱码 | 日日干夜夜干 | 免费观看av | 日本在线观看视频一区 | 99在线免费视频 | 7799av | 国产日韩欧美在线观看视频 | 午夜精品久久 | 午夜av影院 | 日韩视频欧美视频 | 久草视频在线免费 | 六月婷色| 蜜臀aⅴ精品一区二区三区 久久视屏网 | 狠狠操狠狠干天天操 | 西西4444www大胆艺术 | 天天躁日日躁狠狠躁 | 国内精品久久久久久 | aⅴ精品av导航 | 日韩欧美视频在线观看免费 | 国产在线播放一区二区三区 | 国产一区二区三区免费观看视频 | 国产在线精品福利 | 国产无遮挡又黄又爽馒头漫画 | 99精品小视频 | 成人xxxx| 91精品在线免费 | 亚洲一区久久 | 91免费视频网站在线观看 | 国产在线综合视频 | 97视频在线观看成人 | 狠狠狠操| 在线观看91视频 | 国产精品婷婷午夜在线观看 | 国产日韩欧美视频在线观看 | 亚洲高清精品在线 | 成人av在线网 | 综合色综合色 | 日韩在线观看你懂得 | 四虎影视8848dvd | 亚洲精品成人在线 | 韩日av在线| 日韩精品一区二区三区免费观看视频 | 亚洲精品久久久久中文字幕m男 | 国产 欧美 在线 | 伊人成人久久 | 99久久久久免费精品国产 | 一区二区视频在线免费观看 | 波多野结衣亚洲一区二区 | 亚洲黄色激情小说 | 国产精品女人久久久久久 | 欧美日韩成人一区 | 欧美色图另类 | 免费看黄视频 | 欧美日韩一区二区视频在线观看 | 在线观看久 | 国产精品网址在线观看 | 日韩视频免费观看高清完整版在线 | 亚洲国产精品999 | 国产精品一区二区在线 | 91精品视频免费在线观看 | 国产高清免费视频 | av日韩精品 | 国产麻豆视频免费观看 | 亚洲一区二区三区91 | 国产剧情在线一区 | 国产亚洲精品久久久久久大师 | 99热精品国产| 久久久精品国产一区二区三区 | 看黄色.com| 久久久九色精品国产一区二区三区 | 国产护士hd高朝护士1 | 日本在线观看中文字幕 | 亚洲精品国产综合99久久夜夜嗨 | 少妇bbw揉bbb欧美 | 9在线观看免费高清完整版在线观看明 | 久久av免费观看 | 国产性天天综合网 | 午夜丁香视频在线观看 | 免费看成人av | 日韩欧美高清一区二区 | 日韩免费三区 | 日韩电影一区二区在线 | 国产精品久久久精品 | 国产高清视频色在线www | 欧美一级片免费 | 中文字幕成人一区 | 中文字幕一区二区三区久久蜜桃 | 91九色视频在线 | 超碰97在线人人 | 区一区二在线 | 福利一区二区三区四区 | 91插插视频 | 中文字幕日韩高清 | 日韩av在线小说 | 国模一二三区 | 香蕉视频在线视频 | 日本久久成人中文字幕电影 | 国产午夜在线观看 | 天天操网站 | 久久永久免费视频 | 又黄又爽又湿又无遮挡的在线视频 | 色婷婷激情五月 | 国产一区二区午夜 | av看片网址 | a天堂一码二码专区 | 成人蜜桃视频 | 欧美精品一二三 | 日韩精品一区二区不卡 | 国产精品国产亚洲精品看不卡 | 国产欧美最新羞羞视频在线观看 | av在线免费在线观看 | 五月婷婷综合色拍 | 国产精品一区二区久久精品爱涩 | 色视频在线免费观看 | 91丨九色丨蝌蚪丨老版 | 久草在线一免费新视频 | 一区二区理论片 | 天天玩天天操天天射 | 日韩中文字 | 中文字幕在线播放av | 国产一级电影在线 | 中文字幕免费播放 | 2021久久| 黄色免费观看网址 | 999成人精品 | 日韩va亚洲va欧美va久久 | 狠狠干狠狠色 | 91视频大全 | 欧美不卡视频在线 | 亚洲精品动漫成人3d无尽在线 | 午夜精品视频免费在线观看 | 国产美女精品视频 | 国产精品久久久久久高潮 | 国产精品亚洲成人 | 亚洲伦理精品 | 一区二区三区 亚洲 | 成人av网址大全 | 久久久久亚洲精品国产 | 免费在线黄 | 久久五月网 | 久久婷五月| 色停停五月天 | 69xx视频| 国产精品午夜久久 | 九热在线| 99国产精品一区 | 日韩黄色影院 | 国偷自产中文字幕亚洲手机在线 | 特级毛片在线观看 | 91在线看视频免费 | 超碰在线公开 | 久久成 | www日韩视频 | 97狠狠干 | 日韩久久久久久久 | 高清国产午夜精品久久久久久 | 色偷偷88888欧美精品久久久 | 日韩和的一区二在线 | 婷婷色中文网 | 中文字幕国产一区二区 | 超碰在线人人艹 | 国产精品亚洲人在线观看 | 国产亚洲精品久 | 色综合天天| 狠狠精品 | 黄色av电影在线观看 | 国产精品一区在线观看你懂的 | 高清在线观看av | 欧美激情另类 | 久草在线视频国产 | 免费在线日韩 | 亚洲精品一区二区三区四区高清 | 日本久久视频 | 91理论片午午伦夜理片久久 | 日韩在线欧美在线 | av一区二区三区在线 | 欧美激情综合五月色丁香小说 | 亚洲精品五月天 | 视频一区亚洲 | 国产青春久久久国产毛片 | 日韩亚洲在线观看 | 午夜久久久久久久久久久 | 色丁香婷婷 | 在线国产专区 | 精品国产一区二区三区在线 | 亚洲精品美女久久 | 五月婷婷六月丁香在线观看 | wwwwww黄 | 成人一区二区三区在线观看 | 亚洲色图 校园春色 | 欧美日韩aa| 欧美午夜性生活 | 日韩视频免费在线观看 | 日韩欧美精品在线观看视频 | av理论电影 | 天天天天色综合 | 日日干美女| 日韩欧美区 | 99精品在线观看视频 | 欧美最爽乱淫视频播放 | 欧美a影视 | 国产日产高清dvd碟片 | 国产99色| 超碰97成人| 亚洲色图美腿丝袜 | 久久人人爽人人爽人人片av免费 | 国产污视频在线观看 | 日韩有码专区 | 日韩av电影手机在线观看 | 天天色播 | 天天爱综合 | 在线不卡的av | 天天爽天天爽夜夜爽 | 国产精品久久免费看 | 97天天干 | 91热精品 | 91麻豆精品国产自产在线游戏 | 久久久精品国产一区二区三区 | 天天干,天天射,天天操,天天摸 | 免费h视频 | 国产亚洲精品电影 | 亚洲视频,欧洲视频 | 99爱国产精品 | 午夜精品一二三区 | 久久综合精品国产一区二区三区 | 久久久精品亚洲 | 亚洲精品视频免费 | 国产精品麻豆99久久久久久 | 成人久久久久 | 欧洲精品亚洲精品 | 黄色av成人在线 | 国产伦理一区二区三区 | 四虎影视成人永久免费观看亚洲欧美 | 久久久色| 免费a级毛片在线看 | 99激情网| 精品久久久久久国产 | 午夜国产成人 | 日日躁夜夜躁aaaaxxxx | 国产精品久久久久久久久费观看 | 久久久91精品国产一区二区三区 | 在线观看一二三区 | 成人av影院在线观看 | 美女网色 | 天天射天天色天天干 | 超碰99人人 | 亚洲区精品 | 亚洲专区一二三 | 91精品成人久久 | 日韩视频中文字幕 | 国产一二三区在线观看 | 色综合网在线 | 国产免费不卡 | 亚洲 中文 欧美 日韩vr 在线 | 黄色电影网站在线观看 | 99久久精品国产亚洲 | 午夜精品在线看 | 色香网| 久日视频 | 国产一区二区午夜 | 狠狠色丁香久久婷婷综合五月 | 国产视频精品久久 | 99精品免费在线观看 | 亚洲免费观看视频 | 91在线看片 | 中文字幕一区在线观看视频 | 免费看成人a | 亚洲免费av在线播放 | 特黄特色特刺激视频免费播放 | 婷婷激情av | 婷婷精品在线 | 亚洲h色精品 | 中文字幕一二三区 | 天天爽人人爽 | 亚洲精品视频在线观看免费 | 主播av在线 | 日韩中文在线视频 | 亚洲免费公开视频 | 国产在线播放一区 | 日韩视频a | 精品国产一区二区三区久久久 | 天天综合精品 | 又黄又爽的视频在线观看网站 | 黄色影院在线免费观看 | 黄污网站在线观看 | 懂色av一区二区在线播放 | 日韩黄在线观看 | 在线 日韩 av| 91久久人澡人人添人人爽欧美 | 中文字幕在线网址 | av免费网页| 在线精品播放 | 操久久网 | 久久国产亚洲精品 | 亚洲精品日韩av | 69人人| 久久曰视频| 91在线视频免费 | 国产理论片在线观看 | 欧美天天综合网 | 最近日韩中文字幕中文 | 521色香蕉网站在线观看 | 99热亚洲精品 | 中文字幕婷婷 | 97电影网站 | 亚洲国产大片 | 国产在线精品一区二区不卡了 | 在线中文字幕视频 | 久艹视频免费观看 | 久草av在线播放 | 91麻豆高清视频 | 欧美精品在线观看免费 | 日韩一级成人av | 天天操天天艹 | 91久久久久久久一区二区 | 午夜精品久久久久久中宇69 | 91资源在线 | 午夜久久久久 | 亚洲黄色免费 | 成年免费在线视频 | 欧美 亚洲 另类 激情 另类 | 精品免费观看 | 日韩精品最新在线观看 | 99热这里只有精品1 av中文字幕日韩 | 夜夜嗨av色一区二区不卡 | 国产尤物视频在线 | 久久久久精 | 中文字幕在线看人 | a黄色大片 | 亚洲国产精品成人女人久久 | 99热精品在线观看 | 亚洲九九| 欧美精品一区二区在线观看 | 四虎欧美 | 又色又爽的网站 | 在线中文日韩 | 久久久久伊人 | 国产一区二区三区免费观看视频 | 欧美一区,二区 | 国产美腿白丝袜足在线av | 亚洲一区二区精品视频 | 日韩中文字幕一区 | 91av电影| 国内精品在线观看视频 | 欧美性色黄 | 91视频3p | 欧美日韩精品在线观看 | 久久久黄色 | 国产精品第52页 | 亚洲一二三在线 | 美女搞黄国产视频网站 | 少妇精品久久久一区二区免费 | 亚洲精品综合一二三区在线观看 | 99精品视频免费全部在线 | 欧美日韩1区 | 最新av在线播放 | 狠狠久久伊人 | 免费日韩 精品中文字幕视频在线 | 色婷婷欧美 | 久久超碰免费 | 天天躁天天躁天天躁婷 | 日韩色av色资源 | 久久久久国产成人免费精品免费 | 欧美日韩另类在线观看 | 日韩视频www | 91精品久久久久久久91蜜桃 | 999电影免费在线观看 | 久久www免费视频 | 国内精品久久久久影院一蜜桃 | 精品久久久久久综合日本 | 操操操影院 | 18岁免费看片 | 夜夜天天干 | www色av| 日韩av成人免费看 | 碰超在线 | 亚洲精品午夜久久久久久久 | 超碰个人在线 | 在线观看一区 | 国产一级一片免费播放放 | 久久精品96| 国产精品区一区 | 亚洲欧美激情插 | 久久精品99北条麻妃 | 国产一级二级视频 | 亚洲狠狠婷婷综合久久久 | 亚洲国产欧美一区二区三区丁香婷 | 911精品视频| 精品一区二区三区四区在线 | 日韩无在线 | 天天搞天天干天天色 | 欧美在线视频一区二区三区 | 国产在线免费观看 | 中文综合在线 | 欧美黄网站 | 中字幕视频在线永久在线观看免费 | 成人av电影在线 | 麻豆91在线看 | 奇米网444| 九九视频精品免费 | 精品高清美女精品国产区 | 91成年人网站 | 久久久精华网 | 日韩成人在线一区二区 | 99热在| a在线观看免费视频 | 正在播放国产91 | 色爱成人网 | 国产精品美女久久久久久久久久久 | 亚洲综合在线视频 | 91夫妻自拍 | 97网站| 欧美一区在线观看视频 | 黄色的网站免费看 | 婷婷丁香六月 | 国产小视频福利在线 | 在线成人一区二区 | 国产亚洲aⅴaaaaaa毛片 | 国产精品专区一 | 日批视频国产 | 久久久久 免费视频 | www黄色 | 久草视频在线资源站 | 国产亚洲欧美日韩高清 | 国产精品爽爽久久久久久蜜臀 | 狠狠色噜噜狠狠狠合久 | 国产成人精品aaa | 综合色综合色 | 亚洲精品456在线播放乱码 | 亚洲男男gaygay无套同网址 | 亚洲一区二区观看 | 国产日韩视频在线播放 | 欧美成人精品欧美一级乱 | 狠狠干激情 | 日韩精品久久一区二区三区 | 亚洲成人黄色在线 | 综合影视 | 国产一区二区高清不卡 | 免费精品视频在线观看 | 久久免费国产 | 黄色一级性片 | 99日韩精品 | 国产精品999久久久 久产久精国产品 | 日韩一区正在播放 | 新av在线| 在线涩涩 | 亚洲精品视频一二三 | 91视频在线免费观看 | 国产手机在线视频 | 日本bbbb摸bbbb | 久久99精品久久久久久 | 国产精品精品国产婷婷这里av | 91大神在线观看视频 | 国产视频精品在线 | 国内精品久久久久久久久久久 | 奇米影视8888 | 亚洲人成人99网站 | av电影久久 | av在线播放中文字幕 | 国产精品自产拍 | 国产精品一区二区久久精品 | 国产精品久久久久久一区二区三区 | 国产成人免费精品 | 人人澡人人爱 | 色综合小说 | 久久久免费播放 | 久久国产精品久久久久 | 日韩免费高清在线观看 | 中文字幕第一页在线播放 | 亚洲综合视频在线 | 99中文字幕视频 | 日韩一区二区三区在线看 | 久久精品99久久久久久2456 | 免费观看91视频 | 99精品欧美一区二区三区黑人哦 | 国产精品一区二区三区在线免费观看 | 天天干天天射天天操 | 国产精品美女久久久久久久 | 狠狠色狠狠综合久久 | 午夜三级毛片 | 久久99久久精品 | 91中文字幕在线播放 | 在线观看日本高清mv视频 | 精品国产自| 狠狠躁日日躁 | 四虎国产精| 四虎www.| 黄色一集片| 国产精品av久久久久久无 | 国产精品欧美激情在线观看 | 奇米导航 | 五月天天天操 | 天天伊人网 | 毛片在线网| 国产在线高清视频 | 91丨九色丨91啦蝌蚪老版 | 成人黄色av免费在线观看 | 精品无人国产偷自产在线 | 日韩大片在线免费观看 | 97在线观看视频免费 | 欧洲性视频| 国产韩国日本高清视频 | 97免费在线观看视频 | 国产色在线,com | 久久久久久久久爱 | 国产日韩中文在线 | 久久 亚洲视频 | 久久国产成人午夜av影院宅 | 欧美淫aaa免费观看 日韩激情免费视频 | 中文乱码视频在线观看 | 天天色天天射天天操 | 免费三及片| 999抗病毒口服液 | 国产99久久久精品 | 在线亚洲欧美视频 | 综合久久网 | 久久国产精品精品国产色婷婷 | 九九视频在线观看视频6 | 日日碰夜夜爽 | 天天草视频| 国产综合91 | 国产成人三级三级三级97 | 久久噜噜少妇网站 | 在线观看av网 | 91在线播 | 国产成人一区二区三区免费看 | 国产福利在线不卡 | 欧美一级免费高清 | 久久不卡国产精品一区二区 | 久久这里只有精品23 | 欧美中文字幕久久 | 日本aaa在线观看 | 亚洲精品五月 | 国产精品精品国产婷婷这里av | 中文字幕中文字幕在线中文字幕三区 | 久草网视频在线观看 | 国产91区 | 五月天av在线 | 久久综合久久综合这里只有精品 | 91在线免费看片 | 四虎国产精品免费观看视频优播 | 97人人模人人爽人人喊中文字 | 日韩日韩日韩日韩 | 成人h视频 | 521色香蕉网站在线观看 | 91在线永久 | 在线观看免费黄视频 | 91伊人久久大香线蕉蜜芽人口 | 五月天精品视频 | 玖玖爱国产在线 | 黄色精品一区二区 | 丝袜制服综合网 | 国产97在线观看 | 国产亚洲精品久久久久久无几年桃 | 亚洲 欧美 日韩 综合 | 91天堂影院 | 中文字幕在线一区观看 | av网站在线免费观看 | 亚洲一区二区精品在线 | 色干综合| 在线之家免费在线观看电影 | 欧美 激情在线 | 精品美女在线视频 | 久久久久国产精品午夜一区 | 国产中年夫妇高潮精品视频 | 中文不卡视频 | 中文字幕在线观看日本 | 日日碰狠狠躁久久躁综合网 | 免费在线观看视频一区 | 亚洲国产精品成人va在线观看 | 午夜精品av| 国产精品白浆 | 久久精品2 | 日本精品在线视频 | 人人搞人人干 | 久久激情电影 | 国内精品久久久久久中文字幕 | 成人在线观看资源 | av网址在线播放 | 久久久国产精品一区二区三区 | 黄色精品久久 | 国产成人精品在线观看 | 日韩av网页 | 日日干天天操 | 西西人体4444www高清视频 | 97精品国产97久久久久久粉红 | 久久久久亚洲精品国产 | 欧美高清视频不卡网 | 国产人成免费视频 | 国产视频在线观看一区 | 曰韩精品| 天天干夜夜爽 | 日韩欧美视频免费观看 | 在线观看小视频 | 91麻豆网站| 在线亚洲精品 | 97超碰总站 | 国产系列 在线观看 | 91视频午夜 | 狠狠干电影 | 久久综合狠狠综合久久激情 | 久久这里只有精品视频99 | 天天操月月操 | 日本成人黄色片 | 久久精品久久综合 | 国产精品初高中精品久久 | 国产亚洲精品日韩在线tv黄 | 国产资源网站 | 国产很黄很色的视频 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 国产91精品看黄网站 | 天天插天天干 | 中文字幕第一页在线播放 | 99久久精品久久亚洲精品 | 色五月情| 又黄又爽免费视频 | 国内精品国产三级国产aⅴ久 | 久久www免费人成看片高清 | 精品久久一区二区三区 | 国产一级片免费播放 | 国产午夜精品一区二区三区欧美 | 在线观看国产区 | 啪啪免费视频网站 | 久久欧美在线电影 | 国产精品久久久免费 | 亚洲精品动漫在线 | 欧美日韩国产高清视频 | 91精品啪在线观看国产线免费 | 久久久蜜桃 | 欧美日韩精品免费观看视频 | 97人人澡人人爽人人模亚洲 | 麻豆视频成人 | 日韩一级成人av | 久久久久国产一区二区三区 | 日韩毛片在线免费观看 | 日韩国产在线观看 | 2000xxx影视| 永久黄网站色视频免费观看w | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 91丨九色丨丝袜 | 国产99区 | 中文字幕在线观看免费观看 | 美女天天操 | 在线日本看片免费人成视久网 | 91av视频在线观看免费 | 91av资源在线| 性色av免费看 | 亚洲一级免费观看 | 久久精品视频2 | 激情开心 | www.色爱| 六月久久婷婷 | 亚洲精品一区二区三区新线路 | 国产在线国产 | 国产视频综合在线 | 色a综合| 亚洲 综合 国产 精品 | 亚洲精品视频免费在线 | 中文字幕在线视频第一页 | 日本韩国精品一区二区在线观看 | 五月婷婷综合在线观看 | 精品日本视频 | 97视频免费观看2区 亚洲视屏 | 精品久久久久久一区二区里番 | 免费日韩一区二区三区 | 午夜视频免费在线观看 | 久久看视频 | 日韩av免费观看网站 | av高清一区二区三区 | 日日干夜夜草 | 国产aa免费视频 | 日韩天天综合 | 久久爱影视i | 精品视频www | 不卡电影免费在线播放一区 | 最近中文字幕久久 | 国产视频在线免费 | 韩日三级在线 | 一区二区三区四区精品 | 精品无人国产偷自产在线 | 色综合久久88色综合天天6 | 成年人免费观看在线视频 | 亚洲免费av片 | 玖玖精品在线 | 久久玖| 日日爱影视 | 中文字幕一区二区三区在线视频 | 91成人免费| 午夜视频在线观看一区二区三区 | 国产成人一区二区三区在线观看 | 欧美激情视频三区 | 国产录像在线观看 | 手机av看片 | 国产 欧美 日韩 | 91麻豆福利 | 精品视频一区在线 | 中文字幕免费观看视频 | 欧美日韩高清 | 久久调教视频 | 91av视频在线播放 | 91精品色 | 国产一区久久久 | av电影一区二区三区 | 91黄色影视 | 久久精品电影 | 一区二区观看 | 天天操天天操天天操天天操 | 色婷婷狠狠五月综合天色拍 | 天天色成人网 | 超碰在线日韩 | 91污在线 | 亚洲91精品在线观看 | 天天看天天操 | 久久午夜网 | 久久久久久久久久久成人 | 国产免费午夜 | 欧美韩日视频 | 麻豆传媒电影在线观看 | 欧洲亚洲国产视频 | 免费在线观看黄 | 视频二区在线视频 | 天天拍天天干 | 国产色就色 | 国产97视频在线 | 久久久久高清 | 亚洲黄色一级电影 | 日韩精品欧美视频 | 久久99亚洲热视 | 91粉色视频| 久久99久久99精品免观看软件 | 亚洲在线视频免费 | 久久不射电影网 | 国产精品一区二区三区在线看 | 93久久精品日日躁夜夜躁欧美 | 精品不卡av | 色妞色视频一区二区三区四区 | 麻豆视频国产 | 久久久国产精品麻豆 |