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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

60分钟吃掉三杀模型FiBiNET

發布時間:2024/1/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 60分钟吃掉三杀模型FiBiNET 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

神經網絡的結構設計有3個主流的高級技巧:

  • 1,高低融合 (將高層次特征與低層次特征融合,提升特征維度的豐富性和多樣性,像人一樣同時考慮整體和細節)

  • 2,權值共享 (一個權值矩陣參與多個不同的計算,降低參數規模并同時緩解樣本稀疏性,像人一樣一條知識多處運用)

  • 3,動態適應 (不同的輸入樣本使用不同的權值矩陣,動態地進行特征選擇并賦予特征重要度解釋性,像人一樣聚焦重要信息排除干擾信息)

技巧應用范例:

  • 1,高低融合 (DeepWide,UNet,特征金字塔FPN...)

  • 2,權值共享 (CNN,RNN,FM,DeepFM,BlinearFFM...)

  • 3,動態適應 (各種Attention機制...)

新浪微博廣告推薦技術團隊2019年發布的CTR預估模型FiBiNET同時巧妙地運用了以上3種技巧,是神經網絡結構設計的教科書級的范例。

在此介紹給大家。

參考資料:

  • FiBiNET論文:https://arxiv.org/pdf/1905.09433.pdf

  • FiBiNET-結合特征重要性和雙線性特征交互進行CTR預估:https://zhuanlan.zhihu.com/p/72931811

  • 代碼實現:https://github.com/xue-pai/FuxiCTR/blob/main/fuxictr/pytorch/models/FiBiNET.py

  • SENet原理:https://zhuanlan.zhihu.com/p/65459972

公眾號后臺回復關鍵詞: FiBiNET?獲取本文全部源碼和數據集下載鏈接。

本文目錄:

一,FiBiNET原理解析

二,FiBiNET的pytorch實現

三,Criteo數據集完整范例

1,準備數據

2,定義模型

3,訓練模型

4,評估模型

5,使用模型

6,保存模型

一,FiBiNET原理解析

FiBiNET全稱為Feature Importance and Bilinear Interaction Network.

顧名思義,其主要的創意有2個。

第一個是Feature Importance,通過借鑒SENet(Squeeze-and-Excitation)Attention機制實現特征選擇和重要度解釋。

第二個是Bilinear Interaction Network,這是應用權值共享技巧對 FFM(Field-Aware FM)結構進行改進的一種結構。

同時,FiBiNET保留了DeepWide的高低融合的網絡架構。

所以它綜合使用了 高低融合、權值共享、動態適應 這3種神經網絡結構設計的高級技巧。一個不落,Triple kill!

我們重點介紹一下 SENet Attention 和 Bilinear Interaction.

1, SENet Attention

SENet 全稱為 Squeeze-and-Excitation Network,是一種通過注意力機制計算特征重要度的網絡模塊。

最早是在CV領域引入,通過在ResNet結構上添加SENet Attention模塊,贏得了ImageNet 2017競賽分類任務的冠軍。

如何計算各個Feature Map(通道)的特征重要度(注意力權重)呢?

SENet的思想非常簡潔。

step1: 通過全局池化將各個Feature Map由一個一個的矩陣匯總成一個一個的標量。此即Squeeze操作。

step2:通過一個2層MLP將匯總成得到的一個一個的標量所構成的向量進行變換,得到注意力權重。此即Excitation操作。細節一點地說,這個2層的MLP的第1層將通道數量縮減成原來的1/3, 第2層再將通道數恢復。并且每層后面都接入了激活函數。

step3:用注意力權重乘以原始的Feature Map。這個是Re-Weight操作。

圖片示意如下。

pytorch代碼實現如下,可能比圖片更加好懂。

import?torch? from?torch?import?nn? class?SENetAttention(nn.Module):"""Squeeze-and-Excitation?Attention輸入shape:?[batch_size,?num_fields,?d_embed]???#num_fields即num_features輸出shape:?[batch_size,?num_fields,?d_embed]"""def?__init__(self,?num_fields,?reduction_ratio=3):super().__init__()reduced_size?=?max(1,?int(num_fields?/?reduction_ratio))self.excitation?=?nn.Sequential(nn.Linear(num_fields,?reduced_size,?bias=False),nn.ReLU(),nn.Linear(reduced_size,?num_fields,?bias=False),nn.ReLU())def?forward(self,?x):Z?=?torch.mean(x,?dim=-1,?out=None)?#1,SequeezeA?=?self.excitation(Z)?#2,ExcitationV?=?x?*?A.unsqueeze(-1)?#3,Re-Weightreturn?V

2, Bilinear Interaction

Bilinear Interaction實際上是FFM在權值共享思想下的一種改進,也可以稱之為Bilinear FFM。

我們先說說FFM(Field-Aware FM),再看看這個Bilinear FFM 怎么改進的。

FM用隱向量之間的點積來計算特征之間的交叉,并且一個特征用一個隱向量來表示。

FFM認為一個特征用一個隱向量來表達太粗糙了,如果這個特征和不同分組(Field)的特征來做交叉,應該用不同的隱向量。

舉例來說,考慮一個廣告點擊預測的場景,廣告類別 和 用戶所在城市、用戶職業之間的交叉。

在FM中 一個確定的廣告類別 比如游戲廣告 不論是和用戶所在城市,還是用戶職業交叉,都用同一個隱向量。

但是FFM認為,用戶所在城市和用戶職業是兩類完全不同的特征(不同Field),描述它們的向量空間應該是完全不相關的,FM用一個相同的隱向量來和它們做點積不合理。

所以,FFM引入了Field(域)的概念,和不同Field的特征做交叉,要使用不同的隱向量。

實踐表明,FFM這個思路是有效的, FFM的作者阮毓欽正是憑借這個方案贏得了2015年kaggle舉辦的Criteo比賽的冠軍。

但是FFM有個很大的缺點,就是參數量太多了。

對于FM來說,每個特征只有一個隱向量,假設有n個特征,每個隱向量維度為k,全部隱向量參數矩陣的大小 size = n k.

但是對于FFM,有過有f個不同的field,每個特征都將有f-1個隱向量,全部隱向量的參數矩陣的大小增大為 size = (f-1) n k.

通常的應用場景中,Field的數量有幾十幾百維,而Feature的數量有數萬數百萬維。

很顯然,FFM將隱向量的參數規模擴大了幾十幾百倍。

FFM的本質思想是在做特征交叉的時候要區分不同的Field,其實現方式是和不同的Field做交叉時用不同的隱向量。

有沒有辦法保留FFM中區分不同Field的特性,并降低參數規模呢?

BilinearFFM說,我有辦法,權重共享走起來!

BilinearFFM不直接針對不同Field設計不同的隱向量,而是引入了Field變換矩陣來區分不同的Field。

每個特征還是一個隱向量,但是和不同的Field的特征做交叉時,先乘上這個特征所在Field的變換矩陣,然后再做后面的點積。

因此,同屬一個Field的特征共享一個Field變換矩陣。這種bilinear_type叫做 field_each.

Field變換矩陣的大小是k^2, 這種方式下,全部隱向量的參數大小加上共享變換矩陣的參數大小一共是 size = n k + f k^2

由于k和f遠小于n,這種Bilinear方式相比FM增加的參數量可以忽略不計。

除了 同屬一個Field的特征共享一個Field變換矩陣外,我們還可以更加簡單粗暴一點,所有特征共享一個變換矩陣.

這種bilinear_type叫做 field_all.這種方式下,size = n k + k^2

我們也可以更加精細一點,相同的Field組合之間的交互共享一個變換矩陣,這種bilinear_type叫做field_interaction.

總共有f(f-1)/2種組合,這種方式下, size = n k + k^2 f(f-1)/2

以上就是BilinearFFM的基本思想。

FiBiNET中用到的Bilinear Interaction相比BilinearFFM, 還有一處小改動,將點積改成了哈達瑪積,如下圖所示。

