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

2020 年 4 月 6 日 DataFunTalk

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

目前支持的算法

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

背景

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

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

之前在读研期间出于个人兴趣开发过一个基于深度学习的点击率预测算法库DeepCTR:

https://github.com/shenweichen/DeepCTR

随着时间的迭代得到了一些同学的支持和认可,自己也亲身使用到了里面的算法应用到了自己的业务当中并取得了显著的收益。

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

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

安装和使用

  • 通过pip安装

pip install -U deepmatch

  • 文档

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

  • 使用例子

这篇文章是基于v0.1.0写的,如果以后版本升级了发现运行不了,可以选择回退到v0.1.0版本,或者去git仓库里examples目录下运行最新的代码。

https://github.com/shenweichen/DeepMatch

下面以大家比较熟悉的YoutubeDNN为例子,给大家介绍如何使用deepmatch进行召回模型的训练,用户和物品向量的导出,以及使用faiss进行近似最近邻搜索。其他算法的接口和任务流程基本一样~

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

完整代码见链接:

https://github.com/shenweichen/DeepMatch/blob/master/examples/run_youtubednn_sampledsoftmax.py

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 Model

from 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]) + 1
    feature_max_idx[feature] = data[feature].max() + 1

user_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 = 16

user_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=(6416))
# 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 = None
        recall_score = recall_N(test_true_label[uid], pred, N=50)
        s.append(recall_score)
        if test_true_label[uid] in pred:
            hit += 1
    except:
        print(i)
print("recall", np.mean(s))
print("hr", hit / len(test_user_model_input['user_id']))

贡献者

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

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

    • 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

最后

这个项目其实从立项到第一次发布拖了比较长的时间,一方面是大家主要还是工作的同学居多,可能更多的是利用周末的时间进行开发,响应时间会比较长。另一方面,我在开始的时候其实也不知道要做什么样子,也是摸着石头过河,各种接口中途改了很多次,核心还是希望用户在使用的时候不会感到困惑也能够方便大家的理解。

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

项目地址:

https://github.com/shenweichen/DeepMatch

点击文末阅读原文直达~~

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

职位内推

下面为作者所在部门打下招聘广告:

阿里巴巴淘系技术部商业机器智能部招算法:推荐,搜索,NLP以及数据挖掘和数据分析,实习和社招均可~欢迎各路大佬加入!

简历请发:

weichen.swc@alibaba-inc.com

今天的分享就到这里,谢谢大家。

如果您喜欢本文,欢迎点击右上角,把文章分享到朋友圈~~

迎加入DataFunTalk 机器学习技术交流群,跟同行零距离交流。如想进群,请加逃课儿同学的微信(微信号:DataFunTalker),回复:机器学习,逃课儿会自动拉你进群。

——END——


文章推荐:
搜索中的深度匹配模型
Query 理解和语义召回在知乎搜索中的应用
推荐系统技术演进趋势:召回->排序->重排
关于我们:
DataFunTalk专注于大数据、人工智能技术应用分享与交流。发起于2017.12,至今已在全国7个数据智能企业和人才聚集的城市( 北京、上海、深圳、杭州等)举办超过100场线下技术分享和数场千人规模的行业论坛及峰会,邀请300余位工业界专家和50位知名学者参与分享,30000+从业者参与线下交流。合作企业包括BATTMDJ等知名互联网公司和数据智能方向的独角兽公司,旗下DataFunTalk公众号共生产原创文章300+,百万+阅读,5万+精准粉丝。
注:左侧关注"社区小助手"加入各种技术交流群,右侧关注"DataFunTalk"公众号最新干货文章不错过👇👇


一个在看,一段时光👇
登录查看更多
2

相关内容

ACM/IEEE第23届模型驱动工程语言和系统国际会议,是模型驱动软件和系统工程的首要会议系列,由ACM-SIGSOFT和IEEE-TCSE支持组织。自1998年以来,模型涵盖了建模的各个方面,从语言和方法到工具和应用程序。模特的参加者来自不同的背景,包括研究人员、学者、工程师和工业专业人士。MODELS 2019是一个论坛,参与者可以围绕建模和模型驱动的软件和系统交流前沿研究成果和创新实践经验。今年的版本将为建模社区提供进一步推进建模基础的机会,并在网络物理系统、嵌入式系统、社会技术系统、云计算、大数据、机器学习、安全、开源等新兴领域提出建模的创新应用以及可持续性。 官网链接:http://www.modelsconference.org/
近期必读的6篇顶会WWW2020【推荐系统】相关论文-Part3
专知会员服务
57+阅读 · 2020年4月14日
【CVPR2020-CMU】无数据模型选择,一种深度框架潜力
专知会员服务
22+阅读 · 2020年4月12日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
35+阅读 · 2020年4月5日
近期必读的6篇AI顶会WWW2020【推荐系统】相关论文
专知会员服务
56+阅读 · 2020年2月25日
【推荐系统/计算广告/机器学习/CTR预估资料汇总】
专知会员服务
87+阅读 · 2019年10月21日
可解释推荐:综述与新视角
专知会员服务
111+阅读 · 2019年10月13日
【LinkedIn报告】深度自然语言处理的搜索系统,211页pdf
专知会员服务
106+阅读 · 2019年6月21日
腾讯推荐引擎组员工:谈谈推荐系统架构
腾讯大讲堂
14+阅读 · 2019年10月23日
推荐系统(一):推荐系统基础
菜鸟的机器学习
25+阅读 · 2019年9月2日
推荐系统产品与算法概述 | 深度
AI100
11+阅读 · 2019年6月13日
深度 | 推荐系统评估
AI100
24+阅读 · 2019年3月16日
【推荐系统】详解基于内容的推荐算法
产业智能官
23+阅读 · 2018年1月11日
深度学习时代的推荐系统
大数据技术
8+阅读 · 2018年1月6日
Music Transformer
Arxiv
5+阅读 · 2018年12月12日
Arxiv
3+阅读 · 2018年3月21日
Arxiv
5+阅读 · 2017年11月13日
Arxiv
5+阅读 · 2017年7月23日
VIP会员
相关资讯
腾讯推荐引擎组员工:谈谈推荐系统架构
腾讯大讲堂
14+阅读 · 2019年10月23日
推荐系统(一):推荐系统基础
菜鸟的机器学习
25+阅读 · 2019年9月2日
推荐系统产品与算法概述 | 深度
AI100
11+阅读 · 2019年6月13日
深度 | 推荐系统评估
AI100
24+阅读 · 2019年3月16日
【推荐系统】详解基于内容的推荐算法
产业智能官
23+阅读 · 2018年1月11日
深度学习时代的推荐系统
大数据技术
8+阅读 · 2018年1月6日
Top
微信扫码咨询专知VIP会员