3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

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

编程问答

清华大学王晨阳:轻量级Top-K推荐框架及相关论文介绍

發布時間:2024/10/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 清华大学王晨阳:轻量级Top-K推荐框架及相关论文介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文內容整理自 PaperWeekly 和 biendata 在 B 站組織的直播回顧,點擊文末閱讀原文即可跳轉至 B 站收看本次分享完整視頻錄像,如需嘉賓課件,請在?PaperWeekly 公眾號回復關鍵詞課件下載獲取下載鏈接。

構建一個公平的推薦算法“合唱團”,這也是框架名稱 ReChorus 的由來 圖片出處:pixabay

作者簡介:王晨陽,清華大學計算機系人智所信息檢索課題組二年級博士生,研究方向為推薦系統中用戶的動態需求,主要包括序列推薦、引入知識及時間動態性的意圖理解等,在WWW、SIGIR等會議發表多篇論文。

推薦系統中基于深度學習的方法近幾年來層出不窮,然而不同工作之間實驗設定和實現細節的差異使得我們很難直接比較不同論文的相對效果。有論文針對推薦領域中實驗的可復現性提出了質疑,認為百花齊放的表象背后的實際情況是推薦系統領域長時間的停滯不前。

為此,我們基于最近發表在 SIGIR’20 工作的代碼,整理出了一個輕量級的 Top-K推薦框架 ReChorus,旨在分離模型間共同的實驗設定和不同的模型設計,使得各個模型能夠在一個公平的 benchmark 上進行對比。ReChorus 足夠簡單易上手,既適合初學者了解推薦領域的經典模型,也適合研究者快速實現自己的想法;同時 ReChorus 足夠靈活,可以輕松適配個性化的數據格式和評測流程。

本文還會介紹目前 ReChorus 中表現最好的模型——引入商品關系和時間動態性的商品表示。這個工作顯式建模了目標商品和近期交互商品之間的關系,以及不同關系所產生的影響如何隨時間變化。實驗表明該方法得到的商品表示可以靈活地應用于各種推薦算法并取得顯著的效果提升。

推薦系統領域的劣幣驅逐良幣


在開始介紹 ReChorus 前,讓我們先思考幾個問題。

第一個問題,如上圖所示,簡單回憶的話,推薦系統領域所用的 baseline 是不是往往就那么幾個?可能研究者們不再像過去那樣傾向于同某個領域或問題設定下最好的?baseline?做比較,轉而和比較流行的 baseline 做比較。只做到了比某個流行的baseline 表現好一點,研究者就宣稱自己達到了?state-of-the-art(SOTA) 的性能。如果你去找那些非常強的 SOTA?的模型做比較,提升就會相對變小,論文相對更難發,而這樣的狀況很可能導致劣幣驅逐良幣的趨勢。

近期就有這樣的一批論文發表,研究者們都自稱達到了 SOTA 的性能。可以預見的是后續的研究者撰寫新一批論文,選擇?baseline?進行比較時會更傾向于選這批論文中表現比較差的,由此對比出他們的論文算法有了比較大的提升。雖然這樣會讓整體的論文發表呈現百家爭鳴、百花齊放的表象。但是這樣的機制會使真正高質量?baseline?在浪潮中被淹沒。

在推薦領域,即使是比較資深的專家,也很難指出在某個任務設定下 SOTA 模型到底是哪一個。或許你會覺得這有什么難的,直接將新論文同一個 baseline 相對提升的幅度做比較不就可以了?

這就引出來了第二個問題,比較后會發現一個詭異的現象,同一組的?baseline?在不同的論文中相對的優劣是不一樣的。雖然有時候審稿人會指出這些問題,但是在很多已發表的論文中也能觀察到這樣的現象,雖然數據集在其中造成了一定的影響,但是我覺得很大程度上還是因為沒有把參數調好。

現在很多研發者不會下功夫對 baseline 做調整,調出一個差不多的結果后就做罷了。但這樣的后果是,如果想比較兩個自身達到了?SOTA?性能的模型,其相對提升就不會有特別明顯的可比性,可能其中一個 baseline?調的非常好,另外一個則沒有。這時就很難比較到底哪個模型在整個領域上達到了一個更優的效果。

那么,將在同一個數據集上進行過實驗的模型拿來比較效果不就行了嗎?這就引出了第三個問題:很多論文即使是在同一個數據集上,實驗結果也不太有可比性。其中的原因有很多,我們來看幾個比較有代表性的例子:

1. 推薦領域比較常見的數據預處理,是否去除了那些交互數量比較少的用戶item(常見去掉小于等于5的)?

2. 是否去掉了比較 popular 的 item ?

3. 在數據劃分時,直接用 leave-one-out 的方法把每個用戶的最后一個序列作為測試集,還是為了防止時間泄露,設置一個時間來做一刀切來做數據集?

4. 在負例選取上是直接選用戶沒有交互過的作為負例,還是選擇一個按照 item popular 的程度進行加權的負例采樣?

上述例子看起來都是一些細節的設定,可能并不會非常明確的在論文中體現,但它們對模型的效果卻有很大的影響。在同一個數據集上,兩篇論文的實驗結果可能會因為這些細節設定的差別存在跨數量級的差別。

最近?RecSys?的一篇論文 Are we really making much progress? A worrying analysis of recent neural recommendation approaches?也講了這個問題。在推薦系統中,實驗設定有很多具有分歧的地方,在這篇論文中就總結了多達8個分歧點,看起來不多,但假如說每一個分歧點至少有兩種選擇,2的8次方就是256種實驗組合。

雖然實際中可能并不會這么多,常見的情況可能接近10種。這依然意味著很難保證想比較的兩篇論文采取了完全一樣的實驗設定,也就導致即使兩篇在同一個數據集上進行實驗的論文,它們的結果也無法做比較科學的比較。

可能你會產生新的疑問,現在代碼不都開源嗎?我直接將代碼在我的實驗設定下跑一跑就可以了。我們來看看會發生什么:假設你準備下周一跟導師開組會匯報,你和導師說這周要把一個開源的?baseline?在自己的實驗設定下跑一跑結果。周二你下載了代碼,但發現把它改到能在自己的實驗設定下去跑是非常困難的。

這其實是現在比較常見的一個現象,按說代碼開源要滿足的最低要求是可以復現論文的結果,先不說有些開源代碼連這個最低的要求都沒有實現,即使是達到最低要求的代碼可能也很難匹配你的實驗設定。我遇到過一個最極端的例子,當時要去補充一個帶商品關系的 baseline(具體的名字就不說了)。

拿到代碼后首先發現這篇論文有兩個數據集,但奇怪的是代碼載入時好像只有一個數據集的相關的內容。再看模型就更奇怪了,這份商品關系的baseline帶有一個知識圖譜,其中所有關于商品關系的代碼,都按商品關系的數量去寫了多份,比如數據其實有兩種關系,就需要把同樣的代碼段寫兩份,把變量名做一個像X1、X2這樣的區分。

我當時非常震驚,第二個數據集怎么辦?果然有其他人問了論文作者同樣的問題,作者怎么回應呢?給了一個百度網盤的鏈接用來下載第二個數據集的代碼,我下載后發現第二個數據集有3種關系,類似第一個數據集,作者又把所有跟這種商品關系相關的代碼段寫了3遍,所有的變量用X1、X2、X3來替代,這讓我非常崩潰,我的數據集有十幾種關系,如果像他這樣寫,就要寫上一個幾千行且bug非常多的程序。

其實整個開源領域的代碼質量非常參差不齊。回到上文假設的場景,整整一周你都沒有把開源的?baseline 在自己的實驗設定下真正跑起來。但和跟老師匯報時,老師可能會質疑你這一周都干了啥?既然是開源代碼,為什么一周連一個實驗的結果都沒跑出來,你到底有沒有在做實驗?你只能一肚子的委屈。


上面的這些問題,也是一、兩年間我們在做推薦領域研究中觀察到的。上圖右邊,去年 RecSys 上的 best paper 也討論了這些問題,在推薦系統領域,我們是否在真正的 making progress ?作者選擇了18篇推薦領域的論文,但他只成功復現了其中的7篇,這7篇中效果能超過優質傳統模型的又少之又少。

在目前看來,推薦系統論文百花齊放的表象下,確實很有可能隱藏著一個長期的停滯不前,或至少是一個比較緩慢的前行實際情況。

ReChorus推薦框架介紹

2.1 ReChorus推薦框架介紹

如何改善這樣的狀況呢?我們認為關鍵點在于是提供一個比較公平的 benchmark 評測平臺,讓不同的模型在同樣的設定下進行評測。研究者可以直觀、清晰地看到不同的模型之間的優劣關系。好比看家用顯卡天梯圖一樣:我基于現在的預算,就知道我該選什么樣的顯卡。

類似的,有了評測平臺提供的模型天梯圖,研究者就能知道基于自己的實驗設定,應該選擇哪個 baseline 去作為我對比的目標、超越的對象,同時也可以幫助初學者更快地了解常見推薦算法。

我們基于上述的想法,同時在整理這次 SIGIR 一篇論文的代碼時,就思考如何做成更通用的操作,可以推薦框架,促進領域中的模型來做公平的對比,從而構建一個真正的推薦算法“合唱團”,這也是框架名稱 ReChorus 的由來。

在設計框架時,最主要的核心思想是如何分離模型間共同的實驗設定到共享的類中,突出不同的模型的細節,從而讓不同的模型可以在完全相同的實驗設定下進行對比。另外我們希望框架具有以下四個特點:

  • 輕量:易上手,代碼self-contain;

  • 高效:盡可能加速通用的訓練和評測過程;

  • 靈活:適配不同的數據輸入格式和實驗設定;

  • 專注:實現新模型時只需要關注一個文件。

針對第4點再補充說明幾句,為什么很多開源出來不是特別好的代碼,都是一個文件把一個模型寫完?因為這樣的好處非常明顯,使得研究者在調試時非常方便,只關注這一個文件,哪里有問題直接翻到那去找。

而一些框架會分很多很多類,非常面向對象。研究者可能寫一個模型代碼,在數據準備時要翻到前面去,看看所用的類如何適配自己的模型,這需要翻很多其他的文件,甚至還要對文件做改動,牽一發而動全身,研究者又要顧及改動會不會影響自己構建的其他模型,構建模型的思路就會被打亂。

我們希望實現把模型間不同的部分盡可能都集中到統一文件中去。

上圖顯示了已有的模型?目前實現的模型主要是基于 SIGIR 那篇論文的 baseline ,添加了一些常見的模型,還在繼續擴充當中,上圖的右面的二維碼指向GitHub的鏈接,歡迎查看。

可以看到目前實現的模型包括從2009年比較經典的BPR,到后續的2016年、2017年、2018年、2019年、2020年的算法,既包括傳統的模型,也有序列的模型,同時結合知識圖譜、結合時間信息的也有了一些實踐,性能的對比、各自的特點和運行時間列在了上圖右側。后文還會再講這個結果,這里先不做詳細分析。

2.2?框架主體

如上圖,首先把框架分成了兩個類型的類,核心的模型類和幫助類。核心的模型類以 model 結尾,主要用來定義模型的細節,也就是體現模型之間差異化的內容,以及如何構建輸入的batch,這些都放在同一個文件里面,而且并不長。

幫助類分reader 和 runner 。reader 從硬盤中讀取文件、數據集放到內存里,然后進行統一的預處理。runner 控制模型訓練和評測的過程,會和所用到的深度學習框架訓練和評測的代碼有關,這里是基于pytorch的一個實現。

從上圖可以看出,模型可以共享幫助類。雖然目前幫助類只實現了兩個(base reader 和 base runner),如果我們的實驗有變化,比如數據集的格式有變化,我們可以實現新的 reader,也可以用其他的 runner 來實現不同的評測的機制。這些 reader 和 runner 幫助類都是可以指定給每個模型,有點像 OOP 里面的設計模式,這些就像它的“廚師”,可以把它指定給每一個模型,實現靈活的適配。

接下來帶大家從代碼的層面梳理一遍 ReChorus 框架。

文件夾層面大概分data、log和src,log包含輸出的log文件,src包含主要的模型代碼。下面快速看一下data中的內容,數據集大概長什么樣。

上面的代碼非常簡單,包含四個文件,其中train、test和dev 這三個文件比較重要,關鍵數值是user ID、item ID,還有每個的時間戳。

對于測試集和驗證集來說,測試的時候我們一般會 sample 一些負例,和正例組成 candidate set,然后把正例和負例一起做排序,看正例到底排在第幾位,所以train、test和dev這三個文件是必須的。后面選擇性的提供 item 的、特征知識圖譜的一些信息。r_complement 部分代表第一個item跟這一類item有互補的關系。

r_complement 部分代表第一個item跟這一類item有互補的關系。到這個 src 中的代碼層面。主要分為三部分,一個是前文說的幫助類,實現了 base reader 和 base runner,第二部分 models 層面除了 base model 是一個基本的類以外,可以理解為一個抽象類,后面對于每個模型實現一個類,繼承這個 base model 來實現它具體的功能。第三部分 util 層面是一些工具性的函數。函數主要入口在main,從main開始來看一下完整的框架。

# -*- coding: UTF-8 -*-import os import sys import pickle import logging import argparse import numpy as np import torchfrom models import * from helpers import * from utils import utilsdef parse_global_args(parser):parser.add_argument('--gpu', type=str, default='0',help='Set CUDA_VISIBLE_DEVICES')parser.add_argument('--verbose', type=int, default=logging.INFO,help='Logging Level, 0, 10, ..., 50')parser.add_argument('--log_file', type=str, default='',help='Logging file path')parser.add_argument('--random_seed', type=int, default=2019,help='Random seed of numpy and pytorch.')parser.add_argument('--load', type=int, default=0,help='Whether load model and continue to train')parser.add_argument('--train', type=int, default=1,help='To train the model or not.')parser.add_argument('--regenerate', type=int, default=0,help='Whether to regenerate intermediate files.')return parserdef main():logging.info('-' * 45 + ' BEGIN: ' + utils.get_time() + ' ' + '-' * 45)exclude = ['check_epoch', 'log_file', 'model_path', 'path', 'pin_memory','regenerate', 'sep', 'train', 'verbose']logging.info(utils.format_arg_str(args, exclude_lst=exclude))# Random seednp.random.seed(args.random_seed)torch.manual_seed(args.random_seed)torch.cuda.manual_seed(args.random_seed)# GPUos.environ["CUDA_VISIBLE_DEVICES"] = args.gpulogging.info("# cuda devices: {}".format(torch.cuda.device_count()))# Read datacorpus_path = os.path.join(args.path, args.dataset, model_name.reader + '.pkl')if not args.regenerate and os.path.exists(corpus_path):logging.info('Load corpus from {}'.format(corpus_path))corpus = pickle.load(open(corpus_path, 'rb'))else:corpus = reader_name(args)logging.info('Save corpus to {}'.format(corpus_path))pickle.dump(corpus, open(corpus_path, 'wb'))# Define modelmodel = model_name(args, corpus)logging.info(model)model = model.double()model.apply(model.init_weights)model.actions_before_train()if torch.cuda.device_count() > 0:model = model.cuda()# Run modeldata_dict = dict()for phase in ['train', 'dev', 'test']:data_dict[phase] = model_name.Dataset(model, corpus, phase)runner = runner_name(args)logging.info('Test Before Training: ' + runner.print_res(model, data_dict['test']))if args.load > 0:model.load_model()if args.train > 0:runner.train(model, data_dict)logging.info(os.linesep + 'Test After Training: ' + runner.print_res(model, data_dict['test']))model.actions_after_train()logging.info(os.linesep + '-' * 45 + ' END: ' + utils.get_time() + ' ' + '-' * 45)

