重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
作者简介,王喆,硅谷高级机器学习工程师。
本文转载自知乎专栏
https://zhuanlan.zhihu.com/p/52169807
这里是王喆的机器学习笔记,每隔一到两周我会站在算法工程师的角度讲解一些计算广告、推荐系统相关的文章。选择文章必须满足一下三个条件:
一是工程导向的;
二是阿里、facebook、google等一线互联网公司出品的;
三是前沿或者经典的。
这周我们一起讨论一下Youtube的深度推荐系统论文《Deep Neural Networks for YouTube Recommendations》,这是2016年的论文,按照今天的标准来看,已经没有什么新颖的地方,我也是两年前读过这篇文章之后就放下了,但前几天重读这篇文章,竟让发现了诸多亮点,几乎处处是套路,处处是经验,不由惊为神文。这篇神文给我留下的深刻印象有两点:
这毫无疑问是工业界论文的典范,是我非常推崇的工程导向的,算法工程师必读的文章;
我以为毫不起眼的地方,也藏着Youtube工程师宝贵的工程经验,相比上周介绍的阿里的深度兴趣网络DIN,最重要的价值就在于Attention机制,这篇文章你应该精确到句子来体会,这是我惊为神文的原因。
废话不多说,下面就跟大家分享一下两次拜读这篇论文的不同体验和收获。
第一遍读这篇论文的时候,我想所有人都是冲着算法的架构去的,在深度学习推荐系统已经成为各大公司“基本操作”的今天,Youtube在算法架构上并无惊奇之处,我们来快速介绍一下文章中的深度学习推荐系统的算法架构。
Youtube的用户推荐场景自不必多说,作为全球最大的UGC的视频网站,需要在百万量级的视频规模下进行个性化推荐。由于候选视频集合过大,考虑online系统延迟问题,不宜用复杂网络直接进行推荐,所以Youtube采取了两层深度网络完成整个推荐过程:
第一层是Candidate Generation Model完成候选视频的快速筛选,这一步候选视频集合由百万降低到了百的量级。
第二层是用Ranking Model完成几百个候选视频的精排
首先介绍candidate generation模型的架构
Youtube Candidate Generation Model
我们自底而上看这个网络,最底层的输入是用户观看过的video的embedding向量,以及搜索词的embedding向量。至于这个embedding向量是怎么生成的,作者的原话是这样的
Inspired by continuous bag of words language models, we learn high dimensional embeddings for each video in a xed vocabulary and feed these embeddings into a feedforward neural network
所以作者是先用word2vec方法对video和search token做了embedding之后再作为输入的,这也是做embedding的“基本操作”,不用过多介绍;当然,除此之外另一种大家应该也比较熟悉,就是通过加一个embedding层跟上面的DNN一起训练,两种方法孰优孰劣,有什么适用场合,大家可以讨论一下。
特征向量里面还包括了用户的地理位置的embedding,年龄,性别等。然后把所有这些特征concatenate起来,喂给上层的ReLU神经网络。
三层神经网络过后,我们看到了softmax函数。这里Youtube的同学们把这个问题看作为用户推荐next watch的问题,所以输出应该是一个在所有candidate video上的概率分布,自然是一个多分类问题。
好了,这一套深度学习的“基本操作”下来,就构成了Youtube的candidate generation网络,看似平淡无奇,其实还是隐藏着一些问题的,比如
架构图的左上角,为什么在online serving的时候不直接用这套网络进行预测而要使用nearest neighbor search 的方法?
多分类问题中,Youtube的candidate video有百万之巨,意味着有几百万个分类,这必然会影响训练效果和速度,如何改进?
这些问题在读第一遍的时候我也没有深想深看,但却是工程实现中必然会遇到的问题,我们随后再深入介绍论文中的解决方法。
既然得到了几百个候选集合,下一步就是利用ranking模型进行精排序,下面是ranking深度学习网络的架构图。
Youtube Ranking Model
乍一看上面的ranking model似乎与candidate generation模型没有什么区别,模型架构还是深度学习的“基本操作”,唯一的区别就是特征工程,那么我们就讲讲特征工程。
事实上原文也明确说明了,引入另一套DNN作为ranking model的目的就是引入更多描述视频、用户以及二者之间关系的特征,达到对候选视频集合准确排序的目的。
During ranking, we have access to many more features describing the video and the user's relationship to the video because only a few hundred videos are being scored rather than the millions scored in candidate generation.
具体一点,从左至右的特征依次是
impression video ID embedding: 当前要计算的video的embedding
watched video IDs average embedding: 用户观看过的最后N个视频embedding的average pooling
language embedding: 用户语言的embedding和当前视频语言的embedding
time since last watch: 自上次观看同channel视频的时间
#previous impressions: 该视频已经被曝光给该用户的次数
上面五个特征中,我想重点谈谈第4个和第5个。因为这两个很好的引入了对用户行为的观察。
第4个特征背后的思想是
We observe that the most important signals are those that describe a user's previous interaction with the item itself and other similar items.
有一些引入attention的意思,这里是用了time since last watch这个特征来反应用户看同类视频的间隔时间。从用户的角度想一想,假如我们刚看过“DOTA经典回顾”这个channel的视频,我们很大概率是会继续看这个channel的视频的,那么该特征就很好的捕捉到了这一用户行为。
第5个特征#previous impressions则一定程度上引入了exploration的思想,避免同一个视频持续对同一用户进行无效曝光。尽量增加用户没看过的新视频的曝光可能性。
至此,我的第一遍论文阅读就结束了,对Youtube的算法框架有了概念,但总觉得不过如此,没什么太多新颖的地方。。
但如果真这么想,还是太naive了,与上一篇阿里的深度兴趣网络DIN不同的是,你读懂了DIN的attention机制,你就抓住了其论文70%的价值,但这篇文章,如果你只读懂了Youtube的推荐系统架构,你只抓住了30%的价值。那么剩下的70%的价值在哪里呢?
在重读这篇文章的时候,我从一个工程师的角度,始终绷着“如何实现”这根弦,发现这篇论文的工程价值之前被我大大忽略了。下面我列出十个文中解决的非常有价值的问题:
- 文中把推荐问题转换成多分类问题,在next watch的场景下,每一个备选video都会是一个分类,因此总共的分类有数百万之巨,这在使用softmax训练时无疑是低效的,这个问题Youtube是如何解决的?
- 在candidate generation model的serving过程中,Youtube为什么不直接采用训练时的model进行预测,而是采用了一种最近邻搜索的方法?
- Youtube的用户对新视频有偏好,那么在模型构建的过程中如何引入这个feature?
- 在对训练集的预处理过程中,Youtube没有采用原始的用户日志,而是对每个用户提取等数量的训练样本,这是为什么?
- Youtube为什么不采取类似RNN的Sequence model,而是完全摒弃了用户观看历史的时序特征,把用户最近的浏览历史等同看待,这不会损失有效信息吗?
- 在处理测试集的时候,Youtube为什么不采用经典的随机留一法(random holdout),而是一定要把用户最近的一次观看行为作为测试集?
- 在确定优化目标的时候,Youtube为什么不采用经典的CTR,或者播放率(Play Rate),而是采用了每次曝光预期播放时间(expected watch time per impression)作为优化目标?
- 在进行video embedding的时候,为什么要直接把大量长尾的video直接用0向量代替?
- 针对某些特征,比如#previous impressions,为什么要进行开方和平方处理后,当作三个特征输入模型?
- 为什么ranking model不采用经典的logistic regression当作输出层,而是采用了weighted logistic regression?
因为我也是在视频推荐领域工作,所以可以很负责任的说以上的十个问题都是非常有价值的。但今天一口气写到这里,感觉有点气力不足了。。大家如果感兴趣的话可以点个赞,我明天再详细分析一下以上十大问题的答案。
上面问题的解答已经完成啦,大家请参考我的下一篇文章——
好了,这里是王喆的机器学习笔记的第二篇文章,水平有限,欢迎大家吐槽,批评,纠错。
参考资料:
- Deep Neural Networks for YouTube Recommendation
- Recommender System Paper List
- 推荐系统中的注意力机制——阿里深度兴趣网络(DIN)
相关文章:

Struts的select两种遍历方法
转载于:https://blog.51cto.com/9695005/2050390

nginx http 服务器搭建
下载nginx源码:http://nginx.org/en/download.html 安装: wget http://nginx.org/download/nginx-1.9.3.tar.gz cd nginx-1.9.3 ./configure --prefix/usr/local/nginx发现一个问题: checking for PCRE library ... not found checking for P…

加速电子化报销费控服务,易快报完成1500万美元B轮融资
2019年1月21日,报销费控领头羊品牌——易快报对外宣布完成1500万美元B轮系列融资,本轮融资由美元基金曼图资本领投,DCM、明势、银杏谷等投资机构跟投,冲盈资本为本轮独家财务顾问。国内报销费控SaaS行业是个潜力巨大的增量市场&am…

[转]C# 2.0新特性与C# 3.5新特性
C# 2.0新特性与C# 3.5新特性 一、C# 2.0 新特性: 1、泛型List<MyObject> obj_listnew List();obj_list.Add(new MyObject()); 2、部分类(partial)namespace xxx{public partial class Class1{private string _s1;public string S1{get { return _s1; }set { _…

你需要了解的load和initialize
NSObject类有两种初始化方式load和initialize load (void)load; 复制代码对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次。 iOS会在应用程序启动的时候调用load方法,在main函数之前调用 执行子类的load方法前,会…

