小毛驴

Adventure may hurt you, but monotony will kill you.

0%

众所周知,深度学习在计算机视觉、语音识别、自然语言处理等领域最先取得突破并成为主流方法。但是,深度学习为什么是在这些领域而不是其他领域最先成功呢?我想一个原因就是图像、语音、文本数据在空间和时间上具有一定的内在关联性。比如,图像中会有大量的像素与周围的像素比较类似;文本数据中语言会受到语法规则的限制。CNN对于空间特征有很好的学习能力,正如RNN对于时序特征有强大的表示能力一样,因此CNN和RNN在上述领域各领风骚好多年。

在Web-scale的搜索、推荐和广告系统中,特征数据具有高维、稀疏、多类别的特点,一般情况下缺少类图像、语音、文本领域的时空关联性。因此,如何构建合适的网络结构以便在信息检索、推荐系统和计算广告领域取得良好的特征表示能力,进一步提升最终的业务效果成了学术界和工业界共同关注的问题。

本文在跟踪了最近主流的互联网业务中大量使用的排序模型的基础上,总结出了深度CTR、CVR预估模型发展演化的三条主线,跟大家分享。

  1. 第一条主脉络是以FM家族为代表的深度模型,它们的共同特点是自动学习从原始特征交叉组合新的高阶特征。
  2. 第二条主脉络是一类使用attention机制处理时序特征的深度模型,以DIN、DIEN等模型为代表。
  3. 第三条主脉络是以迁移学习、多任务学习为基础的联合训练模型或pre-train机制,以ESMM、DUPN等模型为代表。

其中前两条主脉络虽然出发点不同,但个人认为也有一些共通之处,比如attention机制是不是可以在某种程度上理解为一种特殊形式的组合特征。第三条主脉络属于流程或框架层面的创建。本文的主要目标是理清楚第一条主线中各个经典的深度模型的发展演化脉络,包括它们的优缺点和共通之处。

阅读全文 »

Deep & Cross Network(DCN)在 2017 年由 google 和 Stanford 共同发表的一篇论文中被提出,类似于Wide & Deep Network(WDL),是用负杂网络预估CTR的一种方法。

特征工程一直是许多预测模型成功的关键。许多有效的特征都来自于原始特征的交叉组合。在WDL中,wide侧的交叉组合特征依然需要依靠hand-craft来完成。而DCN能对sparse和dense的输入自动学习特征交叉,可以有效地捕获有限阶(bounded degrees)上的有效特征交叉,无需人工特征工程或暴力搜索(exhaustive searching),并且计算代价较低。

本文在详细介绍Deep & Cross Network网络结构的基础上,给出了高效实现DCN模型的tensorflow代码,主要点出了网络上一些主流实现中常犯的错误,让你真正能够在企业级的生产环境中玩转DCN模型。

阅读全文 »

本文是“基于Tensorflow高阶API构建大规模分布式深度学习模型系列”的第五篇,旨在通过一个完整的案例巩固一下前面几篇文章中提到的各类高阶API的使用方法,同时演示一下用tensorflow高阶API构建一个比较复杂的分布式深度学习模型的完整过程。

文本要实现的深度学习模式是阿里巴巴的算法工程师18年刚发表的论文《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》中提出的ESMM模型,关于该模型的详细介绍可以参考我之前的一篇文章:《CVR预估的新思路:完整空间多任务模型》。

阅读全文 »

特征工程是机器学习流程中重要的一个环节,即使是通常用来做端到端学习的深度学习模型在训练之前也免不了要做一些特征工程相关的工作。Tensorflow平台提供的FeatureColumn API为特征工程提供了强大的支持。

Feature cloumns是原始数据和Estimator模型之间的桥梁,它们被用来把各种形式的原始数据转换为模型能够使用的格式。深度神经网络只能处理数值数据,网络中的每个神经元节点执行一些针对输入数据和网络权重的乘法和加法运算。然而,现实中的有很多非数值的类别数据,比如产品的品牌、类目等,这些数据如果不加转换,神经网络是无法处理的。另一方面,即使是数值数据,在仍给网络进行训练之前有时也需要做一些处理,比如标准化、离散化等。


阅读全文 »

Tensorflow在1.4版本中引入了tf.estimator.train_and_evaluate函数,用来替换老版中Experiment类提供的功能。tf.estimator.train_and_evaluate简化了训练、评估和导出Estimator模型的过程,抽象了模型分布式训练和评估的细节,使得同样的代码在本地与分布式集群上的行为一致。

这意味着使用train_and_evaluate API,我们可以在本地和分布式集群上、不同的设备和硬件上跑同样的代码,而不需要修改代码已适应不同的部署环境。而且训练之后的模型可以很方便地导出以便在打分服务(tensorflow serving)中使用。

本文简要介绍如何自定义Estimator模型并通过使用tf.estimator.train_and_evaluate完成训练和评估。

主要步骤:

  1. 构建自己的Estimator模型
  2. 定义在训练和测试过程中数据如何输入给模型
  3. 定义传递给tf.estimator.train_and_evaluate函数的训练、评估和导出的详述参数(TrainSpec and EvalSpec)
  4. 使用tf.estimator.train_and_evaluate训练并评估模型
阅读全文 »