pytorch代碼實現如下,整體不難理解。作2點說明。

1,Field概念說明

在FFM相關的文章中,引入了Field的概念,以和Feature區分,一個Field中可以包括多個Feature.

實際上Field就是我們通常理解的特征,包括數值特征和類別特征,但是Feature是數值特征或者類別特征onehot后的特征。一個類別特征對應一個Field,但是對應多個Feature。

2,combinations函數說明

組合函數combinations從num_fields中任取2種作為組合,共有 num_fields*(num_fields-1)中組合方式。

所以輸出的Field數量變成了 num_fields*(num_fields-1)/2。

import?torch? from?torch?import?nn? from?itertools?import?combinations class?BilinearInteraction(nn.Module):"""雙線性FFM輸入shape:?[batch_size,?num_fields,?d_embed]?#num_fields即num_features輸出shape:?[batch_size,?num_fields*(num_fields-1)/2,?d_embed]"""def?__init__(self,?num_fields,?d_embed,?bilinear_type="field_interaction"):super().__init__()self.bilinear_type?=?bilinear_typeif?self.bilinear_type?==?"field_all":self.bilinear_layer?=?nn.Linear(d_embed,?d_embed,?bias=False)elif?self.bilinear_type?==?"field_each":self.bilinear_layer?=?nn.ModuleList([nn.Linear(d_embed,?d_embed,?bias=False)for?i?in?range(num_fields)])elif?self.bilinear_type?==?"field_interaction":self.bilinear_layer?=?nn.ModuleList([nn.Linear(d_embed,?d_embed,?bias=False)for?i,?j?in?combinations(range(num_fields),?2)])else:raise?NotImplementedError()def?forward(self,?feature_emb):feature_emb_list?=?torch.split(feature_emb,?1,?dim=1)if?self.bilinear_type?==?"field_all":bilinear_list?=?[self.bilinear_layer(v_i)?*?v_jfor?v_i,?v_j?in?combinations(feature_emb_list,?2)]elif?self.bilinear_type?==?"field_each":bilinear_list?=?[self.bilinear_layer[i](feature_emb_list[i])?*?feature_emb_list[j]for?i,?j?in?combinations(range(len(feature_emb_list)),?2)]elif?self.bilinear_type?==?"field_interaction":bilinear_list?=?[self.bilinear_layer[i](v[0])?*?v[1]for?i,?v?in?enumerate(combinations(feature_emb_list,?2))]return?torch.cat(bilinear_list,?dim=1)

二,FiBiNET的pytorch實現

下面是FiBiNET的一個pytorch實現。

核心代碼是SENetAttention模塊和BilinearInteraction模塊的實現。

import?torch? from?torch?import?nn? from?itertools?import?combinationsclass?NumEmbedding(nn.Module):"""連續特征用linear層編碼輸入shape:?[batch_size,num_features,?d_in],?#?d_in?通常是1輸出shape:?[batch_size,num_features,?d_out]"""def?__init__(self,?n:?int,?d_in:?int,?d_out:?int,?bias:?bool?=?False)?->?None:super().__init__()self.weight?=?nn.Parameter(torch.Tensor(n,?d_in,?d_out))self.bias?=?nn.Parameter(torch.Tensor(n,?d_out))?if?bias?else?Nonewith?torch.no_grad():for?i?in?range(n):layer?=?nn.Linear(d_in,?d_out)self.weight[i]?=?layer.weight.Tif?self.bias?is?not?None:self.bias[i]?=?layer.biasdef?forward(self,?x_num):assert?x_num.ndim?==?3#x?=?x_num[...,?None]?*?self.weight[None]#x?=?x.sum(-2)x?=?torch.einsum("bfi,fij->bfj",x_num,self.weight)if?self.bias?is?not?None:x?=?x?+?self.bias[None]return?xclass?CatEmbedding(nn.Module):"""離散特征用Embedding層編碼輸入shape:?[batch_size,?num_features],?輸出shape:?[batch_size,?num_features,?d_embed]"""def?__init__(self,?categories,?d_embed):super().__init__()self.embedding?=?nn.Embedding(sum(categories),?d_embed)self.offsets?=?nn.Parameter(torch.tensor([0]?+?categories[:-1]).cumsum(0),requires_grad=False)nn.init.xavier_uniform_(self.embedding.weight.data)def?forward(self,?x_cat):"""x_cat:?Long?tensor?of?size?``(batch_size,?features_num)``"""x?=?x_cat?+?self.offsets[None]return?self.embedding(x)?class?CatLinear(nn.Module):"""離散特征用Embedding實現線性層(等價于先F.onehot再nn.Linear())輸入shape:?[batch_size,?num_features?],?輸出shape:?[batch_size,?d_out]"""def?__init__(self,?categories,?d_out=1):super().__init__()self.fc?=?nn.Embedding(sum(categories),?d_out)self.bias?=?nn.Parameter(torch.zeros((d_out,)))self.offsets?=?nn.Parameter(torch.tensor([0]?+?categories[:-1]).cumsum(0),requires_grad=False)nn.init.xavier_uniform_(self.fc.weight.data)def?forward(self,?x_cat):"""Long?tensor?of?size?``(batch_size,?num_features)``"""x?=?x_cat?+?self.offsets[None]return?torch.sum(self.fc(x),?dim=1)?+?self.bias?class?SENetAttention(nn.Module):"""Squeeze-and-Excitation?Attention輸入shape:?[batch_size,?num_fields,?d_embed]???#num_fields即num_features輸出shape:?[batch_size,?num_fields,?d_embed]"""def?__init__(self,?num_fields,?reduction_ratio=3):super().__init__()reduced_size?=?max(1,?int(num_fields?/?reduction_ratio))self.excitation?=?nn.Sequential(nn.Linear(num_fields,?reduced_size,?bias=False),nn.ReLU(),nn.Linear(reduced_size,?num_fields,?bias=False),nn.ReLU())def?forward(self,?x):Z?=?torch.mean(x,?dim=-1,?out=None)?#1,SequeezeA?=?self.excitation(Z)?#2,ExcitationV?=?x?*?A.unsqueeze(-1)?#3,Re-Weightreturn?Vclass?BilinearInteraction(nn.Module):"""雙線性FFM輸入shape:?[batch_size,?num_fields,?d_embed]?#num_fields即num_features輸出shape:?[batch_size,?num_fields*(num_fields-1)/2,?d_embed]"""def?__init__(self,?num_fields,?d_embed,?bilinear_type="field_interaction"):super().__init__()self.bilinear_type?=?bilinear_typeif?self.bilinear_type?==?"field_all":self.bilinear_layer?=?nn.Linear(d_embed,?d_embed,?bias=False)elif?self.bilinear_type?==?"field_each":self.bilinear_layer?=?nn.ModuleList([nn.Linear(d_embed,?d_embed,?bias=False)for?i?in?range(num_fields)])elif?self.bilinear_type?==?"field_interaction":self.bilinear_layer?=?nn.ModuleList([nn.Linear(d_embed,?d_embed,?bias=False)for?i,?j?in?combinations(range(num_fields),?2)])else:raise?NotImplementedError()def?forward(self,?feature_emb):feature_emb_list?=?torch.split(feature_emb,?1,?dim=1)if?self.bilinear_type?==?"field_all":bilinear_list?=?[self.bilinear_layer(v_i)?*?v_jfor?v_i,?v_j?in?combinations(feature_emb_list,?2)]elif?self.bilinear_type?==?"field_each":bilinear_list?=?[self.bilinear_layer[i](feature_emb_list[i])?*?feature_emb_list[j]for?i,?j?in?combinations(range(len(feature_emb_list)),?2)]elif?self.bilinear_type?==?"field_interaction":bilinear_list?=?[self.bilinear_layer[i](v[0])?*?v[1]for?i,?v?in?enumerate(combinations(feature_emb_list,?2))]return?torch.cat(bilinear_list,?dim=1)#mlp class?MultiLayerPerceptron(nn.Module):def?__init__(self,?d_in,?d_layers,?dropout,?d_out?=?1):super().__init__()layers?=?[]for?d?in?d_layers:layers.append(nn.Linear(d_in,?d))layers.append(nn.BatchNorm1d(d))layers.append(nn.ReLU())layers.append(nn.Dropout(p=dropout))d_in?=?dlayers.append(nn.Linear(d_layers[-1],?d_out))self.mlp?=?nn.Sequential(*layers)def?forward(self,?x):"""float?tensor?of?size?``(batch_size,?d_in)``"""return?self.mlp(x)#fibinet? class?FiBiNET(nn.Module):def?__init__(self,d_numerical,?categories,?d_embed,mlp_layers,?mlp_dropout,reduction_ratio?=?3,bilinear_type?=?"field_interaction",n_classes?=?1):super().__init__()if?d_numerical?is?None:d_numerical?=?0if?categories?is?None:categories?=?[]self.categories?=?categoriesself.n_classes?=?n_classesself.num_linear?=?nn.Linear(d_numerical,n_classes)?if?d_numerical?else?Noneself.cat_linear?=?CatLinear(categories,n_classes)?if?categories?else?Noneself.num_embedding?=?NumEmbedding(d_numerical,1,d_embed)?if?d_numerical?else?Noneself.cat_embedding?=?CatEmbedding(categories,?d_embed)?if?categories?else?Nonenum_fields?=?d_numerical+len(categories)self.se_attention?=?SENetAttention(num_fields,?reduction_ratio)self.bilinear?=?BilinearInteraction(num_fields,?d_embed,?bilinear_type)mlp_in?=?num_fields?*?(num_fields?-?1)?*?d_embedself.mlp?=?MultiLayerPerceptron(d_in=?mlp_in,d_layers?=?mlp_layers,dropout?=?mlp_dropout,d_out?=?n_classes)def?forward(self,?x):"""x_num:?numerical?featuresx_cat:?category?features"""x_num,x_cat?=?x#一,wide部分x_linear?=?0.0if?self.num_linear:x_linear?=?x_linear?+?self.num_linear(x_num)?if?self.cat_linear:x_linear?=?x_linear?+?self.cat_linear(x_cat)#二,deep部分?#1,embeddingx_embedding?=?[]if?self.num_embedding:x_embedding.append(self.num_embedding(x_num[...,None]))if?self.cat_embedding:x_embedding.append(self.cat_embedding(x_cat))x_embedding?=?torch.cat(x_embedding,dim=1)#2,interactionse_embedding?=?self.se_attention(x_embedding)ffm_out?=?self.bilinear(x_embedding)se_ffm_out?=?self.bilinear(se_embedding)x_interaction?=?torch.flatten(torch.cat([ffm_out,?se_ffm_out],?dim=1),?start_dim=1)#3,mlpx_deep?=?self.mlp(x_interaction)#三,高低融合x_out?=?x_linear+x_deepif?self.n_classes==1:x_out?=?x_out.squeeze(-1)return?x_out ##測試?FiBiNETmodel?=?FiBiNET(d_numerical?=?3,?categories?=?[4,3,2],d_embed?=?4,?mlp_layers?=?[20,20],?mlp_dropout=0.25,reduction_ratio?=?3,bilinear_type?=?"field_interaction",n_classes?=?1)x_num?=?torch.randn(2,3) x_cat?=?torch.randint(0,2,(2,3)) print(model((x_num,x_cat))) tensor([-0.8621,??0.6743],?grad_fn=<SqueezeBackward1>)

