阿里最新论文解读:考虑时空域影响的点击率预估模型DSTN
作者 | 石晓文
转载自小小挖掘机(ID: wAIsjwj)
【导语】:在本文中,阿里的算法人员同时考虑空间域信息和时间域信息,来进行广告的点击率预估。
什么是时空域?我们可以分解为空间域(spatial domain)和时间域(temporal domain)。空间域的意思即是说,在一屏的推荐中,内容是相互关联的,当推荐了第一条广告之后,第一条广告会对第二条广告的点击率产生影响,从而影响第二条推荐的广告。时间域的意思即是说,用户之前的点击或未点击的广告会影响当次的推荐。
本文介绍的论文题目为是《Deep Spatio-Temporal Neural Networks for Click-Through Rate Prediction》,论文的下载地址为:https://arxiv.org/abs/1906.03776
1、背景
CTR预估问题在广告领域十分重要,吸引了工业界和学术界学者的研究。之前我们也介绍过许多比较成功的方法,如LR、FM、Wide&Deep、DeepFM等。
但上述的方法,存在一个共同的问题,即当我们要预估对一个广告的点击概率时,只考虑该广告的信息,而忽略了其他广告可能带来的影响。如用户历史点击或者曝光未点击的广告、当前上下文已经推荐过的广告等。因此,将这些广告作为辅助信息,加入到模型中,也许可以提升CTR预估的准确性。
总结一下,辅助广告总共有三种类型:上下文广告、用户点击过的广告、用户未点击的广告,如下图所示:
这里还是想强调一下上下文广告这个概念,之前的模型可能一次计算所有广告的点击率,然后按点击率进行排序,取top-K进行展示。但这里我们把一次推荐K个广告过程看作K个单次推荐的过程集合。先推荐第一个位置的广告,再推荐第二个位置的广告,,依次类推。在推荐第三个广告时,推荐的第一个广告和第二个广告便是我们这里所说的上下文广告。
为了将这些信息加入到模型中,必须要注意以下几点:
1)每种类型的辅助广告数量可能相差很多,模型必须适应这些所有可能的情况。
2)辅助的广告信息可能与目标广告是不相关的,因此,模型需要具备提取有效信息,而过滤无用信息的能力。举例来说,用户点击过的广告可能有咖啡广告、服装广告和汽车广告,当目标广告是咖啡相关的广告时,过往点击中咖啡相关的广告可能是起比较大作用的信息。
3)不同类型的辅助广告信息,有时候起到的作用可能是不同的,模型需要能够有能力对此进行判别。
总的来说,就是模型需要有能力有效处理和融合各方面的信息。
本文提出了DSTN(Deep Spatio-Temporal neural Networks)模型来处理和融合各种辅助广告信息,下一节,咱们就来介绍一下模型的结构。
2、模型架构
这里讲了三种不同的DSTN的架构,分别是DSTN - Pooling Model、DSTN - Self-Attention Model和DSTN - Interactive Attention Model。但这三种模型的Embedding部分是同样的,所以咱们先讲Embedding层,再分别介绍几种模型的结构。
2.1 Embedding Layer
Embedding Layer的结构如下:
可以看到,输入有四部分信息,分别是目标广告的信息、上下文广告信息、点击广告信息、曝光未点击广告信息。目标广告信息包括用户特征、query特征(如果是搜索场景的话)、目标广告特征;上下文广告信息包括上下文广告特征;用户点击过和未点击过的广告信息包括广告特征以及对应的query特征。
这些特征可以归为三类:
单值离散特征:如用户ID、广告ID等,这类特征直接转换为对应的Embedding。
多值离散特征:如广告的标题,经过分词之后会包含多个词,每个词在转换为对应的Embedding之后,再经过sum pooling的方式转换为单个向量。
连续特征:对于连续特征如年龄,这里会进行分桶操作转换为离散值,然后再转换为对应的Embedding。
不同的特征转换成对应的Embedding之后,进行拼接操作,如目标广告信息中,会将用户ID、用户年龄、广告ID、广告名称等等对应的Embedding进行拼接;上下文广告信息中的每一个广告,会将广告ID和广告名称对应的Embedding进行拼接等等。
最终,对目标广告信息会得到一个t维的vector,计作xt;对于上下文广告信息,我们会得到nc个c维的vector,每一个计作xci;对于点击广告序列,我们会得到nl个l维的vector,每一个计作xlj;对于未点击序列,会得到nu个u维的vector,每个计作xuq。
介绍完了Embedding,接下来介绍几种不同的上层结构。
2.2 DSTN - Pooling Model
第一种结构称为DSTN - Pooling Model,其模型结构如下:
这种方式就是对上下文广告序列、点击广告序列和未点击广告序列中的vector进行简单的sum-pooling,转换为一个vector:
然后各部分进行拼接,经过全连接神经网络之后,在输出层经过一个sigmoid转换为点击的概率:
损失函数的话选择logloss:
这种方式,实现比较简单,但是存在一定的缺点,当对应一个广告位置,有多个候选目标广告时,只有目标广告信息xt发生变化,其他信息都没有发生变化,这说明我们添加的辅助广告信息仅仅是一个静态信息。同时,由于使用了sum-pooling的方式,一些有用的信息可能会被噪声所覆盖。举例来说,如果目标广告是咖啡相关的, 点击序列中有一个咖啡相关的广告,有10个服饰相关的广告,那么这个咖啡相关广告的信息很容易被忽略。
2.3 DSTN - Self-Attention Model
对于sum-pooling带来的缺陷,文中提出了第二种结构,称为DSTN - Self-Attention Model,这里的Self-Attention是针对每一种特定的辅助广告信息的,也就是说,上下文广告之间进行Self-Attention,点击广告序列之间进行Self-Attention等等。
如果是上下文广告之间进行Self-Attention,其最终输出为:
通过公式可以看出,这里并不是我们所熟知的Transformer里面的self-attention,第一次看也没注意,第二次细看才发现,所以有时候尽管名字一样,但内容也许千差万别。
这里的self-attention的含义是,将每一个广告对应的embedding vector输入到一个f中,得到一个标量输出βci,这里的f可以是一个多层全连接神经网络。然后通过softmax归一化到0-1之间,得到每一个广告的权重aci,随后基于权重进行加权求和。
使用self-attention的好处是可以对序列中的不同广告赋予不同的权重,能够在一定程度上解决sum-pooling的问题,但其仍然存在一定的缺陷。首先,self-attention中计算的权重,没有考虑target ad的信息,也就是说,针对不同的target ad,其attention权重保持不变。其次,归一化后的权重aci,其求和是等于1的,这样,当所有的广告都与目标广告关系不大时,部分广告的权重由于归一化也会变得很大。最后,每种类型的辅助广告的数量也是会产生影响的,但由于对权重进行了归一化,这个信息相当于也丢失了。
2.4 DSTN - Interactive Attention Model
因此,再针对上面的不足,提出了DSTN - Interactive Attention Model。其模型结构如下:
相对于self-attention,这里的权重aci没有经过归一化,其计算过程加入了目标广告的信息,计算公式如下:
这样,针对不同的目标广告,不同类型的辅助广告信息的权重会不断变化,同时权重也没有进行归一化,避免了归一化带来的种种问题。
3、实验结果
论文对比了多种模型的实验结果:
4、模型部署
看论文的时候,比较关心的一点就是模型的性能问题,因为模型中的一部分输入是上下文广告信息,更准确的前面推荐的广告的信息。假设我们有5个广告位需要推荐,比较容易想到的做法过程如下:
1、得到所有的候选广告集,并得到对应的特征,此时的上下文广告信息为空。
2、模型计算所有广告的点击概率。
3、选择点击率最高的一个广告。随后把这个广告加入到上下文广告信息中。
4、对于剩下的广告,再计算所有广告的点击概率。
5、重复第3步和第4步,直到得到5个展示的广告。
我们通过第2步得到了第一个位置的广告,重复执行3和4步4次得到剩下4个位置的广告。
这么做无疑是十分耗时的,线上性能难以保证。因此,文中提到了一种折中的做法,每次从候选集中选择2-3个广告。其示意图如下:
5、总结
感觉本文还是有一定借鉴意义的,最主要的是在推荐过程中考虑推荐结果之间的相互关系,这么做的话个人感觉可以消除点击率预估中的坑位偏置。因为如果上下文信息有两个广告的话,模型会感知到这是对第三个坑位的广告进行推荐。同时上下文信息的加入,在一定程度上也能提升推荐结果的多样性,避免太多同质信息推荐出来。
(*本文为 AI科技大本营转载文章,转载请联系原作者)
◆
精彩推荐
◆
“只讲技术,拒绝空谈!”2019 AI开发者大会将于9月6日-7日在北京举行,这一届AI开发者大会有哪些亮点?一线公司的大牛们都在关注什么?AI行业的风向是什么?2019 AI开发者大会,倾听大牛分享,聚焦技术实践,和万千开发者共成长。
目前,大会盲订票限量发售中~扫码购票,领先一步!
推荐阅读
腾讯拥抱开源:首次公布开源路线图,技术研发向共享、复用和开源迈进
干货 | 20个教程,掌握时间序列的特征分析(附代码)
长点心吧年轻人,利率不是这么算的!我用Python告诉你亏了多少!
一文看懂数据清洗:缺失值、异常值和重复值的处理
Libra 骗局来了! 受害者会是你吗?
那个裸辞的程序员,后来怎么样了?
FreeWheel是一家怎样的公司?| 人物志
Mac 被曝存在恶意漏洞:黑客可随意调动摄像头,波及四百万用户!
文末送书啦!| Device Mapper,那些你不知道的Docker核心技术

