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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从attention到Transformer+CV中的self-attention

發布時間:2024/7/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从attention到Transformer+CV中的self-attention 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.總體結構

由于rnn等循環神經網絡有時序依賴,導致無法并行計算,而Transformer主體框架是一個encoder-decoder結構,去掉了RNN序列結構,完全基于attention和全連接。同時為了彌補詞與詞之間時序信息,將詞位置embedding成向量輸入模型.

二.每一步拆分

1.padding mask

對于輸入序列一般我們都要進行padding補齊,也就是說設定一個統一長度N,在較短的序列后面填充0到長度為N。對于那些補零的數據來說,我們的attention機制不應該把注意力放在這些位置上,所以我們需要進行一些處理。具體的做法是,把這些位置的值加上一個非常大的負數(負無窮),這樣經過softmax后,這些位置的權重就會接近0。Transformer的padding mask實際上是一個張量,每個值都是一個Boolean,值為false的地方就是要進行處理的地方。

def padding_mask(seq_k, seq_q):len_q = seq_q.size(1)print('=len_q:', len_q)# `PAD` is 0pad_mask_ = seq_k.eq(0)#每句話的pad maskprint('==pad_mask_:', pad_mask_)pad_mask = pad_mask_.unsqueeze(1).expand(-1, len_q, -1) # shape [B, L_q, L_k]#作用于attention的maskprint('==pad_mask', pad_mask)return pad_maskdef debug_padding_mask():Bs = 2inputs_len = np.random.randint(1, 5, Bs).reshape(Bs, 1)print('==inputs_len:', inputs_len)vocab_size = 6000 # 詞匯數max_seq_len = int(max(inputs_len))# vocab_size = int(max(inputs_len))x = np.zeros((Bs, max_seq_len), dtype=np.int)for s in range(Bs):for j in range(inputs_len[s][0]):x[s][j] = j + 1x = torch.LongTensor(torch.from_numpy(x))print('x.shape', x.shape)mask = padding_mask(seq_k=x, seq_q=x)print('==mask:', mask.shape)if __name__ == '__main__':debug_padding_mask()

2.Position encoding

其也叫做Position embedding,由于Transformer模型沒有使用RNN,故Position encoding(PE)的目的就是實現文本序列的順序(或者說位置)信息而出現的。

代碼實現如下:輸入batch內的詞位置,輸出是batch內的每個詞的位置embedding向量.

class PositionalEncoding(nn.Module):def __init__(self, d_model, max_seq_len):"""初始化Args:d_model: 一個標量。模型的維度,論文默認是512max_seq_len: 一個標量。文本序列的最大長度"""super(PositionalEncoding, self).__init__()# 根據論文給的公式,構造出PE矩陣position_encoding = np.array([[pos / np.power(10000, 2.0 * (j // 2) / d_model) for j in range(d_model)]for pos in range(max_seq_len)]).astype(np.float32)# 偶數列使用sin,奇數列使用cosposition_encoding[:, 0::2] = np.sin(position_encoding[:, 0::2])position_encoding[:, 1::2] = np.cos(position_encoding[:, 1::2])# 在PE矩陣的第一行,加上一行全是0的向量,代表這`PAD`的positional encoding# 在word embedding中也經常會加上`UNK`,代表位置單詞的word embedding,兩者十分類似# 那么為什么需要這個額外的PAD的編碼呢?很簡單,因為文本序列的長度不一,我們需要對齊,# 短的序列我們使用0在結尾補全,我們也需要這些補全位置的編碼,也就是`PAD`對應的位置編碼position_encoding = torch.from_numpy(position_encoding) # [max_seq_len, model_dim]# print('==position_encoding.shape:', position_encoding.shape)pad_row = torch.zeros([1, d_model])position_encoding = torch.cat((pad_row, position_encoding)) # [max_seq_len+1, model_dim]# print('==position_encoding.shape:', position_encoding.shape)# 嵌入操作,+1是因為增加了`PAD`這個補全位置的編碼,# Word embedding中如果詞典增加`UNK`,我們也需要+1??窗?#xff0c;兩者十分相似self.position_encoding = nn.Embedding(max_seq_len + 1, d_model)self.position_encoding.weight = nn.Parameter(position_encoding,requires_grad=False)def forward(self, input_len):"""神經網絡的前向傳播。Args:input_len: 一個張量,形狀為[BATCH_SIZE, 1]。每一個張量的值代表這一批文本序列中對應的長度。Returns:返回這一批序列的位置編碼,進行了對齊。"""# 找出這一批序列的最大長度max_len = torch.max(input_len)tensor = torch.cuda.LongTensor if input_len.is_cuda else torch.LongTensor# 對每一個序列的位置進行對齊,在原序列位置的后面補上0# 這里range從1開始也是因為要避開PAD(0)的位置input_pos = tensor([list(range(1, len + 1)) + [0] * (max_len - len) for len in input_len])# print('==input_pos:', input_pos)#pad補齊# print('==input_pos.shape:', input_pos.shape)#[bs, max_len]return self.position_encoding(input_pos)def debug_posion():"""d_model:模型的維度"""bs = 16x_sclar = np.random.randint(1, 30, bs).reshape(bs, 1)model = PositionalEncoding(d_model=512, max_seq_len=int(max(x_sclar)))x = torch.from_numpy(x_sclar)#[bs, 1]print('===x:', x)print('====x.shape', x.shape)out = model(x)print('==out.shape:', out.shape)#[bs, max_seq_len, model_dim] if __name__ == '__main__':debug_posion()

3.Scaled dot-product attention實現

Q,K,V:可看成一個batch內詞的三個embedding向量和矩陣相乘得到的,而這個矩陣就是需要學習的,通過Q,K獲取attention score作用于V上獲取加權的V.這樣一句話的不同詞就獲取了不同關注度.注意,Q,K,V這 3 個向量一般比原來的詞向量的長度更小。假設這 3 個向量的長度是64 ,而原始的詞向量或者最終輸出的向量的長度是 512(Q,K,V這 3 個向量的長度,和最終輸出的向量長度,是有倍數關系的)

上圖中,有兩個詞向量:Thinking 的詞向量 x1 和 Machines 的詞向量 x2。以 x1 為例,X1 乘以 WQ 得到 q1,q1 就是 X1 對應的 Query 向量。同理,X1 乘以 WK 得到 k1,k1 是 X1 對應的 Key 向量;X1 乘以 WV 得到 v1,v1 是 X1 對應的 Value 向量。

對應代碼實現:?

class ScaledDotProductAttention(nn.Module):"""Scaled dot-product attention mechanism."""def __init__(self, attention_dropout=0.5):super(ScaledDotProductAttention, self).__init__()self.dropout = nn.Dropout(attention_dropout)self.softmax = nn.Softmax(dim=2)def forward(self, q, k, v, scale=None, attn_mask=None):"""前向傳播.Args:q: Queries張量,形狀為[B, L_q, D_q]k: Keys張量,形狀為[B, L_k, D_k]v: Values張量,形狀為[B, L_v, D_v],一般來說就是kscale: 縮放因子,一個浮點標量attn_mask: Masking張量,形狀為[B, L_q, L_k]Returns:上下文張量和attetention張量"""attention = torch.bmm(q, k.transpose(1, 2)) # [B, sequence, sequence]print('===attention.shape', attention)if scale:attention = attention * scaleif attn_mask is not None:# 給需要mask的地方設置一個負無窮attention = attention.masked_fill_(attn_mask, -np.inf)print('===attention.shape', attention)attention = self.softmax(attention) # [B, sequence, sequence]# print('===attention.shape', attention.shape)attention = self.dropout(attention) # [B, sequence, sequence]# print('===attention.shape', attention.shape)context = torch.bmm(attention, v) # [B, sequence, dim]return context, attentiondef debug_scale_attention():model = ScaledDotProductAttention()# B, L_q, D_q = 32, 100, 128B, L_q, D_q = 2, 4, 10pading_mask = torch.tensor([[[False, False, False, False],[False, False, False, False],[False, False, False, False],[False, False, False, False]],[[False, False, True, True],[False, False, True, True],[False, False, True, True],[False, False, True, True]]])q, k, v = torch.rand(B, L_q, D_q), torch.rand(B, L_q, D_q), torch.rand(B, L_q, D_q)print('==q.shape:', q.shape)print('====k.shape', k.shape)print('==v.shape:', v.shape)out = model(q, k, v, attn_mask=pading_mask) if __name__ == '__main__':debug_scale_attention()

