学习和预测用户的反馈对于个性化推荐、信息检索和在线广告等领域都有着极其重要的作用。在这些领域,用户的反馈行为包括点击、收藏、购买等。本文以点击率(CTR)预估为例,介绍常用的CTR预估模型,试图找出它们之间的关联和演化规律。
使用crontab调度hadoop任务和机器学习任务的正确姿势
虽然现在越来越多的开源机器学习工具支持分布式训练,但分布式机器学习平台的搭建和运维的门槛通常是比较高的。另外一方面,有一些业务场景的训练数据其实并不是很大,在一台普通的开发机上训练个把小时足矣。单机的机器学习工具使用起来通常要比分布式平台好用很多。
特征工程在机器学习任务中占了很大的一部分比重,使用hive sql这样的高级语言处理起来比较方面和快捷。因此,通常特征工程、样本构建都在离线分布式集群(hive集群)上完成,训练任务在数据量不大时可以在gateway机器上完成。这就涉及到几个问题:
- gateway机器上的daily训练任务什么时候开始执行?
- 模型训练结束,并对新数据做出预测后如何把数据上传到分布式集群?
- 如何通知后置任务开始执行?
电商平台商家流量分配机制
本文把电商平台搜索场景的流量分配问题定义为在用户$u$提交查询关键词$q$后,搜索结果列表的第$i$个位置展现哪个商家的哪个商品,以便达到某种商业目标。由此可见,流量跟3个因素有关:用户、查询关键词、搜索结果的展现位置。只要这3个因素其中有一个发生变化,我们就认为产生了一个新的不同的流量。按照这个定义,一般情况下,电商平台的每日流量都在亿或数十亿的数量级。
电商平台为了达到其商业目标,如最大化平台的总成交额(GMV),需要把每个流量和某个具体的商品联系起来。在搜索场景下,表现为系统决定在用户$u$提交查询关键词$q$后搜索列表的各个位置展现哪些商品的过程。这一给流量和商品建立关联的过程就称为流量分配。
在商业目标确定后,流量分配就需要满足一定的约束条件,不能随意而为之。比如,在搜索场景下,考虑到用户体验的问题,流量分配需要能够匹配用户此时此刻的查询意图,即需要满足相关性、个性化、场景化等约束;同时,平台为了更好地服务商家以及追求自身的利益,需要在流量分配时考虑最大化总成交额。
然而,平台的多个商业目标之间,并不是毫无冲突的,比如在最求自身利益最大化的同时并不能很好的服务所有的商家。表现为平台最大化GMV的贪心策略会导致流量分配的马太效应越来越明显,即流量越来越集中到少数的头部商家;中长尾的商家获得的流量少,成交量也少,从而失去参与感。导致这一现象的原因是贪心的流量分配机制严重依赖平台上的历史行为数据。系统倾向于展现过去一段时间转化率高且销量好商品;而对于新上架的商品,或者小众而精美的商品(比如手工艺品等)由于历史成交数据有限,系统未能充分探索并感知其被展现的效用值,因此这类商品得到的展现机会就较少。在机器学习领域,这一问题被称为探索/利用(Exploration and Exploitation)两难问题。
构建平台、用户和商家共赢的生态结构是电商平台的长期目标。采用贪心策略的流量分配机制长期发展下去,不利于平台生态的长远发展。为了缓解马太效应,需要在尽量不影响平台GMV的条件下,有意识的控制头部商家的流量,把更多的流量引导到中长尾商家。这就是本文主要解决的问题。
JVM类加载机制剖析
一、何为类加载器
我们编写的.java文件经过编译器编译之后,生成.class文件,即字节码文件,类加载器就是负责加载字节码文件到JVM中,并将字节码转换成为java.lang.class类的实例,这个实例便是我们编写的类,通过class实例的newInstance方法,便可以得到java类的对象。
类加载器是类加载过程中的关键角色,他存在于「类加载Class load」过程的「加载」阶段中,在这个阶段,JVM虚拟机完成了三件事情:
- 通过一个类的全限定名(包名称+类名称)获取定义此类的二进制字节流(类的权限定名可以映射到文件系统中的文件路径);
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
- 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口;
《所谓情商高就是会说话》读书笔记2
《所谓情商高就是会说话》读书笔记1
搜索广告(sponsored-search)概述
本文主要内容来自于斯坦福大学的Introduction to Computational Advertising课程,重点介绍了搜索广告相关的一部分内容。
计算广告(Computational Advertising)
计算广告是计算机科学中出现的一个相对较新的子科学领域,利用算法来给用户展示出最佳的广告。它集合了下面的技术于一身:
- 信息检索 (Information retrieval)
- 大规模搜索与文本分析(Large scale search and text analysis)
- 统计建模(Statistical modeling)
- 机器学习 (Machine learning)
- 微观经济学 (Microeconomics)
- 博弈论、拍卖理论与机制设计 (Game theory, auction theory, mechanism design)
- 分类(Classification)
- 优化(Optimization)
- 推荐系统 (Recommender systems)
查询改写(Query Rewrite)方法总结
为何需要Query改写
Query分析是搜索引擎的一个重要模块,对搜索结果的覆盖率和相关性至关重要。搜索引擎的检索过程包含了两个重要的阶段:匹配和排序。匹配也叫召回,表示根据用户的查询条件,尽可能多地匹配出主题相关的文档,尽可能少地匹配出主题不相关的文档。排序是指对召回阶段返回的文档集合进行合理的排序,把最满足用户意图的结果尽可能排到前面。Query分析的主要目标是为匹配过程提供必要的知识和信息,同时兼顾后面的排序过程,为排序模型提供原始特征。
Query改写是Query分析的一个重要组成部分。通过对原始Query进行改写,生成一系列相关Query,把相关Query作为原始Query的补充,与原始Query一起参与搜索,从而得到更加丰富和准确的匹配结果。下面分别从网页搜索、电商搜索和广告搜索三个方面来论证Query改写的必要性。
拨开深度学习的迷雾:训练一个性能优秀的深度模型
深度学习技术已经在很多领域取得了非常大的成功,然而其调参的复杂性也导致很多机器学习从业者迷失在丛林里。本文旨在总结一些训练出一个性能优秀的深度模型的相关经验,帮助自己以及这个领域的初学者少走弯路。
激活函数
sigmoid/tanh. 存在饱和的问题,现在不建议使用。
ReLU. 最近几年常用的激活函数,形式为$f(x) = \max(0, x)$,目前建议首先尝试用这个激活函数。
- 相比于sigmoid/tanh函数而言,ReLU能极大地加快SGD算法的收敛速度,因为其分段线性的形式不会导致饱和;
- 相比于sigmoid/tanh函数而言,ReLU实现简单不需要昂贵的指数运算
- 然而,训练过程中ReLU单元可能会失效。例如,当一个非常大的梯度流经ReLU单元时,导致该单元对应的权重更新后(变得非常小)再也无法在任何数据点上激活。因此,需要小心设置学习率,较小的学习率可以缓解该问题。(太大的学习率可能会导致40%以上的ReLU单元变成dead的不可逆状态)
深度学习中的常用训练算法
梯度下降算法是深度学习中使用得最多的优化算法。它是一种用来最小化目标函数$J(\theta)$($\theta \in \mathbb{R}^d$是模型的参数)的方法,其沿着与目标函数相对于参数的梯度$\nabla_\theta J(\theta)$相反的方向更新参数的值。形象地说,就是沿着目标函数所在的超平面上的斜坡下降,直到到达山谷(目标函数极小值)。
关于梯度下降算法的具体介绍请参考我的另一篇博文:《梯度下降算法分类及调参优化技巧》
梯度更新通常有两大类方法,一类是基于随机梯度下降及其变种的一阶方法;另一类是以牛顿方法、共轭梯度为代表的二阶近似优化方法。
本文主要对第一类方法做一个简要的综述。