首先定義了一些global的參數,主要控制整體的,比如 manual_seed的問題。主函數部分還包含一些比較通用的設置,像隨機數參數(隨機數的種子)、具體用哪一個GPU。我調用 reade r這個類去進行 corpus 的構建。

有一些預處理會比較花費時間,所以默認把讀入數據進行存儲,也可以修改比如 regenerate 這樣的參數,讓它實現每一次都進行一個重復的預處理。還可以定義 model,根據所定義的model的內容,來做初始化參數的操作以及決定是否輸入到顯卡中。

之后調用 runner 類對模型進行評測和訓練。還定義了每個的 dataset ,也就是pytorch 面內置的 dataset 一個集成的類,可以看到我把 dataset 寫到了 model 中作為一個內部類。

為什么不把準備batch寫到reader里面去?基于前文說過的設計框架指導原則,就是要把模型間不同的地方都集中到一個文件里,其實準備batch不同模型往往非常不一樣,所以我就把它集成到了模型這類里面去。runner 通過 runner.train 這行代碼控制整個訓練的過程,看一下訓練結果這部分就結束了。以上,main主要就是把所有的部分串聯起來。

class BaseReader(object):@staticmethoddef parse_data_args(parser):parser.add_argument('--path', type=str, default='../data/',help='Input data dir.')parser.add_argument('--dataset', type=str, default='Grocery_and_Gourmet_Food',help='Choose a dataset.')parser.add_argument('--sep', type=str, default='\t',help='sep of csv file.')parser.add_argument('--history_max', type=int, default=20,help='Maximum length of history.')return parserdef __init__(self, args):self.sep = args.sepself.prefix = args.pathself.dataset = args.datasetself.history_max = args.history_maxt0 = time.time()self._read_data()self._append_info()logging.info('Done! [{:<.2f} s]'.format(time.time() - t0) + os.linesep)def _read_data(self):logging.info('Reading data from \"{}\", dataset = \"{}\" '.format(self.prefix, self.dataset))self.data_df, self.item_meta_df = dict(), pd.DataFrame()self._read_preprocessed_df()logging.info('Formating data type...')for df in list(self.data_df.values()) + [self.item_meta_df]:for col in df.columns:df[col] = df[col].apply(lambda x: eval(str(x)))logging.info('Constructing relation triplets...')self.triplet_set = set()relation_types = [r for r in self.item_meta_df.columns if r.startswith('r_')]heads, relations, tails = [], [], []for idx in range(len(self.item_meta_df)):head_item = self.item_meta_df['item_id'][idx]for r_idx, r in enumerate(relation_types):for tail_item in self.item_meta_df[r][idx]:heads.append(head_item)relations.append(r_idx + 1)tails.append(tail_item)self.triplet_set.add((head_item, r_idx + 1, tail_item))self.relation_df = pd.DataFrame()self.relation_df['head'] = headsself.relation_df['relation'] = relationsself.relation_df['tail'] = tailslogging.info('Counting dataset statistics...')self.all_df = pd.concat([self.data_df[key][['user_id', 'item_id', 'time']] for key in ['train', 'dev', 'test']])self.n_users, self.n_items = self.all_df['user_id'].max() + 1, self.all_df['item_id'].max() + 1self.n_relations = self.relation_df['relation'].max() + 1logging.info('"# user": {}, "# item": {}, "# entry": {}'.format(self.n_users, self.n_items, len(self.all_df)))logging.info('"# relation": {}, "# triplet": {}'.format(self.n_relations, len(self.relation_df)))def _append_info(self):"""Add history info to data_df: item_his, time_his, his_length! Need data_df to be sorted by time in ascending order:return:"""logging.info('Adding history info...')user_his_dict = dict() # store the already seen sequence of each userfor key in ['train', 'dev', 'test']:df = self.data_df[key]i_history, t_history = [], []for uid, iid, t in zip(df['user_id'], df['item_id'], df['time']):if uid not in user_his_dict:user_his_dict[uid] = []i_history.append([x[0] for x in user_his_dict[uid]])t_history.append([x[1] for x in user_his_dict[uid]])user_his_dict[uid].append((iid, t))df['item_his'] = i_historydf['time_his'] = t_historyif self.history_max > 0:df['item_his'] = df['item_his'].apply(lambda x: x[-self.history_max:])df['time_his'] = df['time_his'].apply(lambda x: x[-self.history_max:])df['his_length'] = df['item_his'].apply(lambda x: len(x))self.user_clicked_set = dict()for uid in user_his_dict:self.user_clicked_set[uid] = set([x[0] for x in user_his_dict[uid]])def _read_preprocessed_df(self):for key in ['train', 'dev', 'test']:self.data_df[key] = pd.read_csv(os.path.join(self.prefix, self.dataset, key + '.csv'), sep=self.sep)item_meta_path = os.path.join(self.prefix, self.dataset, 'item_meta.csv')if os.path.exists(item_meta_path):self.item_meta_df = pd.read_csv(item_meta_path, sep=self.sep)if __name__ == '__main__':logging.basicConfig(level=logging.INFO)parser = argparse.ArgumentParser()parser = BaseReader.parse_data_args(parser)args, extras = parser.parse_known_args()args.path = '../../data/'corpus = BaseReader(args)corpus_path = os.path.join(args.path, args.dataset, 'Corpus.pkl')logging.info('Save corpus to {}'.format(corpus_path))pickle.dump(corpus, open(corpus_path, 'wb'))

接著看上面 base reader 的代碼,先看如何把數據集加載到內存里,其中兩個函數 read_data 和 append_info。read_data 把數據讀到內存中,轉成 dataframe 的形式,可能會去根據 item_meta_data 構建三元組的形式,也會做整個數據集的統計特征。

appen_info 主要做統一的、之后模型可能都會用到的預處理。具體工作主要包括把item交互的歷史拼到對應的dataframe里面去,tradeoff 整個的訓練過程非常快,不過可能比較占內存,對于更大一點數據集可以考慮把它放到 dataset 里面在多線程準備的時動態的找對應的這個歷史。

補充一點說明,需要把數據一次性讀到內存里面去嗎?確實是,推薦領域中,至少在研究中很少很少像 CV 領域,可能因為圖片都比較大,無法一次全部裝載到內存里。在推薦領域,如上文展示的那種數據集的格式,主要是 ID 和一些特征,直接講 CSV 裝載到內存還是比較方便的。

如果整個數據集比較大,無法預先的把歷史和一些特征先準備好的話,可以之后寫在 batch 里做動態的準備,犧牲一點時間來減少內存的使用。?

總結base reader 這部分就是講數據讀到 dataframe 里,做一個統一的預處理。

class BaseRunner(object):@staticmethoddef parse_runner_args(parser):parser.add_argument('--epoch', type=int, default=100,help='Number of epochs.')parser.add_argument('--check_epoch', type=int, default=1,help='Check some tensors every check_epoch.')parser.add_argument('--early_stop', type=int, default=5,help='The number of epochs when dev results drop continuously.')parser.add_argument('--lr', type=float, default=1e-3,help='Learning rate.')parser.add_argument('--l2', type=float, default=0,help='Weight decay in optimizer.')parser.add_argument('--batch_size', type=int, default=256,help='Batch size during training.')parser.add_argument('--eval_batch_size', type=int, default=256,help='Batch size during testing.')parser.add_argument('--optimizer', type=str, default='Adam',help='optimizer: GD, Adam, Adagrad, Adadelta')parser.add_argument('--num_workers', type=int, default=5,help='Number of processors when prepare batches in DataLoader')parser.add_argument('--pin_memory', type=int, default=1,help='pin_memory in DataLoader')parser.add_argument('--topk', type=str, default='[5,10]',help='The number of items recommended to each user.')parser.add_argument('--metric', type=str, default='["NDCG","HR"]',help='metrics: NDCG, HR')return parserdef __init__(self, args):self.epoch = args.epochself.check_epoch = args.check_epochself.early_stop = args.early_stopself.learning_rate = args.lrself.batch_size = args.batch_sizeself.eval_batch_size = args.eval_batch_sizeself.l2 = args.l2self.optimizer_name = args.optimizerself.num_workers = args.num_workersself.pin_memory = args.pin_memoryself.topk = eval(args.topk)self.metrics = [m.strip().upper() for m in eval(args.metric)]self.main_metric = '{}@{}'.format(self.metrics[0], self.topk[0]) # early stop based on main_metricself.time = None # will store [start_time, last_step_time]def _check_time(self, start=False):if self.time is None or start:self.time = [time()] * 2return self.time[0]tmp_time = self.time[1]self.time[1] = time()return self.time[1] - tmp_timedef _build_optimizer(self, model):optimizer_name = self.optimizer_name.lower()if optimizer_name == 'gd':logging.info("Optimizer: GD")optimizer = torch.optim.SGD(model.customize_parameters(), lr=self.learning_rate, weight_decay=self.l2)elif optimizer_name == 'adagrad':logging.info("Optimizer: Adagrad")optimizer = torch.optim.Adagrad(model.customize_parameters(), lr=self.learning_rate, weight_decay=self.l2)elif optimizer_name == 'adadelta':logging.info("Optimizer: Adadelta")optimizer = torch.optim.Adadelta(model.customize_parameters(), lr=self.learning_rate, weight_decay=self.l2)elif optimizer_name == 'adam':logging.info("Optimizer: Adam")optimizer = torch.optim.Adam(model.customize_parameters(), lr=self.learning_rate, weight_decay=self.l2)else:raise ValueError("Unknown Optimizer: " + self.optimizer_name)return optimizerdef train(self, model, data_dict):main_metric_results, dev_results, test_results = list(), list(), list()self._check_time(start=True)try:for epoch in range(self.epoch):# Fitself._check_time()loss = self.fit(model, data_dict['train'], epoch=epoch + 1)training_time = self._check_time()# Observe selected tensorsif len(model.check_list) > 0 and self.check_epoch > 0 and epoch % self.check_epoch == 0:utils.check(model.check_list)# Record dev and test resultsdev_result = self.evaluate(model, data_dict['dev'], self.topk[:1], self.metrics)test_result = self.evaluate(model, data_dict['test'], self.topk[:1], self.metrics)testing_time = self._check_time()dev_results.append(dev_result)test_results.append(test_result)main_metric_results.append(dev_result[self.main_metric])logging.info("Epoch {:<5} loss={:<.4f} [{:<.1f} s]\t dev=({}) test=({}) [{:<.1f} s] ".format(epoch + 1, loss, training_time, utils.format_metric(dev_result),utils.format_metric(test_result), testing_time))# Save model and early stopif max(main_metric_results) == main_metric_results[-1] or \(hasattr(model, 'stage') and model.stage == 1):model.save_model()if self.early_stop and self.eval_termination(main_metric_results):logging.info("Early stop at %d based on dev result." % (epoch + 1))breakexcept KeyboardInterrupt:logging.info("Early stop manually")exit_here = input("Exit completely without evaluation? (y/n) (default n):")if exit_here.lower().startswith('y'):logging.info(os.linesep + '-' * 45 + ' END: ' + utils.get_time() + ' ' + '-' * 45)exit(1)# Find the best dev result across iterationsbest_epoch = main_metric_results.index(max(main_metric_results))logging.info(os.linesep + "Best Iter(dev)={:>5}\t dev=({}) test=({}) [{:<.1f} s] ".format(best_epoch + 1, utils.format_metric(dev_results[best_epoch]),utils.format_metric(test_results[best_epoch]), self.time[1] - self.time[0]))model.load_model()def fit(self, model, data, epoch=-1):gc.collect()torch.cuda.empty_cache()if model.optimizer is None:model.optimizer = self._build_optimizer(model)data.negative_sampling() # must sample before multi thread startmodel.train()loss_lst = list()dl = DataLoader(data, batch_size=self.batch_size, shuffle=True, num_workers=self.num_workers,collate_fn=data.collate_batch, pin_memory=self.pin_memory)for batch in tqdm(dl, leave=False, desc='Epoch {:<3}'.format(epoch), ncols=100, mininterval=1):batch = utils.batch_to_gpu(batch)model.optimizer.zero_grad()prediction = model(batch)loss = model.loss(prediction)loss.backward()model.optimizer.step()loss_lst.append(loss.detach().cpu().data.numpy())return np.mean(loss_lst)def eval_termination(self, criterion):if len(criterion) > 20 and utils.non_increasing(criterion[-self.early_stop:]):return Trueelif len(criterion) - criterion.index(max(criterion)) > 20:return Truereturn Falsedef evaluate(self, model, data, topks, metrics):"""Evaluate the results for an input dataset.:return: result dict (key: metric@k)"""predictions = self.predict(model, data)return utils.evaluate_method(predictions, topks, metrics)def predict(self, model, data):"""The returned prediction is a 2D-array, each row corresponds to all the candidates,and the ground-truth item poses the first.Example: ground-truth items: [1, 2], 2 negative items for each instance: [[3,4], [5,6]]predictions order: [[1,3,4], [2,5,6]]"""model.eval()predictions = list()dl = DataLoader(data, batch_size=self.eval_batch_size, shuffle=False, num_workers=self.num_workers,collate_fn=data.collate_batch, pin_memory=self.pin_memory)for batch in tqdm(dl, leave=False, ncols=100, mininterval=1, desc='Predict'):prediction = model(utils.batch_to_gpu(batch))predictions.extend(prediction.cpu().data.numpy())return np.array(predictions)def print_res(self, model, data):"""Construct the final result string before/after training:return: test result string"""result_dict = self.evaluate(model, data, self.topk, self.metrics)res_str = '(' + utils.format_metric(result_dict) + ')'return res_str