在TensorFlow 1.3版本之前,读取数据一般有两种方法:

  • 使用placeholder + feed_dict读内存中的数据
  • 使用文件名队列(string_input_producer)与内存队列(reader)读硬盘中的数据

Dataset API同时支持从内存和硬盘的数据读取,相比之前的两种方法在语法上更加简洁易懂。Dataset API可以更方便地与其他高阶API配合,快速搭建网络模型。此外,如果想要用到TensorFlow新出的Eager模式,就必须要使用Dataset API来读取数据。

Dataset可以看作是相同类型“元素”的有序列表。在实际使用时,单个“元素”可以是向量,也可以是字符串、图片,甚至是tuple或者dict。

阅读全文 »

Tensorflow高阶API简介

在tensorflow高阶API(Estimator、Dataset、Layer、FeatureColumn等)问世之前,用tensorflow开发、训练、评估、部署深度学习模型,并没有统一的规范和高效的标准流程。Tensorflow的实践者们基于低阶API开发的代码在可移植性方面可能会遇到各种困难。例如,单机可以运行的模型希望改成能够分布式环境下运行需要对代码做额外的改动,如果在一个异构的环境中训练模型,则还需要额外花精力处理哪些部分跑在CPU上,哪些部分跑在GPU上。当不同的机器有不同数量的GPU数量时,问题更加复杂。

为了能够快速支持新的网络架构的实验测试,深度学习框架都很重视网络架构搭建的灵活性需求,因此能让用户随心所欲地自定义代码实现是很重要的一块功能。

模型构建的灵活性与简洁性需求看似是矛盾的。从开发者的视角,简洁性意味着当模型架构确定时实现不应该需要太多额外的技能要求,不必对深度学习框架有很深刻的洞察,就能够实验不同的模型特性。在内置简洁性属性的框架下开发者能够较轻松地开发出高质量的鲁棒性较好的模型软件,不会一不小心就踩到坑里。另一方面,灵活性意味着开发者能够实现任意的想要的模型结构,这需要框架能够提供一些相对低价的API。类似于Caffe这样的深度学习框架提供了DSL(domain specific language)来描述模型的结构,虽然搭建已知的成熟的模型架构比较方便,但却不能轻松搭建任意想要的模型结构。这就好比用积木搭建房子,如果现在需要一个特殊的以前没有出现过的积木块以便搭建一个特殊的房子,那就无计可施了。

Tensorflow高阶API正是为了同时满足模型构建的灵活性与简洁性需求应运而生的,它能够让开发者快速搭建出高质量的模型,又能够使用结合低阶API实现不受限制的模型结构。

阅读全文 »

在诸如信息检索、推荐系统、在线广告投放系统等工业级的应用中准确预估转化率(post-click conversion rate,CVR)是至关重要的。例如,在电商平台的推荐系统中,最大化场景商品交易总额(GMV)是平台的重要目标之一,而GMV可以拆解为流量×点击率×转化率×客单价,可见转化率是优化目标的重要因子;从用户体验的角度来说准确预估的转换率被用来平衡用户的点击偏好与购买偏好。

阿里妈妈算法团队最近发表了一篇关于CVR预估的论文《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》,提出了一种新颖的CVR预估模型,称之为“完整空间多任务模型”(Entire Space Multi-Task Model,ESMM),下文简称为ESMM模型。ESMM模型创新地利用用户行为序列数据,在完整的样本数据空间同时学习点击率和转化率(post-view clickthrough&conversion rate,CTCVR),解决了传统CVR预估模型难以克服的样本选择偏差(sample selection bias)和训练数据过于稀疏(data sparsity )的问题。

阅读全文 »

推荐系统选择商品展现给用户,并期待用户的正向反馈(点击、成交)。然而推荐系统并不能提前知道用户在观察到商品之后如何反馈,也就是不能提前获得本次推荐的收益,唯一能做的就是不停地尝试,并实时收集反馈以便更新自己试错的策略。目的是使得整个过程损失的收益最小。这一过程就类似与一个赌徒在赌场里玩老虎机赌博。赌徒要去摇老虎机,走进赌场一看,一排老虎机,外表一模一样,但是每个老虎机吐钱的概率可不一样,他不知道每个老虎机吐钱的概率分布是什么,那么每次该选择哪个老虎机可以做到最大化收益呢?这就是多臂赌博机问题(Multi-armed bandit problem, MAB)。

MAB问题的难点是Exploitation-Exploration(E&E)两难的问题:对已知的吐钱概率比较高的老虎机,应该更多的去尝试(exploitation),以便获得一定的累计收益;对未知的或尝试次数较少的老虎机,还要分配一定的尝试机会(exploration),以免错失收益更高的选择,但同时较多的探索也意味着较高的风险(机会成本)。

Bandit算法是一类用来实现Exploitation-Exploration机制的策略。根据是否考虑上下文特征,Bandit算法分为context-free bandit和contextual bandit两大类。

阅读全文 »

在电商平台中,量化每个商品的静态质量及受欢迎的程度有着重要的意义。我们把这个量化值称之为商品人气分。商品人气分在搜索排序、个性化推荐排序及推荐候选集截断、竞价广告系统中都有着重要的应用。

商品人气分受哪些因素的影响,以及这些因素最终如何共同决定商品人气分值?本文总结了一个实际系统中人气分模型的构建过程,从特征和模型两个角度来回答上述两个问题。

阅读全文 »