三,criteo數據集完整范例

Criteo數據集是一個經典的廣告點擊率CTR預測數據集。

這個數據集的目標是通過用戶特征和廣告特征來預測某條廣告是否會為用戶點擊。

數據集有13維數值特征(I1-I13)和26維類別特征(C14-C39), 共39維特征, 特征中包含著許多缺失值。

訓練集4000萬個樣本,測試集600萬個樣本。數據集大小超過100G.

此處使用的是采樣100萬個樣本后的cretio_small數據集。

!pip?install?-U?torchkeras?-i?https://pypi.org/simple/ import?numpy?as?np? import?pandas?as?pd? import?datetime?from?sklearn.model_selection?import?train_test_split?import?torch? from?torch?import?nn? from?torch.utils.data?import?Dataset,DataLoader?? import?torch.nn.functional?as?F? import?torchkeras?def?printlog(info):nowtime?=?datetime.datetime.now().strftime('%Y-%m-%d?%H:%M:%S')print("\n"+"=========="*8?+?"%s"%nowtime)print(info+'...\n\n')

1,準備數據

from?sklearn.preprocessing?import?LabelEncoder,QuantileTransformer from?sklearn.pipeline?import?Pipeline? from?sklearn.impute?import?SimpleImputer?dfdata?=?pd.read_csv("../input/criteo-small/train_1m.txt",sep="\t",header=None) dfdata.columns?=?["label"]?+?["I"+str(x)?for?x?in?range(1,14)]?+?["C"+str(x)?for?x?in?range(14,40)]cat_cols?=?[x?for?x?in?dfdata.columns?if?x.startswith('C')] num_cols?=?[x?for?x?in?dfdata.columns?if?x.startswith('I')] num_pipe?=?Pipeline(steps?=?[('impute',SimpleImputer()),('quantile',QuantileTransformer())])for?col?in?cat_cols:dfdata[col]??=?LabelEncoder().fit_transform(dfdata[col])dfdata[num_cols]?=?num_pipe.fit_transform(dfdata[num_cols])categories?=?[dfdata[col].max()+1?for?col?in?cat_cols] import?torch? from?torch.utils.data?import?Dataset,DataLoader?#DataFrame轉換成torch數據集Dataset,?特征分割成X_num,X_cat方式 class?DfDataset(Dataset):def?__init__(self,df,label_col,num_features,cat_features,categories,is_training=True):self.X_num?=?torch.tensor(df[num_features].values).float()?if?num_features?else?Noneself.X_cat?=?torch.tensor(df[cat_features].values).long()?if?cat_features?else?Noneself.Y?=?torch.tensor(df[label_col].values).float()?self.categories?=?categoriesself.is_training?=?is_trainingdef?__len__(self):return?len(self.Y)def?__getitem__(self,index):if?self.is_training:return?((self.X_num[index],self.X_cat[index]),self.Y[index])else:return?(self.X_num[index],self.X_cat[index])def?get_categories(self):return?self.categories dftrain_val,dftest?=?train_test_split(dfdata,test_size=0.2) dftrain,dfval?=?train_test_split(dftrain_val,test_size=0.2)ds_train?=?DfDataset(dftrain,label_col?=?"label",num_features?=?num_cols,cat_features?=?cat_cols,categories?=?categories,?is_training=True)ds_val?=?DfDataset(dfval,label_col?=?"label",num_features?=?num_cols,cat_features?=?cat_cols,categories?=?categories,?is_training=True)ds_test?=?DfDataset(dftest,label_col?=?"label",num_features?=?num_cols,cat_features?=?cat_cols,categories?=?categories,?is_training=True) dl_train?=?DataLoader(ds_train,batch_size?=?2048,shuffle=True) dl_val?=?DataLoader(ds_val,batch_size?=?2048,shuffle=False) dl_test?=?DataLoader(ds_test,batch_size?=?2048,shuffle=False)for?features,labels?in?dl_train:break

2,定義模型

def?create_net():net?=?FiBiNET(d_numerical=?ds_train.X_num.shape[1],categories=?ds_train.get_categories(),d_embed?=?8,?mlp_layers?=?[128,64,32],?mlp_dropout=0.25,reduction_ratio?=?3,bilinear_type?=?"field_all",n_classes?=?1)return?net?from?torchkeras?import?summarynet?=?create_net()

3,訓練模型