注意q和k,v維度可以不一樣

import torch.nn as nn d_model = 256 nhead = 8 multihead_attn1 = nn.MultiheadAttention(d_model, nhead, dropout=0.1) src1 = torch.rand((256, 1, 256)) src2 = torch.rand((1024, 1, 256)) src2_key_padding_mask = torch.zeros((1, 1024)) src12 = multihead_attn1(query=src1,key=src2,value=src2, attn_mask=None,key_padding_mask=src2_key_padding_mask)[0]print('=src12.shape:', src12.shape)key_padding_mask = torch.zeros((1, 1024)) num_heads = 8 q = torch.rand((256, 1, 256)) tgt_len, bsz, embed_dim = q.size() head_dim = embed_dim // num_heads q = q.contiguous().view(tgt_len, bsz * num_heads, head_dim).transpose(0, 1) print('==q.shape:', q.shape) k = torch.rand((1024, 1, 256)) v = torch.rand((1024, 1, 256)) k = k.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1) src_len = k.size(1) v = v.contiguous().view(-1, bsz * num_heads, head_dim).transpose(0, 1) print('==k.shape:', k.shape) print('==v.shape:', v.shape) attn_output_weights = torch.bmm(q, k.transpose(1, 2)) print('==attn_output_weights.shape:', attn_output_weights.shape) if key_padding_mask is not None:attn_output_weights = attn_output_weights.view(bsz, num_heads, tgt_len, src_len)attn_output_weights = attn_output_weights.masked_fill(key_padding_mask.unsqueeze(1).unsqueeze(2),float('-inf'),)attn_output_weights = attn_output_weights.view(bsz * num_heads, tgt_len, src_len) attn_output_weights = F.softmax(attn_output_weights, dim=-1) print('==attn_output_weights.shape:', attn_output_weights.shape) attn_output = torch.bmm(attn_output_weights, v) print('==attn_output.shape:', attn_output.shape) attn_output = attn_output.transpose(0, 1).contiguous().view(tgt_len, bsz, embed_dim) print('==attn_output.shape:', attn_output.shape)

?

4.Multi-Head Attention

? ? ? ? ? ? ? ? ? ? ??

其中H就是Multi-Head可看出首先對Q,K,V進行一次線性變換,然后進行切分,對每一個切分的部分進行attention(Scaled dot-product attention),然后最后將結果進行合并.有一種類似通道加權的感覺.

對應代碼實現:?

class MultiHeadAttention(nn.Module):def __init__(self, model_dim=512, num_heads=8, dropout=0.0):"""model_dim:詞向量維度num_heads:頭個數"""super(MultiHeadAttention, self).__init__()self.dim_per_head = model_dim // num_heads#split個數也就是每個head要處理維度self.num_heads = num_headsself.linear_k = nn.Linear(model_dim, self.dim_per_head * num_heads)self.linear_v = nn.Linear(model_dim, self.dim_per_head * num_heads)self.linear_q = nn.Linear(model_dim, self.dim_per_head * num_heads)self.dot_product_attention = ScaledDotProductAttention(dropout)self.linear_final = nn.Linear(model_dim, model_dim)self.dropout = nn.Dropout(dropout)self.layer_norm = nn.LayerNorm(model_dim)def forward(self, key, value, query, attn_mask=None):residual = query# [B, sequence, model_dim]dim_per_head = self.dim_per_headnum_heads = self.num_headsbatch_size = key.size(0)# linear projectionkey = self.linear_k(key)# [B, sequence, model_dim]value = self.linear_v(value)# [B, sequence, model_dim]query = self.linear_q(query)# [B, sequence, model_dim]# print('===key.shape:', key.shape)# print('===value.shape:', value.shape)# print('==query.shape:', query.shape)# split by headskey = key.view(batch_size * num_heads, -1, dim_per_head)# [B* num_heads, sequence, model_dim//*num_heads]value = value.view(batch_size * num_heads, -1, dim_per_head)# [B* num_heads, sequence, model_dim//*num_heads]query = query.view(batch_size * num_heads, -1, dim_per_head)# [B* num_heads, sequence, model_dim//*num_heads]# print('===key.shape:', key.shape)# print('===value.shape:', value.shape)# print('==query.shape:', query.shape)if attn_mask:attn_mask = attn_mask.repeat(num_heads, 1, 1)# scaled dot product attentionscale = (key.size(-1) // num_heads) ** -0.5context, attention = self.dot_product_attention(query, key, value, scale, attn_mask)# print('===context.shape', context.shape)# [B* num_heads, sequence, model_dim//*num_heads]# print('===attention.shape', attention.shape)# [B* num_heads, sequence, sequence]# concat headscontext = context.view(batch_size, -1, dim_per_head * num_heads)# [B, sequence, model_dim]# print('===context.shape', context.shape)# final linear projectionoutput = self.linear_final(context)# [B, sequence, model_dim]# print('===context.shape', context.shape)# dropoutoutput = self.dropout(output)# add residual and norm layeroutput = self.layer_norm(residual + output)# [B, sequence, model_dim]# print('==output.shape:', output.shape)return output, attention def debug_mutil_head_attention():model = MultiHeadAttention()B, L_q, D_q = 32, 100, 512q, k, v = torch.rand(B, L_q, D_q), torch.rand(B, L_q, D_q), torch.rand(B, L_q, D_q)# print('==q.shape:', q.shape)# [B, sequence, model_dim]# print('====k.shape', k.shape)# [B, sequence, model_dim]# print('==v.shape:', v.shape)# [B, sequence, model_dim]out, _ = model(q, k, v)# [B, sequence, model_dim]print('==out.shape:', out.shape) if __name__ == '__main__':debug_mutil_head_attention()

5.Positional-wise feed forward network(前饋神經網絡層)

如上圖中畫框就是其所在,

代碼:

#Position-wise Feed Forward Networks class PositionalWiseFeedForward(nn.Module):def __init__(self, model_dim=512, ffn_dim=2048, dropout=0.0):"""model_dim:詞向量的維度ffn_dim:卷積輸出的維度"""super(PositionalWiseFeedForward, self).__init__()self.w1 = nn.Conv1d(model_dim, ffn_dim, 1)self.w2 = nn.Conv1d(ffn_dim, model_dim, 1)self.dropout = nn.Dropout(dropout)self.layer_norm = nn.LayerNorm(model_dim)def forward(self, x):#[B, sequence, model_dim]output = x.transpose(1, 2)#[B, model_dim, sequence]# print('===output.shape:', output.shape)output = self.w2(F.relu(self.w1(output)))#[B, model_dim, sequence]output = self.dropout(output.transpose(1, 2))#[B, sequence, model_dim]# add residual and norm layeroutput = self.layer_norm(x + output)return outputdef debug_PositionalWiseFeedForward():B, L_q, D_q = 32, 100, 512x = torch.rand(B, L_q, D_q)model = PositionalWiseFeedForward()out = model(x)print('==out.shape:', out.shape) if __name__ == '__main__':debug_PositionalWiseFeedForward()