iOS11、iPhone X、Xcode9 适配指南
2017.09.23 不断完善中。。。 2017.10.02 新增 iPhone X 适配官方中文文档 更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类: 单纯升级iOS11后造成的变化;Xcode9 打包后造成的变化;iPhoneX的适配一、…

Grape和Sinatra结合使用
Grape && Sinatra Grape(https://github.com/intridea/grape) is a REST-like API micro-framework for Ruby Sinatra(http://www.sinatrarb.com/intro.html) is a DSL for quickly creating web applications in Ruby 可见,Grape适合构建纯Api系统…

公告三大“罪状”,无人驾驶公司Roadstar联合创始人被罢免
(从左至右依次是为周光、佟显乔、衡量) 整理 | Jane 出品 | AI科技大本营 1 月 21 日,因技术造假等违规行为,国内自动驾驶创业公司 Roadstar (深圳星行科技有限公司)官方宣布,罢免联合创始人周…

大雁悲歌,月哭泣
??时间,毫无感情的把这段故事剪成了碎片……??――题记????一??眺望天边那抹残红,心瞬间间抖落成一滴血。??无法愈合的伤口,夜夜繁衍着孤寂。爱,颈椎痛 ,这个烂熟于胸的字,有时真是扎心般刺眼,…

写高质量的代码,永不言晚!
作者 | Nitesh sharma 译者 | 弯月责编 | 郭芮出转载自 CSDN(ID:CSDNnews) 以下为译文: 在如今这个时代,每个人都在努力提升资源能力。在Web应用程序方面,我们有Spring、Play和Struts等框架,这…

ios searchBar 的代理方法 集合
下面是搜索框控件的一些代理方法: - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar;将要开始编辑时的回调,返回为NO,则不能编辑- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;已经开始编辑时的回调- (BOOL)…

双绞线接法详解
一直以来很多人(包括作者)都认为10 base-t 10m网络使用了网线中8条信号线之4条,而100 base-t 100m则使用了全部8条信号线(要不怎么那么快呢?)。可是作者前不久在使用一条按所谓10m直连接法(1与3…

step by step YAML 复用
yaml文件适合用来描述软件测试过程的步骤。当不同类型的CI过程集中在一个yaml文件时,首先碰到的一个问题是:大量重复的步骤如何进行复用? 举个例子: stage1:run_it:exec:- A- B- C- D1stage2:run_it:exec:- A- B- C- D2显然&#…

在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)
最近一个项目要用到从listview向treeview拖动item,达到从外部拖动图标成为树形结构的一部分,通过查阅资料总结了一些实现方式,分享给大家。这是winform中的例子。 在进行拖放操作之前,必须要对进行拖放操作的组件的"AllowDro…

node 模块化 require expores,简易实现原理。
为了更好的理解 Node.js 的 require 实现机制,我实现了一个简易的版本。我们node index.js的时候就是require(./index.js),话不多说我们直接上代码: 目录index.jsa.jsb.jsc.jsindex.js use strictfunction $require(filepath) {const fs req…

100+Python编程题给你练~(附答案)
整理 | Just 出品 | Python大本营 春节马上就要到了,怎么能让自己在假期里不掉队?今天,营长给大家准备一个项目: 100 编程练习,这些题如果能坚持每天至少完成一道,一定可以帮大家轻松 get Python 的编程技…

为了一窥国足输韩国之后人们的评论,我爬了懂球帝App
【导语】2019亚洲杯决赛正如火如荼进行中,国足的晋级之路可谓用“惊现”二字评论。继1月16日,国足对战韩国队败北后,一名Python学习者为了一窥网友们的评论,特意爬了懂球帝App的数据。最新喜讯是在20日国足对战泰国的比赛中&#…

Mac下mysql服务器安装
Mac下mysql服务器安装 下载mysql 进入http://dev.mysql.com/downloads/mysql/ 下载Mac OS X 10.9 (x86, 64-bit), Compressed TAR Archive 安装 tar -zxvf mysql-5.6.25-osx10.9-x86_64.tar.gz mv mysql-5.6.25-osx10.9-x86_64 mysql cd mysql sudo scripts/mysql_install_db -…

linux查找文件
find . | grep xyz 将当前目录下(包括子目录)的文件名中含有xyz的文件过滤出来 find . | xargs grep xyz 将当前目录下(包括子目录)的文件内容中含有xyz的行过滤出来 转载于:https://www.cnblogs.com/anovana/p/8036032.html

Grape Api 笔记
关键字:namespace aliases:group,resources,resources,segment define route parameter: 1. namespace :id 2. param_route :id 关键字before 每次api请求前均执行一次 关键字helpers 1. 定义module,通过…

第一个spring boot应用
前提 首先要确保已经安装了java和maven: $ java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) $ mvn -v Apache Maven 3.3.9 (bb52d850…

【转载】xp自动校时
招式一. 自由设定XP时间同步间隔 而对于Windows 2000和XP,由于自身已经集成了自动对时功能,就不用像Win98那样麻烦地安装第三方软件了。但系统默认的时间同步间隔只是7天,我们无法自由选择,使得这个功能在灵活性方面大打折扣。其实…

发改委:互联网企业没有出现大规模裁员现象
1 月 22 日,据中国网报道,国家发改委就宏观经济运行情况举行发布会,新闻发言人孟玮就近期互联网行业裁员情况以及就业保障问题予以回应。 孟玮表示,近期国家发改委通过多种方式进行了调研,包括到有关企业进行座谈&…

php操作mysql的常用语句(大全)
SQL分类:DDL—数据定义语言(Create,Alter,Drop,DECLARE)DML—数据操纵语言(Select,Delete,Update,Insert)DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)p…
ElasticSearch + xpack 使用
ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应。我们为什么要选择 ElasticSearch ?因为它是一个准实时的搜索工具,在一般情况下延时少于一秒&…

java coverage exclude使用
使用cobertura:http://mojo.codehaus.org/cobertura-maven-plugin/usage.html 若想要忽略一部分代码,可以通过exclude来指定: <configuration> <instrumentation><excludes><exclude>com/alibaba/ws/gcenter/web/**/…

人工智障?243个机器人被裁
图片源自 Henn-na 官网作者 | 若名出品 | AI科技大本营(ID: rgznai100)全球经济降温,企业裁员消息不断,如果你不能带来显著效益,则很有可能被淘汰,即使是机器人,也难逃被裁的命运。“我们酒店的…

Silverlight C# 游戏开发:Silverlight开发环境
Silverlight C# 游戏开发:Silverlight开发环境 所谓工欲善其事必先利其器,没有好的工具也没有办法做事,我以前曾经想学习C以外的程序语言,当时有java和C#来选择,当时考虑java比较受推崇,可能会比较好一些&a…

算法工程师必须要知道的面试技能雷达图
本文作者王喆,硅谷高级机器学习工程师。转载自知乎专栏:https://zhuanlan.zhihu.com/p/52169807这里是 王喆的机器学习笔记 的第五篇文章,今天我们不聊paper,换一个轻松一点的话题,聊一聊如何准备算法工程师的面试。今…

Qt中文手册 之 QHeaderView
一、 头文件:#include<QHeaderView> 继承自:QAbstractItemView 二、属性 1、cascadingSectionResizes : bool 如果下一区域已经达到最小,是否继续改变下下一个区域的大小。 前提条件是:设置setResizeMode()为interactive 默认是false 相关函数: bool cascadingS…