import?os,sys,time import?numpy?as?np import?pandas?as?pd import?datetime? from?tqdm?import?tqdm?import?torch from?torch?import?nn? from?accelerate?import?Accelerator from?copy?import?deepcopydef?printlog(info):nowtime?=?datetime.datetime.now().strftime('%Y-%m-%d?%H:%M:%S')print("\n"+"=========="*8?+?"%s"%nowtime)print(str(info)+"\n")class?StepRunner:def?__init__(self,?net,?loss_fn,stage?=?"train",?metrics_dict?=?None,?optimizer?=?None,?lr_scheduler?=?None,accelerator?=?None):self.net,self.loss_fn,self.metrics_dict,self.stage?=?net,loss_fn,metrics_dict,stageself.optimizer,self.lr_scheduler?=?optimizer,lr_schedulerself.accelerator?=?acceleratordef?__call__(self,?features,?labels):#losspreds?=?self.net(features)loss?=?self.loss_fn(preds,labels)#backward()if?self.optimizer?is?not?None?and?self.stage=="train":if?self.accelerator?is??None:loss.backward()else:self.accelerator.backward(loss)self.optimizer.step()if?self.lr_scheduler?is?not?None:self.lr_scheduler.step()self.optimizer.zero_grad()#metricsstep_metrics?=?{self.stage+"_"+name:metric_fn(preds,?labels).item()?for?name,metric_fn?in?self.metrics_dict.items()}return?loss.item(),step_metricsclass?EpochRunner:def?__init__(self,steprunner):self.steprunner?=?steprunnerself.stage?=?steprunner.stageself.steprunner.net.train()?if?self.stage=="train"?else?self.steprunner.net.eval()def?__call__(self,dataloader):total_loss,step?=?0,0loop?=?tqdm(enumerate(dataloader),?total?=len(dataloader))for?i,?batch?in?loop:features,labels?=?batchif?self.stage=="train":loss,?step_metrics?=?self.steprunner(features,labels)else:with?torch.no_grad():loss,?step_metrics?=?self.steprunner(features,labels)step_log?=?dict({self.stage+"_loss":loss},**step_metrics)total_loss?+=?lossstep+=1if?i!=len(dataloader)-1:loop.set_postfix(**step_log)else:epoch_loss?=?total_loss/stepepoch_metrics?=?{self.stage+"_"+name:metric_fn.compute().item()?for?name,metric_fn?in?self.steprunner.metrics_dict.items()}epoch_log?=?dict({self.stage+"_loss":epoch_loss},**epoch_metrics)loop.set_postfix(**epoch_log)for?name,metric_fn?in?self.steprunner.metrics_dict.items():metric_fn.reset()return?epoch_logclass?KerasModel(torch.nn.Module):def?__init__(self,net,loss_fn,metrics_dict=None,optimizer=None,lr_scheduler?=?None):super().__init__()self.accelerator?=?Accelerator()self.history?=?{}self.net?=?netself.loss_fn?=?loss_fnself.metrics_dict?=?nn.ModuleDict(metrics_dict)?self.optimizer?=?optimizer?if?optimizer?is?not?None?else?torch.optim.Adam(self.parameters(),?lr=1e-2)self.lr_scheduler?=?lr_schedulerself.net,self.loss_fn,self.metrics_dict,self.optimizer?=?self.accelerator.prepare(self.net,self.loss_fn,self.metrics_dict,self.optimizer)def?forward(self,?x):if?self.net:return?self.net.forward(x)else:raise?NotImplementedErrordef?fit(self,?train_data,?val_data=None,?epochs=10,?ckpt_path='checkpoint.pt',?patience=5,?monitor="val_loss",?mode="min"):train_data?=?self.accelerator.prepare(train_data)val_data?=?self.accelerator.prepare(val_data)?if?val_data?else?[]for?epoch?in?range(1,?epochs+1):printlog("Epoch?{0}?/?{1}".format(epoch,?epochs))#?1,train?-------------------------------------------------??train_step_runner?=?StepRunner(net?=?self.net,stage="train",loss_fn?=?self.loss_fn,metrics_dict=deepcopy(self.metrics_dict),optimizer?=?self.optimizer,?lr_scheduler?=?self.lr_scheduler,accelerator?=?self.accelerator)train_epoch_runner?=?EpochRunner(train_step_runner)train_metrics?=?train_epoch_runner(train_data)for?name,?metric?in?train_metrics.items():self.history[name]?=?self.history.get(name,?[])?+?[metric]#?2,validate?-------------------------------------------------if?val_data:val_step_runner?=?StepRunner(net?=?self.net,stage="val",loss_fn?=?self.loss_fn,metrics_dict=deepcopy(self.metrics_dict),accelerator?=?self.accelerator)val_epoch_runner?=?EpochRunner(val_step_runner)with?torch.no_grad():val_metrics?=?val_epoch_runner(val_data)val_metrics["epoch"]?=?epochfor?name,?metric?in?val_metrics.items():self.history[name]?=?self.history.get(name,?[])?+?[metric]#?3,early-stopping?-------------------------------------------------arr_scores?=?self.history[monitor]best_score_idx?=?np.argmax(arr_scores)?if?mode=="max"?else?np.argmin(arr_scores)if?best_score_idx==len(arr_scores)-1:torch.save(self.net.state_dict(),ckpt_path)print("<<<<<<?reach?best?{0}?:?{1}?>>>>>>".format(monitor,arr_scores[best_score_idx]),file=sys.stderr)if?len(arr_scores)-best_score_idx>patience:print("<<<<<<?{}?without?improvement?in?{}?epoch,?early?stopping?>>>>>>".format(monitor,patience),file=sys.stderr)self.net.load_state_dict(torch.load(ckpt_path))break?return?pd.DataFrame(self.history)@torch.no_grad()def?evaluate(self,?val_data):val_data?=?self.accelerator.prepare(val_data)val_step_runner?=?StepRunner(net?=?self.net,stage="val",loss_fn?=?self.loss_fn,metrics_dict=deepcopy(self.metrics_dict),accelerator?=?self.accelerator)val_epoch_runner?=?EpochRunner(val_step_runner)val_metrics?=?val_epoch_runner(val_data)return?val_metrics@torch.no_grad()def?predict(self,?dataloader):dataloader?=?self.accelerator.prepare(dataloader)result?=?torch.cat([self.forward(t[0])?for?t?in?dataloader])return?result.data from?torchkeras.metrics?import?AUCloss_fn?=?nn.BCEWithLogitsLoss()metrics_dict?=?{"auc":AUC()}optimizer?=?torch.optim.Adam(net.parameters(),?lr=0.002,?weight_decay=0.001)?model?=?KerasModel(net,loss_fn?=?loss_fn,metrics_dict=?metrics_dict,optimizer?=?optimizer) dfhistory?=?model.fit(train_data=dl_train,val_data=dl_val,epochs=100,?patience=5,monitor?=?"val_auc",mode="max",ckpt_path='checkpoint.pt')

4,評估模型

%matplotlib?inline %config?InlineBackend.figure_format?=?'svg'import?matplotlib.pyplot?as?pltdef?plot_metric(dfhistory,?metric):train_metrics?=?dfhistory["train_"+metric]val_metrics?=?dfhistory['val_'+metric]epochs?=?range(1,?len(train_metrics)?+?1)plt.plot(epochs,?train_metrics,?'bo--')plt.plot(epochs,?val_metrics,?'ro-')plt.title('Training?and?validation?'+?metric)plt.xlabel("Epochs")plt.ylabel(metric)plt.legend(["train_"+metric,?'val_'+metric])plt.show() plot_metric(dfhistory,"loss") plot_metric(dfhistory,"auc")

5,使用模型

from?sklearn.metrics?import?roc_auc_score preds?=?torch.sigmoid(model.predict(dl_val)) labels?=?torch.cat([x[-1]?for?x?in?dl_val])val_auc?=?roc_auc_score(labels.cpu().numpy(),preds.cpu().numpy()) print(val_auc)

0.7806176567186112

6,保存模型