上面是是 base runner 部分,主要控制整個訓練的流程和評測。通過設置參數控制整個訓練的流程,如check time是一些工具性的函數,通過build_optimizer 去構建具體的優化器。

訓練方面,可以看到主要調用的是 train 函數,去調用后面的fit的函數,對訓練集做參數的更新,它主要解決驗證集上的結果,在測試集上的結果進行一個輸出,看是否在驗證集上達到最好。達到最好的話需要 save model,是否滿足 early_stop 的條件,如果滿足就 break ,這里其實也檢測了手動的 Ctrl C break ,可能訓練到中間的某一個輪次覺得這個明顯不會好,所以就先去掉。

去掉了之后,它會問你是否要真正退出,如果最后想要再評測一下看最后效果、最后的指標,可以不退出,如果連最后指標都不想看,可以完全退出。

最后訓練完,我會找到在驗證集上最優的一輪,去做模型的load ,方便后續進行測試。fit 這部分是剛才 train 中去調用的,代碼都是 pytorch 用戶非常熟悉的。

每一個 batch 參數的更新,前面是準備性工作,包括訓練的時候因為是 top_k 的訓練,應是一個 ranking loss ,會采樣一些負例。這里還會定義 dataloader,dataloader 是 pytorch 內置的類,是 dataset 相應的那個類,它會返回一個迭代器,當你每次去迭代它的時候,它會多線程從 data 中去準備相應的 batch。

這個 batch 具體是什么樣是要靠你在 dataset 類里面去設定的。它會根據參數的不同,是否 shuffle ,每次返回對應的batch,這就相當于是 for dataloader 得到對應的batch之后,讓model 得到 batch prediction 的結果,進行參數的更新,以上就是fit 這部分代碼所做的工作。

def eval_termination 開始這部分是之前調用的、判斷是否 early_stop 的標準,evaluate 這部分這些比較簡單,直接調用 prediction ,得到 predictions 之后,用到工具類中寫到的評測函數去進行評測。這個評測其實也針對目前的 topk 實驗設定進行了相應優化,會讓整個算 NDCG、算 HR 都會非常快。

predict 與 fit 比較像,不需要進行參數的更新,也是定義相應的 dataloader ,每一個 batch 得到預測的結果即可,最后規范輸出的 string 格式。

整個 baserunner 大概不到200行,整個核心框架不到800行,所以說這是一個非常容易上手的框架。上述很多是比較細節的信息,希望幫助新手能更快上手。

class BaseModel(torch.nn.Module):reader = 'BaseReader'runner = 'BaseRunner'extra_log_args = []@staticmethoddef parse_model_args(parser):parser.add_argument('--model_path', type=str, default='',help='Model save path.')parser.add_argument('--num_neg', type=int, default=1,help='The number of negative items during training.')parser.add_argument('--dropout', type=float, default=0.2,help='Dropout probability for each deep layer')parser.add_argument('--buffer', type=int, default=1,help='Whether to buffer feed dicts for dev/test')return parser@staticmethoddef init_weights(m):if 'Linear' in str(type(m)):torch.nn.init.normal_(m.weight, mean=0.0, std=0.01)if m.bias is not None:torch.nn.init.normal_(m.bias, mean=0.0, std=0.01)elif 'Embedding' in str(type(m)):torch.nn.init.normal_(m.weight, mean=0.0, std=0.01)def __init__(self, args, corpus):super(BaseModel, self).__init__()self.model_path = args.model_pathself.num_neg = args.num_negself.dropout = args.dropoutself.buffer = args.bufferself.item_num = corpus.n_itemsself.optimizer = Noneself.check_list = list() # observe tensors in check_list every check_epochself._define_params()self.total_parameters = self.count_variables()logging.info('#params: %d' % self.total_parameters)"""Methods must to override"""def _define_params(self):self.item_bias = torch.nn.Embedding(self.item_num, 1)def forward(self, feed_dict):""":param feed_dict: batch prepared in Dataset:return: prediction with shape [batch_size, n_candidates]"""i_ids = feed_dict['item_id']prediction = self.item_bias(i_ids)return prediction.view(feed_dict['batch_size'], -1)"""Methods optional to override"""def loss(self, predictions):"""BPR ranking loss with optimization on multiple negative samples@{Recurrent neural networks with top-k gains for session-based recommendations}:param predictions: [batch_size, -1], the first column for positive, the rest for negative:return:"""pos_pred, neg_pred = predictions[:, 0], predictions[:, 1:]neg_softmax = (neg_pred - neg_pred.max()).softmax(dim=1)neg_pred = (neg_pred * neg_softmax).sum(dim=1)loss = F.softplus(-(pos_pred - neg_pred)).mean()# ↑ For numerical stability, we use 'softplus(-x)' instead of '-log_sigmoid(x)'return lossdef customize_parameters(self):# customize optimizer settings for different parametersweight_p, bias_p = [], []for name, p in filter(lambda x: x[1].requires_grad, self.named_parameters()):if 'bias' in name:bias_p.append(p)else:weight_p.append(p)optimize_dict = [{'params': weight_p}, {'params': bias_p, 'weight_decay': 0}]return optimize_dict"""Auxiliary methods"""def save_model(self, model_path=None):if model_path is None:model_path = self.model_pathutils.check_dir(model_path)torch.save(self.state_dict(), model_path)logging.info('Save model to ' + model_path[:50] + '...')def load_model(self, model_path=None):if model_path is None:model_path = self.model_pathself.load_state_dict(torch.load(model_path))logging.info('Load model from ' + model_path)def count_variables(self):total_parameters = sum(p.numel() for p in self.parameters() if p.requires_grad)return total_parametersdef actions_before_train(self):passdef actions_after_train(self):pass"""Define dataset class for the model"""

再來看最關鍵basemodel,這涉及到模型具體是怎么實現的。首先用靜態變量的方式指定 reader 和 runner ,指定了它的幫助類是什么,具體用哪個 reader 去讀數據,用哪個 runner 去訓練和評測模型。

這里有一些通用的與模型相關的參數,可以增量的添加。前面是一些與模型相關的參數,包括定義模型里面具體有哪些可學習的參數,prediction 怎么去進行,loss 具體是什么,每個 customize parameters 應該是怎么樣去設置。

后面有一些工具類的函數,再往后是上文提到的把 dataset 的類寫成一個 model 的內部類,目的主要還是希望能在寫模型的過程中,在一個文件里既準備對應的? ?batch,同時定義模型具體在前面怎么forward的。

因為在構建模型時,特別在研究過程中,經常需要變換輸入的信息、輸入的格式,在 forward 中來做相應的這種變換,如果經常需要換文件,或者改動調試,是比較痛苦的,所以考慮把它以內部類的形式呈現。

代碼繼承的 basedataset 其實是 pytorch 中內置的傳給 dataloader 的 dataset ,只是把它改了一個名字,因為這個類本身也想要dataset。如果想用dataset,通過官方方式去使用它的話,一般需要去重寫兩個函數,一個是 len 函數,一個是 getitem 函數。len 函數完成的任務是獲得 basedataset 中存的數據一共有多少個?getitem 是根據給定的 index ,去獲得對應數據中的 index ,要輸入給模型的 batch 。

如何實現這兩個函數?這里面的data是什么?是basereader 讀進來的dataframe ,但是這里為了方便,準備了多線程 batch(dataframe 對于多線程訪問不太友好),所把它轉成一個dict。

class Dataset(BaseDataset):def __init__(self, model, corpus, phase):self.model = modelself.corpus = corpusself.phase = phaseself.data = utils.df_to_dict(corpus.data_df[phase])# ↑ DataFrame is not compatible with multi-thread operationsself.neg_items = None if phase == 'train' else self.data['neg_items']# ↑ Sample negative items before each epoch during trainingself.buffer_dict = dict()self.buffer = self.model.buffer and self.phase != 'train'self._prepare()def __len__(self):for key in self.data:return len(self.data[key])def __getitem__(self, index):return self.buffer_dict[index] if self.buffer else self._get_feed_dict(index)# Prepare model-specific variables and buffer feed dictsdef _prepare(self):if self.buffer:for i in tqdm(range(len(self)), leave=False, ncols=100, mininterval=1,desc=str('Prepare ' + self.phase)):self.buffer_dict[i] = self._get_feed_dict(i)# Key method to construct input data for a single instancedef _get_feed_dict(self, index):target_item = self.data['item_id'][index]neg_items = self.neg_items[index]item_ids = np.concatenate([[target_item], neg_items])feed_dict = {'item_id': item_ids}return feed_dict# Sample negative items for all the instances (called before each epoch)def negative_sampling(self):self.neg_items = np.random.randint(1, self.corpus.n_items, size=(len(self), self.model.num_neg))for i, u in enumerate(self.data['user_id']):user_clicked_set = self.corpus.user_clicked_set[u]for j in range(self.model.num_neg):while self.neg_items[i][j] in user_clicked_set:self.neg_items[i][j] = np.random.randint(1, self.corpus.n_items)# Collate a batch according to the list of feed dictsdef collate_batch(self, feed_dicts):feed_dict = dict()for key in feed_dicts[0]:stack_val = np.array([d[key] for d in feed_dicts])if stack_val.dtype == np.object: # inconsistent length (e.g. history)feed_dict[key] = pad_sequence([torch.from_numpy(x) for x in stack_val], batch_first=True)else:feed_dict[key] = torch.from_numpy(stack_val)feed_dict['batch_size'] = len(feed_dicts)feed_dict['phase'] = self.phasereturn feed_dict

上面的代碼是我主要的 data ,確定phase具體在哪個階段,是train 的階段還是在評測 validation 、test 階段。

len 部分直接獲得了data的長度,被很多人吐槽,把data變成了一個dict的形式,它本身是一個data frame,每一列的長度是一樣的,直接返回了第一列的長度。

getitem主要的功能放在 get_feed_dict 里面去完成。這是根據是否需要 buffer 去做選擇。在數據集比較小的時候,如果條件允許的話,對于驗證集跟測試集,完全可以把它所有的 batch 提前準備好放在內存里,這樣訓練、測試就會更快一些。如果不去 buffer 的話,每次現場做準備都要重復工作。

get_feed_dict 主要給index 返回對應的 predict ,也就是輸入到模型的 batch 。base model 本來可能是抽象的,但還是把它寫成可以運行的類。模型之后可以回返回來再看,根據給定的每一個 item ID ,去定義每個 item ID 對應的 bias ,然后直接把輸出的 bias 作為預測的值。所以在這要為它準備 item ID ,target_item ID可以直接從data中item ID的類直接取出即可。

我們會提前準備好負例。訓練集通過函數在每一輪之前進行采樣。可以通過這一步從成員變量中直接獲得對應的負例,并和target一起傳到模型里,相當于返回了每一個index 對應的 free_dict 。而要傳遞模型的一個 batch 相當于一個群組,好多index 組成一個 batch ,也相當于一個 free_dict 的list 來組成一個 batch ,等于把相同的 key 當中的 value 組合到了一起。

注意看代碼部分默認帶有函數,由于后面可能涉及到不同的歷史、長度,這里需要做動態的pad,這部分也重寫了一些。當然,如果檢測到序列的長度不一致,也會進行一個填充的操作,填充到同樣的長度。也可以去添加一些整體上的控制變量。

以上這部分這是 dataset 比較重要的一部分,控制了怎么去給模型輸入,包含了每個 batch 必須要有的內容。

可以再看看整體的模型, item_bias 部分對于我輸入的 item_ID ,可以直接取對應的 bias 作為 prediction ,進而返回對應的 prediction 結果。

到這一部分,其實整個框架已經完成了對使用者的幫助工作。全部的代碼量非常少,所以使用者可以很快上手。

2.3?實例演示

看完以上的引導,還是不知道怎么創建新模型怎么辦?下面繼續手把手教到底,通過一段視頻教大家怎么基于框架在 5 分鐘時間里實現一個 BPR。

看完快速上手視頻,我們對整個框架做完了比較細致的梳理,希望能夠幫助大家更好地上手、更好地使用它。

相關論文方法介紹

下面準備了一些相關具體算法的介紹,也是我們最近一項工作的介紹,可能比較偏模型、偏理論一些。

上圖是我們現在所實現的模型的性能對比,可以看到,基于深度模型的NCF,如果在調參調得不好的情況下,比 BPR 還要差很多。引入了時間信息的 Tensor ,效果會有明顯提升。對于序列的模型來說,因為有序列的信息效果是不錯的。

我們逐一簡單講一講:

1. SASRec 基于 self_attention,如果好好調參,效果確實會非常好。

2. TiSASRec是今年剛提出來的,把時間間隔用embedding的方式去融入到self_attention,也能取得稍微更好一點點的結果,但它的運行時間就會多很多。

3. CFKG 則是一個融入知識圖譜的推薦,效果也是很不錯的。

4. 最后兩個模型,是把知識圖譜、時間相關,還有序列的信息都用進來,也獲得非常好的結果。

接著介紹一下,這里面表現最好的模型,大概是一個什么樣的結構。

這是我們團隊在SIGIR的論文:Make It a Chorus:Knowledge-and Time-aware Item Modeling for Sequential Recommendation

首先是motivation,做這項工作的目的在于,我們感覺現在的推薦系統有很多問題。舉個例子,我剛買完手機,你認為我會很喜歡電子產品,所以就會推薦很多款手機,但其實我此時已經不需要了。

如果比較智能的算法,可能會去推薦Air Pods,作為配件而言,我對它的需求可能會提升。但是這樣的智能可能還是不夠,如果我已經在其他平臺上買過無線耳機,我現在也就不需要無線耳機,系統可能覺得我需要,但是我實際不需要。我剛開始可能覺得系統挺智能的,但是如果一直去推Air Pods,我會覺得很蠢。

不同的推薦應該會隨著時間有一定的衰減,所以這篇文章所提出來的主要想法,就是每一個item可能在不同的context下,在不同的時間下,扮演不同的角色。

還有一些具體的例子,如果我之前買的是iphone,它對于目標商品Air Pods有沒有互補的關系?它對我購買Air Pods影響應該短期內是正的,但會隨時間慢慢遞減的影響。而如果我之前買的商品是Air Pods同類商品,是替代品Powerbeats,那么短期內應該是有負向的影響,但是隨著時間的增長,可能到該換耳機的時候,反而會得到正向的影響,是分配時間和負向變化正向的這樣的一個過程。