6.encoder實現

其共有6層4,5的結構,可看出q k v 均來自同一文本.

def sequence_mask(seq):batch_size, seq_len = seq.size()mask = torch.triu(torch.ones((seq_len, seq_len), dtype=torch.uint8),diagonal=1)mask = mask.unsqueeze(0).expand(batch_size, -1, -1) # [B, L, L]return maskdef padding_mask(seq_k, seq_q):len_q = seq_q.size(1)# `PAD` is 0pad_mask = seq_k.eq(0)pad_mask = pad_mask.unsqueeze(1).expand(-1, len_q, -1) # shape [B, L_q, L_k]return pad_maskclass EncoderLayer(nn.Module):"""一個encode的layer實現"""def __init__(self, model_dim=512, num_heads=8, ffn_dim=2018, dropout=0.0):super(EncoderLayer, self).__init__()self.attention = MultiHeadAttention(model_dim, num_heads, dropout)self.feed_forward = PositionalWiseFeedForward(model_dim, ffn_dim, dropout)def forward(self, inputs, attn_mask=None):# self attention# [B, sequence, model_dim] [B* num_heads, sequence, sequence]context, attention = self.attention(inputs, inputs, inputs, attn_mask)# feed forward networkoutput = self.feed_forward(context) # [B, sequence, model_dim]return output, attentionclass Encoder(nn.Module):"""編碼器實現 總共6層"""def __init__(self,vocab_size,max_seq_len,num_layers=6,model_dim=512,num_heads=8,ffn_dim=2048,dropout=0.0):super(Encoder, self).__init__()self.encoder_layers = nn.ModuleList([EncoderLayer(model_dim, num_heads, ffn_dim, dropout) for _ in range(num_layers)])self.seq_embedding = nn.Embedding(vocab_size + 1, model_dim, padding_idx=0)self.pos_embedding = PositionalEncoding(model_dim, max_seq_len)# [bs, max_seq_len] [bs, 1]def forward(self, inputs, inputs_len):output = self.seq_embedding(inputs) # [bs, max_seq_len, model_dim]print('========output.shape', output.shape)# 加入位置信息embeddingoutput += self.pos_embedding(inputs_len) # [bs, max_seq_len, model_dim]print('========output.shape', output.shape)self_attention_mask = padding_mask(inputs, inputs)attentions = []for encoder in self.encoder_layers:output, attention = encoder(output, attn_mask=None)# output, attention = encoder(output, self_attention_mask)attentions.append(attention)return output, attentionsdef debug_encoder():Bs = 16inputs_len = np.random.randint(1, 30, Bs).reshape(Bs, 1)# print('==inputs_len:', inputs_len) # 模擬獲取每個詞的長度vocab_size = 6000 # 詞匯數max_seq_len = int(max(inputs_len))# vocab_size = int(max(inputs_len))x = np.zeros((Bs, max_seq_len), dtype=np.int)for s in range(Bs):for j in range(inputs_len[s][0]):x[s][j] = j+1x = torch.LongTensor(torch.from_numpy(x))inputs_len = torch.from_numpy(inputs_len)#[Bs, 1]model = Encoder(vocab_size=vocab_size, max_seq_len=max_seq_len)# x = torch.LongTensor([list(range(1, max_seq_len + 1)) for _ in range(Bs)])#模擬每個單詞print('==x.shape:', x.shape)print(x)model(x, inputs_len=inputs_len)if __name__ == '__main__':debug_encoder()

7.Sequence Mask

樣本:“我/愛/機器/學習”和 "i/ love /machine/ learning"

訓練:
7.1. 把“我/愛/機器/學習”embedding后輸入到encoder里去,最后一層的encoder最終輸出的outputs [10, 512](假設我們采用的embedding長度為512,而且batch size = 1),此outputs 乘以新的參數矩陣,可以作為decoder里每一層用到的K和V;

7.2. 將<bos>作為decoder的初始輸入,將decoder的最大概率輸出詞 A1和‘i’做cross entropy計算error。

7.3. 將<bos>,"i" 作為decoder的輸入,將decoder的最大概率輸出詞 A2 和‘love’做cross entropy計算error。

7.4. 將<bos>,"i","love" 作為decoder的輸入,將decoder的最大概率輸出詞A3和'machine' 做cross entropy計算error。

7.5. 將<bos>,"i","love ","machine" 作為decoder的輸入,將decoder最大概率輸出詞A4和‘learning’做cross entropy計算error。

7.6. 將<bos>,"i","love ","machine","learning" 作為decoder的輸入,將decoder最大概率輸出詞A5和終止符</s>做cross entropy計算error。

可看出上述訓練過程是挨個單詞串行進行的,故引入sequence mask,用于并行訓練.

作用生成

8.decoder實現

也是循環6層,可以看出decoder的soft-attention,q來自于decoder,k和v來自于encoder。它體現的是encoder對decoder的加權貢獻。

class DecoderLayer(nn.Module):"""解碼器的layer實現"""def __init__(self, model_dim, num_heads=8, ffn_dim=2048, dropout=0.0):super(DecoderLayer, self).__init__()self.attention = MultiHeadAttention(model_dim, num_heads, dropout)self.feed_forward = PositionalWiseFeedForward(model_dim, ffn_dim, dropout)# [B, sequence, model_dim] [B, sequence, model_dim]def forward(self,dec_inputs,enc_outputs,self_attn_mask=None,context_attn_mask=None):# self attention, all inputs are decoder inputs# [B, sequence, model_dim] [B* num_heads, sequence, sequence]dec_output, self_attention = self.attention(key=dec_inputs, value=dec_inputs, query=dec_inputs, attn_mask=self_attn_mask)# context attention# query is decoder's outputs, key and value are encoder's inputs# [B, sequence, model_dim] [B* num_heads, sequence, sequence]dec_output, context_attention = self.attention(key=enc_outputs, value=enc_outputs, query=dec_output, attn_mask=context_attn_mask)# decoder's output, or contextdec_output = self.feed_forward(dec_output) # [B, sequence, model_dim]return dec_output, self_attention, context_attentionclass Decoder(nn.Module):"""解碼器"""def __init__(self,vocab_size,max_seq_len,num_layers=6,model_dim=512,num_heads=8,ffn_dim=2048,dropout=0.0):super(Decoder, self).__init__()self.num_layers = num_layersself.decoder_layers = nn.ModuleList([DecoderLayer(model_dim, num_heads, ffn_dim, dropout) for _ inrange(num_layers)])self.seq_embedding = nn.Embedding(vocab_size + 1, model_dim, padding_idx=0)self.pos_embedding = PositionalEncoding(model_dim, max_seq_len)def forward(self, inputs, inputs_len, enc_output, context_attn_mask=None):output = self.seq_embedding(inputs)output += self.pos_embedding(inputs_len)print('==output.shape:', output.shape)self_attention_padding_mask = padding_mask(inputs, inputs)seq_mask = sequence_mask(inputs)self_attn_mask = torch.gt((self_attention_padding_mask + seq_mask), 0)self_attentions = []context_attentions = []for decoder in self.decoder_layers:# [B, sequence, model_dim] [B* num_heads, sequence, sequence] [B* num_heads, sequence, sequence]output, self_attn, context_attn = decoder(output, enc_output, self_attn_mask=None, context_attn_mask=None)self_attentions.append(self_attn)context_attentions.append(context_attn)return output, self_attentions, context_attentionsdef debug_decoder():Bs = 2model_dim = 512vocab_size = 6000 #詞匯數inputs_len = np.random.randint(1, 5, Bs).reshape(Bs, 1)#batch里每句話的單詞個數inputs_len = torch.from_numpy(inputs_len) # [Bs, 1]max_seq_len = int(max(inputs_len))x = np.zeros((Bs, max_seq_len), dtype=np.int)for s in range(Bs):for j in range(inputs_len[s][0]):x[s][j] = j + 1x = torch.LongTensor(torch.from_numpy(x))#模擬每個單詞# x = torch.LongTensor([list(range(1, max_seq_len + 1)) for _ in range(Bs)])print('==x:', x)print('==x.shape:', x.shape)model = Decoder(vocab_size=vocab_size, max_seq_len=max_seq_len, model_dim=model_dim)enc_output = torch.rand(Bs, max_seq_len, model_dim) #[B, sequence, model_dim]print('==enc_output.shape:', enc_output.shape)out, self_attentions, context_attentions = model(inputs=x, inputs_len=inputs_len, enc_output=enc_output)print('==out.shape:', out.shape)#[B, sequence, model_dim]print('==len(self_attentions):', len(self_attentions), self_attentions[0].shape)print('==len(context_attentions):', len(context_attentions), context_attentions[0].shape)if __name__ == '__main__':debug_decoder()