torch.save(model.net.state_dict(),"best_fibinet.pt") net_clone?=?create_net() net_clone.load_state_dict(torch.load("best_fibinet.pt")) from?sklearn.metrics?import?roc_auc_score net_clone.eval() preds?=?torch.cat([torch.sigmoid(net_clone(x[0])).data?for?x?in?dl_val])? labels?=?torch.cat([x[-1]?for?x?in?dl_val])val_auc?=?roc_auc_score(labels.cpu().numpy(),preds.cpu().numpy()) print(val_auc)

0.7806176567186112

可以看到FiBiNET在驗證集的AUC得分為0.7806,相比之下DeepFM的驗證集AUC為0.7803。

不能說紋絲不動, 只能說了漲了個蚊子腿大小肉的點。

并且這是以較大地犧牲模型訓練預測效率為代價的。

DeepFM訓練一個Epoch大約需要20s, 而FiBiNET訓練一個Epoch需要大約2min.

盡管如此, FiBiNET的結構設計依然是值得我們學習和借鑒的, 集神經網絡結構設計三大主流高級技巧于一體, 閃爍著穿越時空的才華與智慧光芒。

以上。

萬水千山總是情,點個在看行不行?😋😋?

公眾號后臺回復關鍵詞:?FiBiNET?獲取本文全部源碼和數據集下載鏈接。


總結

以上是生活随笔為你收集整理的60分钟吃掉三杀模型FiBiNET的全部內容,希望文章能夠幫你解決所遇到的問題。

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