具體怎么去設計這個模型?我們想讓模型在item扮演不同角色的時候,有不一樣的靜態表示,比如在context下扮演互補品、替代品的時候是怎樣的角色。然后根據序列的情況,把這些靜態的表示,與現在有沒有在扮演這個角色進行動態結合,包括之間間隔的時間,每一個扮演的角色有可能有正向、負向影響或者不起作用。例如給AirPods一個基本的表示,還有作為互補品的表示,作為替代品的表示,在不同context下就會都會起到更多的作用,下圖是具體的模型圖。


上圖左邊部分,進行了知識圖譜嵌入,但這其實并不是工作重點,所以我們用了一個比較常見的關系建模,對商品之間的關系進行向量的切入,這些向量也會作為每個商品的基本表示進行數據化。

上圖右半部分是第二個階段,基于左邊的表示,即對每個商品有很基本的表示,我們還希望得到它跟relation相關的表示,通過這樣的translation,在第一個階段里面使用的translation方式,去得到扮演不同角色時的靜態表示,這樣對于每一個商品,都有了基本表示和扮演不同角色時的表示。

這時候,就需要根據 context 去對它們做動態加和,用到叫做 time_aware integration weight 的方法,它是怎么設計的呢?就是去挑選歷史里面跟目標商品有關系的歷史交互,看它們對我的影響到底是什么,這個具體的影響有一個稱為temporal kernel function 設計的函數去控制,是一個疊加的效應。

temporal kernel function 的方式怎么設計?其實會根據先驗知識,或者是希望這個系統展現出來一個什么樣的效果去設計,比如對于互補品設計成遞減,對于替代品則是從負向到正向的變化,這樣能控制扮演不同角色時的靜態 embedding 在整個動態的結合過程中所做的貢獻。

基于這樣動態表示,就等于得到了一個目標商品在目前context下的動態表示,這個表示可以用到很多基于embedding模型里面,比如像BPR、GMF最后會統一去ranking loss。

上圖是大概數據的信息,和剛才所提到的兩種關系。

上圖是實驗結果,大致情況是我們的模型能夠比之前所提到的引入知識、引入時間動態性的模型有比較明顯的提升。

上圖是 relation 的分析,圖中的\R跟\T分別是去掉第一階段的 knowledge graph 和第二階段的 temporal kernel function ,不考慮時間動態變化的影響。可以看到,影響最大的還是商品關系所帶來的,但是有時候商品關系可能處理得不好,這個時候動態結果就起到很大作用,如果不對不同的關系做時間動態變化的結合,\T會帶來非常嚴重的損失,所以時間在所有數據上也有比較一致的提升。

最后,有趣的是,我們看了不同類型商品所求出的 temporal kernel function 方式長什么樣?是否反映該類商品的一些特征?

上圖左邊是互補品求出來的 temporal kernel function ,它相較于可替代商品,下降曲線會更緩一些。這說明什么?說明可能用戶過了一段時間之后,還會對這種可替代商品,比如替換的電池和之前老的智能手機還有興趣,有可能過很長時間才會換。

而對于頭戴式耳機來說,interest 下降就會非常快。就像上文提到的,有可能這個耳機我就不需要了,所以這個分數很快降下來,而不會過多打擾到用戶。

上圖右邊是替代品的 temporal kernel function 方式寫出來的結果。對于像手機殼這一類商品,它的負向影響基本上被削平了,主要是正向的影響,使得它的峰值會不太一樣。這說明了,之前購買手機殼的行為對于購買下一個手機殼,其實沒有很多負向影響。用戶可能因為很多原因去換手機殼,比如摔壞了一個角,或者只是看到外觀就換了,所以負向影響非常少。

而對于充電器、手機,它的負向影響和正向影響都非常明顯。比較奇妙的是,兩者峰值大概都處于一個位置,這其實也說明它倆是有一定依賴關系,因為可能不同的類型的手機配不同類型的充電頭,反映了商品內部的這種關聯。

這個模型在我們現在的框架中表現也是比較突出的。總結來說,這種模型主要提出了對于目標商品的動態表示,能夠比較方便運用到各種基于 embedding 的方法中,并且進一步提升模型的性能等。

總結

最后做個總結,我們介紹 ReChorus 這種 top k 推薦框架,它目前會比較適合兩類人群:作為初學者,可能想要了解一些經典推薦系統相關的算法,可以通過它去快速了解經典算法具體是怎么實現的;對于研究者來說,也可用它來測試一些新的idea,比較模型的性能。

但現在我覺得 ReChorus 還有很多的問題,包括只有一個內置數據集去比較,可能某些實驗設定上還需要進一步提煉,比如最近一篇 ACL best paper 提出的思路,用類似軟工的形式進行NLP的全面評測。不知道之后推薦系統方向是否會有相應的內容。

ReChorus 未來存在很多可以改善的空間,也非常歡迎廣大同行研究者們提交 issue 來完善這個框架,共同構建真正的推薦算法的“合唱團”,不僅僅實現表面上的百花齊放(大量論文的涌現),也去真正推動這個領域一步一個腳印、實打實地進步。

關于數據實戰派

數據實戰派希望用真實數據和行業實戰案例,幫助讀者提升業務能力,共建有趣的大數據社區。

更多閱讀

#投 稿?通 道#

?讓你的論文被更多人看到?

如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。

總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?

PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得技術干貨。我們的目的只有一個,讓知識真正流動起來。

?????來稿標準:

? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?

? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?

? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志

?????投稿郵箱:

? 投稿郵箱:hr@paperweekly.site?

? 所有文章配圖,請單獨在附件中發送?

? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通

????

現在,在「知乎」也能找到我們了

進入知乎首頁搜索「PaperWeekly」

點擊「關注」訂閱我們的專欄吧

關于PaperWeekly

PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。

總結