9.transformer

將encoder和decoder組合起來即可.

class Transformer(nn.Module):def __init__(self,src_vocab_size,src_max_len,tgt_vocab_size,tgt_max_len,num_layers=6,model_dim=512,num_heads=8,ffn_dim=2048,dropout=0.2):super(Transformer, self).__init__()self.encoder = Encoder(src_vocab_size, src_max_len, num_layers, model_dim,num_heads, ffn_dim, dropout)self.decoder = Decoder(tgt_vocab_size, tgt_max_len, num_layers, model_dim,num_heads, ffn_dim, dropout)self.linear = nn.Linear(model_dim, tgt_vocab_size, bias=False)self.softmax = nn.Softmax(dim=2)def forward(self, src_seq, src_len, tgt_seq, tgt_len):context_attn_mask = padding_mask(tgt_seq, src_seq)print('==context_attn_mask.shape', context_attn_mask.shape)output, enc_self_attn = self.encoder(src_seq, src_len)output, dec_self_attn, ctx_attn = self.decoder(tgt_seq, tgt_len, output, context_attn_mask)output = self.linear(output)output = self.softmax(output)return output, enc_self_attn, dec_self_attn, ctx_attn def debug_transoform():Bs = 4#需要翻譯的encode_inputs_len = np.random.randint(1, 10, Bs).reshape(Bs, 1)src_vocab_size = 6000 # 詞匯數encode_max_seq_len = int(max(encode_inputs_len))encode_x = np.zeros((Bs, encode_max_seq_len), dtype=np.int)for s in range(Bs):for j in range(encode_inputs_len[s][0]):encode_x[s][j] = j + 1encode_x = torch.LongTensor(torch.from_numpy(encode_x))#翻譯的結果decode_inputs_len = np.random.randint(1, 10, Bs).reshape(Bs, 1)target_vocab_size = 5000 # 詞匯數decode_max_seq_len = int(max(decode_inputs_len))decode_x = np.zeros((Bs, decode_max_seq_len), dtype=np.int)for s in range(Bs):for j in range(decode_inputs_len[s][0]):decode_x[s][j] = j + 1decode_x = torch.LongTensor(torch.from_numpy(decode_x))encode_inputs_len = torch.from_numpy(encode_inputs_len) # [Bs, 1]decode_inputs_len = torch.from_numpy(decode_inputs_len) # [Bs, 1]model = Transformer(src_vocab_size=src_vocab_size, src_max_len=encode_max_seq_len, tgt_vocab_size=target_vocab_size, tgt_max_len=decode_max_seq_len)# x = torch.LongTensor([list(range(1, max_seq_len + 1)) for _ in range(Bs)])#模擬每個單詞print('==encode_x.shape:', encode_x.shape)print('==decode_x.shape:', decode_x.shape)model(encode_x, encode_inputs_len, decode_x, decode_inputs_len) if __name__ == '__main__':debug_transoform()

10.總結

(1):相比lstm而言,其能夠實現并行,而lstm由于依賴上一時刻只能串行輸出;
(2):利用self-attention將每個詞之間距離縮短為1,大大緩解了長距離依賴問題,所以網絡相比lstm能夠堆疊得更深;
(3):Transformer可以同時融合前后位置的信息,而雙向LSTM只是簡單的將兩個方向的結果相加,嚴格來說仍然是單向的;
(4):完全基于attention的Transformer,可以表達字與字之間的相關關系,可解釋性更強;
(5):Transformer位置信息只能依靠position encoding,故當語句較短時效果不一定比lstm好;
(6):attention計算量為O(n^2), n為文本長度,計算量較大;
(7):相比CNN能夠捕獲全局的信息,而不是局部信息,所以CNN缺乏對數據的整體把握。

三.CV中的self-attention

介紹完了nlp的self-attention,現在介紹CV中的,如下圖所示。

1.feature map通過1*1卷積獲得,q,k,v三個向量,q與k轉置相乘得到attention矩陣,進行softmax歸一化到0到1,在作用于V,得到每個像素的加權.

2.softmax

3,加權求和

import torch import torch.nn as nn import torch.nn.functional as Fclass Self_Attn(nn.Module):""" Self attention Layer"""def __init__(self, in_dim):super(Self_Attn, self).__init__()self.chanel_in = in_dimself.query_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)self.key_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim // 8, kernel_size=1)self.value_conv = nn.Conv2d(in_channels=in_dim, out_channels=in_dim, kernel_size=1)self.gamma = nn.Parameter(torch.zeros(1))self.softmax = nn.Softmax(dim=-1)def forward(self, x):"""inputs :x : input feature maps( B * C * W * H)returns :out : self attention value + input featureattention: B * N * N (N is Width*Height)"""m_batchsize, C, width, height = x.size()proj_query = self.query_conv(x).view(m_batchsize, -1, width * height).permute(0, 2, 1) # B*N*Cproj_key = self.key_conv(x).view(m_batchsize, -1, width * height) # B*C*Nenergy = torch.bmm(proj_query, proj_key) # batch的matmul B*N*Nattention = self.softmax(energy) # B * (N) * (N)proj_value = self.value_conv(x).view(m_batchsize, -1, width * height) # B * C * Nout = torch.bmm(proj_value, attention.permute(0, 2, 1)) # B*C*Nout = out.view(m_batchsize, C, width, height) # B*C*H*Wout = self.gamma * out + xreturn out, attentiondef debug_attention():attention_module = Self_Attn(in_dim=128)#B,C,H,Wx = torch.rand((2, 128, 100, 100))attention_module(x)if __name__ == '__main__':debug_attention()

參考:

舉個例子講下transformer的輸入輸出細節及其他 - 知乎

The Illustrated Transformer – Jay Alammar – Visualizing machine learning one concept at a time.

machine-learning-notes/transformer_pytorch.ipynb at master · luozhouyang/machine-learning-notes · GitHub

總結

以上是生活随笔為你收集整理的从attention到Transformer+CV中的self-attention的全部內容,希望文章能夠幫你解決所遇到的問題。

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