相关文章:

windows7 64位机上配置MinGW+Codeblocks+ wxWidgets
在Windows7 64位机子上安装配置MinGWCodeblockswxWidgets步骤如下: 1、 下载mingw-get-inst-20111118:http://sourceforge.net/projects/mingw/; 2、 双击mingw-get-inst-20111118.exe,一般按默认即可,选择自己需要…

jQuery带动画的弹出对话框
在线演示 本地下载

陶哲轩实分析 习题 13.4.6
设 $(X,d)$ 是度量空间,并设 $(E_{\alpha})_{\alpha\in I}$ 是 $X$ 中的一族连通集合.还设 $\bigcap_{\alpha\in I}E_{\alpha}$ 不空.证明 $\bigcup_{\alpha\in I}E_{\alpha}$ 是连通的.证明:由于 $\bigcap_{\alpha\in I}E_{\alpha}$ 是不空的,因此存在 $p\in \bigcap_{\alpha\…

一年参加一次就够,全新升级的AI开发者大会议程出炉!
“只讲技术,拒绝空谈”的AI开发者大会再次来临!2018 年的AI开发者大会,作为年度人工智能领域面向专业开发者的一次高规格技术盛会,上千名开发者与上百名技术专家齐聚一堂,大会以“AI技术与应用”为核心,就人…

Windows7下配置MinGW+CodeBlocks+OpenCV2.3.1
1、下载mingw-get-inst-20111118:http://sourceforge.net/projects/mingw/; 2、双击mingw-get-inst-20111118.exe,一般按默认即可,选择自己需要的组件; 3、添加MinGW环境变量:选择计算机-->点击右键--…

Spark SQL基本操作以及函数的使用
2019独角兽企业重金招聘Python工程师标准>>> 引语: 本篇博客主要介绍了Spark SQL中的filter过滤数据、去重、集合等基本操作,以及一些常用日期函数,随机函数,字符串操作等函数的使用,并列编写了示例代码&am…

OpenCV提取轮廓(去掉面积小的轮廓)
转自:http://www.kaixuela.net/?p23 #include <stdio.h> #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> using namespace std; #pragma comment(lib,"cv.lib") #pra…

软工作业 5:词频统计——增强功能
一、基本信息 1.1 编译环境、项目名称、作者 1 #编译环境:python3.6 2 #项目名称:软工作业5-词频统计—增强功能 3 #作者:1613072055 潘博 4 # 1613072056 侯磊 1.2项目地址 本次作业地址: https://www.cnblogs.com/panboo/项目git地址: https://g…

Linux之文件权限管理
chmod ux转载于:https://www.cnblogs.com/chaoren399/archive/2013/03/11/2953727.html

如果三十年前有这些AI技术,可可西里的悲剧不会发生
作者 | 神经小姐姐来源 | HyperAI超神经(ID:HyperAI)而被盗猎者大量的非法捕杀。多种野生动物都处于濒临灭绝的局面,人工智能等技术,能够在帮助保护野生动物上,发挥比较大的作用,让我们能够生存…

Percona-Server-5.5.30安装
1、安装系统环境 yum install -y gcc gcc-c autoconf automake zlib* libxml* ncurses-devel libmcrypt* libtool-ltdl-devel* cmake bison 2、下载源码包 1 http://www.percona.com/downloads/ 2 3 wget -c http://www.percona.com/redir/downloads/Percona-Server-5.5/Perc…

OpenCV中SVM的使用
转自:http://download.csdn.net/download/gaogaogao124/3125857 略有改动: #include"stdafx.h" #include<opencv2/opencv.hpp> #include<cmath> #include<ctime> using namespace std; int _tmain(int argc,_TCHAR…

数据不够,用GAN来凑!
作者 | CV君来源 | 我爱计算机视觉(ID:aicvml)在计算机视觉领域,深度学习方法已全方位在各个方向获得突破,这从近几年CVPR 的论文即可看出。但这往往需要大量的标注数据,比如最著明的ImageNet数据集&#x…

MySQL的登陆错误:ERROR 1049 (42000): Unknown database 'root'
刚刚装上数据库的时候,直接按照这个格式就登陆上去了,突然莫名其妙登陆不上去了 但是现在突然死活登陆不上去了 于是拿着这个报错信息在网上找啊找,终于找了了错误的原因 -p和密码是连在一起的,赶紧一试,果然可以登陆&…

分布式缓存系统Memcached简介与实践
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵活。此时Memcached或许是你想要的。Memca…

Windows7 libsvm库中grid.py的使用步骤
1、从http://www.csie.ntu.edu.tw/~cjlin/libsvm/下载最新的libsvm-3.12库(libsvm-3.12.tar.gz或libsvm-3.12.zip),将其放到F:\libsvm文件夹下解压缩,生成一个libsvm-3.12文件夹; 2、从http://www.gnuplot.info/下载最新的gnuplot即gp460-wi…

基于GEMM实现的CNN底层算法被改?Google提出全新间接卷积算法
作者 | Marat Dukhan from Google Research译者 | 凯隐责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导读】本文介绍的内容主要聚焦Google 的一项最新工作:改变基于 GEMM 实现的 CNN底层算法提出的新方法。通用矩阵乘法(Gener…

共享内存跨进程通信
通过共享内存通信是最快的,不过既然是共享资源,那么就必须要有同步机制。 创建共享内存有两种方式shm和mmap的方式。 mmap是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射。而对于shm而言,shm每个进程最终会映射…

扶稳!四大步“上手”超参数调优教程,就等你出马了 | 附完整代码
作者 | Matthew Stewart译者 | Monanfei责编 | Jane出品 | AI科技大本营(ID: rgznai100)【导读】在本文中,我们将为大家介绍如何对神经网络的超参数进行优化调整,以便在 Beale 函数上获得更高性能,Beale 函数是评价优化…

读好书,写好程序
本人是做.NET开发的,以企业应用为主,以互联网为爱好,这里给大家推荐一些适合.NET程序员的书: 软件设计《企业应用架构模式》 Martin Fowler 的大作之一,总结了多种常见的企业应用架构模式,这些模式是脱离具…

SIFT特征点匹配中KD-tree与Ransac算法的使用
转自:http://blog.csdn.net/ijuliet/article/details/4471311 Step1:BBF算法,在KD-tree上找KNN。第一步做匹配咯~ 1.什么是KD-tree(fromwiki) K-Dimension tree,实际上是一棵平衡二叉树。 一般的KD-tree构造过程&a…

jQuery带缩略图的宽屏焦点图插件
在线演示 本地下载

追溯XLNet的前世今生:从Transformer到XLNet
作者丨李格映来源 | 转载自CSDN博客导读:2019 年 6 月,CMU 与谷歌大脑提出全新 XLNet,基于 BERT 的优缺点,XLNet 提出一种泛化自回归预训练方法,在 20 个任务上超过了 BERT 的表现,并在 18 个任务上取得了当…

微软MCITP系列课程
http://liushuo890.blog.51cto.com/5167996/d-1转载于:https://blog.51cto.com/showcart/1156172

在Ubuntu11.10中安装配置OpenCV2.3.1和CodeBlocks
1、 打开终端; 2、 执行指令,删除ffmpeg and x264旧版本:sudo apt-get removeffmpeg x264 libx264-dev 3、下载安装x264和ffmpeg所有的依赖:sudo apt-get update sudo apt-get installbuild-essential checkinstall git cmake…

深入浅出Rust Future - Part 1
本文译自Rust futures: an uneducated, short and hopefully not boring tutorial - Part 1,时间:2018-12-02,译者:motecshine, 简介:motecshine 欢迎向Rust中文社区投稿,投稿地址,好文将在以下地方直接展示 Rust中文社区首页Rust…

cmd 修改文件属性
现在的病毒基本都会采用一种方式,就是将病毒文件的属性设置为系统隐藏属性以逃避一般用户的眼睛,而且由于Windows系统的关系,这类文件在图形界面下是不能修改其属性的。但是好在Windows还算做点好事,留下了一个attrib命令可以让我…

Django 视图
Django之视图 目录 一个简单的视图CBV和FBV FBV版:CBV版:给视图加装饰器 使用装饰器装饰FBV使用装饰器装饰CBVrequest对象 请求相关的常用值属性方法Response对象 使用属性JsonResponse对象Django shortcut functions render()redirect()Django的View&am…

喜大普奔!GitHub官方文档推出中文版
原创整理 | Python开发者(ID:PythonCoder)最近程序员交友圈出了一个大新闻,GitHub 帮助文档正式推出中文版了,之前一直都是只有英文文档,看起来费劲不方便。这份中文文当非常详尽,可以说有了它 …

Linux中获取当前程序路径的方法
1、命令行实现:转自:http://www.linuxdiyf.com/viewarticle.php?id84177 #!/bin/sh cur_dir$(pwd) echo $cur_dir 注意:在cur_dir后没空格,后面也不能有空格,不然它会认为空格不是路径而报错 2、程序实现…