久久久久观看 | 日本久久久久久 | 国产精品一区久久久久 | 99久久激情 | 97av在线视频免费播放 | 久久亚洲综合色 | 亚洲一区精品二人人爽久久 | www.色午夜,com | 国内揄拍国内精品 | 亚洲电影黄色 | 麻豆成人精品视频 | 欧美日韩国产一区 | 久久久久福利视频 | 国产精品久久久久久久久蜜臀 | 欧美久久99 | 色综合久久综合中文综合网 | 在线播放精品一区二区三区 | 91亚色在线观看 | 射射射av| 欧美一区二区在线免费看 | 久久视影 | 亚洲精品欧美视频 | 国产成人精品女人久久久 | 日日躁你夜夜躁你av蜜 | 五月婷婷在线观看视频 | 亚洲综合精品视频 | 久久精品亚洲一区二区三区观看模式 | 96精品在线| 久久电影国产免费久久电影 | 国产在线视频资源 | 欧美久久久一区二区三区 | 91丨九色丨国产丨porny精品 | 麻豆传媒在线免费看 | 天天操狠狠操夜夜操 | 欧美一级艳片视频免费观看 | 久久 亚洲视频 | 亚洲精品玖玖玖av在线看 | 网站你懂的 | 国产精品一区二区三区99 | 草久久精品 | 亚洲五月| 日韩高清免费电影 | 色综合 久久精品 | 超碰人人av | 欧美日韩免费在线视频 | 性色av香蕉一区二区 | 91av看片 | 亚洲综合色网站 | 欧美日韩一区二区在线 | 在线观看av片 | 国产丝袜高跟 | 天堂av在线| 在线观看国产高清视频 | 五月婷婷天堂 | 亚洲综合五月 | 国产韩国日本高清视频 | 成 人 免费 黄 色 视频 | 91在线视频免费播放 | 干av在线 | 国产在线p | 久久99欧美 | 国产成人综 | 欧美在线视频一区二区三区 | 99精品免费久久久久久日本 | 99热这里只有精品在线观看 | 国产精品免费视频观看 | 香蕉视频网址 | 九九免费在线视频 | 婷婷亚洲五月 | 中文字幕在线观看亚洲 | 国产va在线 | 精品久久久久久综合日本 | 九九热视频在线 | 国产成人av | 久久av免费 | 亚洲日本va午夜在线电影 | 91亚洲精品久久久中文字幕 | 国产在线精品二区 | 99精品免费视频 | 奇米7777狠狠狠琪琪视频 | 黄色免费网站下载 | 日韩伦理片一区二区三区 | 国产精品涩涩屋www在线观看 | 国产在线中文字幕 | www91在线观看 | 手机在线观看国产精品 | 精品久久一区 | 成人a毛片| 中文字幕资源在线观看 | 日韩高清在线一区二区三区 | 丁香五月缴情综合网 | 精品久久电影 | 久久久国产精品网站 | 国产精品亚| 中文字幕日韩国产 | 就要干b| 成人永久视频 | 丝袜美腿亚洲 | 久草久草视频 | 久久亚洲私人国产精品 | 国产伦精品一区二区三区… | 国产精国产精品 | 国产精品中文久久久久久久 | 久久香蕉一区 | 精品美女久久久久久免费 | 亚洲国产日韩一区 | 亚洲乱码中文字幕综合 | 四虎成人精品在永久免费 | 亚洲成人免费在线观看 | 在线激情小视频 | 精品视频www | 深爱综合网 | 中文字幕 国产专区 | 国产99久久久久久免费看 | 国产福利av | 日韩一区二区免费视频 | 国产在线久久久 | 色www免费视频 | 日韩精品一区二区三区免费视频观看 | 欧美污在线观看 | 成人午夜av电影 | 国产精品一区二区精品视频免费看 | 色婷婷免费视频 | 国产高清绿奴videos | av久久久 | 91精品啪在线观看国产线免费 | 在线观看一区 | 成人小视频在线观看免费 | 毛片网在线观看 | 99在线视频免费观看 | 国产成人久久77777精品 | 毛片一级免费一级 | 黄色一二级片 | 免费观看全黄做爰大片国产 | 久久刺激视频 | 国产精品欧美久久久久无广告 | 日韩欧美在线视频一区二区三区 | 成人在线观看日韩 | 日本韩国精品一区二区在线观看 | 在线观看免费福利 | 国产 日韩 欧美 自拍 | 99婷婷 | 视频直播国产精品 | 日韩免费三区 | 国产剧情一区二区在线观看 | 日韩天堂网 | 日韩在线理论 | 久久久免费精品视频 | 亚洲精品午夜一区人人爽 | 亚洲精品www | 免费在线中文字幕 | 国产精品日韩久久久久 | 日韩午夜在线播放 | 日本精品久久久久久 | 欧美大片大全 | 日本中文字幕在线免费观看 | 欧美色精品天天在线观看视频 | www.久热 | 成人a大片 | 免费在线成人av电影 | 不卡的av在线播放 | 激情婷婷综合网 | 国产一区视频免费在线观看 | 精品久久久久国产 | 91精品播放| 狠狠gao | www视频在线播放 | 高清视频一区二区三区 | 国产中文在线视频 | 久久艹在线 | 视频国产区 | 久久综合九色综合久久久精品综合 | 波多野结衣视频一区二区 | 亚洲视频一区二区三区在线观看 | 精品久久国产一区 | 91天堂影院| 狠狠狠狠狠操 | 日日摸日日爽 | 国产日韩欧美在线 | 最新日韩视频在线观看 | 婷婷久操| 国产精品一区二区三区在线播放 | 美国av大片| 正在播放国产一区 | 人人爽人人爽人人爽 | 亚洲精品中文字幕视频 | 97色狠狠 | 国产精品破处视频 | 欧美亚洲专区 | 日韩中文字幕亚洲一区二区va在线 | 在线国产一区二区三区 | 91视频 - 88av | 在线观看成人毛片 | 日韩大片在线播放 | 制服丝袜一区二区 | 美女网站黄免费 | 婷婷深爱网 | 二区三区毛片 | 狂野欧美激情性xxxx欧美 | 亚洲最大av在线播放 | 国产最新视频在线观看 | 亚洲精品视频网站在线观看 | 国产精品美乳一区二区免费 | 中文在线最新版天堂 | 日韩一区二区三区不卡 | 粉嫩一区二区三区粉嫩91 | 成人免费在线观看电影 | 久久久久中文字幕 | 欧美日韩亚洲第一页 | 亚洲成aⅴ人片久久青草影院 | 欧美va电影| 国产中文 | 深夜免费福利视频 | 日日夜夜天天操 | 9在线观看免费高清完整版在线观看明 | 99精品在线播放 | 久久久黄色免费网站 | 人人草在线视频 | 毛片网站免费在线观看 | 美女视频黄是免费的 | 欧美国产精品久久久久久免费 | 成人免费看电影 | 人人天天夜夜 | 少妇bbw搡bbbb搡bbb | 特级黄色一级 | 2023年中文无字幕文字 | 中文字幕免费成人 | 日韩精品黄 | 97在线观看视频 | 日韩欧美高清免费 | 久久伊人婷婷 | 九色91在线| 日日夜夜天天 | 亚洲精品乱码白浆高清久久久久久 | 国语精品免费视频 | 最新av网址在线 | 96香蕉视频 | 成人av av在线| 国产一区在线免费观看 | 国产精品一级视频 | 91在线免费视频 | 亚洲年轻女教师毛茸茸 | 中文区中文字幕免费看 | 天天干天天射天天爽 | 韩日三级在线 | 久久精品这里精品 | 91香蕉视频黄色 | www.午夜色.com | 成年人三级网站 | 黄色成人影院 | 国产成人久久av免费高清密臂 | 日韩在线电影一区二区 | 99精品视频免费观看 | 日本久久高清视频 | 亚洲久草视频 | 亚洲国产日韩在线 | 狠狠操.com| 亚洲免费成人av电影 | 97香蕉久久国产在线观看 | 国产精品成人av在线 | 韩国av免费观看 | 中文字幕在线免费看线人 | 91在线观看欧美日韩 | 午夜视频免费在线观看 | 日韩高清www | 中文字幕欧美日韩va免费视频 | 久草网视频在线观看 | 欧美精品免费在线 | 夜夜干天天操 | 色网av| 中文字幕免费在线看 | 日韩黄色大片在线观看 | 一区二区视频在线免费观看 | 99久久精品免费一区 | 久久久国产精品视频 | 国产成人亚洲在线观看 | 久久精品免费播放 | 中中文字幕av在线 | 欧美日韩三区二区 | 日韩欧美电影在线 | 亚洲一区二区视频在线播放 | 特级aaa毛片 | 91精品对白一区国产伦 | 欧美日韩aaaa | 久久观看 | 91精品国产综合久久婷婷香蕉 | 国产精品一区二区三区视频免费 | avav99| 欧美日本在线观看视频 | 国产午夜精品在线 | 狠狠色丁香婷婷综合久久片 | 欧美性生活大片 | 色偷偷av男人天堂 | 97超碰人人看 | 操久在线 | 国产成人一区二区三区 | 日韩欧在线| 国产69精品久久99不卡的观看体验 | 亚州精品天堂中文字幕 | 91在线免费播放视频 | 日韩精品视频在线观看免费 | 九九热在线免费观看 | 日韩av偷拍 | 日韩免费播放 | 四虎在线观看精品视频 | 日本性生活免费看 | 欧美va天堂va视频va在线 | 尤物九九久久国产精品的分类 | 在线影院av | 国产女v资源在线观看 | 色网站在线免费 | 在线小视频 | 久久久久久久久电影 | 婷婷免费视频 | 欧美日韩高清 | 五月婷婷六月丁香 | 亚洲日本在线一区 | 天堂网一区二区 | 91香蕉视频| 992tv成人免费看片 | 最新久久免费视频 | www.狠狠操| 国产午夜精品一区二区三区在线观看 | 在线观看中文 | 国产精品电影一区 | 麻豆果冻剧传媒在线播放 | 久久精品一区二区三区视频 | 国产精品系列在线播放 | 99精品视频在线看 | 一级性生活片 | 中文字幕国产视频 | 91精品视频导航 | 久久视频精品在线 | 91麻豆精品国产自产 | 性色av香蕉一区二区 | 亚洲精品视频大全 | 在线一区电影 | 国产69精品久久99不卡的观看体验 | 在线欧美国产 | 国产精品免费久久 | 97在线精品视频 | 午夜久久影视 | 久草剧场 | 九九热1 | 日本婷婷色 | 国产成人91| 人交video另类hd | 久久精品伊人 | 91亚洲视频在线观看 | 亚洲国产黄色 | 国产精品久久久久婷婷二区次 | 97超在线视频 | 人人爽人人射 | 国产一级二级在线观看 | 三级在线视频播放 | 日日夜夜综合网 | 国产精品久久久久久久电影 | 日韩av高潮 | 狠狠干狠狠艹 | 精品国产一区二区三区蜜臀 | 久久久久久久久久久网站 | 91精品视频在线免费观看 | 超碰九九| 97视频人人澡人人爽 | 亚洲区视频在线观看 | 97精品国产91久久久久久 | 97精品久久| 亚洲精品88欧美一区二区 | 在线看污网站 | 国产精品久久久久久久久久免费看 | 日韩av女优视频 | 国产精品门事件 | 97涩涩视频| 92精品国产成人观看免费 | 美女中文字幕 | 久久午夜电影网 | 国产精品第一页在线观看 | 999精品 | 亚洲精品av中文字幕在线在线 | 超碰大片| 中文字幕888 | 国内三级在线观看 | 国产美女黄网站免费 | av在线精品 | 免费三级骚 | 91av在线免费观看 | 国产麻豆精品久久一二三 | 国产精品激情偷乱一区二区∴ | 国产精品久久久久aaaa九色 | 久久网站免费 | 婷婷丁香六月天 | 高清av免费看 | 久久精品五月 | 人人草在线视频 | 国产麻豆视频网站 | 最近免费中文视频 | 国产精品久久久久永久免费 | 色av网站 | 视频在线一区二区三区 | 国产一区二区观看 | 久久黄色小说 | 免费黄色小网站 | 性色在线视频 | 欧美伦理一区二区 | 亚洲精品在线播放视频 | 欧美精品久久久久久久久久 | 亚洲精品欧美专区 | 国产一区在线免费观看视频 | 成人精品一区二区三区电影免费 | 亚洲精品视频免费在线 | 香蕉久草在线 | 久久看片 | 天堂av官网 | 国产在线更新 | 99久久成人| 国内精品久久影院 | 免费a级大片| 国产精品永久免费视频 | 黄色一级大片在线免费看产 | 91桃色在线观看视频 | 国产精品激情 | 国产精选视频 | 色播五月激情五月 | 日韩av在线一区二区 | 午夜视频一区二区 | 在线视频精品播放 | 中文字幕在线观看资源 | 亚洲国产精品久久久久婷婷884 | a在线一区| 国产又粗又猛又黄 | 九九免费在线观看 | 亚洲欧美综合精品久久成人 | 久久久久国产成人精品亚洲午夜 | 国产一区欧美二区 | 久艹在线播放 | 亚洲人成人在线 | 综合久久久久久 | 欧美日韩亚洲国产一区 | 国产精品专区在线观看 | 免费在线播放黄色 | 91成人在线视频观看 | 日韩亚洲精品电影 | 国产视频一二三 | 久久综合久久综合这里只有精品 | 免费看v片网站 | 91精品视频在线播放 | 狠狠色丁香久久婷婷综 | 96av在线视频| 成人欧美日韩国产 | 天天看天天干天天操 | 日韩色一区二区三区 | 亚洲 欧洲 国产 日本 综合 | 人人狠狠综合久久亚洲婷 | 久久精品国产一区二区 | 日韩精品欧美精品 | 亚洲欧洲精品一区二区精品久久久 | 久久精品日韩 | 免费看三级黄色片 | 久久伊人精品天天 | h网站免费在线观看 | 日韩视频图片 | 黄色小说免费观看 | 色姑娘综合天天 | 精品国产_亚洲人成在线 | 涩涩网站免费 | 久久国产一区二区三区 | 91av视频免费在线观看 | 欧美激情xxxx性bbbb | 婷婷丁香狠狠爱 | 探花视频免费观看 | 亚洲区另类春色综合小说 | 日韩av电影免费观看 | 四虎视频 | 手机成人av| 成人网页在线免费观看 | 国产精品久久久久久超碰 | 成人一区影院 | 国产 日韩 欧美 自拍 | 国产片免费在线观看视频 | 国产精品久久久一区二区三区网站 | 亚洲高清视频在线播放 | 午夜久久久精品 | 五月婷婷开心 | 久久久亚洲国产精品麻豆综合天堂 | 国产破处在线视频 | 亚洲黄色成人网 | 久精品在线| 欧洲精品久久久久毛片完整版 | 国产日韩欧美在线免费观看 | 国产成人精品一区二区三区福利 | 日韩精品免费在线视频 | 国产一区二区在线免费 | 国产伦精品一区二区三区免费 | 日本性久久| 免费在线国产精品 | 激情伊人| 美女福利视频网 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产精品入口传媒 | 亚洲激情综合 | a电影免费看 | 黄色在线看网站 | 色婷婷成人网 | 免费国产黄线在线观看视频 | 免费av福利 | 国产96在线| 成人免费观看a | av+在线播放在线播放 | 亚洲妇女av| 国产一区成人 | 国产亚州精品视频 | 国产精品免费视频观看 | 91探花系列在线播放 | 美女在线免费观看视频 | 亚洲综合色视频 | 久久在线电影 | 一区二区三区四区五区在线 | 99产精品成人啪免费网站 | 夜夜操网站 | 国产精品18久久久久久久 | 在线观看日韩精品视频 | 黄色软件在线观看 | av手机版| 日本激情动作片免费看 | 日韩理论片 | 色播五月激情五月 | 国产精品 亚洲精品 | 久久精品国产成人 | 精品一区二区三区香蕉蜜桃 | 91亚洲成人| 欧洲一区二区三区精品 | av电影在线播放 | 97精品伊人 | 色综合久久中文字幕综合网 | 亚洲理论在线 | 成人精品一区二区三区电影免费 | 99自拍视频在线观看 | 91精品国产乱码在线观看 | 国产精品入口麻豆 | 免费观看一级视频 | 99操视频 | 麻豆免费在线视频 | 碰天天操天天 | 一二三区在线 | 精品国产乱码一区二 | 久久久免费播放 | 免费在线观看av电影 | 亚洲国产三级在线 | 精品999久久久| 天天射天天操天天 | 成人小视频在线 | 天天看天天干 | 欧美 日韩 成人 | 国产精品久久一区二区三区, | 国产一级黄色电影 | 欧美一区二区精美视频 | 日韩综合第一页 | 久久久影院一区二区三区 | 中文日韩在线 | 玖玖999| 国产一区二区不卡视频 | 欧美午夜性生活 | 激情视频区 | 久久精品99国产 | 久久国产片 | 国产精品无av码在线观看 | 国内精品久久影院 | 片网址| 9797在线看片亚洲精品 | 国产精品二区在线观看 | 国产黄在线看 | 久久精品麻豆 | 久久久久www| 国产一级一片免费播放放a 一区二区三区国产欧美 | 黄色小说视频网站 | 亚洲精品国产精品国产 | 日韩中文字幕视频在线观看 | av免费电影在线观看 | 极品久久久久久久 | 亚洲欧洲国产日韩精品 | 国产精品毛片久久久久久久久久99999999 | 久久精品国产精品 | 久久亚洲区 | 日韩三级成人 | 色综合天天视频在线观看 | 97在线看 | 亚洲精品高清一区二区三区四区 | 久久久久久久久久久影视 | 欧美日韩视频网站 | 成人久久18免费 | 久久久国产精品麻豆 | 在线中文字幕网站 | www色,com | 国产流白浆高潮在线观看 | 狠狠操操操 | 欧美91精品久久久久国产性生爱 | 天天天干夜夜夜操 | 国产日韩欧美在线观看视频 | 久久久影视 | 亚洲精品999 | 99精品久久久久久久久久综合 | 丁香六月欧美 | a√天堂中文在线 | 成年人在线观看 | 日本中出在线观看 | 午夜精品av在线 | 日韩av电影免费在线观看 | 久久人人爽人人爽人人 | 欧美大荫蒂xxx | 亚州中文av | 在线观看精品国产 | 香蕉网在线观看 | 人人舔人人舔 | 视频二区在线 | 天天干天天怕 | 久久综合九色综合欧美就去吻 | 国产正在播放 | 97成人精品视频在线观看 | 蜜臀久久99精品久久久久久网站 | 亚洲综合在线观看视频 | 99国产视频在线 | av综合av | 日韩高清免费在线观看 | 色免费在线 | 国产aaa大片 | 欧美成人猛片 | 美女视频黄免费的 | 欧美日韩国产在线一区 | 日韩一区二区三免费高清在线观看 | 日韩有码第一页 | 欧美人交a欧美精品 | 欧美精品乱码99久久影院 | 久久a级片 | www.天天草 | 美女视频黄是免费的 | 国内精品久久久久久久久久久 | 日韩在线观看中文 | 91在线日本| 国产成人久久av977小说 | 极品嫩模被强到高潮呻吟91 | 国产精品一区二区精品视频免费看 | 人人澡人人澡人人 | 国产高清av | 在线日韩亚洲 | 免费av观看网站 | 欧美精品乱码久久久久久按摩 | 成人a视频 | 久久精品中文字幕免费mv | 久久99国产视频 | 亚洲黄网址 | 久久理伦片 | 国产高清视频在线播放 | 国产精品自产拍 | 国产一区二区在线观看免费 | 国产精品黄色在线观看 | 一区二区电影在线观看 | 日韩精品视频免费看 | 久久国产精品一区二区三区四区 | 久久国产成人午夜av影院宅 | 毛片888| 91久久黄色 | 九九av | 日韩在线一级 | 国产一区欧美一区 | 人人舔人人舔 | 午夜精品久久久久久久久久 | 久久精品黄| 精品欧美一区二区精品久久 | 欧美一区二区三区在线播放 | 最新日韩中文字幕 | 亚洲少妇影院 | 在线视频a | 成人久久久久久久久久 | 久久少妇免费视频 | 丁香婷婷色综合亚洲电影 | av免费播放| 四虎国产精品永久在线国在线 | 成年人黄色大全 | 国产小视频在线看 | 九九热在线播放 | www狠狠| 在线免费观看麻豆 | 亚洲国产97在线精品一区 | 超碰在线观看99 | 色全色在线资源网 | 欧美性色综合网站 | 丁香av在线 | 中文字幕有码在线播放 | 欧美激情精品久久久久久变态 | 91麻豆精品国产91久久久无限制版 | 成人av午夜 | 欧美久久综合 | 韩国在线一区二区 | 国产99一区视频免费 | 成年性视频 | 久久国产网站 | 日韩成人免费观看 | 亚洲黄色免费 | 国产高清视频在线播放一区 | 天堂资源在线观看视频 | 高清av不卡| 女人18毛片a级毛片一区二区 | 欧美午夜视频在线 | 欧美aa一级 | 欧美一区二区视频97 | 成人电影毛片 | 在线黄色免费av | 黄色一级大片在线观看 | 在线播放第一页 | 亚洲电影久久久 | 狠狠色丁香婷婷综合基地 | 日韩一三区 | 日韩精品视频一二三 | 91精品久久久久久 | 国产 日韩 在线 亚洲 字幕 中文 | 五月综合婷 | 久久艹国产 | 色婷婷激情综合 | 99国内精品 | 成人免费精品 | 久草精品免费 | 在线天堂v | 色噜噜日韩精品一区二区三区视频 | 色多多污污在线观看 | 最新国产在线 | 黄色一级影院 | 伊人伊成久久人综合网小说 | 在线观看va| 免费看一级特黄a大片 | 国产在线最新 | 亚洲国产片色 | 日本最新中文字幕 | 日韩在线观看视频一区二区三区 | 手机在线看片日韩 | 丁香一区二区 | 丰满少妇在线观看网站 | 久久99最新地址 | 不卡的av中文字幕 | 亚洲无在线 | 最新av电影网站 | 日韩精品不卡在线观看 | 欧美污在线观看 | 久久毛片视频 | 国产精品18久久久久久不卡孕妇 | 久久久久久看片 | 久久久久久麻豆 | 成人免费色| 国产中的精品av小宝探花 | 免费日韩av片 | 中文字幕在线观看2018 | 精品视频不卡 | 色综合天天在线 | 国内小视频| 国产精品亚洲片夜色在线 | 欧美一级在线观看视频 | 最近中文字幕高清字幕免费mv | 国产无套精品久久久久久 | 91九色蝌蚪国产 | 最新av免费在线 | 日批网站在线观看 | 在线观看av免费观看 | 麻豆精品视频 | 日韩欧美综合在线视频 | 欧美激情精品久久 | 成人动漫一区二区三区 | 天天操天天干天天综合网 | 夜夜操天天干, | 亚洲国产免费av | 亚洲高清视频在线观看免费 | 国外调教视频网站 | 欧美日韩国产二区三区 | 97精品国产97久久久久久春色 | 国产精品小视频网站 | 深爱激情站 | 亚洲精品视频在线免费 | 不卡在线一区 | 色av男人的天堂免费在线 | 色a在线观看| 韩国在线视频一区 | 在线国产一区二区三区 | 91久久人澡人人添人人爽欧美 | 日韩69视频 | 激情开心站 | 欧美a级在线| 又爽又黄又刺激的视频 | 久久午夜网 | 99国产免费网址 | 国产成人福利在线 | 亚洲精品午夜久久久久久久久久久 | 亚洲欧美少妇 | 天天草天天干天天射 | www.亚洲精品视频 | 亚洲精品自在在线观看 | 精品三级av | 九九热只有这里有精品 | 日韩一区二区三区高清免费看看 | 国内一区二区视频 | 在线观看视频 | 色婷婷99| 欧美日韩色婷婷 | 高清不卡免费视频 | 欧美91视频 | 狠狠干天天操 | 中文字幕亚洲欧美日韩2019 | 欧美性大战 | 在线观看的av网站 | 狠狠网| 久久只精品99品免费久23小说 | 婷婷五月情 | 欧美性色综合网 | 亚洲精品在线观看免费 | 国产欧美日韩精品一区二区免费 | 91av视频网| 五月天激情在线 | 在线免费国产 | 夜夜骑天天操 | 人人爽人人爽人人片 | 久久艹欧美 | 国产视频在线免费观看 | 在线播放国产精品 | 婷婷丁香激情综合 | 成人国产精品久久久春色 | 最近能播放的中文字幕 | 免费精品国产 | 日本久久久久久科技有限公司 | 国产99免费视频 | 91精品老司机久久一区啪 | 国产视频资源在线观看 | 日日干精品 | 在线观看视频一区二区三区 | 狠狠色丁香久久婷婷综合丁香 | 国产在线理论片 | 国产精品伦一区二区三区视频 | 国产成人三级一区二区在线观看一 | 夜夜操狠狠干 | 日韩精品网址 | 天天躁天天躁天天躁婷 | 麻花传媒mv免费观看 | 91爱爱电影 | 97看片| 国产精品一区二区美女视频免费看 | 亚洲不卡av一区二区三区 | 黄色软件网站在线观看 | 免费在线播放黄色 | 久久综合给合久久狠狠色 | 欧美二区在线播放 | 亚洲精品资源 | 久久久久久久久久久久国产精品 | 日韩系列 | av网址aaa | 欧美日韩综合在线观看 | 亚洲精品动漫久久久久 | 亚洲成av人影院 | 中文字幕亚洲精品在线观看 | 色天天久久 | 国产福利网站 | 91天堂影院 | 成人小视频在线免费观看 | 国产在线黄 | 免费日韩在线 | 色视频国产直接看 | 国产大片黄色 | 国产1区在线观看 | 极品国产91在线网站 | 黄色电影小说 | 超碰在线资源 | 夜夜躁日日躁狠狠久久av | 在线日本v二区不卡 | 99免费看片| 国产做a爱一级久久 | 国产成人精品女人久久久 | 国产明星视频三级a三级点| 国产 在线 高清 精品 | 91精品视频免费看 | 中文字幕亚洲综合久久五月天色无吗'' | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 91色视频| 亚洲色图av | 91综合视频在线观看 | 天天干婷婷 | 91九色视频国产 | 91热精品| 日韩久久精品一区二区三区下载 | 精品无人国产偷自产在线 | 亚洲激情av | 亚洲精品网址在线观看 | 日韩av中文 | 日本不卡一区二区 | 人人添人人澡人人澡人人人爽 | 国产亚洲精品日韩在线tv黄 | 久久综合导航 | 国产免费成人 | 国产91aaa | 成人久久影院 | 欧美精品黑人性xxxx | 日韩在线观看中文 | 天天综合日日夜夜 | 国产精品一区二区在线观看免费 | 国产精品99久久久久久人免费 | 日韩欧美在线综合网 | av黄免费看 | 天天综合成人 | 国产永久免费高清在线观看视频 | 精品国产_亚洲人成在线 | 激情婷婷在线 | 国产综合视频在线观看 | 日韩av一卡二卡三卡 | 国产成人免费在线观看 | 日韩av片无码一区二区不卡电影 | 天天色天天色 | 一区二区 不卡 | 伊人成人精品 | 91看片黄色| 五月天激情视频在线观看 | 91久久一区二区 | 天天伊人网 | 精品三级av | 久久电影色 | 亚洲精品免费在线视频 | 亚洲电影自拍 | 亚洲片在线观看 | 狠狠色狠狠色终合网 | 蜜臀久久99静品久久久久久 | 国产日产精品一区二区三区四区 | 综合久久久久久 | 国产精品久久久久久久久毛片 | 777xxx欧美| 久久激情视频 久久 | 午夜三级理论 | 91字幕| 久久久久久久影院 | 人人看人人 | www.com.日本一级 | 国产污视频在线观看 | 午夜视频日本 | 在线成人国产 | 国产精品电影在线 | 免费在线国产 | 国产麻豆精品95视频 | 亚洲色图激情文学 | 婷婷av色综合 | 国产一区二区三区 在线 | 色的网站在线观看 | 日韩电影一区二区在线 | 久久人91精品久久久久久不卡 | 在线视频麻豆 | 色是在线视频 | 成人动漫一区二区 | 不卡精品视频 | 成人小视频在线 | 男女靠逼app | 婷婷丁香av | 91成人在线网站 | 国产视频手机在线 | 国产亚洲精品久久久久久网站 | 一本到视频在线观看 | 国产黄色免费观看 | 九七在线视频 | 在线91观看 | 开心丁香婷婷深爱五月 | 久久在线免费观看 | 成年人视频在线免费 | 在线视频中文字幕一区 | 欧美一级裸体视频 | 国内精品美女在线观看 | 国产视频一区精品 | 91av美女| 欧美狠狠色| 午夜视频亚洲 | 99精品在线免费观看 | 亚洲va男人天堂 | 天堂av免费观看 | 日韩视频www | 9在线观看免费高清完整版 玖玖爱免费视频 | 一 级 黄 色 片免费看的 | 色精品视频 | 欧美三级高清 | 91网站在线视频 | 亚洲少妇激情 | 国产一区二区三区四区在线 | 亚洲精品国产精品乱码不99热 | 欧美另类一二三四区 | 在线观看91 | 国产精品白浆视频 | 久久精品一区二区 | a一片一级 | 久久精品国产精品 | 日韩一区二区三区免费视频 | 久久国产一二区 | www.夜夜爱 | 成人一级视频在线观看 | 免费99精品国产自在在线 | 在线视频 日韩 | 国产精品久久久久久影院 | 国产亚洲在线视频 | 探花视频免费观看 | 久久久网站 | 91自拍成人 |