以上是生活随笔為你收集整理的清华大学王晨阳:轻量级Top-K推荐框架及相关论文介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产综合在线观看 | 少妇高潮一区二区三区99 | 红桃av一区二区三区在线无码av | 国产精品久久久一区二区三区 | 亚洲精品一区三区三区在线观看 | 亚洲精品国偷拍自产在线麻豆 | 国产精品人人爽人人做我的可爱 | 丝袜美腿亚洲一区二区 | 久久国产精品精品国产色婷婷 | 亚洲色欲色欲欲www在线 | 久久久久久av无码免费看大片 | 亚洲区小说区激情区图片区 | 亚洲大尺度无码无码专区 | 国产精品亚洲专区无码不卡 | 性欧美大战久久久久久久 | 国产精品-区区久久久狼 | 男女超爽视频免费播放 | 伊人久久大香线焦av综合影院 | 97久久国产亚洲精品超碰热 | 中文字幕亚洲情99在线 | 欧美人与动性行为视频 | 欧美35页视频在线观看 | 亚洲精品一区二区三区大桥未久 | 久久精品人妻少妇一区二区三区 | 欧美精品国产综合久久 | 亚洲精品综合一区二区三区在线 | 亚洲日本一区二区三区在线 | 国产精品爱久久久久久久 | 国产精品自产拍在线观看 | 国产麻豆精品一区二区三区v视界 | 小鲜肉自慰网站xnxx | 亚洲第一网站男人都懂 | 国产人妻人伦精品 | 激情综合激情五月俺也去 | 97久久超碰中文字幕 | 在线观看免费人成视频 | 亚洲人成无码网www | 无码成人精品区在线观看 | 亚洲精品一区二区三区婷婷月 | 中文字幕人妻丝袜二区 | 午夜男女很黄的视频 | 国产精品爱久久久久久久 | 成人性做爰aaa片免费看 | 性生交片免费无码看人 | 欧美野外疯狂做受xxxx高潮 | 国产人成高清在线视频99最全资源 | 色情久久久av熟女人妻网站 | 波多野结衣乳巨码无在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 熟妇人妻无码xxx视频 | 国产精品无码一区二区桃花视频 | 亚洲国产精华液网站w | 亚洲 欧美 激情 小说 另类 | 亚洲精品国产精品乱码不卡 | 丰满人妻被黑人猛烈进入 | 中文久久乱码一区二区 | 久久99久久99精品中文字幕 | 亚洲国产高清在线观看视频 | 亚洲天堂2017无码 | 久久久久免费精品国产 | 精品久久综合1区2区3区激情 | 欧美第一黄网免费网站 | 一本久久a久久精品亚洲 | 亚洲精品国产精品乱码视色 | 免费无码av一区二区 | 久久婷婷五月综合色国产香蕉 | 日韩精品成人一区二区三区 | 久久久久99精品国产片 | 高中生自慰www网站 | 内射爽无广熟女亚洲 | 欧美丰满少妇xxxx性 | 亚洲国产午夜精品理论片 | 高中生自慰www网站 | 人人妻在人人 | 国产农村乱对白刺激视频 | 久久综合九色综合97网 | 免费乱码人妻系列无码专区 | 久久99精品国产.久久久久 | 一区二区三区乱码在线 | 欧洲 | 人妻插b视频一区二区三区 | 日日摸日日碰夜夜爽av | 日本精品人妻无码77777 天堂一区人妻无码 | 日本熟妇乱子伦xxxx | 99久久精品午夜一区二区 | 久久人妻内射无码一区三区 | 在线а√天堂中文官网 | 亚洲日本在线电影 | 日日摸夜夜摸狠狠摸婷婷 | 少妇无码av无码专区在线观看 | 久久人妻内射无码一区三区 | 亚洲男人av香蕉爽爽爽爽 | 国产精品怡红院永久免费 | yw尤物av无码国产在线观看 | 日韩亚洲欧美精品综合 | 国产亚洲日韩欧美另类第八页 | 国产成人一区二区三区在线观看 | 欧美变态另类xxxx | 亚洲s码欧洲m码国产av | 亚洲一区二区三区国产精华液 | 欧美日韩一区二区综合 | 久久亚洲国产成人精品性色 | 精品无码成人片一区二区98 | 东京无码熟妇人妻av在线网址 | 久久人人爽人人人人片 | 鲁大师影院在线观看 | 久久国产精品_国产精品 | 亚洲s色大片在线观看 | 国产午夜亚洲精品不卡 | 色一情一乱一伦一区二区三欧美 | 日本精品久久久久中文字幕 | 亚洲精品成人av在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 日本乱偷人妻中文字幕 | 亚洲乱码国产乱码精品精 | 草草网站影院白丝内射 | 少妇被黑人到高潮喷出白浆 | 伦伦影院午夜理论片 | 男女作爱免费网站 | 爽爽影院免费观看 | 国产亚av手机在线观看 | 少妇性俱乐部纵欲狂欢电影 | 俄罗斯老熟妇色xxxx | 久久亚洲日韩精品一区二区三区 | 55夜色66夜色国产精品视频 | 久久99精品国产麻豆蜜芽 | 国内精品一区二区三区不卡 | 久久人人97超碰a片精品 | 国产另类ts人妖一区二区 | 少妇无码吹潮 | 亚洲另类伦春色综合小说 | 欧美三级a做爰在线观看 | 全黄性性激高免费视频 | 亚洲人成网站在线播放942 | 无码任你躁久久久久久久 | 5858s亚洲色大成网站www | 国内综合精品午夜久久资源 | 内射巨臀欧美在线视频 | 又大又紧又粉嫩18p少妇 | 男人的天堂av网站 | 2020最新国产自产精品 | 日韩av无码一区二区三区 | 无码纯肉视频在线观看 | 亚洲人成影院在线无码按摩店 | 伊在人天堂亚洲香蕉精品区 | 一本大道久久东京热无码av | 欧美黑人乱大交 | 学生妹亚洲一区二区 | 国产成人精品优优av | 真人与拘做受免费视频 | 无码人妻黑人中文字幕 | 国产精品亚洲а∨无码播放麻豆 | 美女黄网站人色视频免费国产 | 岛国片人妻三上悠亚 | 日本爽爽爽爽爽爽在线观看免 | 成人片黄网站色大片免费观看 | 图片小说视频一区二区 | 精品人妻人人做人人爽夜夜爽 | 久久久婷婷五月亚洲97号色 | 欧美乱妇无乱码大黄a片 | 无码乱肉视频免费大全合集 | 中文字幕中文有码在线 | 久久午夜无码鲁丝片 | 女人被男人躁得好爽免费视频 | 国产超级va在线观看视频 | 日韩 欧美 动漫 国产 制服 | 欧美自拍另类欧美综合图片区 | 色一情一乱一伦一视频免费看 | 国产午夜手机精彩视频 | 激情内射亚州一区二区三区爱妻 | 女人被爽到呻吟gif动态图视看 | 欧美人妻一区二区三区 | 无码成人精品区在线观看 | 精品一二三区久久aaa片 | 久久国内精品自在自线 | 无遮挡国产高潮视频免费观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美精品aaaaaa片 | 亚洲欧洲无卡二区视頻 | 亚洲国产精品美女久久久久 | 一本色道久久综合亚洲精品不卡 | 老头边吃奶边弄进去呻吟 | 国产精品丝袜黑色高跟鞋 | 在教室伦流澡到高潮hnp视频 | 熟女俱乐部五十路六十路av | 综合网日日天干夜夜久久 | 亚洲乱亚洲乱妇50p | 国内少妇偷人精品视频免费 | 午夜精品久久久久久久久 | 桃花色综合影院 | 最近免费中文字幕中文高清百度 | 久久www免费人成人片 | 久久精品中文字幕一区 | 欧美老熟妇乱xxxxx | 欧美日韩人成综合在线播放 | 亚洲一区二区三区含羞草 | 国产人妻精品一区二区三区 | 成人精品视频一区二区三区尤物 | 国产成人综合色在线观看网站 | 午夜福利试看120秒体验区 | 内射老妇bbwx0c0ck | 性啪啪chinese东北女人 | 色综合久久久久综合一本到桃花网 | 国产真实乱对白精彩久久 | 中文字幕av伊人av无码av | 国产乱子伦视频在线播放 | 伊人久久大香线焦av综合影院 | 免费人成在线观看网站 | 国产一区二区三区精品视频 | 无码中文字幕色专区 | 夜夜影院未满十八勿进 | 大地资源网第二页免费观看 | 欧美兽交xxxx×视频 | av香港经典三级级 在线 | 色婷婷综合激情综在线播放 | 精品欧美一区二区三区久久久 | 亚洲国产欧美国产综合一区 | 性欧美videos高清精品 | 精品国产福利一区二区 | 精品国精品国产自在久国产87 | 久久无码中文字幕免费影院蜜桃 | 性欧美熟妇videofreesex | 色一情一乱一伦一区二区三欧美 | 成年美女黄网站色大免费全看 | 国产午夜福利亚洲第一 | 特黄特色大片免费播放器图片 | 国产精品久久久午夜夜伦鲁鲁 | 久久精品人人做人人综合 | aⅴ亚洲 日韩 色 图网站 播放 | 一本久久a久久精品亚洲 | 乌克兰少妇性做爰 | 性色欲情网站iwww九文堂 | 国语精品一区二区三区 | 18无码粉嫩小泬无套在线观看 | 一本久道高清无码视频 | 午夜丰满少妇性开放视频 | 精品久久久中文字幕人妻 | 久久久久成人精品免费播放动漫 | 久久久久亚洲精品中文字幕 | √8天堂资源地址中文在线 | 无码任你躁久久久久久久 | √8天堂资源地址中文在线 | 日本丰满熟妇videos | 天堂在线观看www | 国内揄拍国内精品人妻 | 国产精品国产三级国产专播 | 成人精品一区二区三区中文字幕 | а天堂中文在线官网 | 成人性做爰aaa片免费看 | 夫妻免费无码v看片 | 300部国产真实乱 | 亚洲人成无码网www | 久久视频在线观看精品 | 无码人妻久久一区二区三区不卡 | 天天av天天av天天透 | 久久国产自偷自偷免费一区调 | 国产内射爽爽大片视频社区在线 | 少妇高潮一区二区三区99 | 天天综合网天天综合色 | 国产精品国产三级国产专播 | 亚洲成av人影院在线观看 | 久久人人爽人人爽人人片av高清 | 性色av无码免费一区二区三区 | 特级做a爰片毛片免费69 | 日韩人妻无码中文字幕视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 中文字幕 人妻熟女 | 男女性色大片免费网站 | 欧洲美熟女乱又伦 | 日日碰狠狠躁久久躁蜜桃 | 俺去俺来也在线www色官网 | 在线成人www免费观看视频 | 亚洲一区av无码专区在线观看 | 成年美女黄网站色大免费全看 | 未满小14洗澡无码视频网站 | 国产片av国语在线观看 | 亚洲色成人中文字幕网站 | 国产午夜视频在线观看 | 亚洲成色www久久网站 | 在线播放无码字幕亚洲 | 国产亲子乱弄免费视频 | 亚洲爆乳大丰满无码专区 | 亚洲精品久久久久中文第一幕 | 亚洲欧美精品aaaaaa片 | 亚洲精品无码国产 | 无码人妻出轨黑人中文字幕 | 在线看片无码永久免费视频 | 99久久精品午夜一区二区 | 福利一区二区三区视频在线观看 | 国产成人无码午夜视频在线观看 | 漂亮人妻洗澡被公强 日日躁 | 亚洲精品一区二区三区四区五区 | 黑人巨大精品欧美黑寡妇 | 蜜桃视频插满18在线观看 | 7777奇米四色成人眼影 | 欧美激情一区二区三区成人 | 久久亚洲精品中文字幕无男同 | 欧美日韩色另类综合 | 免费中文字幕日韩欧美 | 国产亚洲精品久久久久久国模美 | 日韩人妻系列无码专区 | 天堂а√在线中文在线 | 无码中文字幕色专区 | 在线成人www免费观看视频 | 久久精品99久久香蕉国产色戒 | 天海翼激烈高潮到腰振不止 | 无码国产激情在线观看 | 亚洲国产精品无码一区二区三区 | 国产亚洲欧美在线专区 | 亚洲国产精品成人久久蜜臀 | 中文无码精品a∨在线观看不卡 | 特黄特色大片免费播放器图片 | 一本色道久久综合狠狠躁 | 国产后入清纯学生妹 | av在线亚洲欧洲日产一区二区 | 亚洲乱码中文字幕在线 | 精品乱码久久久久久久 | 亚洲欧洲日本综合aⅴ在线 | 无码人妻精品一区二区三区不卡 | 天天爽夜夜爽夜夜爽 | 成年美女黄网站色大免费视频 | 乱码av麻豆丝袜熟女系列 | 红桃av一区二区三区在线无码av | 国产成人无码a区在线观看视频app | 精品无人区无码乱码毛片国产 | 图片小说视频一区二区 | 欧美日韩一区二区免费视频 | 国产精品欧美成人 | 欧美日韩一区二区综合 | 久久久久人妻一区精品色欧美 | 麻豆md0077饥渴少妇 | 免费男性肉肉影院 | 免费国产黄网站在线观看 | 久久综合狠狠综合久久综合88 | 少妇愉情理伦片bd | 蜜臀aⅴ国产精品久久久国产老师 | 又粗又大又硬毛片免费看 | 成熟女人特级毛片www免费 | 天堂无码人妻精品一区二区三区 | 久久久国产一区二区三区 | 2019午夜福利不卡片在线 | 天天躁日日躁狠狠躁免费麻豆 | 欧美日韩一区二区免费视频 | 亚洲国产精品久久久天堂 | 国产明星裸体无码xxxx视频 | 一本精品99久久精品77 | 国产人成高清在线视频99最全资源 | 亚洲一区二区三区无码久久 | 中文亚洲成a人片在线观看 | 人妻互换免费中文字幕 | 成年美女黄网站色大免费全看 | 精品国产乱码久久久久乱码 | 伊人久久大香线蕉午夜 | 性欧美疯狂xxxxbbbb | 国产精品美女久久久久av爽李琼 | 国产综合在线观看 | 亚洲日本一区二区三区在线 | 高潮喷水的毛片 | 中文字幕av日韩精品一区二区 | 日本精品少妇一区二区三区 | 欧美人与牲动交xxxx | 国产亚洲精品久久久久久大师 | 国产免费久久精品国产传媒 | 中文亚洲成a人片在线观看 | 亚洲国产日韩a在线播放 | 色综合久久久无码中文字幕 | 国产人妻精品一区二区三区 | 亚洲人成人无码网www国产 | 亚洲欧美精品伊人久久 | 国产精品人人爽人人做我的可爱 | 久久久久成人片免费观看蜜芽 | 亚洲欧美日韩成人高清在线一区 | 国产真实夫妇视频 | 亚洲日本在线电影 | 欧美成人家庭影院 | 久久精品丝袜高跟鞋 | 色窝窝无码一区二区三区色欲 | 欧美性生交活xxxxxdddd | 久久久国产精品无码免费专区 | 国产色xx群视频射精 | 7777奇米四色成人眼影 | 好爽又高潮了毛片免费下载 | 国产欧美熟妇另类久久久 | 丝袜足控一区二区三区 | 欧美老人巨大xxxx做受 | 亚洲日本va午夜在线电影 | 免费视频欧美无人区码 | 又大又硬又黄的免费视频 | 欧美色就是色 | 窝窝午夜理论片影院 | 国产成人无码av在线影院 | 精品乱子伦一区二区三区 | 中文字幕无码热在线视频 | 毛片内射-百度 | 日欧一片内射va在线影院 | 免费无码的av片在线观看 | 欧美熟妇另类久久久久久不卡 | 色综合久久久无码中文字幕 | 国产舌乚八伦偷品w中 | 7777奇米四色成人眼影 | 色婷婷久久一区二区三区麻豆 | 国产人妖乱国产精品人妖 | 人人妻人人澡人人爽欧美一区 | 国产精品久久久午夜夜伦鲁鲁 | 午夜无码区在线观看 | 宝宝好涨水快流出来免费视频 | 久久午夜无码鲁丝片午夜精品 | 国产精品毛片一区二区 | 伦伦影院午夜理论片 | 亚洲国精产品一二二线 | 377p欧洲日本亚洲大胆 | 国产精品高潮呻吟av久久 | 99国产精品白浆在线观看免费 | 精品久久久久久亚洲精品 | 大地资源中文第3页 | 国产精品久久国产三级国 | 国产无遮挡又黄又爽免费视频 | 精品久久久无码人妻字幂 | 又粗又大又硬毛片免费看 | 无码人妻丰满熟妇区毛片18 | 日本在线高清不卡免费播放 | 丁香啪啪综合成人亚洲 | 国产激情精品一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 内射欧美老妇wbb | 国产真实乱对白精彩久久 | 又大又硬又黄的免费视频 | 西西人体www44rt大胆高清 | 丰满妇女强制高潮18xxxx | 国产小呦泬泬99精品 | 特黄特色大片免费播放器图片 | 午夜精品久久久内射近拍高清 | 国产suv精品一区二区五 | 精品亚洲韩国一区二区三区 | 在线精品国产一区二区三区 | 任你躁在线精品免费 | 精品欧洲av无码一区二区三区 | 成人免费无码大片a毛片 | 国产亲子乱弄免费视频 | 日本熟妇乱子伦xxxx | 六十路熟妇乱子伦 | 国产精品永久免费视频 | 奇米影视888欧美在线观看 | 色窝窝无码一区二区三区色欲 | 日韩少妇内射免费播放 | 欧洲欧美人成视频在线 | 国产精品视频免费播放 | 激情内射亚州一区二区三区爱妻 | 麻豆精品国产精华精华液好用吗 | 日本乱偷人妻中文字幕 | 黑人玩弄人妻中文在线 | 精品水蜜桃久久久久久久 | 中文亚洲成a人片在线观看 | 久久综合久久自在自线精品自 | 亚洲综合色区中文字幕 | 日韩亚洲欧美精品综合 | 天天摸天天透天天添 | 大屁股大乳丰满人妻 | 无码播放一区二区三区 | 日产精品高潮呻吟av久久 | 欧美成人免费全部网站 | 欧美刺激性大交 | 亚洲成色在线综合网站 | 无码午夜成人1000部免费视频 | 日日橹狠狠爱欧美视频 | 乱人伦中文视频在线观看 | 77777熟女视频在线观看 а天堂中文在线官网 | 国产成人精品三级麻豆 | 成 人 网 站国产免费观看 | 久久精品女人天堂av免费观看 | 国产亚洲精品久久久ai换 | 成熟人妻av无码专区 | 国产成人综合美国十次 | 欧美日本精品一区二区三区 | 日本www一道久久久免费榴莲 | 色婷婷综合中文久久一本 | 牲欲强的熟妇农村老妇女视频 | 樱花草在线播放免费中文 | 亚洲 激情 小说 另类 欧美 | 人人妻人人澡人人爽精品欧美 | 2020久久香蕉国产线看观看 | 牲欲强的熟妇农村老妇女视频 | 国产精品手机免费 | 丰腴饱满的极品熟妇 | 露脸叫床粗话东北少妇 | 色婷婷综合激情综在线播放 | 红桃av一区二区三区在线无码av | 欧美亚洲国产一区二区三区 | 日韩人妻少妇一区二区三区 | 国产亚洲精品久久久ai换 | 国产艳妇av在线观看果冻传媒 | 亚洲精品一区三区三区在线观看 | 狠狠躁日日躁夜夜躁2020 | 全黄性性激高免费视频 | 人妻少妇精品久久 | 久激情内射婷内射蜜桃人妖 | 丰满岳乱妇在线观看中字无码 | 日本护士xxxxhd少妇 | 成年女人永久免费看片 | 中文字幕人成乱码熟女app | 亚洲中文字幕在线观看 | 国产精品毛片一区二区 | 久久国产精品精品国产色婷婷 | 久久午夜无码鲁丝片午夜精品 | 亚洲日韩av一区二区三区中文 | 少妇性俱乐部纵欲狂欢电影 | 亚洲中文字幕无码一久久区 | 十八禁真人啪啪免费网站 | 思思久久99热只有频精品66 | 99久久亚洲精品无码毛片 | 亚洲а∨天堂久久精品2021 | 日本一本二本三区免费 | 国产suv精品一区二区五 | 青草青草久热国产精品 | 亚洲精品国产第一综合99久久 | 97人妻精品一区二区三区 | 精品无人国产偷自产在线 | 精品午夜福利在线观看 | 亚洲熟悉妇女xxx妇女av | 乱人伦中文视频在线观看 | 精品无码一区二区三区爱欲 | 一本大道伊人av久久综合 | 国产成人人人97超碰超爽8 | 成人免费无码大片a毛片 | 高清国产亚洲精品自在久久 | 俺去俺来也www色官网 | 男女爱爱好爽视频免费看 | 国产亚洲精品久久久久久大师 | 成年美女黄网站色大免费全看 | 久久综合给久久狠狠97色 | 欧美日韩久久久精品a片 | 人妻少妇精品视频专区 | 欧美老人巨大xxxx做受 | 成人三级无码视频在线观看 | 国产亚洲精品久久久久久久 | 欧美自拍另类欧美综合图片区 | 网友自拍区视频精品 | 亚洲成a人一区二区三区 | 无套内射视频囯产 | 亚洲国产高清在线观看视频 | 在线欧美精品一区二区三区 | 亚洲无人区一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 国产亚洲精品久久久久久国模美 | 国产成人综合在线女婷五月99播放 | 伊在人天堂亚洲香蕉精品区 | 日韩亚洲欧美中文高清在线 | 婷婷综合久久中文字幕蜜桃三电影 | 国内精品九九久久久精品 | 亚洲熟妇色xxxxx欧美老妇y | 扒开双腿吃奶呻吟做受视频 | аⅴ资源天堂资源库在线 | 在线观看国产一区二区三区 | 欧美日韩视频无码一区二区三 | 女人被爽到呻吟gif动态图视看 | 少妇邻居内射在线 | 无码精品国产va在线观看dvd | 日韩在线不卡免费视频一区 | 精品无人区无码乱码毛片国产 | 国产成人亚洲综合无码 | 日本成熟视频免费视频 | 国产美女极度色诱视频www | 99麻豆久久久国产精品免费 | 98国产精品综合一区二区三区 | 色综合视频一区二区三区 | 人人澡人摸人人添 | 中文字幕av无码一区二区三区电影 | 日本一区二区三区免费高清 | 精品无码av一区二区三区 | 女人高潮内射99精品 | 理论片87福利理论电影 | 国产精品久久久久久无码 | 中文无码精品a∨在线观看不卡 | 久久精品国产一区二区三区 | 无码毛片视频一区二区本码 | 强开小婷嫩苞又嫩又紧视频 | 激情国产av做激情国产爱 | 欧美人与动性行为视频 | 伊人久久大香线蕉av一区二区 | 成年美女黄网站色大免费视频 | 在线播放亚洲第一字幕 | 日韩av激情在线观看 | 国产亚洲视频中文字幕97精品 | 午夜福利一区二区三区在线观看 | 中文字幕无码免费久久99 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久精品国产99精品亚洲 | 欧美日本精品一区二区三区 | 国产片av国语在线观看 | 无码人妻丰满熟妇区五十路百度 | 无码人妻精品一区二区三区不卡 | 99视频精品全部免费免费观看 | 色综合视频一区二区三区 | a片免费视频在线观看 | 精品国产麻豆免费人成网站 | 国产偷抇久久精品a片69 | 国产sm调教视频在线观看 | 东京热一精品无码av | 在线播放无码字幕亚洲 | 红桃av一区二区三区在线无码av | 欧美人妻一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品久久国产三级国 | 久久精品中文字幕一区 | 亚洲中文字幕无码中文字在线 | 亚洲狠狠色丁香婷婷综合 | 国产在线一区二区三区四区五区 | 成 人 网 站国产免费观看 | 久久精品一区二区三区四区 | 人人爽人人澡人人人妻 | 女人被爽到呻吟gif动态图视看 | 一本大道伊人av久久综合 | 成人免费视频一区二区 | 亚洲gv猛男gv无码男同 | 波多野结衣高清一区二区三区 | 综合人妻久久一区二区精品 | 国产午夜福利亚洲第一 | 中文字幕日产无线码一区 | 人人妻人人藻人人爽欧美一区 | 色爱情人网站 | 国产精品-区区久久久狼 | av无码不卡在线观看免费 | 一本色道婷婷久久欧美 | 国产精品美女久久久 | 欧美变态另类xxxx | 国产精品久久福利网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 天堂无码人妻精品一区二区三区 | 蜜臀av无码人妻精品 | 亚洲中文字幕在线观看 | 天干天干啦夜天干天2017 | 中文字幕av日韩精品一区二区 | 妺妺窝人体色www在线小说 | 免费看男女做好爽好硬视频 | 一二三四社区在线中文视频 | 老头边吃奶边弄进去呻吟 | 国产片av国语在线观看 | 亚洲中文字幕va福利 | 精品国产一区二区三区av 性色 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品午夜国产va久久成人 | 国产一区二区三区精品视频 | 2020久久超碰国产精品最新 | 强辱丰满人妻hd中文字幕 | 亚洲日韩乱码中文无码蜜桃臀网站 | 在教室伦流澡到高潮hnp视频 | 国产精品久久久午夜夜伦鲁鲁 | 18禁止看的免费污网站 | 久久97精品久久久久久久不卡 | 亚洲精品成人av在线 | 欧美精品免费观看二区 | 久久久久成人片免费观看蜜芽 | 国内精品人妻无码久久久影院蜜桃 | 亚洲成av人片在线观看无码不卡 | 成 人 网 站国产免费观看 | 国产女主播喷水视频在线观看 | 精品欧美一区二区三区久久久 | 伊人久久大香线蕉亚洲 | 激情爆乳一区二区三区 | 麻豆国产丝袜白领秘书在线观看 | 麻豆av传媒蜜桃天美传媒 | 亚洲精品久久久久avwww潮水 | 日韩在线不卡免费视频一区 | 97久久精品无码一区二区 | 狠狠色欧美亚洲狠狠色www | 国产精品久久久久9999小说 | 无码毛片视频一区二区本码 | 人人澡人人妻人人爽人人蜜桃 | 久久99精品久久久久久 | 日本大乳高潮视频在线观看 | 国产性生大片免费观看性 | 在线观看免费人成视频 | 99久久精品无码一区二区毛片 | 亚洲七七久久桃花影院 | 无人区乱码一区二区三区 | 亚洲精品国产a久久久久久 | 亚洲日本va中文字幕 | 欧美精品无码一区二区三区 | 国产人妻久久精品二区三区老狼 | 亚洲精品国产第一综合99久久 | 国产绳艺sm调教室论坛 | 红桃av一区二区三区在线无码av | 免费网站看v片在线18禁无码 | 国产卡一卡二卡三 | 男女超爽视频免费播放 | 鲁大师影院在线观看 | 乱中年女人伦av三区 | 任你躁国产自任一区二区三区 | 99久久人妻精品免费二区 | 亚洲中文字幕久久无码 | 国产内射爽爽大片视频社区在线 | 亚洲娇小与黑人巨大交 | 成人无码精品一区二区三区 | 97精品人妻一区二区三区香蕉 | 人人妻人人澡人人爽欧美一区 | 亚洲综合另类小说色区 | 免费乱码人妻系列无码专区 | 中文精品无码中文字幕无码专区 | 亚洲一区二区三区在线观看网站 | 亚洲 另类 在线 欧美 制服 | 成 人 免费观看网站 | 无码人妻丰满熟妇区五十路百度 | 精品久久8x国产免费观看 | √8天堂资源地址中文在线 | 蜜桃视频插满18在线观看 | 人妻少妇精品无码专区二区 | 九月婷婷人人澡人人添人人爽 | 国产成人综合色在线观看网站 | 日日碰狠狠躁久久躁蜜桃 | 中文字幕乱妇无码av在线 | 午夜福利不卡在线视频 | 久久久国产精品无码免费专区 | 欧美人与物videos另类 | 成熟女人特级毛片www免费 | 国产在线一区二区三区四区五区 | 98国产精品综合一区二区三区 | 成年美女黄网站色大免费全看 | 亚洲一区二区三区含羞草 | 欧美黑人巨大xxxxx | 四虎影视成人永久免费观看视频 | 欧美性生交xxxxx久久久 | 97精品人妻一区二区三区香蕉 | 欧美国产日韩久久mv | 精品aⅴ一区二区三区 | 亚洲国产精品无码一区二区三区 | 国产xxx69麻豆国语对白 | 国产午夜亚洲精品不卡下载 | 精品国精品国产自在久国产87 | 国产精品.xx视频.xxtv | 人人妻人人澡人人爽人人精品浪潮 | 色欲综合久久中文字幕网 | 人妻与老人中文字幕 | 亚洲中文无码av永久不收费 | 欧美喷潮久久久xxxxx | 男女超爽视频免费播放 | 亚洲人亚洲人成电影网站色 | 黑人巨大精品欧美黑寡妇 | 国产性生大片免费观看性 | 亚洲欧美日韩成人高清在线一区 | 撕开奶罩揉吮奶头视频 | 蜜臀av无码人妻精品 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲一区av无码专区在线观看 | 少妇无套内谢久久久久 | 久久无码人妻影院 | 国产色在线 | 国产 | 97精品国产97久久久久久免费 | 国产亚洲欧美在线专区 | 欧洲极品少妇 | 亚洲精品一区二区三区四区五区 | 风流少妇按摩来高潮 | 欧美一区二区三区 | 国产精品-区区久久久狼 | 亚洲欧洲无卡二区视頻 | 亚洲日本va中文字幕 | 亚洲成av人影院在线观看 | 国产成人一区二区三区别 | 亚洲精品国偷拍自产在线麻豆 | 熟妇人妻无乱码中文字幕 | 亚洲日本va中文字幕 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品国产品国语在线观看 | 无码人妻精品一区二区三区不卡 | 波多野结衣av一区二区全免费观看 | 亚洲精品中文字幕久久久久 | 99久久久无码国产精品免费 | 精品国产av色一区二区深夜久久 | 亚洲熟妇色xxxxx欧美老妇y | 一本大道伊人av久久综合 | 久久久久免费看成人影片 | 97久久国产亚洲精品超碰热 | 成 人 网 站国产免费观看 | 99麻豆久久久国产精品免费 | 成人动漫在线观看 | 中文字幕无码视频专区 | 女人被男人爽到呻吟的视频 | 日韩精品a片一区二区三区妖精 | 天天做天天爱天天爽综合网 | 少妇人妻av毛片在线看 | 国产三级久久久精品麻豆三级 | 国产精品亚洲综合色区韩国 | 亚洲日韩中文字幕在线播放 | 欧美性黑人极品hd | 欧美日韩色另类综合 | 久久精品人妻少妇一区二区三区 | 在线观看欧美一区二区三区 | 丰满少妇女裸体bbw | 精品偷自拍另类在线观看 | 国产成人无码一二三区视频 | 中文字幕色婷婷在线视频 | 亚洲日韩精品欧美一区二区 | 97se亚洲精品一区 | 国内精品久久毛片一区二区 | а天堂中文在线官网 | 波多野结衣乳巨码无在线观看 | 国产成人精品优优av | 亚洲色大成网站www国产 | 日韩亚洲欧美精品综合 | 小sao货水好多真紧h无码视频 | 一个人看的www免费视频在线观看 | 人妻少妇精品视频专区 | 国产亚洲精品久久久久久久久动漫 | 亚洲综合精品香蕉久久网 | 国产熟妇高潮叫床视频播放 | 美女毛片一区二区三区四区 | 欧美 丝袜 自拍 制服 另类 | 国产香蕉尹人综合在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲娇小与黑人巨大交 | 老司机亚洲精品影院 | 久久99精品国产麻豆 | 日韩av无码中文无码电影 | 无码福利日韩神码福利片 | 天天做天天爱天天爽综合网 | 色欲久久久天天天综合网精品 | 亚洲人成人无码网www国产 | 无码福利日韩神码福利片 | 国产精品亚洲lv粉色 | 免费无码av一区二区 | 国产9 9在线 | 中文 | 中文字幕日产无线码一区 | 亚洲精品一区二区三区在线 | 精品国产一区av天美传媒 | 无码吃奶揉捏奶头高潮视频 | 亚洲码国产精品高潮在线 | 国产特级毛片aaaaaa高潮流水 | 日本免费一区二区三区最新 | 人妻体内射精一区二区三四 | 性生交片免费无码看人 | 又粗又大又硬又长又爽 | 亚洲国产午夜精品理论片 | 久久久www成人免费毛片 | 国产精品美女久久久久av爽李琼 | 中文字幕人妻无码一夲道 | 无码乱肉视频免费大全合集 | 天天爽夜夜爽夜夜爽 | 久久99精品久久久久久 | 亚洲 a v无 码免 费 成 人 a v | 自拍偷自拍亚洲精品10p | 亚洲精品国产第一综合99久久 | 精品无码一区二区三区的天堂 | 97无码免费人妻超级碰碰夜夜 | 2020久久香蕉国产线看观看 | 成人精品天堂一区二区三区 | 色偷偷人人澡人人爽人人模 | 熟妇激情内射com | 国产另类ts人妖一区二区 | 人妻aⅴ无码一区二区三区 | 天天做天天爱天天爽综合网 | 又粗又大又硬又长又爽 | 97精品人妻一区二区三区香蕉 | av香港经典三级级 在线 | 98国产精品综合一区二区三区 | 久久综合给久久狠狠97色 | 国产精品久久福利网站 | 999久久久国产精品消防器材 | 天堂久久天堂av色综合 | 国产精品视频免费播放 | 中文字幕日产无线码一区 | 久久人人爽人人爽人人片ⅴ | 亚洲欧美精品aaaaaa片 | 欧美日韩视频无码一区二区三 | 亚洲中文字幕无码中字 | 无码精品国产va在线观看dvd | 亚洲一区二区三区四区 | 18黄暴禁片在线观看 | 欧美乱妇无乱码大黄a片 | 国产精品a成v人在线播放 | 精品国产麻豆免费人成网站 | а√天堂www在线天堂小说 | 中文无码成人免费视频在线观看 | 国产精品久久久久久亚洲毛片 | 成人无码影片精品久久久 | 日日碰狠狠丁香久燥 | 久久精品99久久香蕉国产色戒 | 国产午夜亚洲精品不卡 | 国产熟女一区二区三区四区五区 | 亚洲自偷自拍另类第1页 | 十八禁真人啪啪免费网站 | 亚洲成熟女人毛毛耸耸多 | 成 人 网 站国产免费观看 | 男女下面进入的视频免费午夜 | 精品 日韩 国产 欧美 视频 | 亚洲精品成a人在线观看 | 国产香蕉97碰碰久久人人 | 久久精品99久久香蕉国产色戒 | 日日干夜夜干 | 久久久久久国产精品无码下载 | 十八禁真人啪啪免费网站 | 夜夜夜高潮夜夜爽夜夜爰爰 | 又大又硬又爽免费视频 | 131美女爱做视频 | 日韩欧美成人免费观看 | 国产福利视频一区二区 | 麻豆av传媒蜜桃天美传媒 | 国产午夜亚洲精品不卡 | 在线精品国产一区二区三区 | a在线观看免费网站大全 | 无套内谢的新婚少妇国语播放 | 国产精品亚洲专区无码不卡 | 2020久久香蕉国产线看观看 | 人妻尝试又大又粗久久 | 欧美精品一区二区精品久久 | 天堂在线观看www | 日本精品人妻无码77777 天堂一区人妻无码 | 精品国产一区二区三区四区 | 欧美性猛交内射兽交老熟妇 | 国产极品视觉盛宴 | 人人爽人人澡人人人妻 | 高清不卡一区二区三区 | 国内少妇偷人精品视频 | 麻豆精产国品 | 日本xxxx色视频在线观看免费 | 亚洲a无码综合a国产av中文 | 国产美女极度色诱视频www | √8天堂资源地址中文在线 | 国产成人精品优优av | 国产极品视觉盛宴 | 西西人体www44rt大胆高清 | 小鲜肉自慰网站xnxx | 国产午夜无码精品免费看 | 国产9 9在线 | 中文 | 亚洲综合伊人久久大杳蕉 | 中文字幕无线码免费人妻 | 伊在人天堂亚洲香蕉精品区 | 欧美精品在线观看 | 成人亚洲精品久久久久 | 欧美成人免费全部网站 | 成人三级无码视频在线观看 | 99久久人妻精品免费一区 | 在线播放亚洲第一字幕 | 欧美阿v高清资源不卡在线播放 | 又大又紧又粉嫩18p少妇 | 欧美xxxxx精品 | 国产在线一区二区三区四区五区 | 狠狠噜狠狠狠狠丁香五月 | a在线亚洲男人的天堂 | 国产精品免费大片 | 欧美阿v高清资源不卡在线播放 | 国产亚洲精品精品国产亚洲综合 | 丰满人妻精品国产99aⅴ | 久热国产vs视频在线观看 | 日本又色又爽又黄的a片18禁 | 成熟人妻av无码专区 | 久久精品中文字幕大胸 | 亚洲无人区一区二区三区 | 精品国产成人一区二区三区 | 丰满人妻被黑人猛烈进入 | 国内丰满熟女出轨videos | 国产明星裸体无码xxxx视频 | 国产精品无码一区二区桃花视频 | 日韩成人一区二区三区在线观看 | 精品人妻人人做人人爽 | 黑人玩弄人妻中文在线 | 久久久久av无码免费网 | 欧美 日韩 亚洲 在线 | 国产精品无码成人午夜电影 | 好男人www社区 | 在线欧美精品一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 日本又色又爽又黄的a片18禁 | 一本久久a久久精品亚洲 | 一本久久a久久精品亚洲 | ass日本丰满熟妇pics | aⅴ亚洲 日韩 色 图网站 播放 | 一本久久a久久精品亚洲 | 人人妻人人澡人人爽欧美精品 | 好男人社区资源 | 亚洲人成人无码网www国产 | 999久久久国产精品消防器材 | 亚洲精品一区二区三区婷婷月 | 国产成人精品必看 | 亚洲精品国产品国语在线观看 | 亲嘴扒胸摸屁股激烈网站 | 国产美女极度色诱视频www | 亚洲成av人在线观看网址 | 国产亚洲美女精品久久久2020 | 2019nv天堂香蕉在线观看 | 久久亚洲日韩精品一区二区三区 | 在线成人www免费观看视频 | 国产乱码精品一品二品 | 性生交片免费无码看人 | 美女极度色诱视频国产 | 精品成在人线av无码免费看 | 国产真实夫妇视频 | 精品无码一区二区三区的天堂 | 久激情内射婷内射蜜桃人妖 | 亚洲春色在线视频 | 东京无码熟妇人妻av在线网址 | 澳门永久av免费网站 | 国产成人精品久久亚洲高清不卡 | 秋霞成人午夜鲁丝一区二区三区 | 久久zyz资源站无码中文动漫 | 激情五月综合色婷婷一区二区 | 亚洲欧美精品aaaaaa片 | 午夜性刺激在线视频免费 | 成人欧美一区二区三区黑人免费 | 免费无码午夜福利片69 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产美女精品一区二区三区 | 熟妇人妻中文av无码 | 人人超人人超碰超国产 | 全球成人中文在线 | 无码精品人妻一区二区三区av | av无码不卡在线观看免费 | 疯狂三人交性欧美 | 亚洲欧美色中文字幕在线 | 久久熟妇人妻午夜寂寞影院 | 国产网红无码精品视频 | 亚洲日韩av一区二区三区四区 | 99久久久无码国产aaa精品 | 小泽玛莉亚一区二区视频在线 | 久久精品成人欧美大片 | 中文字幕无码av波多野吉衣 | 午夜理论片yy44880影院 | 无码人妻精品一区二区三区下载 | 少妇被黑人到高潮喷出白浆 | 欧美性生交xxxxx久久久 | 国产熟女一区二区三区四区五区 | 97资源共享在线视频 | 成人动漫在线观看 | 欧美猛少妇色xxxxx | 日本一本二本三区免费 | 日本www一道久久久免费榴莲 | 久9re热视频这里只有精品 | 久久精品无码一区二区三区 | 国产明星裸体无码xxxx视频 | 亚洲の无码国产の无码影院 | 亚洲第一网站男人都懂 | 无码帝国www无码专区色综合 | 东京热一精品无码av | 久久久久久av无码免费看大片 | 97精品国产97久久久久久免费 | 日日碰狠狠躁久久躁蜜桃 | 亚洲日韩av一区二区三区中文 | 999久久久国产精品消防器材 | 欧美刺激性大交 | 亚洲の无码国产の无码影院 | 亚洲色欲色欲天天天www | 久久 国产 尿 小便 嘘嘘 | 欧美性猛交内射兽交老熟妇 | 日韩精品乱码av一区二区 | 日本精品久久久久中文字幕 | 熟妇人妻中文av无码 | 午夜精品久久久久久久久 | 日日橹狠狠爱欧美视频 | 18无码粉嫩小泬无套在线观看 | 国产另类ts人妖一区二区 | 欧美freesex黑人又粗又大 | 国产精品久久福利网站 | 兔费看少妇性l交大片免费 | 日本饥渴人妻欲求不满 | 红桃av一区二区三区在线无码av | 亚洲国产精品一区二区美利坚 | 粉嫩少妇内射浓精videos | 欧美亚洲国产一区二区三区 | 老熟妇乱子伦牲交视频 | 狂野欧美性猛xxxx乱大交 | 日韩精品久久久肉伦网站 | 国产激情无码一区二区app | 人妻aⅴ无码一区二区三区 | 久久人人爽人人爽人人片ⅴ | 爆乳一区二区三区无码 | 美女张开腿让人桶 | 99久久亚洲精品无码毛片 | 97精品国产97久久久久久免费 | 亚洲精品一区国产 | 人妻少妇精品无码专区动漫 | 久久99精品国产麻豆 | 国产偷国产偷精品高清尤物 | 久久久久99精品成人片 | 偷窥日本少妇撒尿chinese | 色婷婷久久一区二区三区麻豆 | 亚洲成a人片在线观看无码3d | 九九久久精品国产免费看小说 | a在线观看免费网站大全 | av无码电影一区二区三区 | 又大又黄又粗又爽的免费视频 | 任你躁国产自任一区二区三区 | 18黄暴禁片在线观看 | а天堂中文在线官网 | 亚洲日韩一区二区 | 国产麻豆精品一区二区三区v视界 | 精品偷自拍另类在线观看 | 一本精品99久久精品77 | 亚洲精品久久久久中文第一幕 | 一本一道久久综合久久 | 99er热精品视频 | 成年美女黄网站色大免费视频 | 亚洲中文字幕无码一久久区 | 久久精品国产精品国产精品污 | 国産精品久久久久久久 | yw尤物av无码国产在线观看 | 综合人妻久久一区二区精品 | 欧美国产日韩久久mv | 国产精品无码一区二区三区不卡 | 又紧又大又爽精品一区二区 | 午夜性刺激在线视频免费 | 十八禁视频网站在线观看 | 久久久无码中文字幕久... | 亚洲熟女一区二区三区 | 中文无码精品a∨在线观看不卡 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久久久亚洲精品中文字幕 | 久久国语露脸国产精品电影 | 少妇性荡欲午夜性开放视频剧场 | 欧美日韩一区二区综合 | 少妇的肉体aa片免费 | 久久精品女人天堂av免费观看 | 女人高潮内射99精品 | 99久久久无码国产精品免费 | 色综合久久中文娱乐网 | 国产一区二区三区精品视频 | 亚洲熟妇色xxxxx欧美老妇 | 久久精品无码一区二区三区 | 俄罗斯老熟妇色xxxx | 又大又硬又爽免费视频 | 久久精品99久久香蕉国产色戒 | 内射爽无广熟女亚洲 | 国产在线精品一区二区三区直播 | 真人与拘做受免费视频一 | 2020久久超碰国产精品最新 | 精品国产成人一区二区三区 | 久久99精品久久久久婷婷 | 精品久久8x国产免费观看 | 樱花草在线播放免费中文 | 国产亚洲视频中文字幕97精品 | 中文亚洲成a人片在线观看 | 国产成人无码a区在线观看视频app | 黑森林福利视频导航 | 欧美国产日韩亚洲中文 | 国产麻豆精品精东影业av网站 | 国产内射老熟女aaaa | 熟女体下毛毛黑森林 | 成人三级无码视频在线观看 | 欧美 亚洲 国产 另类 | 欧美成人免费全部网站 | 精品久久久无码人妻字幂 | 日本饥渴人妻欲求不满 | 樱花草在线播放免费中文 | 人妻少妇精品无码专区动漫 | 精品无码国产自产拍在线观看蜜 | 亚洲中文字幕va福利 | 亚洲自偷自拍另类第1页 | 日韩成人一区二区三区在线观看 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 无码av岛国片在线播放 | 久久精品国产日本波多野结衣 | v一区无码内射国产 | 国产小呦泬泬99精品 | 国产香蕉尹人综合在线观看 | 亚洲精品中文字幕 | 国产精品久久久久久亚洲影视内衣 | 欧美精品免费观看二区 | 乱人伦人妻中文字幕无码 | 偷窥日本少妇撒尿chinese | 久久久久国色av免费观看性色 | 蜜桃视频韩日免费播放 | 精品人妻人人做人人爽夜夜爽 | 岛国片人妻三上悠亚 | 国产手机在线αⅴ片无码观看 | 色偷偷人人澡人人爽人人模 | 欧美人与禽猛交狂配 | 夫妻免费无码v看片 | 水蜜桃亚洲一二三四在线 | 国产亚洲精品久久久久久久 | 给我免费的视频在线观看 | 四十如虎的丰满熟妇啪啪 | 国产成人精品三级麻豆 | 日本一卡二卡不卡视频查询 | 成人av无码一区二区三区 | 国产av一区二区精品久久凹凸 | 国产一区二区三区四区五区加勒比 | 无码国内精品人妻少妇 | 在教室伦流澡到高潮hnp视频 | 乱人伦人妻中文字幕无码 | 免费观看激色视频网站 | 99视频精品全部免费免费观看 | 久久综合色之久久综合 | 亚洲小说图区综合在线 | 欧美精品一区二区精品久久 | 日本一卡二卡不卡视频查询 | 国产成人综合色在线观看网站 | 日日躁夜夜躁狠狠躁 | 久久国产精品二国产精品 | 久久综合激激的五月天 | 亚洲 欧美 激情 小说 另类 | 国产麻豆精品一区二区三区v视界 | 日本欧美一区二区三区乱码 | 久久99精品国产麻豆蜜芽 | 青青草原综合久久大伊人精品 | 中文字幕av无码一区二区三区电影 | 少妇邻居内射在线 | 亚洲色欲色欲天天天www | 久久久久久亚洲精品a片成人 | 日本一卡二卡不卡视频查询 | 国产精品国产自线拍免费软件 | 国产av无码专区亚洲a∨毛片 | 熟女少妇人妻中文字幕 | 国产成人午夜福利在线播放 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲欧美综合区丁香五月小说 | 中文字幕乱码人妻无码久久 | 国产欧美精品一区二区三区 | 色五月五月丁香亚洲综合网 | 日韩精品无码一区二区中文字幕 | 性欧美熟妇videofreesex | 少妇被黑人到高潮喷出白浆 | 少妇愉情理伦片bd | 亚洲欧美日韩国产精品一区二区 | 日韩人妻无码一区二区三区久久99 | 国产国产精品人在线视 | 亚洲色成人中文字幕网站 | 亚洲国产日韩a在线播放 | 久久久精品人妻久久影视 | 亚洲成色www久久网站 | 国产在线一区二区三区四区五区 | 300部国产真实乱 | 久久亚洲精品成人无码 | 亚洲色欲色欲天天天www | 国产 精品 自在自线 | 精品久久8x国产免费观看 | 午夜精品一区二区三区的区别 | 中文精品久久久久人妻不卡 | 精品国产一区二区三区四区 | 亚洲a无码综合a国产av中文 | 青青青手机频在线观看 | 色婷婷综合激情综在线播放 | 亚洲 激情 小说 另类 欧美 | 欧美丰满少妇xxxx性 | 国产又爽又猛又粗的视频a片 | 色婷婷香蕉在线一区二区 | 欧美精品免费观看二区 | 一个人看的www免费视频在线观看 | 午夜精品一区二区三区在线观看 | 亚洲色无码一区二区三区 | 精品欧美一区二区三区久久久 | 亚洲爆乳精品无码一区二区三区 | 青青青手机频在线观看 | 成人毛片一区二区 | 国产无套内射久久久国产 | 久久精品视频在线看15 | 牛和人交xxxx欧美 | 秋霞特色aa大片 | 亚洲小说图区综合在线 | 奇米影视7777久久精品人人爽 | 一个人免费观看的www视频 | 夫妻免费无码v看片 | 99久久久无码国产精品免费 | 最新国产乱人伦偷精品免费网站 | 久久久久久久女国产乱让韩 | 天下第一社区视频www日本 | 丰满少妇人妻久久久久久 | 人妻少妇精品视频专区 | 亚洲综合久久一区二区 | 搡女人真爽免费视频大全 | 国产香蕉97碰碰久久人人 | 丝袜 中出 制服 人妻 美腿 | 国产精品沙发午睡系列 | 国产精品久免费的黄网站 | 色欲久久久天天天综合网精品 | 中国女人内谢69xxxx | 亚洲国产精品毛片av不卡在线 | 无遮挡啪啪摇乳动态图 | 中文字幕 人妻熟女 | 无码人妻av免费一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 东京无码熟妇人妻av在线网址 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧洲无卡二区视頻 | 男女下面进入的视频免费午夜 | 国产午夜无码精品免费看 | 奇米影视888欧美在线观看 | 国产人妻久久精品二区三区老狼 | 18黄暴禁片在线观看 | 成人无码影片精品久久久 | 国产香蕉97碰碰久久人人 | 久久久www成人免费毛片 | 精品少妇爆乳无码av无码专区 | 夜精品a片一区二区三区无码白浆 | 久久久久成人精品免费播放动漫 | 女人被男人爽到呻吟的视频 | 国产肉丝袜在线观看 | 国产精品无码一区二区桃花视频 | 亚洲国产精品毛片av不卡在线 | 无码人妻久久一区二区三区不卡 | 色欲综合久久中文字幕网 | 精品无码国产自产拍在线观看蜜 | 极品嫩模高潮叫床 | 人人妻人人澡人人爽欧美一区九九 | 精品偷拍一区二区三区在线看 | 国精产品一品二品国精品69xx | 久久婷婷五月综合色国产香蕉 | 成人无码视频在线观看网站 | 天堂а√在线地址中文在线 | 亚洲欧美综合区丁香五月小说 | 国产精品爱久久久久久久 | 野狼第一精品社区 | 国产综合在线观看 | 性欧美牲交xxxxx视频 | 国产成人一区二区三区别 | 国产极品视觉盛宴 | 国产成人无码午夜视频在线观看 | av无码电影一区二区三区 | 波多野结衣高清一区二区三区 | а√资源新版在线天堂 | 精品久久8x国产免费观看 | 亚洲а∨天堂久久精品2021 | 国内少妇偷人精品视频 | 狠狠综合久久久久综合网 | 无码人妻丰满熟妇区毛片18 | 少妇的肉体aa片免费 | 人人澡人人透人人爽 | 国产九九九九九九九a片 | 人妻aⅴ无码一区二区三区 | 亚洲一区二区三区偷拍女厕 | 精品一区二区不卡无码av | 大乳丰满人妻中文字幕日本 | 国产熟妇高潮叫床视频播放 | 国产精品免费大片 | 好爽又高潮了毛片免费下载 | 亚洲精品国产a久久久久久 | 国产成人无码av片在线观看不卡 | 亚洲精品无码人妻无码 | 天天躁夜夜躁狠狠是什么心态 | 美女扒开屁股让男人桶 | 久久久久久a亚洲欧洲av冫 | 欧美人与动性行为视频 | 精品无码av一区二区三区 | 久久www免费人成人片 | 国产人妻久久精品二区三区老狼 | 老熟女乱子伦 | 精品一区二区三区波多野结衣 | 免费观看激色视频网站 | 在线欧美精品一区二区三区 | 亚洲自偷自偷在线制服 | 99riav国产精品视频 | 亚洲成a人片在线观看无码 | 无套内谢老熟女 | 国产香蕉尹人视频在线 | 美女极度色诱视频国产 | 大色综合色综合网站 | 久久精品人人做人人综合 | 久久99精品久久久久久动态图 | 99er热精品视频 | 日韩人妻无码中文字幕视频 | 久久综合久久自在自线精品自 | 一本大道伊人av久久综合 | 丝袜人妻一区二区三区 | 波多野结衣乳巨码无在线观看 | 丰满少妇熟乱xxxxx视频 | 国产精品爱久久久久久久 | 天堂а√在线地址中文在线 | 欧美熟妇另类久久久久久不卡 | 1000部啪啪未满十八勿入下载 | 国内精品人妻无码久久久影院蜜桃 | 国产成人无码av一区二区 | 欧美人与动性行为视频 | 在线a亚洲视频播放在线观看 | 免费中文字幕日韩欧美 | 久久精品中文字幕一区 | 日本在线高清不卡免费播放 | 久久久久免费精品国产 | 久久精品99久久香蕉国产色戒 | 麻豆人妻少妇精品无码专区 | 一本久道久久综合狠狠爱 | 99久久亚洲精品无码毛片 | 久久精品女人天堂av免费观看 | 亚洲精品一区二区三区在线观看 | 国产精品久久久久7777 | 国产在线一区二区三区四区五区 | 黑人粗大猛烈进出高潮视频 | 最新国产麻豆aⅴ精品无码 | 成人毛片一区二区 | 最近中文2019字幕第二页 | 又色又爽又黄的美女裸体网站 | 成人女人看片免费视频放人 | 国内综合精品午夜久久资源 | 亚洲精品一区二区三区婷婷月 | 免费中文字幕日韩欧美 | 自拍偷自拍亚洲精品被多人伦好爽 | 男人扒开女人内裤强吻桶进去 | 理论片87福利理论电影 | 高清国产亚洲精品自在久久 | 成人女人看片免费视频放人 | 中文字幕人妻无码一夲道 | 国产在线精品一区二区三区直播 | 国产黄在线观看免费观看不卡 | 色综合久久88色综合天天 | 蜜桃视频插满18在线观看 | 久久综合网欧美色妞网 | 网友自拍区视频精品 | 99久久99久久免费精品蜜桃 | 蜜桃视频韩日免费播放 | 又紧又大又爽精品一区二区 | 人妻无码久久精品人妻 | 欧美色就是色 | 欧美性黑人极品hd | 高清不卡一区二区三区 | 精品无码成人片一区二区98 | 奇米影视7777久久精品人人爽 | 97精品人妻一区二区三区香蕉 | 欧美xxxxx精品 | 免费网站看v片在线18禁无码 | 亚洲国产精品无码一区二区三区 | 国产精品久久久久久无码 | av香港经典三级级 在线 | 日韩精品a片一区二区三区妖精 | 午夜精品一区二区三区在线观看 | 在线播放免费人成毛片乱码 | 99麻豆久久久国产精品免费 | 国产香蕉尹人视频在线 | 国内精品一区二区三区不卡 | 四虎国产精品免费久久 | 色综合久久88色综合天天 | 国产av无码专区亚洲awww | 中文字幕无码热在线视频 | 久久99精品久久久久婷婷 | 精品一区二区三区波多野结衣 | 国产熟妇高潮叫床视频播放 | 久久久久久久女国产乱让韩 | 国产亚洲精品久久久久久 | 水蜜桃色314在线观看 | 亚洲精品午夜国产va久久成人 | 99久久久国产精品无码免费 | 免费国产黄网站在线观看 | 亚洲精品成人福利网站 | 国产精品无码成人午夜电影 | 捆绑白丝粉色jk震动捧喷白浆 | 国产精品久久精品三级 | 亚洲色大成网站www | 日本一卡2卡3卡四卡精品网站 | 国产精品香蕉在线观看 | 中文字幕人成乱码熟女app | 亚洲精品久久久久avwww潮水 | 亚洲自偷精品视频自拍 | 亚洲国产成人a精品不卡在线 | 国产极品美女高潮无套在线观看 | 亚洲熟妇色xxxxx亚洲 | 妺妺窝人体色www在线小说 | 搡女人真爽免费视频大全 | 丰满少妇女裸体bbw | 日本一卡二卡不卡视频查询 | 中文字幕 人妻熟女 | 国产精品久久久久影院嫩草 | 久久 国产 尿 小便 嘘嘘 | 成人无码精品1区2区3区免费看 | 中文无码伦av中文字幕 | 色欲综合久久中文字幕网 | 无码一区二区三区在线观看 | 中文字幕精品av一区二区五区 | 成人无码视频在线观看网站 | 少妇性l交大片欧洲热妇乱xxx | 欧美人与动性行为视频 | 亚洲男人av天堂午夜在 | 久久久亚洲欧洲日产国码αv | 亚洲人成网站免费播放 | 无码人妻精品一区二区三区下载 | 欧美老熟妇乱xxxxx | 九九综合va免费看 | 国产精品无码mv在线观看 | 野外少妇愉情中文字幕 | 樱花草在线播放免费中文 | 亚洲一区av无码专区在线观看 | 麻花豆传媒剧国产免费mv在线 | 色情久久久av熟女人妻网站 | 小泽玛莉亚一区二区视频在线 | 久久99国产综合精品 | 亚洲中文字幕无码中字 | 特黄特色大片免费播放器图片 | 国产真实乱对白精彩久久 | 欧美刺激性大交 | 国产亚洲视频中文字幕97精品 | 少妇高潮喷潮久久久影院 | 国产国产精品人在线视 | 女人和拘做爰正片视频 | 色一情一乱一伦一区二区三欧美 | 色一情一乱一伦一视频免费看 | 伊人久久婷婷五月综合97色 | 天下第一社区视频www日本 | 国产麻豆精品一区二区三区v视界 | 十八禁真人啪啪免费网站 | 免费看少妇作爱视频 | 亚洲大尺度无码无码专区 | 99er热精品视频 | 亚洲国产精品无码一区二区三区 | 在线亚洲高清揄拍自拍一品区 | 精品一区二区不卡无码av | 日韩亚洲欧美精品综合 | 最近中文2019字幕第二页 | 久久视频在线观看精品 | 国产亚洲精品精品国产亚洲综合 | 久久久精品成人免费观看 | 久久综合狠狠综合久久综合88 | 全黄性性激高免费视频 | 久久综合九色综合97网 | 国产sm调教视频在线观看 | 亚洲七七久久桃花影院 | 日韩精品无码一本二本三本色 | 国产偷抇久久精品a片69 | 国产成人无码a区在线观看视频app | 国产精品va在线播放 | 亚洲自偷精品视频自拍 | 精品乱码久久久久久久 | 在线a亚洲视频播放在线观看 | 任你躁在线精品免费 | 无码av免费一区二区三区试看 | 初尝人妻少妇中文字幕 | 国产精品人人爽人人做我的可爱 | 亚洲精品成a人在线观看 | 亚洲熟妇色xxxxx欧美老妇 | 国产精品久久久久影院嫩草 | 精品国产一区二区三区四区 | 国产亚洲美女精品久久久2020 | 国产激情精品一区二区三区 | 99久久人妻精品免费一区 | 亚洲精品一区二区三区婷婷月 | а√天堂www在线天堂小说 | 国内精品久久久久久中文字幕 | 国产无遮挡又黄又爽免费视频 | 麻豆果冻传媒2021精品传媒一区下载 | 久久久婷婷五月亚洲97号色 | 性做久久久久久久免费看 | 日本在线高清不卡免费播放 | 国产精品久久久久久无码 | 日日天干夜夜狠狠爱 | 99国产欧美久久久精品 | 亚洲综合另类小说色区 | 中文精品久久久久人妻不卡 | 国产亚洲精品久久久久久久久动漫 | 国产成人精品无码播放 | 最新国产麻豆aⅴ精品无码 | 亚洲成熟女人毛毛耸耸多 | 大色综合色综合网站 | 特大黑人娇小亚洲女 | 亚洲精品国产第一综合99久久 | 国产超级va在线观看视频 | 婷婷五月综合缴情在线视频 | 国产精品嫩草久久久久 | 亚洲爆乳精品无码一区二区三区 | 色综合视频一区二区三区 | 最近中文2019字幕第二页 | 久久国内精品自在自线 | 中国女人内谢69xxxx | 伦伦影院午夜理论片 | 国产精品久久久久久无码 | 2020久久香蕉国产线看观看 | 国产精品亚洲lv粉色 | 又大又硬又黄的免费视频 | 荫蒂被男人添的好舒服爽免费视频 | 玩弄少妇高潮ⅹxxxyw | 亚洲精品久久久久avwww潮水 | 亚洲综合在线一区二区三区 | 在线观看免费人成视频 | 国产成人无码一二三区视频 | 久久精品国产精品国产精品污 | 国产成人无码专区 | 性色欲网站人妻丰满中文久久不卡 | 国产又粗又硬又大爽黄老大爷视 | 无码毛片视频一区二区本码 | 无码人妻久久一区二区三区不卡 | 亚洲色在线无码国产精品不卡 | 国产亚洲精品久久久久久 | 久久国内精品自在自线 | 国产综合在线观看 | 成人精品视频一区二区三区尤物 | 亚洲成av人片在线观看无码不卡 | 欧美日韩一区二区免费视频 | 国产69精品久久久久app下载 | 国产三级久久久精品麻豆三级 | 久久人人爽人人爽人人片av高清 | 无码任你躁久久久久久久 | 强奷人妻日本中文字幕 | 天天爽夜夜爽夜夜爽 | 国产特级毛片aaaaaa高潮流水 | 亚洲一区av无码专区在线观看 | 欧美熟妇另类久久久久久多毛 | 欧美三级不卡在线观看 | 97夜夜澡人人爽人人喊中国片 | 天天爽夜夜爽夜夜爽 | 国产片av国语在线观看 | 性做久久久久久久久 | 午夜无码人妻av大片色欲 | 性生交大片免费看l | av无码不卡在线观看免费 | 国产亚洲精品久久久久久久久动漫 | 一区二区三区乱码在线 | 欧洲 | 亚洲热妇无码av在线播放 | 97无码免费人妻超级碰碰夜夜 | 精品无人国产偷自产在线 | 婷婷综合久久中文字幕蜜桃三电影 | 67194成是人免费无码 | 精品欧美一区二区三区久久久 | 久久久久久a亚洲欧洲av冫 | 欧洲精品码一区二区三区免费看 | 丝袜 中出 制服 人妻 美腿 | 日本护士xxxxhd少妇 | 国产女主播喷水视频在线观看 | 99视频精品全部免费免费观看 | 亚洲一区二区三区含羞草 | 国产成人一区二区三区在线观看 | 国产另类ts人妖一区二区 | 国产精品亚洲五月天高清 | 日本一区二区更新不卡 | 玩弄中年熟妇正在播放 | 亚洲中文无码av永久不收费 | 一本久久伊人热热精品中文字幕 | 中文字幕av日韩精品一区二区 | 亚洲精品综合五月久久小说 | 麻豆国产97在线 | 欧洲 | 特黄特色大片免费播放器图片 | 377p欧洲日本亚洲大胆 | 九九热爱视频精品 | 久久精品一区二区三区四区 | 狠狠综合久久久久综合网 | 青草青草久热国产精品 | 人妻中文无码久热丝袜 | 人妻体内射精一区二区三四 | 色欲久久久天天天综合网精品 | 国产成人精品无码播放 | 日本va欧美va欧美va精品 | 一本久久a久久精品vr综合 | 精品久久久无码人妻字幂 | aa片在线观看视频在线播放 | 荫蒂添的好舒服视频囗交 | 中国女人内谢69xxxx | 色诱久久久久综合网ywww | 图片区 小说区 区 亚洲五月 | 精品无码一区二区三区的天堂 | 99久久精品无码一区二区毛片 | 性欧美熟妇videofreesex | 欧美 亚洲 国产 另类 | 图片区 小说区 区 亚洲五月 | 撕开奶罩揉吮奶头视频 | 国产精品va在线播放 | 中文字幕日韩精品一区二区三区 | 亚洲va中文字幕无码久久不卡 | 亚洲精品久久久久久一区二区 | 人妻体内射精一区二区三四 | 亚洲欧洲中文日韩av乱码 | 国产精华av午夜在线观看 | 久9re热视频这里只有精品 | 大乳丰满人妻中文字幕日本 | 国产av一区二区精品久久凹凸 | 亚洲综合无码一区二区三区 | 熟女少妇人妻中文字幕 | 青春草在线视频免费观看 | 久久 国产 尿 小便 嘘嘘 | 午夜不卡av免费 一本久久a久久精品vr综合 | 中文字幕乱码人妻无码久久 | 装睡被陌生人摸出水好爽 | 伊人色综合久久天天小片 | 日欧一片内射va在线影院 | 亚洲欧洲日本综合aⅴ在线 | 97夜夜澡人人爽人人喊中国片 | 伊人久久婷婷五月综合97色 | 日本高清一区免费中文视频 | 国产高清av在线播放 | 中文字幕无码人妻少妇免费 | 国产亚av手机在线观看 | 午夜精品久久久久久久 | 少妇人妻大乳在线视频 | 成人性做爰aaa片免费看 | 国产97人人超碰caoprom | 色五月丁香五月综合五月 | 国产一区二区不卡老阿姨 | 99久久婷婷国产综合精品青草免费 | 成人女人看片免费视频放人 | 亚洲精品中文字幕久久久久 | 国产婷婷色一区二区三区在线 | 大肉大捧一进一出好爽视频 | 久久人人97超碰a片精品 | 国产精品亚洲一区二区三区喷水 | 精品久久久久久亚洲精品 | 国产精品国产自线拍免费软件 | 欧美精品无码一区二区三区 | 亚洲午夜久久久影院 |