DeepMatch:用于推荐广告的深度召回匹配算法库

一只小狐狸带你解锁 炼丹术&NLP 秘籍

前言

今天介绍一下我们的一个开源项目DeepMatch,提供了若干主流的深度召回匹配算法的实现,并支持快速导出用户和物品向量进行ANN检索。非常适合同学们进行快速实验和学习,解放算法工程师的双手!

发布一个月后已经收到了400+ star

下面分别从开发背景,安装和使用方法以及贡献和交流几个方面介绍一下这个项目。文末提供了交流群感兴趣的同学不要错过,欢迎找bug和提意见~

deepmatch

众所周知,目前主流的推荐广告算法架构体系是一个召回排序的两阶段流程,召回模块从海量的候选池中召回多样的相关的候选物料,排序模块根据用户偏好和上下文信息给出用户最可能感兴趣的一个有序列表。

随着深度学习技术的普及,越来越多的深度学习算法被应用到了工业界中。笔者自去年毕业进入企业后,有幸参与了某新业务的推荐系统搭建以及用户体验和业务指标的优化当中,其中在召回部分也进行过一些基于向量召回的探索并取得了一些收益。

之前在读研期间出于个人兴趣开发过一个基于深度学习的点击率预测算法库DeepCTR(https://github.com/shenweichen/DeepCTR),随着时间的迭代得到了一些同学的支持和认可,自己也亲身使用到了里面的算法应用到了自己的业务当中并取得了显著的收益。

相比于排序中各种点击率预估模型,自己对于召回模块的了解还有很多欠缺,借着这个机会,抱着学习的心态,和几位热心的优秀小伙伴一起做了DeepMatch这个项目,希望它能够帮助到大家!

下面简单介绍一下如何安装和使用

安装和使用

  • 通过pip安装

pip install -U deepmatch

  • 文档

https://deepmatch.readthedocs.io/en/latest/

  • 使用例子

下面已大家比较熟悉的YoutubeDNN为例子,给大家介绍如何使用 deepmatch进行召回模型的训练,用户和物品向量的导出,以及使用faiss进行近似最近邻搜索。

整段代码不到100行,可以是非常的方便进行学习和使用了~

import pandas as pd
from deepctr.inputs import SparseFeat, VarLenSparseFeat
from preprocess import gen_data_set, gen_model_input
from sklearn.preprocessing import LabelEncoder
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.models import Modelfrom deepmatch.models import *
from deepmatch.utils import sampledsoftmaxloss# 以movielens数据为例,取200条样例数据进行流程演示data = pd.read_csvdata = pd.read_csv("./movielens_sample.txt")
sparse_features = ["movie_id", "user_id","gender", "age", "occupation", "zip", ]
SEQ_LEN = 50
negsample = 0# 1. 首先对于数据中的特征进行ID化编码,然后使用 `gen_date_set` and `gen_model_input`来生成带有用户历史行为序列的特征数据features = ['user_id', 'movie_id', 'gender', 'age', 'occupation', 'zip']
feature_max_idx = {}
for feature in features:lbe = LabelEncoder()data[feature] = lbe.fit_transform(data[feature]) + 1feature_max_idx[feature] = data[feature].max() + 1user_profile = data[["user_id", "gender", "age", "occupation", "zip"]].drop_duplicates('user_id')item_profile = data[["movie_id"]].drop_duplicates('movie_id')user_profile.set_index("user_id", inplace=True)user_item_list = data.groupby("user_id")['movie_id'].apply(list)train_set, test_set = gen_data_set(data, negsample)train_model_input, train_label = gen_model_input(train_set, user_profile, SEQ_LEN)
test_model_input, test_label = gen_model_input(test_set, user_profile, SEQ_LEN)# 2. 配置一下模型定义需要的特征列,主要是特征名和embedding词表的大小embedding_dim = 16user_feature_columns = [SparseFeat('user_id', feature_max_idx['user_id'], embedding_dim),SparseFeat("gender", feature_max_idx['gender'], embedding_dim),SparseFeat("age", feature_max_idx['age'], embedding_dim),SparseFeat("occupation", feature_max_idx['occupation'], embedding_dim),SparseFeat("zip", feature_max_idx['zip'], embedding_dim),VarLenSparseFeat(SparseFeat('hist_movie_id', feature_max_idx['movie_id'], embedding_dim,embedding_name="movie_id"), SEQ_LEN, 'mean', 'hist_len'),]item_feature_columns = [SparseFeat('movie_id', feature_max_idx['movie_id'], embedding_dim)]# 3. 定义一个YoutubeDNN模型,分别传入用户侧特征列表`user_feature_columns`和物品侧特征列表`item_feature_columns`。然后配置优化器和损失函数,开始进行训练。K.set_learning_phase(True)model = YoutubeDNN(user_feature_columns, item_feature_columns, num_sampled=5, user_dnn_hidden_units=(64, 16))
# model = MIND(user_feature_columns,item_feature_columns,dynamic_k=True,p=1,k_max=2,num_sampled=5,user_dnn_hidden_units=(64,16),init_std=0.001)model.compile(optimizer="adagrad", loss=sampledsoftmaxloss)  # "binary_crossentropy")history = model.fit(train_model_input, train_label,  # train_label,batch_size=256, epochs=1, verbose=1, validation_split=0.0, )# 4. 训练完整后,由于在实际使用时,我们需要根据当前的用户特征实时产生用户侧向量,并对物品侧向量构建索引进行近似最近邻查找。这里由于是离线模拟,所以我们导出所有待测试用户的表示向量,和所有物品的表示向量。test_user_model_input = test_model_input
all_item_model_input = {"movie_id": item_profile['movie_id'].values, "movie_idx": item_profile['movie_id'].values}# 以下两行是deepmatch中的通用使用方法,分别获得用户向量模型和物品向量模型
user_embedding_model = Model(inputs=model.user_input, outputs=model.user_embedding)
item_embedding_model = Model(inputs=model.item_input, outputs=model.item_embedding)
# 输入对应的数据拿到对应的向量
user_embs = user_embedding_model.predict(test_user_model_input, batch_size=2 ** 12)
# user_embs = user_embs[:, i, :]  i in [0,k_max) if MIND
item_embs = item_embedding_model.predict(all_item_model_input, batch_size=2 ** 12)print(user_embs.shape)
print(item_embs.shape)# 5. [可选的]如果有安装faiss库的同学,可以体验以下将上一步导出的物品向量构建索引,然后用用户向量来进行ANN查找并评估效果test_true_label = {line[0]:[line[2]] for line in test_set}
import numpy as np
import faiss
from tqdm import tqdm
from deepmatch.utils import recall_N
index = faiss.IndexFlatIP(embedding_dim)
# faiss.normalize_L2(item_embs)
index.add(item_embs)
# faiss.normalize_L2(user_embs)
D, I = index.search(user_embs, 50)
s = []
hit = 0
for i, uid in tqdm(enumerate(test_user_model_input['user_id'])):try:pred = [item_profile['movie_id'].values[x] for x in I[i]]filter_item = Nonerecall_score = recall_N(test_true_label[uid], pred, N=50)s.append(recall_score)if test_true_label[uid] in pred:hit += 1except:print(i)
print("recall", np.mean(s))
print("hr", hit / len(test_user_model_input['user_id']))
  • 完整代码见链接 https://github.com/shenweichen/DeepMatch/blob/master/examples/run_youtubednn_sampledsoftmax.py

  • 同时我们也提供了在movielens-1M数据集上进行实验的notebook,感兴趣的同学可以运行一下试试~ https://github.com/shenweichen/DeepMatch/blob/master/examples/colab_MovieLen1M_YoutubeDNN.ipynb

贡献者

一个人的力量有限,感谢一起参与开发的小伙伴们~~他们分别是:

  • 王喆 京东广告算法工程师

    • blog: https://zhuanlan.zhihu.com/c_1218845039004119040

    • github: https://github.com/wangzhegeek

  • 蔡庆亮 字节跳动高级广告算法工程师

    • blog: https://blog.csdn.net/cqlboat

    • github:https://github.com/LeoCai

  • 杨婕妤,浙江大学研二找工作????,疯狂求各大公司收留

    • mail: yangjieyu@zju.edu.cn

    • github:https://github.com/Eleanoryuyuyu

讨论群和参与开发

我们也邀请了上面几位同学一起建立了DeepMatch的交流群,帮助同学们共同学习和交流。也欢迎感兴趣的同学加入我们一起进行开发!

希望大家多多支持,可以给我们来个star! 

https://github.com/shenweichen/DeepMatch【点击阅读原文直达】

另外悄悄透露下:我们还有若干模型已经开发完成,等待测试好了就会公布,所以一定要关注我们呀!

本文原创首发于【浅梦的学习笔记】,想了解更多关于推荐系统的内容,欢迎扫码关注公众号。回复【加群】可以加入我们的交流群一起学习!

浅梦的学习笔记】持续产出推荐/广告/搜索等算法相关技术干货和实践经验。关注公号后台回复口令推荐入门获取推荐系统入门必读的经典论文合集!

浅梦的学习笔记近期文章????

  • 【论文笔记】谷歌最新双塔DNN召回模型——应用于YouTube大规模视频推荐场景

  • 【论文笔记】如何刻画用户的多样兴趣——MIND阅读笔记

  • 【视频讲解】DeepCTR中的DeepFM原理和实现

  • 向量化召回在360信息流广告的实践

  • KDD19 DGL教程:Recommender System with GNN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最全Spring面试71题与答案

1.什么是spring? Spring是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。 2.使用Spring框架的好处…

论文浅尝 | 近期论文精选

本文转载自公众号 PaperWeekly, 对我们近期的论文浅尝进行了精选整理并附上了相应的源码链接,感谢 PaperWeekly!TheWebConf 2018■ 链接 | https://www.paperweekly.site/papers/1956■ 解读 | 花云程,东南大学博士,研究方向为自然…

海马体what where记忆推理模型

Generalisation of structural knowledge in theHippocampal-Entorhinal systemhttps://www.groundai.com/project/generalisation-of-structural-knowledge-in-the-hippocampal-entorhinal-system/海马 - 内嗅系统结构知识的泛化 实体概念信息和位置及虚拟位置信息组成记忆保存…

快速排序quicksort算法细节优化(一次申请内存/无额外内存排序)

文章目录1.只申请一次内存,避免多次递归调用时反复的申请和释放内存,提高程序运行效率2.不申请内存,在原数组上直接排序优化比较总结对链接中快速排序进行代码优化 https://blog.csdn.net/qq_21201267/article/details/80993672#t6 1.只申请…

在深度学习顶会ICLR 2020上,Transformer模型有什么新进展?

一只小狐狸带你解锁炼丹术&NLP秘籍大数据文摘出品来源:medium编译:一一、AndyICLR是机器学习社群最喜爱的会议平台之一。如今,机器学习领域的会议已成为预印本里论文质量的标志和焦点。但即使这样,论文的发表数量还是越来越庞…

领域应用 | 人工智能+知识图谱:如何规整海量金融大数据?

本文转载自公众号:恒生技术之眼。21世纪以来,人类社会信息资源的开发范围持续扩大,经济、社会信息随着经济活动加剧得到空前的开发,信息资源总量呈爆炸式增长,我们从最初的“信息匮乏”一步踏入到“信息过量”时代。个…

神经网络不应视为模型,推理过程当为机器学习问题一等公民

首发于论智关注专栏写文章神经网络不应视为模型,推理过程当为机器学习问题一等公民编者按:Microsoft Semantic Machines资深研究科学家、UC Berkeley计算机科学博士Jacob Andreas指出,神经网络不应视为模型,因为神经网络的模型和推…

2019最全BAT资深Java面试题答案合集,建议收藏~

马上进入求职招聘高峰,总结了一份BAT(阿里、百度等)资深Java相关的面试题答案合集给到大家。 该板块的各面试章节,后续会持续迭代更新最新一线互联网公司的面试题目,建议收藏该页面,不定期更新查看~ Java…

中国古代诗词文本挖掘项目

PoemMining 项目地址:https://github.com/liuhuanyong/PoemMining Chinese Classic Poem Mining Project including corpus buiding by spyder and content analysis by nlp methods, 基于爬虫与nlp的中国古代诗词文本挖掘项目 项目介绍 中国古代诗词文化无疑是…

推荐系统的价值观

一只小狐狸带你解锁炼丹术&NLP秘籍 前言 推荐系统作为满足人类不确定性需求的一种有效工具,是具有极大价值的,这种价值既体现在提升用户体验上,又体现在获取商业利润上。对绝大多数公司来说,提升用户体验的最终目标也是为了获…

POJ1003/1004/1005/1207/3299/2159/1083/3094/2388解题(刷一波水题)

POJ 1003 题目链接 http://poj.org/problem?id1003 大意&#xff1a;长度1/21/3…1/n&#xff0c;给定长度值&#xff0c;求n #include<iostream> using namespace std; int main() {float len 0,sum;int n;while(cin >> len && len ! 0){for(n2,sum0;s…

论文浅尝 | 远程监督关系抽取的生成式对抗训练

动机远程监督关系抽取方法虽然可以使用知识库对齐文本的方法得到大量标注数据&#xff0c;但是其中噪声太多&#xff0c;影响模型的训练效果。基于 bag 建模比基于句子建模能够减少噪声的影响&#xff0c;但是仍然无法克服 bag 全部是错误标注的情形。为了换机噪声标注&#xf…

谷歌最强NLP模型BERT官方代码来了!GitHub一天3000星

新智元报道 来源&#xff1a;GitHub 作者&#xff1a;Google Research 编辑&#xff1a;肖琴 【新智元导读】谷歌AI团队终于开源了最强NLP模型BERT的代码和预训练模型。从论文发布以来&#xff0c;BERT在NLP业内引起巨大反响&#xff0c;被认为开启了NLP的新时代。 BERT的官方…

Java经典基础与高级面试36题和答案

在Java面试的首轮&#xff0c;经常会问很多关于Java面试基础以及高级的问题&#xff0c;今天收集相关Java面试36题和答案分享出来。 1.”static”关键字是什么意思&#xff1f;Java中是否可以覆盖&#xff08;override&#xff09;一个private或者是static的方法&#xff1f; …

论文浅尝 | 问题生成(QG)与答案生成(QA)的结合

本文转载自公众号&#xff1a;徐阿衡。梳理一下 MSRA 3 篇关于 QG 的 paper&#xff1a;Two-Stage Synthesis Networks for Transfer Learning in Machine ComprehensionQuestion Answering and Question Generation as Dual TasksA Joint Model for Question Answering and Qu…

卖萌屋算法岗面试手册上线!通往面试自由之路

一只小狐狸带你解锁 炼丹术&NLP 秘籍作为算法工程师&#xff0c;基础知识的重要性自然不必多说。虽然在有些项目中比较难感受到基础的作用&#xff0c;但扎实的coding能力&#xff0c;对算法本质和适用情况的理解&#xff0c;始终是决定工作效率与未来发展的重要feature。这…

2019头条抖音Java 3面真题,含面试题答案!

一面&#xff1a; hashmap&#xff0c;怎么扩容&#xff0c;怎么处理数据冲突&#xff1f;怎么高效率的实现数据迁移&#xff1f; Linux的共享内存如何实现&#xff0c;大概说了一下。 socket网络编程&#xff0c;说一下TCP的三次握手和四次挥手 同步IO和异步IO的区别&#…

深入理解XGBoost

本文的主要内容概览&#xff1a;1 XGBoost简介XGBoost的全称是eXtreme Gradient Boosting&#xff0c;它是经过优化的分布式梯度提升库&#xff0c;旨在高效、灵活且可移植。XGBoost是大规模并行boosting tree的工具&#xff0c;它是目前最快最好的开源 boosting tree工具包&am…

会议 | ESWC2018 见闻

本文转载自公众号&#xff1a;南大Websoft 。 ESWC2018于2018年6月2日在希腊克里特岛上的伊拉克利翁举行。会议包括两天的前会(workshops, tutorials) 和三天的正会&#xff0c;参会人数约300人。KeynotesKeynote1: Structural S…

POJ 1804 逆序数 解题(归并排序)

文章目录解法1&#xff1a;直接双重循环求解&#xff0c;n*n复杂度解法2&#xff1a;采用归并排序求解&#xff0c;复杂度nlgn题目链接 http://poj.org/problem?id1804题目大意&#xff1a;让一串无序数&#xff0c;在只能相邻数字交换的前提下&#xff0c;最短的次数变成有序…