日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

手寫Transformer核心模塊:從零實(shí)現(xiàn)Linear、Embedding與反向傳播

手寫Transformer核心模塊:從零實(shí)現(xiàn)Linear、Embedding與反向傳播 這次我們來(lái)看一項(xiàng)很多人學(xué)完 Transformer 但依然沒(méi)完全搞懂的事情不只是會(huì)調(diào)用nn.Transformer而是親手把 Linear Layer、Embedding Layer、參數(shù)初始化和反向傳播全部實(shí)現(xiàn)出來(lái)。本文對(duì)應(yīng)的場(chǎng)景是 Stanford CS 336 3.3也就是在課程作業(yè)中要求用最樸素的 PyTorch 張量操作搭建語(yǔ)言模型組件并通過(guò)梯度檢查驗(yàn)證手寫反向傳播的正確性。標(biāo)題里的四個(gè)關(guān)鍵詞其實(shí)就對(duì)應(yīng)了 Transformer 落地中四個(gè)最容易翻車的點(diǎn)參數(shù)初始化決定模型能不能收斂反向傳播決定你寫的網(wǎng)絡(luò)是不是真的“能學(xué)”Linear Layer 是所有前饋計(jì)算的地基Embedding Layer 則承擔(dān)著離散 token 到連續(xù)向量的映射。如果這幾個(gè)模塊只是靠nn.Linear和nn.Embedding一帶而過(guò)那遇到 loss 不降、梯度 NaN、維度對(duì)不上這類問(wèn)題的時(shí)候往往只能瞎猜。自己手拼一遍之后很多報(bào)錯(cuò)一眼就能看出問(wèn)題。這篇文章會(huì)從零實(shí)現(xiàn)一個(gè)可訓(xùn)練的最小 Transformer包含前向傳播、手寫 backward、參數(shù)初始化、梯度驗(yàn)證最后在一個(gè)小模型上完成端到端訓(xùn)練測(cè)試。全程使用 CPU 即可運(yùn)行不依賴 GPU也不需要下載任何預(yù)訓(xùn)練權(quán)重。適合正在啃 Transformer 源碼、準(zhǔn)備算法面試、或者做課程作業(yè)時(shí)想把原理徹底吃透的讀者。1. 核心能力速覽先把這篇文章涉及的技術(shù)目標(biāo)和運(yùn)行約束講清楚。下面的表格不是項(xiàng)目 README而是你讀完這篇文章后應(yīng)該具備的“能力驗(yàn)收清單”。能力項(xiàng)說(shuō)明項(xiàng)目類型從零手寫 Transformer 核心模塊的教學(xué)實(shí)現(xiàn)來(lái)源Stanford CS 336 Language Modeling 課程 3.3 小節(jié)主題核心模塊Linear Layer、Embedding Layer、LayerNorm、參數(shù)初始化、手寫反向傳播技術(shù)棧Python 3.9、PyTorch 2.x、NumPy 可選運(yùn)行方式本地腳本運(yùn)行支持 Jupyter Notebook硬件要求CPU 可跑顯存不是必需是否依賴 nn.Linear不依賴手動(dòng)實(shí)現(xiàn) forward/backward是否依賴 nn.Embedding不依賴手動(dòng)實(shí)現(xiàn)查表與梯度回傳反向傳播方式手動(dòng)推導(dǎo)并實(shí)現(xiàn)通過(guò) torch.autograd.gradcheck 驗(yàn)證驗(yàn)證方式形狀測(cè)試、梯度對(duì)比、小模型端到端 loss 下降適合人群學(xué)習(xí) Transformer 原理、面試準(zhǔn)備、課程作業(yè)、源碼閱讀從表格可以看出這是一篇“先別用庫(kù)、先把原理跑通”的教程。它的核心產(chǎn)出不是一個(gè)大而全的訓(xùn)練框架而是一套你可以自己掌控每個(gè)張量形狀和每個(gè)梯度去向的最小實(shí)現(xiàn)。2. 適用場(chǎng)景與使用邊界手寫 Transformer 并不是為了讓 PyTorch 用戶拋棄官方 API。相反它適合在以下幾個(gè)場(chǎng)景里發(fā)揮作用第一課程作業(yè)或?qū)嶒?yàn)報(bào)告。CS 336 這類課程的核心目標(biāo)就是讓學(xué)生脫離高級(jí)封裝理解語(yǔ)言模型內(nèi)部到底發(fā)生了什么。自己實(shí)現(xiàn) Linear、Embedding、LayerNorm 之后再去看nn.TransformerEncoder的實(shí)現(xiàn)會(huì)明顯感覺(jué)到“圖層”不再是黑盒。第二算法面試準(zhǔn)備。很多公司面試會(huì)問(wèn)“Transformer 參數(shù)初始化為什么用 Xavier”“Embedding 梯度怎么回傳”“softmax 反向傳播的雅可比是什么”。這些問(wèn)題的答案不親手寫一遍很難講得清楚。第三源碼閱讀和二次開(kāi)發(fā)。當(dāng)你想修改某一層的行為比如給 Attention 換成線性注意力或者把 LayerNorm 換成 RMSNorm如果只依賴高層 API往往不知道改哪里但手寫過(guò)底層模塊之后你能很快定位到具體實(shí)現(xiàn)位置。同時(shí)也要明確使用邊界。這套手寫代碼主要用于教學(xué)和原理驗(yàn)證不推薦直接用于大規(guī)模訓(xùn)練。手寫循環(huán)、GPU 算子融合、FlashAttention 這些工程優(yōu)化都不在范圍內(nèi)。如果目標(biāo)是在生產(chǎn)環(huán)境訓(xùn)練大模型應(yīng)該直接使用成熟框架PyTorch 的nn.Transformer、Hugging Face 的transformers或者 Megatron-LM 等。另一個(gè)必須強(qiáng)調(diào)的是合規(guī)邊界。課程代碼、作業(yè)要求、課件內(nèi)容都有各自的版權(quán)和使用協(xié)議本文只講解通用技術(shù)原理和常見(jiàn)實(shí)踐不復(fù)制任何課程原始材料。訓(xùn)練時(shí)不要使用未經(jīng)授權(quán)的數(shù)據(jù)、人臉信息、版權(quán)文本或用戶隱私數(shù)據(jù)盡量在本地構(gòu)造的玩具數(shù)據(jù)集上驗(yàn)證。3. 環(huán)境準(zhǔn)備與前置條件手寫層不需要復(fù)雜環(huán)境。建議使用 Python 3.9 以上版本和 PyTorch 2.x安裝命令pip install torch numpy tqdm如果沒(méi)有 GPU直接用 CPU 跑小模型即可。這里的關(guān)鍵不是訓(xùn)練速度而是驗(yàn)證前向輸出形狀與反向傳播梯度是否正確。建議的工程目錄結(jié)構(gòu)transformer_from_scratch/ ├── layers/ │ ├── __init__.py │ ├── linear.py │ ├── embedding.py │ ├── layernorm.py │ └── attention.py ├── init.py ├── model.py ├── train.py └── tests/ └── test_gradcheck.py這種按層拆分的結(jié)構(gòu)能讓你在調(diào)試時(shí)只關(guān)心單個(gè)模塊而不會(huì)一次面對(duì)整個(gè)網(wǎng)絡(luò)。動(dòng)手之前還需要確認(rèn)三塊數(shù)學(xué)基礎(chǔ)矩陣乘法求導(dǎo)公式、鏈?zhǔn)椒▌t、softmax 的雅可比矩陣。不需要研究得很深但至少要知道對(duì)于一個(gè)線性變換y x W從上層傳回的梯度dy應(yīng)該分別回傳到dx和dW公式是dx dy W.T、dW x.T dy。后面所有代碼都建立在這條基本規(guī)則上。4. 從零實(shí)現(xiàn)核心模塊4.1 手寫 Linear LayerLinear Layer 是最基礎(chǔ)的計(jì)算單元公式很簡(jiǎn)單y x W b。但參數(shù)初始化和梯度回傳是兩個(gè)容易被忽略的細(xì)節(jié)。第一個(gè)細(xì)節(jié)是參數(shù)初始化。下面用 Xavier 均勻初始化它的上下界是bound sqrt(6 / (fan_in fan_out))。這種初始化適合線性層和 tanh 激活函數(shù)能讓每層輸出的方差保持在一個(gè)合理范圍內(nèi)避免深層網(wǎng)絡(luò)時(shí)梯度消失或爆炸。第二個(gè)細(xì)節(jié)是反向傳播。除了dx要回傳給上一層還要計(jì)算dW和db供優(yōu)化器更新。這里有一個(gè)常見(jiàn)錯(cuò)誤把dW寫成了grad_output.T x正確寫法是x.T grad_output。推導(dǎo)方法是對(duì)損失函數(shù)求 W 的偏導(dǎo)保持張量形狀對(duì)齊即可。import torch import math class LinearLayer: def __init__(self, in_features, out_features, biasTrue): self.in_features in_features self.out_features out_features self.bias bias # Xavier 均勻初始化 bound math.sqrt(6.0 / (in_features out_features)) self.W torch.empty(in_features, out_features).uniform_(-bound, bound) self.b torch.zeros(out_features) if bias else None def forward(self, x): self.x x out x self.W if self.b is not None: out out self.b return out def backward(self, grad_output): dx grad_output self.W.T dW self.x.T grad_output db grad_output.sum(dim0) if self.b is not None else None return dx, dW, db這段代碼最值得注意的地方是forward里保存了self.x。這是手寫反向傳播的基礎(chǔ)backward 需要用到前向時(shí)輸入的原始值。很多新手寫的反向傳播出錯(cuò)不是因?yàn)楣酵茖?dǎo)錯(cuò)而是因?yàn)榍跋驔](méi)有保存必要的中間變量。4.2 手寫 Embedding LayerEmbedding Layer 本質(zhì)上是一個(gè)查表操作。輸入是 token id 序列輸出是形狀為[batch_size, seq_len, embedding_dim]的向量序列。它的反向傳播很有特點(diǎn)并不是所有 embedding 行都會(huì)被更新只有當(dāng)前 batch 中實(shí)際被查到的 token 行才有梯度。實(shí)現(xiàn)方式是用torch.index_add_把梯度累加到對(duì)應(yīng)的行上。class EmbeddingLayer: def __init__(self, num_embeddings, embedding_dim, init_scale0.1): self.num_embeddings num_embeddings self.embedding_dim embedding_dim # 常用做法均勻分布 [-init_scale, init_scale] self.E torch.empty(num_embeddings, embedding_dim) self.E.uniform_(-init_scale, init_scale) def forward(self, tokens): self.tokens tokens return self.E[tokens] def backward(self, grad_output): dE torch.zeros_like(self.E) # 把梯度累加到被查到的行上 dE.index_add_(0, self.tokens.flatten(), grad_output.flatten(0, 1)) return dE這里有一個(gè)工程細(xì)節(jié)index_add_是原地操作調(diào)用前必須確保dE是全零矩陣。如果同一個(gè) token 在一句話中出現(xiàn)多次它的梯度會(huì)自然累加這也符合 embedding 反向傳播的定義。你不需要為它手動(dòng)去重。4.3 參數(shù)初始化決定 Transformer 能不能收斂的隱藏開(kāi)關(guān)參數(shù)初始化在 PyTorch 使用里常常被忽略因?yàn)閚n.Linear已經(jīng)封裝好了默認(rèn)初始化。但手寫模塊時(shí)每層初始化都必須自己處理。先看原始 Transformer 論文中的做法embedding 層使用均值 0、方差 1 的正態(tài)分布初始化之后乘以sqrt(d_model)。也就是說(shuō)如果 embedding 矩陣初始化為N(0, 1)那么實(shí)際查表輸出要再乘一個(gè)sqrt(d_model)。這樣做的目的是讓輸入到 Attention 的向量范數(shù)不要太小避免 softmax 之前的所有點(diǎn)積都擠到極小值附近。GPT 風(fēng)格的大模型通常采用更小的初始化方差例如N(0, 0.02)。原因很簡(jiǎn)單模型層數(shù)越深殘差分支積累的隱狀態(tài)方差越大逐層用小方差初始化可以抑制這種累積。如果你在深層 Transformer 里發(fā)現(xiàn)訓(xùn)練初期 logits 出現(xiàn) NaN或者 loss 長(zhǎng)時(shí)間不下降首先排查初始化方差是否過(guò)大。下面給出一個(gè)簡(jiǎn)單的參數(shù)初始化工具函數(shù)def init_linear_weight(W, modexavier): if mode xavier: fan_in, fan_out W.shape bound math.sqrt(6.0 / (fan_in fan_out)) W.uniform_(-bound, bound) elif mode gpt: nn.init.normal_(W, std0.02) else: raise ValueError(fUnknown init mode: {mode}) def init_embedding(E, d_model, modenormal): if mode normal: E.normal_(mean0.0, std1.0) E.mul_(math.sqrt(d_model)) elif mode uniform: scale 0.1 E.uniform_(-scale, scale) else: raise ValueError(fUnknown init mode: {mode})從實(shí)踐角度看訓(xùn)練一個(gè)小模型時(shí)建議 Linear 層優(yōu)先用 Xavier 均勻初始化Embedding 層可以用uniform(-0.1, 0.1)這種比較保險(xiǎn)的小范圍初始化。如果訓(xùn)練不收斂再嘗試 GPT 風(fēng)格的N(0, 0.02)并配合 warmup 學(xué)習(xí)率調(diào)度。4.4 手寫反向傳播并用 gradcheck 驗(yàn)證手寫反向傳播最難的不是某一層的公式而是整個(gè)鏈路的梯度形狀。一個(gè)效率很高的驗(yàn)證方式是用torch.autograd.gradcheck。它會(huì)用數(shù)值差分計(jì)算梯度再和你的手動(dòng) backward 梯度對(duì)比誤差在閾值內(nèi)就說(shuō)明反向傳播正確。from torch.autograd import gradcheck torch.manual_seed(0) linear LinearLayer(64, 128) x torch.randn(2, 32, 64, requires_gradTrue, dtypetorch.float64) # 注意gradcheck 需要高精度通常使用 float64 linear.W linear.W.double() linear.b linear.b.double() output linear.forward(x) grad_output torch.randn_like(output) dx_manual, dW_manual, db_manual linear.backward(grad_output) # 用 autograd 計(jì)算參考梯度 output_double x.double() linear.W.double() linear.b.double() dx_auto torch.autograd.grad(output_double.sum(), x)[0] print(dx 誤差:, (dx_manual - dx_auto).abs().max().item())gradcheck函數(shù)更嚴(yán)格可以直接傳一個(gè)自定義函數(shù)def linear_forward_wrapper(W, b, x): return x W b linear_layer LinearLayer(16, 32) linear_layer.W linear_layer.W.double() linear_layer.b linear_layer.b.double() x torch.randn(4, 16, dtypetorch.float64, requires_gradTrue) W linear_layer.W.clone().requires_grad_(True) b linear_layer.b.clone().requires_grad_(True) check gradcheck( lambda w, b_: linear_forward_wrapper(w, b_, x), (W, b), eps1e-6, atol1e-5, ) print(gradcheck passed:, check)如果你是在課程作業(yè)里驗(yàn)證反向傳播務(wù)必把所有參數(shù)和輸入都轉(zhuǎn)成float64。數(shù)值差分在float32下誤差會(huì)很大導(dǎo)致明明公式正確gradcheck卻報(bào)錯(cuò)。4.5 LayerNorm 與殘差Transformer 穩(wěn)定訓(xùn)練的第二道防線LayerNorm 在 Transformer 中負(fù)責(zé)把每一層的輸出拉回穩(wěn)定的數(shù)值范圍。手寫時(shí)可以直接使用簡(jiǎn)化形式y(tǒng) (x - mean) / sqrt(var eps)反向傳播用一個(gè)更緊湊的公式class LayerNorm: def __init__(self, dim, eps1e-5): self.gamma torch.ones(dim) self.beta torch.zeros(dim) self.eps eps def forward(self, x): self.x x self.mean x.mean(dim-1, keepdimTrue) self.var x.var(dim-1, unbiasedFalse, keepdimTrue) self.x_hat (x - self.mean) / torch.sqrt(self.var self.eps) return self.gamma * self.x_hat self.beta def backward(self, grad_output): N self.x.shape[-1] dy grad_output * self.gamma dx (dy - dy.mean(dim-1, keepdimTrue) - self.x_hat * (dy * self.x_hat).mean(dim-1, keepdimTrue) ) / torch.sqrt(self.var self.eps) dgamma (grad_output * self.x_hat).sum(dim(0, 1)) dbeta grad_output.sum(dim(0, 1)) return dx, dgamma, dbeta這個(gè)反向公式的推導(dǎo)過(guò)程相當(dāng)經(jīng)典。核心思路是歸一化操作同時(shí)依賴mean和var所以dx中必須包含dy.mean以及dy * x_hat的均值項(xiàng)。很多人手寫 LayerNorm 反向時(shí)少了一項(xiàng)導(dǎo)致gradcheck一直不過(guò)幾乎都是這個(gè)原因。殘差連接則是把輸入和子層輸出相加它的反向傳播不需要任何額外計(jì)算梯度在相加處直接“分叉”。實(shí)現(xiàn)時(shí)只要在 forward 里保存原始輸入即可。4.6 組裝一個(gè)最小 Transformer Block有了 Linear、Embedding、LayerNorm 和殘差可以組裝一個(gè)最小 Transformer Block。這里為了控制篇幅Attention 部分不手寫 backward而是用 PyTorch 基礎(chǔ)算子實(shí)現(xiàn) forward反向交給 autograd。import torch import torch.nn.functional as F class MultiHeadAttention: def __init__(self, d_model, n_heads): self.d_model d_model self.n_heads n_heads self.head_dim d_model // n_heads self.Wq torch.empty(d_model, d_model) self.Wk torch.empty(d_model, d_model) self.Wv torch.empty(d_model, d_model) self.Wo torch.empty(d_model, d_model) for w in [self.Wq, self.Wk, self.Wv, self.Wo]: nn.init.xavier_uniform_(w) def forward(self, x): B, T, D x.shape q x self.Wq k x self.Wk v x self.Wv q q.view(B, T, self.n_heads, self.head_dim).transpose(1, 2) k k.view(B, T, self.n_heads, self.head_dim).transpose(1, 2) v v.view(B, T, self.n_heads, self.head_dim).transpose(1, 2) scores q k.transpose(-2, -1) / (self.head_dim ** 0.5) attn torch.softmax(scores, dim-1) out attn v out out.transpose(1, 2).reshape(B, T, D) return out self.Wo這里的關(guān)鍵知識(shí)點(diǎn)是縮放因子。Attention 公式里scores q k.T / sqrt(d_head)不能省略。如果不做縮放點(diǎn)積結(jié)果會(huì)隨著d_head增大而變大softmax 會(huì)進(jìn)入飽和區(qū)梯度接近 0訓(xùn)練會(huì)非常慢。5. 功能測(cè)試與效果驗(yàn)證5.1 測(cè)試 Linear 前向形狀第一個(gè)測(cè)試很簡(jiǎn)單確認(rèn)輸出形狀正確。torch.manual_seed(0) linear LinearLayer(64, 128) x torch.randn(2, 32, 64) out linear.forward(x) print(Linear input shape:, x.shape) print(Linear output shape:, out.shape) # 期望輸出 (2, 32, 128)如果這里形狀不對(duì)問(wèn)題幾乎一定出在W的定義方式上。W應(yīng)該是(in_features, out_features)這樣x W才能把最后一維從 64 映射到 128。5.2 測(cè)試 Embedding 反向是否正確構(gòu)造一個(gè)只有 0、1、2 三個(gè) token 的序列驗(yàn)證 embedding 各行的梯度。torch.manual_seed(0) embed EmbeddingLayer(num_embeddings3, embedding_dim8) tokens torch.tensor([[0, 1], [0, 2]]) out embed.forward(tokens) grad_output torch.randn_like(out) dE embed.backward(grad_output) print(dE shape:, dE.shape) print(dE row 0:, dE[0])判斷依據(jù)第 0 行梯度應(yīng)該等于輸入中 token 0 對(duì)應(yīng)位置梯度的累加。如果第 1 行或第 2 行也出現(xiàn)了不該有的梯度說(shuō)明index_add_的索引寫錯(cuò)了。5.3 用 gradcheck 驗(yàn)證全部手寫層強(qiáng)烈建議給每個(gè)手寫層都寫一個(gè) gradcheck。以 LinearLayer 為例用前文包裝函數(shù)方式驗(yàn)證 W 和 b 的梯度EmbeddingLayer 則驗(yàn)證 E 矩陣的梯度。def embedding_forward_wrapper(E, tokens): return E[tokens] E torch.randn(10, 16, dtypetorch.float64, requires_gradTrue) tokens torch.tensor([[1, 2, 3], [4, 5, 6]], dtypetorch.long) gradcheck_check gradcheck(embedding_forward_wrapper, (E, tokens)) print(Embedding gradcheck:, gradcheck_check)注意gradcheck要求輸入張量至少有一個(gè)是requires_gradTrue且所有浮點(diǎn)張量都建議使用float64。整數(shù) token 張量不需要梯度。5.4 端到端小模型訓(xùn)練觀察 loss 是否下降這是最后一個(gè)驗(yàn)證能證明整個(gè)鏈路從參數(shù)初始化到反向傳播都沒(méi)有大問(wèn)題。import torch import torch.optim as optim torch.manual_seed(0) vocab_size 64 d_model 32 n_heads 4 block MultiHeadAttention(d_modeld_model, n_headsn_heads) embed EmbeddingLayer(vocab_size, d_model) x torch.randint(0, vocab_size, (2, 8)) y torch.randint(0, vocab_size, (2, 8)) optim_params [ {params: [block.Wq, block.Wk, block.Wv, block.Wo]}, {params: [embed.E]}, ] optimizer optim.Adam(optim_params, lr1e-3) loss_fn torch.nn.CrossEntropyLoss() for step in range(20): h embed.forward(x) h block.forward(h) logits h embed.E.T loss loss_fn(logits.view(-1, vocab_size), y.view(-1)) optimizer.zero_grad() # 這里故意用 autograd 計(jì)算整條鏈路梯度因?yàn)?MultiHeadAttention 沒(méi)有手寫 backward loss.backward() optimizer.step() if step % 5 0: print(step, step, loss, loss.item())這段代碼用到了一個(gè)取巧但合理的設(shè)計(jì)embedding 矩陣既負(fù)責(zé)查表也作為輸出投影矩陣。這種“共享嵌入”的寫法在 GPT 系列中很常見(jiàn)。更好的實(shí)現(xiàn)是單獨(dú)定義一個(gè)輸出 Linear 層但從教學(xué)角度看共享嵌入能顯著減少參數(shù)。判斷標(biāo)準(zhǔn)如果 loss 在 20 步內(nèi)明顯下降說(shuō)明參數(shù)初始化、前向、反向、優(yōu)化器調(diào)度全部工作正常如果 loss 原地不動(dòng)優(yōu)先檢查學(xué)習(xí)率是否太大或者太小其次檢查初始化方差。6. 從“手寫層”到“接口化調(diào)用”批量實(shí)驗(yàn)與可復(fù)用設(shè)計(jì)這個(gè)項(xiàng)目沒(méi)有 HTTP API也不需要提供 Web 服務(wù)。但從工程化角度看你可以把自定義層設(shè)計(jì)成統(tǒng)一的“前向 反向”接口方便批量跑實(shí)驗(yàn)。比如定義一個(gè) BaseLayer 風(fēng)格class BaseLayer: def forward(self, x): raise NotImplementedError def backward(self, grad_output): raise NotImplementedErrorLinearLayer、EmbeddingLayer、LayerNorm 都繼承這個(gè)接口這樣在訓(xùn)練循環(huán)里可以統(tǒng)一調(diào)度。批量實(shí)驗(yàn)最常見(jiàn)的場(chǎng)景是掃描不同初始化模式對(duì)收斂速度的影響??梢詫懸粋€(gè)小腳本init_modes [xavier, gpt, uniform] learning_rates [1e-4, 1e-3, 1e-2] for init_mode in init_modes: for lr in learning_rates: model build_transformer(init_modeinit_mode) final_loss train_short(model, lrlr) print(init_mode, lr, final_loss)當(dāng)你把“參數(shù)初始化”和“反向傳播”都變成可配置項(xiàng)之后就能系統(tǒng)性地觀察為什么 GPT 風(fēng)格的小方差初始化在深層模型中表現(xiàn)更好為什么 Xavier 在淺層模型中已經(jīng)足夠。這種實(shí)驗(yàn)往往比單純閱讀論文更有價(jià)值。如果你確實(shí)想把模塊暴露成服務(wù)也可以額外包一層 FastAPI但這屬于教學(xué)項(xiàng)目之外的擴(kuò)展不推薦在原理學(xué)習(xí)階段引入。7. 資源占用與性能觀察手寫模塊的最大問(wèn)題是性能遠(yuǎn)低于 PyTorch 原生算子。因?yàn)檫@里為了教學(xué)把 forward 和 backward 的中間張量都保存在內(nèi)存中也沒(méi)有做算子融合。如果是大型模型訓(xùn)練這種寫法會(huì)占用大量顯存。觀察資源使用可以這樣寫import time import psutil x torch.randn(4, 128, 256) linear LinearLayer(256, 256) # warmup linear.forward(x) t0 time.time() for _ in range(10): out linear.forward(x) _, _, _ linear.backward(torch.randn_like(out)) t1 time.time() print(平均耗時(shí):, (t1 - t0) / 10) mem psutil.Process().memory_info().rss / 1024 / 1024 print(當(dāng)前內(nèi)存占用 MB:, mem)如果訓(xùn)練時(shí)顯存不足有幾種通用降載方法減小 batch size減小序列長(zhǎng)度降低 d_model 和 n_heads把不必要的中間變量從 forward 中移出例如 forward 結(jié)束后只保留反向需要用到的張量不保存完整 attention 矩陣對(duì)大模型訓(xùn)練改用半精度或混合精度。從性能觀察的角度說(shuō)手寫版的價(jià)值不在于快而在于你能清楚看到每個(gè)操作的時(shí)間和空間開(kāi)銷。這也是理解后續(xù) FlashAttention 為什么要合并算子、減少訪存的起點(diǎn)。8. 常見(jiàn)問(wèn)題與排查方法問(wèn)題現(xiàn)象可能原因排查方式解決方案gradcheck 一直報(bào)錯(cuò)沒(méi)有開(kāi)啟 float64檢查輸入張量和參數(shù) dtype全部轉(zhuǎn)成torch.float64Linear 反向維度報(bào)錯(cuò)dW寫成grad_output.T x打印x.shape、grad_output.shape改為x.T grad_outputEmbedding 梯度全部為 0查表后沒(méi)有保存 token 索引檢查forward是否保存self.tokens在 forward 中保存輸入 tokenloss 不下降學(xué)習(xí)率不合適或初始化方差太小打印梯度均值、方差調(diào)大 learning rate 或改用 GPT initloss 出現(xiàn) NaN初始化方差太大或 Attention 沒(méi)有縮放打印 logits 是否存在 inf使用sqrt(d_head)縮放減小初始化方差LayerNorm 反向公式缺項(xiàng)忘記處理 mean 和 var 的依賴用 gradcheck 定位使用包含dy.mean與dy*x_hat項(xiàng)的簡(jiǎn)化公式Attention 維度 reshape 錯(cuò)誤Q、K、V 的 view/transpose 順序不對(duì)打印q.shape、k.shape、scores.shape先 view 成[B, T, n_heads, head_dim]再 transpose 成[B, n_heads, T, head_dim]CPU 訓(xùn)練太慢batch size / 序列長(zhǎng)度偏大用 time 統(tǒng)計(jì) forward/backward 耗時(shí)減小 batch size 和 seq_len從上表能看出手寫 Transformer 的大部分報(bào)錯(cuò)都集中在維度形狀和梯度公式上。我的建議是遇到問(wèn)題不要直接搜答案先打印梯度的 shape 和數(shù)值范圍往往能更快定位。9. 最佳實(shí)踐與使用建議寫手寫 Transformer 項(xiàng)目時(shí)有幾條通用的工程建議值得遵守。第一按層拆分文件。不要把所有自定義層堆在一個(gè) Python 文件里。按linear.py、embedding.py、layernorm.py、attention.py拆分每層只做一件事調(diào)試時(shí)直接定位對(duì)應(yīng)文件。第二每寫一層就立即驗(yàn)證一層。不要等到所有模塊寫完了再驗(yàn)證。驗(yàn)證工具就是torch.autograd.gradcheck它比任何肉眼觀察都可靠。每層驗(yàn)證通過(guò)之后再進(jìn)入下一步。第三先跑最小配置。第一個(gè)實(shí)驗(yàn)建議使用vocab_size64、d_model32、n_heads4、batch_size2、seq_len8。這么小的配置可以在幾秒內(nèi)完成完整訓(xùn)練循環(huán)。如果最小配置都能跑通再逐步放大。第四保留一個(gè) baseline 對(duì)照。用 PyTorch 官方nn.Linear、nn.Embedding或nn.TransformerEncoder實(shí)現(xiàn)同樣的網(wǎng)絡(luò)不斷對(duì)比前向輸出和梯度。這樣能快速排除“手寫層寫錯(cuò)”和“訓(xùn)練邏輯寫錯(cuò)”兩類問(wèn)題。第五模型文件、訓(xùn)練代碼和測(cè)試代碼分目錄管理。避免把臨時(shí)調(diào)試代碼和正式代碼混在一起。如果你要批量跑初始化實(shí)驗(yàn)建議加一個(gè)配置字典或者命令行參數(shù)。第六涉及真實(shí)數(shù)據(jù)時(shí)注意合規(guī)。本文教學(xué)項(xiàng)目只需要隨機(jī) token 或自己構(gòu)造的玩具數(shù)據(jù)不需要真實(shí)文本。如果后續(xù)擴(kuò)展項(xiàng)目需要真實(shí)語(yǔ)料務(wù)必確認(rèn)數(shù)據(jù)來(lái)源合法、授權(quán)完整不涉及個(gè)人隱私和版權(quán)內(nèi)容。10. 總結(jié)與下一步這個(gè)手寫項(xiàng)目最值得驗(yàn)證的功能就是“參數(shù)初始化 手寫反向傳播”的組合。你先跑通一層 Linear 的 gradcheck再試一個(gè)最小 Transformer 的 loss 下降就會(huì)理解為什么Transformer的每一層都需要精心設(shè)計(jì)梯度通路。最容易踩的坑有三個(gè)Linear 反向里dW的維度順序、LayerNorm 反向里缺少歸一化依賴項(xiàng)、Attention 里的縮放因子。這三個(gè)坑只要踩過(guò)一個(gè)以后再看到類似報(bào)錯(cuò)就會(huì)很敏感。下一步建議做三件事第一給 MultiHeadAttention 也實(shí)現(xiàn)手寫 backward完整覆蓋所有模塊第二加入 causal mask讓 Attention 只能看到當(dāng)前位置之前的 token變成一個(gè)真正的自回歸語(yǔ)言模型第三把學(xué)到的參數(shù)初始化經(jīng)驗(yàn)搬到一個(gè)小型文本數(shù)據(jù)集上觀察 loss 曲線在不同 init 和 learning rate 下的表現(xiàn)。做完這三步你對(duì) Transformer 的掌握就不再停留在“會(huì)用層”的層面而是真正進(jìn)入了“能寫層”的階段。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91精品操美女| 国产精品久久久久久久黄无码| 丁香五月电影| 操人人| 超碰在线974| 国产A v无码专区| 久久97视频| 九九九综合精品| 性色av网站| 熟妇乱伦一区二区| 韩国嫰模上门援交视频| 色图四区| 欧美韩国你懂得在线 | 男人综合网| 亚洲A色| 亚洲最大无码中文字幕网站| 精品偷拍13p欧美dodk视频| 精品人妻久久久| 91总综合网| 大香蕉宗合网在线| 亚洲无码成人精品| 天美精品原创av片国产| 综合色欧美| 久久草视频污视频| 国厂麻豆77q4| 国内黄色精品| 丰满翘臀美女影院视频| 日本欧美一区二区三区视频麻豆| 久久性爱视频99| 欧美日韩亚洲天堂| 成人一二三区| 91色综合| 国产中出内射一区二区| 大香蕉日韩| 婷婷15月天青娱乐| 伊人网在线观看| 91是天天| 老熟女熟妇| 91亚·色| 欧美久久毛片基地| 欧洲精品人妻| 精品人妻视频一区二区在线播放| 九九av| 一本一首道人妻少妇免费久久| 少妇 综合| 九九99精品视频在线观看| 亚洲中文一区二区三区| 国产精品蜜乳AV| 亚洲国产奇米影视久久| 欧美日韩免费性爱| 黄色电影观看久久9| 九九精品无码专区免费| 操逼操网| 少妇超碰在线| 亚洲免费精品一区| 欧美在线伊人色| 很黄很污的免费网站| 91女在线观看| 日本欧美韩国日产片片在线看免| 久99久视频精选| 少妇国产不卡| 老熟妇一区二区三区啪啪| 囯产精品强| 婷婷精品国产一区二区三区日韩| 91欧美丝袜| 97热视频在线观看| 九久9精品| AVE乱伦| 亚洲色欲天天天堂色欲网女| 亚洲无线码一区国产欧美国| 久久久激情| 久久久999网站| 久久精品一区| av橘色网站| 97欧美视频| 欧美视频一区二区在线| 91熟女熟妇视频网站| 热天堂一区二区| 日产中文字幕2020| 东京太热男人的天堂久久久| 免费夜夜爱黄色视频毛片| 91亚洲黑人| 9999亚洲电影| 亚洲人妻日日日| 国产在线视频午夜精华在| 天堂俺去俺来也www久久婷婷| 免费在线黄片视频| 天天综合网一91网| 欧美午夜视频| 国产白丝精品在线观看| 无码聚合| 激情文学 国产一二三aV| 国产精品天干天干综合网麻豆| 久久久久深夜无码| 中文字幕,人妻,日韩| 91看黄片| 大香蕉伊利av| 91亚洲网站| 影音先锋每日最新资源在线观看| 欧美另类色图片| 人人噜夜夜操| 日韩中文字幕视频| 91精品黄在线观看| 2020天天色综合| 成人精品无码| 狂操嫩妻视频一区二区三区| 国产热av| 热久久国产| 亚洲一区深夜| 超碰人妻久久| 一区二区娱乐网站| 综合干干干av久久久综合网| 国产精品99精品视频网站| 欧美性生活综合| 日欧美色| 91人精品妻入口| 92午夜免费福利视频| 欧美天堂日韩三级国产传媒| 激情五月天综合网| 女人香蕉久久毛毛片精品| 色综合av男人天堂| 啊操爽品善一区二区三区| 欧美日本成人一区二区| 亚洲色欲天天人妻无码系列专区| 裸体1区| 国产1024在线播放| 91天天日| 久久一区二区高清免费| 欧美97视频| 免费观看国产小粉嫩喷水精品午| 久久人妻四季| 人人看黄色视频| 少妇二级| 又粗又长又爽在线观看| 91欧美性| 高清无码国产亚洲| 夜夜精品视频| 中国黑人三级片网站上区| 91综合在线| 一二三啪啪专区| 女人天堂av在线播放| 一区二区三区精品黑丝白丝酒店对鸡| 人人妻人人澡人人爽久久av| 欧美拳交在线播放| 粉嫩av平台| 操我啊啊啊啊啊| 中文字幕一区二区视频在线观看| 淫淫总合网| 97精品网| 午夜精品久久久久久久99热影院| 2019天天干天天操| 天天操妹子| 无码自拍SM| 欧美色视| 久久国99999| 国产极品999| 中日亚韩免费视频| 一区二区播放| 宗合情欲网| 高清无码在线播放网站| 大香蕉手机在线| 大香蕉啪啪啪| 午夜欧美女人操逼| 亚洲综合20p| 99热网站| 乱性AV| 99精品高潮| 国产伦精品一区二区三区在线观| 精品欧美不卡在线播放| 日本精品九九九| 97操碰| 97在线观看| 情色五月天网| 91爽啪| 亚洲激情综合另类男同| 粉嫩av一区二区三区天美传媒| 啊啊啊啊一区| 综合自拍| 一级A片女人高潮叫床| 啊啊啊爽爽| 国产精品久久久久中文字幕| 91操熟女| se01国产在线视频| 久久一区二区蜜桃| 91美女高潮| 97天天做| 国产亚洲 中文欧美久久| 丁香九月 婷婷| 我要色综合网站| 欧美大干日韩| 亚洲无码国产探花在线观看| 91青青在线| 久操影视| 日韩精品人妻中文字有码在线| 亚洲AV无码天美传媒一区| 极品尤物女神在线观看| 脫衣舞一区二区三区| 欧美激情久操网| 久9精品| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 色999五月色| 大黄片做爱的大的| 日本成人A片网站| 午夜小电影在线插入淫高潮 | 久久98| 九月丁香综合网| 一区二区三区黄片免费观看| 国产色精品午夜大片| 波多野结衣一级视频| 国产AAAAAABBBBB| 2020久久免费视频| 亚洲 暴爽 AV人人爽日日碰| 欧美资源| 欧美一级AAAAAAA| 老熟妇乱轮| 亚洲 无码 偷拍| 国内偷拍精品一区二区| 青草草免费网站av| 亚洲一区二区中文字幕| 成人福利视频网| 欧美亚洲日本激情在线| 高清国产av无码| 色婷婷在线视频| 国色综合天| 中文字幕一区二区无码成人| 亚洲资源站| 亚洲男人电影天堂| 嫩草美女久久| 国产农村一一级特黄毛片| 性爱精品一区| 国产精品麻豆成人AV艾秋| 丁香激情网| 亚洲中文制服诱惑| 国产后入内射| 欧美性性性| 日本在线观看网址| 免费精品99| 精品人妻二区三区| 欧美成人国产精品| 啊啊啊啊啊在线| 日本精品中文字幕视频| 天天激清| 99视频这有这里有精品| 91 亚洲 欧美 日韩 国产 综合| 综合久久婷婷| 另类av天堂| 欧美亚洲韩国视频十五区 | 激情抓乳插进去啪啪啪日韩 | 99精品久久久久久久婷婷蜜桃| 激情综合五月天| 亚洲色图欧美色图制服丝袜| 久超碰这里只有精品| 成人久久久| 成人97人人超碰人人| 秋霞免费AV| 超碰超碰95| 制服诱惑亚洲一区二区三区在线观看| 日本不卡二区| 国产三级电影免费观看| 青久操| 国产精品伦理| 国产精品探花视频| 亚洲情色一区三区| 中文字幕成人乱码熟女精品国50| 久久精品性| 九九英色视频| 葡萄牙性视频一二区| 波多野结衣先锋影音| 天天欧美色| 亚洲久久东京热一二三四五区视频| 亚洲视频精选| 超碰在线成人| 欧亚揄拍偷拍精品视频| 九月丁香婷婷色| 亚洲中文字幕妇伦久久| 97免费在线观看| 去干网最新版| 久久久久久久久国产| 黄色操人| 久久综合中文国产| 精品少妇999| 欧美刺激色黄片免费看| 精吧天堂| 国产 v乱码一区二| 国产精品国产| 日韩乱伦影音先锋| 亚洲人综合| 国产av波波国产精品| 操操操操网黑人| 青青免费在线视频一区| 色性荡荡荡荡视频| 久草尤物| 爽爽爽免费视频| 男女啪啪啪18禁网站| 玖玖视频在线资源一区二区三区| 91肉丝| 女色视频社区| 乱伦强奸区日韩| 亚洲AV无码天美传媒一区| 天天日夜干| 极品色社| 久久成人国产精品| 亚洲和欧美裸体美女双飞视频| 8x福利精品第一福利视频导航| 精彩国产视频播放1区2区| 国产无码精品久久久久久| 天堂资源欧美| 麻花豆传媒剧国产MV出差| 精品九九淫乱男| 亚洲色 国产 欧美 日韩| 精品人妻一区二区三区蜜桃视频| av在线资源| 亚洲人天堂| 无码heyzo高清一区| 天堂69亚洲精品中文字| 超碰97在线中文| 亚洲午夜福利视频| 夜色91| 啊好爽受不了无码| 国产免费操逼| 欧美在线天堂| 综合网亚| 一区二区三区机械有限公司| 日本不卡五区| 亚洲性少妇| 婷婷五月av| 好吊色综合| 99www.bibizy香蕉资源国产一区二区三区高清 | av日韩中文字幕| 日日操天天操| 97资源视频| 久久是精品| 91在线页| 欧美专区日本专区| 五十路熟女人妻一区二区在线观看| 久久夜色一区二区| 天天弄天天操| www..com操老师| 亚洲国产熟妇综合色专区| 歐美性天天| 色婷婷影院| 天堂俺去俺来也www久久婷婷| 天天综合站| 亚洲图片欧美制度| 亚州情色j区| 在线观看色视频| 欧美狠狠干| 我爱操| 美女的肌被草喷水视频| 色999亚洲人成色| 人人贴人人摸| 九九九九精品九九九九| 中文字幕乱妇免费视频| 操逼无毒无码免费视频| 男人的天堂欧美| 五月天激情网图片| 色香色欲天天综合网天天来吧| 久草精品国产99| 人人澡人人干| 天天射天天色成人| 蜜桃臀久久| 蜜臀99999| 亚殴在线| 中文字幕在线播放2中文字幕在线观看2| 日韩人妻有码免费视频| 国产精品白丝在线播放 | 狠狠穞A片一區二區三區| 2019天天干天天操| 激情五月天插| 波多野结衣AV无码一区| 极品销魂美女一区二区| 精品人妻av区天天看片| 日本一二区不卡| 78m成人视线| 欧美综合自拍亚洲综合图| 白丝在线一区| 久久97超碰香蕉| 日韩久草| 日韩丨制服丨中文|在线| 超碰夫妻97| 骚熟女吞| 麻豆精品三区视频| 经典丝袜一区| 97爱啪| 激情文学亚洲| 男人的天堂久久| 久久大香蕉97| 干少妇视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 在线观看中文字幕| 又粗又长又大国产不卡| 亚洲中文字幕熟女| 成 人 A V免费视频在线观看| 综合97| 美女被啪到深处抽搐视频| 午夜操一操| www.亚洲黄色| 国产精品美女在线一区| 91操人| 色婷婷av在线观看| 午夜精品99久久久久传媒| 91久久久久久久久久久| 色欲人妻一区二区在线| 国偷自 一区二区| 色噜噜狠狠色综无码久久| 成人一二三区| a'v在线资源| 老司机深夜18禁污污网站| 尤物黄色在线观看网站| 欧美日韩第一页| 欧美日韩高潮喷水91| 99re3这里只有精品| 国产1727欧美| 美女91| 国产av强奸美女| 超碰AV在线| 亚洲成人精品久久久| 在线观看 99热| 97天天| 大学生口爆吞精| 久久这里只精品99re66图| 超碰亚洲97| 伊人 俄罗斯 a v| 又黄又硬又粗又长国产视频| 亚洲码在线中文在线观看| 日本Xx性爱| 欧美午夜精品久久久久久超碰| 久久久久ab| 国产区在线| 啪啪视频亚洲第一| 亚洲男人bt天堂| 久久草视频污视频| 午夜舔阴达高潮视频免费看| 日本精品不卡一二三区| 高清有码一区二区| 围产精品一区二区三区视频播放| 老女人爆菊| julia ann久久| 亚洲无码成人精品| 精彩视频日韩| 国产视频第二页| 干日本人少妇午夜寂寞影院| 91在线免费观看处女| 国产精品久久久午夜夜伦鲁鲁| 免费αV在线视频| 综合熟女| 一本大道青青| 超碰精品在线| 亚洲天天精品| 午夜120视频在线观看| 麻豆AV一区二区| 超碰色97| 日日狠狠久久偷偷色综合免费| 99re在线视频| 欧美精品日韩久久久九| 日韩成人午夜精品久久高潮| aaa亚无码专区| 69人妻精品一区二区绯色| 十八禁电影伊人网| 911粉嫩人妻| 亚洲熟女一区| 日韩丰满熟妇| 欧美,亚洲,日韩,v,天堂,手机在线观看| 国产亚洲精品无码三区| 99只有精品| 青草草免费网站av| 欧美韩国你懂得在线 | 国产成人综合在线播放| 精品二999| 国产欧美日韩一区二区三区| 骚逼一区二区| 中国国国产一级特黄毛片| 熟女精品一区二区在线观看| 8050无码八戒| 91天堂| 色哟哟国产精品免费网址| 91性感在线| 大香蕉色十月| 国产精品嫩草影院午夜两性 | juliaann丝袜| 欧美AB在线观看| 综合伊人激情| 激情文学 亚洲图片| 亚洲精品啪视频| 日韩操逼HD| 午夜精品久久久久| 成人性爱电影一区二区| 欧美综合另类| 欧美亚洲厕所精品偷拍91 | 茄子社区国产精品| 久久精品国产精品亚洲艾通辽熟妇| 91制服丝袜中文字幕| 久久综合日韩亚洲欧美| a v网站在线播放| 九九九成人| 午夜呻吟欧美| 国产精品久久久久久久毛片1| 超碰精品97| 日韩熟女精品无码专区一区二区| 国产对白刺激视频| 伊人性在线视频| 久久久不能久久久久| 精品国产丝袜一区二区三区乱码 | 婷婷五月色| 午夜国产成人精品视频| 乱色老一区二区三区的观看方式 | 青青草好吊色| 亚洲熟女乱综合一区二区三区| 99色色网| 国产多人在线观看视频| 少妇激情AV| 国产精品小视频一区二区三区| 亚洲精品一区二区精品| 久久精品视频28| 亚洲AV无码乱码在线观看性色| 97天天| 高清肉丝中文无码| 色噜噜狠狠色综无码久久合欧美| 中文AV制服乱伦| 亚洲欧美内射| 女人一区| 激情五月激情综合网| 国产高清精品一区二区三区毛片| 日韩综合第八区国产精品| 俺去久久| 人妻AV 中文字幕的| 久久首页| 一区二区免费电影久久| 天天欧美| 激情小说亚洲视频| www.高清无码诱惑一区.com| 蜜臀久久99精品久久综合| 操www| 国产精品美女视频诱惑| 九九五月天| 9/A片| 欧美黑人精品一区二区| 亚洲精品国产无码高清| 亚洲成人激情小说视频| 国产97av| 伊人9| www.acm成人黄色毛片| 性生活久久久久久久久久| 五月丁香狠狠爱| 久久精品国产免费观看99| 秋霞一集毛片观看| A级国产欧美激情在线| 精品久久97| 天天热精品| 日韩 欧美 国产 麻豆| 丰满少妇一区二区三区四区观看| 五月天婷婷成人网| 国产精品交换一区二区| 婷婷五月天av| 青草伊人网| 动漫av中文| 亚洲视频,小说| 天天干天天日天天射黄色片| 免费看污网站| 九九热免费国产视频婷婷伊人五月 | 熟女人妻精品一区二区视频| 亚洲男人天堂网站| 中文字幕在线免费观看 | 久艾草在线精品视频在线观看| 天天操美美| 青草园大香蕉| 欧美极品少妇| 水滴偷拍| 综合久久9| 男人久久天堂| 粉嫩av在线| 日韩国产精品人妻无码久久久| 国产传媒一区二区三区| 精品无码欧美三级| 国产91影院| 91精品久久久久五月天精品 | 欧美最婬乱婬爆婬性视频 | 中美日韩毛片| 亚洲天堂人人妻| 日韩综合97P| 久久久成人免费av电影| 丝袜视频网国产90| 啊啊啊操死我| 搡老熟女免费视频| 丰满人妻无码一区二区三区| 亚洲黄色a级片| 在线人人人人人人精品超 | 超碰午夜| 天天综合网视频91| 91精品人| 免费伦费视频在线观看| 亚洲精品99| 91精品电影18| 亚州日韩97| 色色色色日本| 极品粉嫩一区二区| 久久9精品| 欧美男人天堂| 太久视频| 美女人妻色网站| 日本一天色道久久久精品视频| 加勒比综合a∨| 一本大道不卡一二三区| 99操视频| 久久九七| 日日骚网站| 午夜视频好爽啊| 亚洲欧美日韩综合在线尤物| 欧美爆操91| 台湾佬中文娱乐网久久久久久久久久com | 熟妇高潮一区二| 夜夜黄| 亚洲密乳AV| 国产欧美伊人| 人妻喷水| 91成人久久| 狠狠狠一区二区三区| 激情四射五月天| 欧美日韩在线小说| 户外裸露刺激视频第一区| 奸色色 男人天堂 天天射| 性交一区二区在线播放| av一区二区三区不卡| 九九黄色视频在线观看| 第45页一区二区| 欧美激情精品| 女人喷水视频在线观看| 欧美日韩大陆黑人少妇99| 一二三区精品视频| 人人摸人人摸人人干| 91撸色网 玖玖网 欧美| 欧美色图电影| 色天使亚洲综合在线观看| 污啪啪啪视频| 四虎精品亚洲| www激情| 成人精品水蜜桃久久久久久久| 中文字幕精品一区欧美| 国产欧美美女免费观看视频| 狠狠色五月亚洲91| 超碰久热| 熟女少妇视频| 伊人成人中文字幕久久网| 欧美性少妇| 日韩一级欧美一级国产一级台湾| 久久香蕉国产传媒一区剧情天美| 色噜噜人妻av中文字幕| 国产激情综合| 青青草在线视频播放器| 五月天综合网| 97这里有精品| 色色丁香| 91无遮挡| 亚洲精品一二三四区| 丁香婷婷五月| 久久久久一本一区二区青青蜜月| 久久精品午夜国产亚洲AV无码| 天天摸天天插天天日| 我要色综合网| 青青草视频久久久久| 伊人国产成人av网站| 国产精品懂色tv影视免费观看| 91九九| 日日碰视频网| 最新欧洲欧美日本激情网站| 日日爱99| 91爰爱欧美| 亚洲日韩美女中文字幕乱| 男人天堂最新手机版在线青青草| 欧美亚洲中文字幕| 超碰日韩美妻| 五月婷婷激情综合| 加勒比综合网| 国产精品久久久久久久久久久久久久久| 天天激情干| 日韩无码一级黄色av片| 性爱久久| 天天做天天爱夜夜爽毛片试看| 久久曰曰| 青青草天天亲夜夜操网| 欧美资源| 蜜桃久久久久久久久久久久| 亚欧日韩成人| 免费视频一二三区| 伊人丝袜美腿高跟在线观看高清| 午夜男人av| 性91| 99re69| 婷婷天堂站| 91色综合| 日韩BBN| 欧美成不卡网| 九色在线熟女国产黑人| 九九九九热| baiduhicn.com。| 床上啊啊啊一区二区三区| 粉嫩av平台| 91国产伊人大香蕉| 韩国女主播青草福利视频| 性爱乱伦网址| 九九综合九九综合| 韩国嫰模上门援交视频| ′ !γ}丶。。久久精品欧美一区二区三区 | 96麻豆精品一区二区三区| 欧美成人色| 色色无码| 日韩欧美字幕亚洲一区二区| 黄色无码高清黄色无码网站| 色狠狠一区二区三区香蕉| 精品福利视频| 亚洲暴力强奸AV| 免费家庭乱伦视频| 亚洲深夜福利| 超碰久久网| 97人人中文网| 国产这里只有精品| 成人精品一区二区91毛片不卡| 在线性黄高清免费视频| 不卡中文字幕aⅴ在线| 豆1无夜无码| 精品人妻一区二区三区-国产精品| 亚洲精品无码少妇久久| 成人无遮挡毛片免费看| 啪啪啪亚欧美视频| 精品少妇99| 操逼无毒无码免费视频| 91夜夜蜜桃臀1区2区3区| 97超碰jingpin| 国产女生在线| 日本性爱少妇| 懂色av色欲av蜜臀av| 国产高清午夜成人在线观看| 色欲久久99国产精品久久久久久| 国产午夜福利合集| 欧美性视频二区三区| 97操在线| 国产盗摄美女如厕大神作品在线观看| 日韩人妻一区二区精品| 在线精品福利免费播放| 欧美极品性爱天天射| 日本日逼高清| 成人性爱av| 国产一区二区三区视频在线看| 一区二区三区美女超清| 成人五级久久| 青青青国产手线观看视频2| 久草尤物| 欧亚无码视频| 日本狂喷奶水在线播放212| 人人妻碰人人免费| 9丨久久九九九| 九九九九九九视频免费| 97超碰美女| 欧美成人性爱视频在线播放| 男女性无套 免费九一| 综合影院永久入口国产| 成全动漫视频观看免费下载| 亚洲一区二区三区中文字幕| 色狠狠 - 百度| 日本熟女中文| 色婷婷电影网| 97干在线看| 欧美内射少妇| 97超碰人操| 超碰久草| 亚洲福利影院一区久久| 日韩三级在线观看网站| 亚洲黄色| 日韩三A大片在线观看| 老熟女乱子伦中文字幕一区二区| 婬女免费一二三区A片| 五月天婷婷基地| 97欧美精品综合| 啊啊啊快操我视频| 精品人妻一区二区三区蜜桃视频| 殴美色网| 久久伊人亚洲AV无码网站| 少妇啪啪自拍| 亚洲激情久久| 91熟女丨91老女人| 人人看人人插| 精品伊人久久久大香线蕉小说| 国产少妇肉丝在线观看| 午夜成人福利影视| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 亚洲欧美国产va在线| 久久熟女嫩草成人片免费 | V A在线| 欧美日韩国产黄色片| 人人操人人摸人人看人人插| 久久久精品视频免费观看| 97精品国产97久久久| 日韩啪啪啪视频| 亚洲三级。日韩三级| 日韩欧洲操屄视频| 欧美另类精品xxxx| 欧美性特| 一区 欧美 日韩 麻豆| 国产欧美日产一区二区三区 - 国产欧美日 | 97色色,97综合| 抽插一区二区视频| 国产一区二区成人av在线播放| 欧美综合区| 另类亚洲图色| 干少妇视频| 欧美性爱三区二区| 9热9热综合网| 台湾佬大香蕉| 五月天婷精品激情| 天天综和| 干超碰碰熟女| 欧美日韩操逼嗦吊| 亚熟hd视频在线| 色香综合| 亚洲激情在线| 加勒比伊人综合| 99久久久久久亚洲精品不卡| 天天综合精品| 0755午夜福利视频| h4610国产人妻| 夜夜嗷嗷一区二区| 热99re69精品8在线播放| 亚洲国产一区二区三区四区国产| 国产传媒一区日韩| 亚洲欧美一区二区网址| 亚洲天堂,男人| 亚洲高清91| 亚洲砖码砖专无区2023| 国产精彩女在线观看视频| 色欲天天婬色婬香WWW夜色| 久久久艹艹艹| 国产成人精品网站| 啪啪啪综合网| 啊啊啊操死我了| 国内自拍 日韩激情 99| 国产白丝在线| 青青草日本中文字幕| 亚洲中文字幕熟女少妇一区二区| 日本久久网| 99色热| 国产精品大香蕉| 青青青草原| 色婷婷导航| 精品久久久久成人码免| 国产福利精品最新在线| 91天天美女| 亚洲成av人片色午夜乱码| 五月天欧美色图| 国产一区二区三区精品观看啪| 香蕉免费一区二区三区不读 | 色香在线| 艹比视频国产精品| 午夜精品久久久久久久99| 伦理片秋霞免费影院| 超碰综合97在线| 99久久精品无码一区二区毛片免费| 75大香蕉| 日本1区2区不卡视频| 日han少妇无码| 婷婷丁香五月天亚洲天堂网| 蜜臀av中文字幕| 亚洲成人在线播放| 91美女小视频| 日本丝袜美腿人妻九九| 欧美的性爱网站免费| 午夜福利在线合集| 国产情侣自拍在线播放| 骚女天天综合网| 欧美老熟另类| 乳欲人妻办公室奶水| 狠狠爱夜夜干| 国产在线76页| 欧美日韩大香蕉| 中文字幕乱偷人妻久久艾草网| 婷婷中文网| 超碰在线人人射| 九九九九日本| 26UUU欧美激情一区二区| 久草老司机| 激情第四色| 天天综合欧美| 亚洲图片 激情小说| 激情六月天| 久久国产熟女影院| 大香蕉手机在线| 狠狠躁AV| 日韩中文字幕在线视频观看| 伊人网高清| 久久国产精品熟女人妻| 在线观看日韩av不卡| 久久永久无码人妻视频| 噜噜噜亚洲精品| 啪啪91| 中文字幕日韩专区精品系列 | 91亚洲丝袜熟女| 美女露胸露屁股| 成人av毛片在线观看| 日韩久草| 国产日本熟女顶级一区二区三区视频| 精品性爱一区二区| 欧美99999| 亚洲极品| 亚洲色91C| 精品国产乱码久久久久久久久1| 亚洲欧美国产成人综合不卡| 中文字幕欧美日韩三级| 蜜桃传媒视频第一区入口在线看| 国产一级久久久| 欧美亚州手机在线| 国产精品一区二区 尿失禁| 一区操逼| 干我久操| 亚洲综合欧美| 水滴偷拍| 九九超碰综合网| 亚洲老司机123专区| 好吊色在线观看| 狠狠干,狠狠操| 国产亚洲日本精品在线| 国产欧美精选自拍一区| 国产狂喷潮在线精品| 少妇天堂| 易易A毛视频| 欧美青青草视频| 精品二999| 久久久久久9| 97亚洲色图| 欧美精品不卡一二三四在线91| 操淫穴亚洲五月丁香 | 丁香五月性爱| 日韩欧美俄罗斯A片| 国产偷拍自拍在线视频| 日本精品中文字幕视频| а√天堂资源官网在线资源| 亚洲不雅视频1区二区| 中文字幕第2页| 国产精品96| 色香天天| 国产精品ww久久| 亚洲天堂资源网| 好爽视频在线观看视频| 欧美亚洲天天| 天天干18禁| 国产一级内射高清视频| 试看60秒 爽| 国产成人欧美精品在线| 91无遮挡| 亚洲国产精品无码AV久久久| 沈阳熟女高潮对白视频| 无码操逼视频一下| 18禁免费视频| www.av在线视频| 亚洲国产午夜真人一级片中文字幕精品黄网站| 日本黄色大片一级视频免费麻豆| 天天操夜夜嗨| 亚洲日韩美国人妻| 在线国产探花| 一色网男人的天堂| 91色艳| 天天看特黄的免费网站| 狠综合网| 99热线麻豆| 香蕉精品二区二区| AV乱伦国产| 色色色欧美| 极品尤物在线观看| 99久久com免费视频′| 老鸭窝亚洲毛片| 久久免费精品96| 少妇500双飞99| www.acm成人黄色毛片| 九九热国产| 一级一性爱免费视频| 无码黑人精品一区二区三区三| 日韩欧美俄罗斯A片| 日韩人妻大香蕉| 97国产天堂岛| 夜夜骑日日| 亚州熟女乱伦| 口爆吞精在线观看| 欧美日韩丝袜 | 中文字幕在线观| 色色色色日本| 99欧美| 久久爱超碰网| 狠狠97| 亚洲日韩视频二区| 五月天婷婷色| 97久久精品亚洲中六字幕| 亚洲精品黑丝| 啊啊啊好多水| 淫荡熟女乱伦网| 亚洲国产成人福利在线观看| 人人操av| 91欧美性| 欧美天天综合| 极品色www影院| 人妻在线臀日韩| 97中文综合| 被男人添B超爽视频| 国产亚洲综合欧美一区| 1区2区3区中文字幕日韩| 丰满欧美放荡少妇在线| 国产一区免费午夜视频| 色99视频| 天美传媒av一区二区| 在线亚洲 欧美 日本专区| 欧美亚洲日本视频久久久| 五月天伊人| 欧美日韩97| 国模少妇一区二区三区| 成人一区二区三区四区| 久久精品日韩专区免费观看| 97超级久久强资源| 福利五区| 色色网91| 女人一区| 日韩成人人妻网站| 一本一道波多野毛片中文在线| 亚洲综合另类欧美久久久| 尤物视频新赏网鲜网色诱网| 亚洲成a人片在线观看中文!!!| 国产不卡片| 精品人妻久久久| 国产精品99久久久www| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日韩簧片免费看| 成年女人18级毛片毛片免费观看| 亚洲青青草| 国语精品内射在线观看| 中文字日本乱码| 欧美gv在线观看| 人人爽夜夜操| 91无遮挡| 九九久久久九九| 超碰97综合| 尹人大香蕉视频在线| 国产精品不卡少妇白| 天天看,天天做| 亚洲欧美综合图片| 风流老熟女一区二区三区l| 天天影视射综合网| 久久一区二区高清免费| 欧美白嫩女HD| 综合欧美激情网| 青青操视频在线| 人人插人人摸人人| 久久久久极品| 五月婷久久| 精品免费囯产一区二区三区| 狠狠操夜夜操蜜桃视频三区| 久久久一区二区三区麻豆| 啪啪啪综合网| 99久久99久久免费精品蜜臀| 国产 亚洲 丝袜 制服| 青青伊人久久| 尤物黄色在线观看网站| 亚洲综合色在线| 99热婷婷| 天天综合网日韩| 青青草日本中文字幕| 男女激情黄色网址| 天天热精品| 丁香六月激情综合| 四虎国产精品永久在线囯在线| 大香蕉在线86| 亚洲中文日韩欧美大香蕉视频| 免费人人搞97| 国产精品黄色三级av| 试看60秒| 久久东京国产精品视频| 日韩电影免费网站麻豆视频| 欧美麻豆成人同性GⅤ在线| 97视频免费在线| 大鸡巴久久久| 人人插人人摸人人| 99热在线只有精品| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 亚洲 小说 欧美 激情 另类| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 欧美刺激色黄片免费看| 日韩啪啪视频| 丁香五月婷婷基地| 最新国内自拍av免费| 大白逼三四级| 插入综合网| 国产亚洲精品美女久久久m| 国产精品操| 偷拍在线观看视频| 婷婷中文字幕| 影音先锋视频在线| 91情色在线| 日韩无码AB| 免费看毛片操穴| 国产高清精品一区二区三区毛片| 欧美操逼录像国产黄色国产| 精品一久久久| 欧美黄片视频在线观看免费| 成人av毛片在线观看| 成人区人妻精品一| 自拍盗摄一区| 九九色色| 欧美性爱十八禁| 亚洲色婷婷久久91| 久久久一区二区三区麻豆| 久久久久久久国产| 日本色婷婷| 丝袜美腿制服人妻二区中文字幕 | 女人久久久| 偷拍偷窥与盗摄视频专区| 尤物视频偷拍免费| 丝袜喷水在线| 五月激情综合网| 另类TS人妖一区二区三区 | 人妻久热在线| 十八禁视频一区二区| 欧美日韩狠狠爱| 中出20p| 99热导航| 久久国产精品91| 涩涩五月天| 91狠狠综合久久久| 免费精品人妻一区二区三| 中国农村熟妇毛片视频| 欧美一区二区男人天堂| 欧日韩一二三f区| 亚洲和欧美裸体美女双飞视频| 夜夜操二区| 亚洲AV无码久久久国产精品| 日韩精品一区二区日韩| 手机看片91人妻| 老熟女网站| 东京热毛片177b2viP| 欧美性色欧美| 伊人久久亚洲色欲综合网站| 婷婷15月天青娱乐| 欧美在线55555| av在线浏览| 亚洲情色一区综合| 少妇蜜汁| 中文字幕高清20页视频| 色综合五月天| 狠狠狠狠狠狠| 九九性爱网| 超碰九色| 在线观看一卡二卡| 久久老子无码午夜伦不卡| 91另类| 人人澡人人澡人人| 天天性射网| 精品人妻一区二区免费看| 青草一区二区| 日本亚洲嫩草影院啪啪| 综合熟妇一区二区三区| 亚州欧美在线| 91熟女在线| 日日夜夜摸| 黄片qw| 奇米狠999| 91操人视频|