亚洲在线观看av | 亚洲人视频在线 | 69国产盗摄一区二区三区五区 | 国产精品 日韩 | 91香蕉视频好色先生 | 久久av在线播放 | 在线国产能看的 | 精品久久久网 | 91爱爱免费观看 | 久久久久中文字幕 | 九九免费在线观看 | 91视频 - v11av | av大全在线看 | 日韩精品短视频 | 特级xxxxx欧美 | 久久9999久久免费精品国产 | 日韩免费一区 | 国产第一页在线观看 | 日韩av电影中文字幕在线观看 | 国产午夜在线观看视频 | 久草青青在线观看 | 摸阴视频 | 国产精品观看 | 日本三级香港三级人妇99 | 中文字幕在线国产精品 | 国产精品入口久久 | 91精品人成在线观看 | 欧洲亚洲激情 | 日韩av看片 | 天堂中文在线视频 | 精品久久一二三区 | 蜜臀av夜夜澡人人爽人人 | 在线免费观看羞羞视频 | 亚洲高清av在线 | av中文天堂在线 | av一区在线播放 | 97久久久免费福利网址 | 日韩夜夜爽 | 一区二区三区在线视频观看58 | 91人人澡人人爽人人精品 | 国产精品一区二区在线免费观看 | 97爱| 精品国产亚洲日本 | 粉嫩av一区二区三区四区在线观看 | 免费一级片在线观看 | 亚洲春色综合另类校园电影 | 亚洲精品视频网 | 国产麻豆视频免费观看 | 在线观看视频黄 | 一区在线观看 | 99久热在线精品 | 99视频国产精品免费观看 | 精品久久久久久亚洲综合网 | 国产精品激情在线观看 | 国产视频一区在线免费观看 | 免费观看黄色12片一级视频 | 亚洲成av | 麻豆视频免费网站 | 99视频在线观看一区三区 | 午夜天使 | 91免费观看 | 草久在线观看 | 欧美在线视频二区 | 国产精品久久久久久久午夜片 | 日韩va欧美va亚洲va久久 | 午夜av在线| 国产丝袜高跟 | 国产精品v欧美精品 | 在线播放视频一区 | 欧美三级在线播放 | 久久久久久久久国产 | 五月天狠狠操 | 色噜噜在线观看 | 在线精品亚洲 | 国产999精品久久久影片官网 | 蜜臀久久99静品久久久久久 | 亚洲,国产成人av | 久久精品国产99国产 | 国产精品美女久久久网av | 午夜精品久久久久99热app | 国产精品自产拍在线观看桃花 | 操操操人人 | 在线观看一区 | 视频成人永久免费视频 | 91精品国自产在线观看欧美 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 91cn国产在线| 三级毛片视频 | 91九色免费视频 | 99国产免费网址 | 97免费在线观看视频 | 又黄又爽又湿又无遮挡的在线视频 | 高清av免费看 | 亚洲视频免费视频 | 国产黄色美女 | 91麻豆精品91久久久久同性 | 久久99精品久久久久久清纯直播 | 天天玩天天操天天射 | 9i看片成人免费看片 | 欧美一级片在线播放 | 天天操天天摸天天射 | av黄色av | 97热在线观看 | 国产91在线 | 美洲 | 亚洲精品88欧美一区二区 | 五月激情久久 | 日本精品一区二区三区在线观看 | 国产在线a视频 | 亚洲一区二区视频在线 | 日本不卡123 | 免费视频二区 | 欧美日韩国产三级 | 国产在线视频资源 | 国产剧情一区二区在线观看 | 最近中文字幕高清字幕免费mv | 亚洲电影网站 | 日韩免费在线看 | 国产精品久久久久久超碰 | 欧美一区在线看 | 欧美性护士| 久久激情影院 | 在线免费观看国产视频 | 久草在线免费看视频 | 91av综合 | 丰满少妇在线观看资源站 | 久久人人精品 | 一二区精品 | 欧美色综合久久 | 国产一区二区手机在线观看 | 麻花传媒mv免费观看 | 欧美亚洲成人xxx | japanese黑人亚洲人4k | 国产精品毛片久久久久久久 | 丁香六月婷婷开心 | av中文在线观看 | 国产福利精品在线观看 | 亚洲精品成人av在线 | 久久国色夜色精品国产 | 久久视讯 | 免费福利在线视频 | 色婷婷激情综合 | 国产尤物视频在线 | 天天射天天干天天 | 亚洲一级二级 | 精品国产电影一区 | 91精品在线观看视频 | 992tv在线成人免费观看 | 日日操网站 | 国产福利91精品一区二区三区 | 狠狠狠色丁香婷婷综合激情 | 又爽又黄在线观看 | 精品一区中文字幕 | 最近最新中文字幕 | 爱射综合 | 国产成人1区 | 国产一区二区在线观看免费 | 日韩免费网站 | 激情五月婷婷综合网 | 久久国产经典视频 | 一区二区精品 | www.国产毛片 | 成人禁用看黄a在线 | 亚洲理论影院 | 一级黄色大片在线观看 | 免费在线中文字幕 | 狠狠操狠狠干天天操 | 美女网站色在线观看 | 最近中文字幕mv免费高清在线 | 在线观看视频福利 | 97精品国产91久久久久久久 | 亚洲国产精品va在线看 | 国产精品自在线 | 午夜久久美女 | 久久久国产精品免费 | 精品超碰| 国产色视频一区 | 国产精品久久久久久爽爽爽 | 国产黄色在线观看 | 欧美色婷 | 探花视频在线观看+在线播放 | 久久久久久久影视 | 免费看麻豆 | 国产高清综合 | 成人黄大片视频在线观看 | 97精品国产97久久久久久免费 | 91天天操| 国产精品99久久久久久小说 | 久久综合九色欧美综合狠狠 | 免费在线观看av的网站 | av在线免费网站 | 欧美老少交 | www.国产毛片 | 玖玖爱免费视频 | 不卡视频在线 | 久草视频在 | 人人射人人澡 | 亚洲黄色av | 天天插夜夜操 | 狠狠色噜噜狠狠 | 婷婷丁香激情网 | 国产第一页在线观看 | 日韩精品专区在线影院重磅 | 亚洲视频 在线观看 | 在线观看免费黄视频 | 国产 在线观看 | 日本精品久久久一区二区三区 | wwwww.国产| 国内精品毛片 | 国产精品久久久久久久久久妇女 | 超碰九九 | 久久99热精品这里久久精品 | 91av原创| 亚洲黄色片在线 | 国产精品毛片一区二区 | 97国产在线观看 | 99久久99热这里只有精品 | 99久久99视频只有精品 | 五月婷婷视频在线 | 在线精品视频免费观看 | 五月天婷婷狠狠 | 免费久久片 | 久久69av| 九九热在线视频 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 九九视频在线 | 欧美一级视频一区 | 久久激情视频 久久 | 在线观看久久 | 亚洲午夜精品一区 | 特级毛片aaa | 久久国产精品99久久久久 | 最新日韩视频在线观看 | 国产精品一区二区av | 欧美aaaxxxx做受视频 | 欧美精品中文在线免费观看 | 日韩免费在线观看网站 | 97国产人人| 天天草天天干天天射 | 欧美成人久久 | 久久久免费av | 最新av在线播放 | 日韩精品一区二区三区在线视频 | 国产精品久久久久永久免费 | 国产色小视频 | 黄色软件在线观看免费 | 奇米影视777四色米奇影院 | 亚洲国产中文在线 | 成人av在线资源 | 国产91综合一区在线观看 | 在线免费观看一区二区三区 | 综合天堂av久久久久久久 | 91片黄在线观 | 日日狠狠 | 看片一区二区三区 | 久久精品99国产精品 | 九九免费在线观看视频 | 欧美日韩视频免费 | 狠狠操.com| 国产中文字幕在线观看 | 国产亚洲aⅴaaaaaa毛片 | 一区二区亚洲精品 | 亚洲伊人婷婷 | 国产精品97| 女女av在线| 久久久久久看片 | 国产这里只有精品 | 国产午夜三级一区二区三 | 久久久久欧美精品999 | 国产精品美女久久久久久2018 | 91看片淫黄大片在线播放 | 成人欧美一区二区三区黑人麻豆 | 亚洲自拍偷拍色图 | 国产精品视频观看 | 中文字幕观看av | 国产在线观看高清视频 | 亚洲精品国产综合久久 | 中文字幕日韩高清 | 91麻豆精品国产91久久久使用方法 | 四虎在线视频免费观看 | 国产一性一爱一乱一交 | 久久av在线 | 日本韩国在线不卡 | 成人午夜久久 | 一级电影免费在线观看 | 亚洲乱亚洲乱妇 | 91av视频 | 欧美一级片播放 | 在线不卡的av | 国产精品一区二区三区在线免费观看 | 国产视频在线观看一区 | 在线观看日韩国产 | 韩国精品在线 | 午夜的福利 | 日韩精品在线视频 | 最新久久久 | 国产精品18久久久久久不卡孕妇 | 成人小视频在线免费观看 | 天天操天天艹 | 中文字幕电影网 | 中文在线字幕免 | 黄污视频大全 | www亚洲视频 | 精品三级av | 99产精品成人啪免费网站 | 日韩精品影视 | 91精品在线免费观看 | 国产精品一区二区久久精品爱涩 | a在线观看国产 | 日韩在线免费视频 | 久久国产女人 | 久久一区国产 | 日韩成人精品一区二区 | 天天操天天爱天天干 | 在线亚洲欧美日韩 | 久久6精品 | 亚洲天天在线 | www激情网| 夜夜躁狠狠躁日日躁视频黑人 | 亚洲成熟女人毛片在线 | 欧美一区中文字幕 | 精品理论片 | 六月丁香在线视频 | 毛片1000部免费看 | 在线观看亚洲精品视频 | 一区视频在线 | 成人久久影院 | 一级黄色片在线观看 | 婷婷久久国产 | 久久精品影片 | 激情五月播播久久久精品 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 中文字幕亚洲精品在线观看 | 91精品老司机久久一区啪 | 久久不色 | 久久九九网站 | 成人av高清在线观看 | 成人在线视频在线观看 | 国产一区免费在线观看 | 婷婷激情五月 | 久久精品综合 | 欧美色插 | 99久久精品国产欧美主题曲 | 国产精品女 | 日本最新高清不卡中文字幕 | 天天干 天天摸 天天操 | 久久精品网站视频 | av免费成人 | 最新中文字幕在线观看视频 | 亚洲精品啊啊啊 | 五月婷丁香 | 黄色小说视频网站 | 日韩欧美综合视频 | 碰超人人 | 精品国产一区二区三区不卡 | 国产精品va在线观看入 | 天天狠狠干 | 四虎国产精品成人免费4hu | 日韩久久视频 | 久久婷婷久久 | 国产丝袜一区二区三区 | www.亚洲| 久久久电影 | 日韩精品一区电影 | 亚洲午夜久久久久久久久 | 久草在线视频看看 | 99久久久国产精品 | 国产无区一区二区三麻豆 | 玖玖色在线观看 | 99久久电影 | 国产视频欧美视频 | 69国产盗摄一区二区三区五区 | 国产经典 欧美精品 | 四虎影视8848aamm | 99热 精品在线 | 在线免费观看欧美日韩 | bbbbb女女女女女bbbbb国产 | 狠狠地日 | 国产精品理论片在线观看 | 91网在线观看| av福利网址导航大全 | 在线蜜桃视频 | 亚洲涩涩网站 | 午夜影院先| 欧美有色 | 久久精品中文字幕一区二区三区 | av在线电影网站 | 成人国产精品久久久 | 久久精国产 | 色综合咪咪久久网 | 麻豆视频在线免费 | 国产小视频在线观看免费 | 一区免费观看 | 亚洲精品综合在线观看 | 特黄免费av | 中文字幕在线观看网址 | 国产精品第7页 | 一区二区三区四区五区在线视频 | 国产资源中文字幕 | 精品国产aⅴ麻豆 | 日韩电影久久久 | 伊人婷婷综合 | 免费网站色 | 日韩乱码中文字幕 | 99精品视频在线播放免费 | 九九涩涩av台湾日本热热 | 可以免费观看的av片 | 国产最新在线观看 | 二区三区在线视频 | 色婷婷a| 91久久丝袜国产露脸动漫 | www.com操| 91精品国产综合久久福利不卡 | 日韩在线观看小视频 | 91精品国产网站 | 久草在线看片 | 国产最新视频在线观看 | 色资源中文字幕 | 综合色亚洲 | 国产高清绿奴videos | 99re中文字幕 | 99国产高清| 亚洲视频综合 | 婷婷五情天综123 | 日韩三级不卡 | 中文字幕制服丝袜av久久 | 亚洲天堂网在线视频观看 | 午夜成人免费电影 | 一区 二区 精品 | 永久黄网站色视频免费观看w | 伊人婷婷色 | 久久国产精品一国产精品 | 天天色天天射天天操 | 国产一级免费观看 | 麻豆视频一区二区 | 美女视频免费精品 | 99视频国产精品免费观看 | 97av影院| 狠狠操操 | 黄色在线免费观看网站 | 丁香婷婷综合激情 | 欧美另类69 | 国产视频一 | 久久综合免费视频影院 | 久久毛片视频 | 亚洲精品视频在 | 激情小说网站亚洲综合网 | 亚洲欧美成人在线 | 十八岁免进欧美 | 狠狠色综合欧美激情 | 免费91麻豆精品国产自产在线观看 | 在线观看视频 | 国产一区二区在线播放 | 国产v欧美 | 天天天天综合 | 丁香婷婷综合激情五月色 | 夜夜高潮夜夜爽国产伦精品 | 国产精品一区在线播放 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 天天插天天射 | 东方av免费在线观看 | 日韩精品一区二区不卡 | 最新成人在线 | 一级c片| 免费看黄色小说的网站 | 欧美一级片在线观看视频 | 久久与婷婷 | 91精品在线免费观看视频 | 玖玖国产精品视频 | 深夜免费小视频 | 精品在线观看视频 | 探花视频在线观看免费版 | 国产精品美女久久久免费 | 国产乱对白刺激视频在线观看女王 | 草久在线播放 | 国产传媒一区在线 | 免费高清在线观看电视网站 | 亚洲专区在线视频 | 天天干夜夜夜 | 福利在线看片 | 中文字幕国产一区二区 | 免费av小说 | 深夜激情影院 | 久久99精品久久久久久 | 丰满少妇久久久 | 欧美日韩国产二区三区 | 日本三级不卡 | 亚洲一区二区视频 | 国产123区在线观看 国产精品麻豆91 | 国产精品免费在线观看视频 | 黄色成人在线 | 国产精品久久久久久久久软件 | av一二三区| 精品不卡视频 | 欧美日韩不卡在线视频 | 亚洲理论影院 | 激情五月六月婷婷 | 十八岁以下禁止观看的1000个网站 | 久久久久国产免费免费 | 四川bbb搡bbb爽爽视频 | 国产精品专区在线 | 99在线视频播放 | 久久久三级视频 | 国产精品第7页 | 免费91麻豆精品国产自产在线观看 | av官网在线 | 日韩亚洲精品电影 | 我爱av激情网 | 欧美夫妻性生活电影 | 免费观看第二部31集 | 狠狠狠色丁香综合久久天下网 | 亚洲精品777 | 西西444www大胆高清图片 | 国产黄色片一级 | 亚洲美女视频在线 | 在线观看视频一区二区 | 天天操天天摸天天爽 | 久久综合九色99 | 啪啪免费试看 | 在线观看精品一区 | 国产中文在线字幕 | 天堂av在线中文在线 | 成人网在线免费视频 | 中文字幕一区二区三区在线视频 | 激情欧美xxxx | 激情综合国产 | 亚洲精品一区二区在线观看 | 久久久黄视频 | 在线精品亚洲 | 久草免费在线观看视频 | 亚洲成人动漫在线观看 | 美女免费黄网站 | 99久久久国产精品美女 | 美女视频是黄的免费观看 | 国产精品18毛片一区二区 | 视频在线一区二区三区 | 日本精品va在线观看 | 国产精品久久久区三区天天噜 | 中文字幕在线观看第三页 | 免费观看www7722午夜电影 | 欧美一区日韩一区 | 天天曰天天干 | 在线免费观看视频一区二区三区 | 国产视频在线观看一区 | 欧美精品久久久久久久久久丰满 | 欧美激情综合五月色丁香小说 | 久久99精品久久久久蜜臀 | 日女人免费视频 | 一色屋精品视频在线观看 | 91视频免费网站 | 91在线网址 | 欧美中文字幕久久 | 久人人| 日韩精品免费一线在线观看 | 国产亚洲片 | 欧美一区日韩精品 | 亚洲午夜久久久久久久久 | 免费观看www7722午夜电影 | 色香蕉在线 | 天堂在线一区 | 九九九热精品免费视频观看 | 久久91久久久久麻豆精品 | 精品亚洲欧美无人区乱码 | 6080yy精品一区二区三区 | 在线黄色av电影 | 91传媒免费观看 | 国产91精品一区二区麻豆亚洲 | 欧美电影在线观看 | 天天爱天天操 | 欧美精品一区二区性色 | 最近2019中文免费高清视频观看www99 | 国产成人精品一区二区三区免费 | 四虎天堂 | 97在线免费视频 | 久久久综合电影 | 亚洲美女视频在线 | 在线观看日韩一区 | 在线视频a | 五月激情丁香图片 | 国产九九精品视频 | 久草干 | 色婷婷狠狠操 | 玖草在线观看 | 午夜精品一区二区三区在线 | 欧美综合在线视频 | 日日爽视频 | 午夜精品视频在线 | 在线观看深夜视频 | 亚洲精品www | 九九免费精品视频在线观看 | 久在线观看视频 | 婷婷六月丁 | 精品视频免费 | 最近中文字幕mv | 久久久久成人精品亚洲国产 | 国产成人精品福利 | 91麻豆.com| 在线三级av | 综合网欧美 | 最新精品国产 | 国产精品一区久久久久 | 成人9ⅰ免费影视网站 | 夜夜摸夜夜爽 | 成年人黄色免费看 | 三上悠亚一区二区在线观看 | 日韩精品视频在线观看免费 | 综合色在线观看 | 国模一区二区三区四区 | 日韩视频免费看 | 最新日韩在线 | 国产精品乱看 | 免费精品视频在线观看 | 欧美巨大荫蒂茸毛毛人妖 | 一区二区三区视频网站 | 欧美激情精品久久 | 欧美日韩国产高清视频 | 欧美精品午夜 | 国产成人精品一区二 | 99免费在线 | 国产亚洲亚洲 | 国产人成在线视频 | 国产成人精品在线观看 | 成人黄色av网站 | 日本三级久久久 | 国产一级特黄电影 | 99精品国产在热久久下载 | 亚洲热视频 | 国产一级片观看 | 99热国内精品 | 91在线观看视频 | 中文字幕日本电影 | 亚洲精品在线看 | 91九色蝌蚪视频 | 中文字幕黄网 | 在线视频一区观看 | 亚洲砖区区免费 | 欧美日韩国产一区二 | 欧美日韩一级久久久久久免费看 | 日韩中文免费视频 | 日韩av有码在线 | 91av资源在线 | 久草精品在线播放 | 国产人成精品一区二区三 | 久久av免费| 色网站视频| 人人涩| 欧美日韩视频一区二区三区 | 国产精品久久久久久久久久妇女 | 高清av免费一区中文字幕 | 在线观看免费日韩 | 天天躁天天操 | 一本一道波多野毛片中文在线 | 国产高清日韩 | 日韩免费福利 | 狠狠色丁香婷婷综合欧美 | 亚洲精品一区二区三区新线路 | 在线欧美最极品的av | 人人爱在线视频 | 91桃花视频| 97在线观看视频 | 免费在线观看成人小视频 | 欧美一级在线观看视频 | 色婷婷综合成人av | 天天操伊人 | 国产男女无遮挡猛进猛出在线观看 | 国产在线91在线电影 | 国产精品免费不卡 | 成人网在线免费视频 | 精品一二三四五区 | 粉嫩一区二区三区粉嫩91 | 亚洲精区二区三区四区麻豆 | 亚洲国产成人久久 | 国产精品18久久久久久首页狼 | 手机av在线网站 | 中文字幕超清在线免费 | 精品一区二区影视 | 欧美性久久久久久 | 亚洲黄色免费 | 九九热精品视频在线播放 | 欧美日韩高清在线 | 日本 在线 视频 中文 有码 | 人人干狠狠干 | 国产69精品久久久久久久久久 | 久久综合欧美精品亚洲一区 | 在线观看免费av片 | 九九热在线播放 | 亚洲精品动漫在线 | 亚洲va综合va国产va中文 | 国产毛片久久 | 91成年人视频 | 久久深爱网 | 国产专区在线看 | 色婷婷国产精品一区在线观看 | 国产精品久久久99 | 久草观看视频 | www.99av | 国产中文自拍 | 欧美日韩一区二区在线观看 | 超碰在线免费97 | 久久综合综合久久综合 | 欧美视频网址 | 精品在线二区 | 久久五月精品 | 中文字幕在线观看网 | 97精品国自产拍在线观看 | 国产精品美女久久久久aⅴ 干干夜夜 | 天天干天天做 | 成人av亚洲 | 久久久五月婷婷 | 欧美日韩高清一区二区 国产亚洲免费看 | 日韩va欧美va亚洲va久久 | 欧美另类xxx | 在线视频观看成人 | 日本免费一二三区 | 成人av.com| 欧美日韩不卡一区二区三区 | 99re国产视频 | 久久超碰在线 | 一个色综合网站 | 色吊丝在线永久观看最新版本 | 一区二区三区日韩视频在线观看 | 久久综合偷偷噜噜噜色 | 日韩二区在线播放 | 国产一级精品绿帽视频 | 三上悠亚一区二区在线观看 | 伊人天天色 | 91高清视频在线 | 色av网站| 久久精品国产精品亚洲 | 国产vs久久 | 波多野结衣久久资源 | 粉嫩av一区二区三区四区五区 | 国产中出在线观看 | 成人黄色视 | 免费看国产黄色 | 99精品久久只有精品 | av大片免费在线观看 | 国产精品成人国产乱一区 | 色综合咪咪久久网 | 美女啪啪图片 | 丁香伊人网 | 99热九九这里只有精品10 | 好看的国产精品视频 | 国产在线观看一 | 91麻豆精品国产91久久久久 | 永久黄网站色视频免费观看w | 国产一级二级在线 | 国产精品免费一区二区三区在线观看 | 日韩欧美国产免费播放 | 亚洲日本在线视频观看 | 在线视频在线观看 | 天天色官网 | 精品美女国产在线 | 91免费观看网站 | 伊人色综合久久天天 | 久久午夜色播影院免费高清 | 美女视频黄频大全免费 | 缴情综合网五月天 | 国产人成在线视频 | 能在线看的av | 日韩欧美专区 | 久久电影日韩 | 色94色欧美 | 成人av资源网站 | 亚洲视频久久久久 | 亚洲国产999 | 九草在线视频 | 精品一二区 | 超碰97人 | 午夜国产在线 | 婷婷av电影| av免费在线观看1 | 在线播放精品一区二区三区 | www.天天操 | 日本免费久久高清视频 | 亚洲精品久久视频 | 日韩美女高潮 | 国产 欧美 日产久久 | 国产专区视频在线 | 国产精品一区二区久久久 | 91久久精品一区 | 久久香蕉国产精品麻豆粉嫩av | 午夜久久福利影院 | 国产精品99爱 | 福利视频一区二区 | 亚洲精品高清在线观看 | 6699私人影院 | 一本到在线| av看片在线观看 | 一级成人免费视频 | 国产一区二区三区在线 | 超碰97网站| 欧美一级大片在线观看 | 插久久 | adn—256中文在线观看 | 久久成人精品视频 | 最新国产精品久久精品 | 色丁香久久 | 99久久久久成人国产免费 | 二区视频在线观看 | 国产伦精品一区二区三区… | 国产又粗又猛又黄又爽的视频 | 久久精品亚洲综合专区 | 五月婷婷丁香网 | 精品国产乱码久久久久久1区2匹 | 91亚洲在线| 天天鲁一鲁摸一摸爽一爽 | 国产精品高潮呻吟久久av无 | 成人免费观看网址 | 在线观看日本高清mv视频 | 国产精品日韩在线播放 | 中文字幕国产亚洲 | 久久久免费毛片 | 日韩综合视频在线观看 | 日韩二区三区在线观看 | 欧美永久视频 | 中文字幕在线观看完整版电影 | 国产小视频免费在线观看 | 中文不卡视频在线 | 亚洲最新视频在线 | 国产一区二区在线免费播放 | 国产成人av福利 | 久久国产精品一区二区 | 国内久久久 | 亚洲丝袜一区二区 | 亚洲无毛专区 | 亚洲国产精品va在线 | 国产小视频在线观看 | 亚州中文av | 欧美另类人妖 | 99在线视频免费观看 | 日韩区欠美精品av视频 | 国产最顶级的黄色片在线免费观看 | 亚洲一区免费在线 | 日韩av一区二区在线 | 九九激情视频 | 日日干av | 婷婷免费视频 | 精品久久久免费 | 久久短视频 | 久久精品综合一区 | 一区二区精品在线观看 | 日韩视频免费 | 一区二区激情视频 | 欧美一区二区视频97 | 日韩久久精品一区二区三区下载 | 亚洲高清在线精品 | 激情电影在线观看 | 国产午夜剧场 | 97人人澡人人添人人爽超碰 | 亚洲人人爱 | 成年人天堂com| 久久影视一区 | 国产中文字幕一区二区三区 | 天天干天天天 | 中文字幕一区二区三区乱码不卡 | 美女视频免费精品 | 五月亚洲综合 | ww视频在线观看 | 天天操天天干天天操天天干 | 四虎影视成人精品 | 天天干天天干天天干天天干天天干天天干 | 免费在线观看一级片 | 免费一级日韩欧美性大片 | 美女视频黄是免费的 | 亚洲日本国产精品 | 天天色天天射天天干 | 五月天激情在线 | 久久电影日韩 | 免费看短 | 久久久久久久久久影视 | 在线观看理论 | 九九热免费视频在线观看 | 免费一级特黄录像 | 免费色视频在线 | 成年人视频在线观看免费 | av在线官网 | 亚洲日韩中文字幕 | 四虎国产精品成人免费影视 | 日本精品视频免费 | 国产乱视频| 免费看搞黄视频网站 | 三级黄色网络 | 91九色视频在线观看 | 天天曰| 久久久久国产精品一区 | 狠狠干夜夜操天天爽 | 麻豆免费在线播放 | 欧美在线视频日韩 | 最新中文字幕视频 | 日韩在线资源 | 天天综合狠狠精品 | 激情综合电影网 | 一区二区国产精品 | 在线欧美国产 | 在线观看网站黄 | 免费国产在线精品 | 久草视频一区 | 91成人免费在线 | 五月视频 | 久久国内精品99久久6app | 成人在线视频观看 | 粉嫩av一区二区三区四区五区 | 国产 日韩 在线 亚洲 字幕 中文 | 五月婷婷六月丁香在线观看 | 免费视频97 | 亚洲精品久久久蜜臀下载官网 | 亚洲色图av | 成人超碰在线 | 国产精品18久久久久久不卡孕妇 | 亚洲国产精品传媒在线观看 | 91网站在线视频 | 国产中文在线视频 | 婷婷激情小说网 | 亚洲黄色软件 | 在线观看成人网 | av丝袜美腿 | 91桃色国产在线播放 | 国产 av 日韩 | 99免费精品视频 | 成人一区二区在线 | 国产精品免费久久久久影院仙踪林 | 国产精品毛片一区二区在线 | 国产资源在线视频 | 成人资源在线观看 | 久久影院一区 | 国产精品嫩草影院9 | 国产精品一区二区久久久久 | 国产区久久 | 99九九免费视频 | 美女网站免费福利视频 | 日韩欧美aaa | 亚洲精品久久久久久久不卡四虎 | 免费看的黄色的网站 | 日韩日韩日韩日韩 | 国产黄色免费观看 | 97国产大学生情侣酒店的特点 | 国产一二三在线视频 | 亚洲精品在线观看网站 | 久草视频免费播放 | 久久久久黄 | 婷婷久久五月天 | 亚色视频在线观看 | 激情xxxx| 视频福利在线 | 日本韩国在线不卡 | 国产精彩视频一区二区 | 在线观看日韩中文字幕 | 国产精品男女 | 日韩综合在线观看 | 精品一区二区免费视频 | 天天曰夜夜操 | 日韩av偷拍| 成人av在线一区二区 | 日韩一区二区三区高清在线观看 | 五月天婷婷免费视频 | 久久免费视频7 | 亚洲小视频在线观看 | 免费看污片 | 亚洲视频中文 | 91在线小视频 | 91亚洲精品国偷拍自产在线观看 | 国产精品美女 | 91丨九色丨国产女 | 亚洲欧洲精品在线 | av福利在线看 | 成人黄色一级视频 | 91桃花视频| 国产一级特黄毛片在线毛片 | 在线观看午夜 | 日本三级不卡视频 | 美女网站视频色 | 日日夜夜免费精品视频 | 欧美电影黄色 | 日日夜夜草 | 国产成人61精品免费看片 | 国产18精品乱码免费看 | 日韩久久久久久久久久久久 | 日韩视 | 久久高清国产 | 欧美 日韩 成人 | 国产亚洲情侣一区二区无 | 91精品秘密在线观看 | 日日夜夜添 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 精品国产一二三四区 | 天天操夜操| 在线观看国产www | 91在线视频网址 | 国产精品久久婷婷六月丁香 | 日本精品视频一区 | 综合色中色 | 91成人精品一区在线播放 | 日本少妇高清做爰视频 | 天天爽夜夜爽精品视频婷婷 | 91人人爽久久涩噜噜噜 | 久久tv视频 | 人人爱天天操 | 国产手机在线 |