点击关注 InfoQ,置顶公众号
程序员的 8 点技术早餐
图为张重阳AICon演讲现场
大家好,我是来自微信的张重阳,很荣幸有这个机会和大家一起交流一下机器学习和人工智能技术在微信的应用实践。谈起人工智能,大家首先想到的是图像识别、语音识别、机器翻译、机器人这些技术,然而人工智能所涉及的应用场景和商业价值却远不止此。在日常的经营和管理中,任何一个企业都会维护客户关系,都有销售数据需要分析,都会在生产,销售和运营的各个环节中面对不同的决策问题,新一代的商业智能技术就是利用现在飞速发展的机器学习和数据分析技术对企业商业化过程中面临的各种问题给出自动化的智能解决方案,从而驱动业务快速增长。
我们来看一下智能技术在商业过程中解决问题的 4 个重要环节,我这里总结了 4 个“in”,首先我们叫 integration,就是针对需要解决的问题收集和整合已有的数据。这里所面临的挑战主要有两个,首先是如何在计算机中表示数据以便于存储和计算,另一个是在我们实际应用中如何处理保密数据,比如财务数据,或是当我们处理用户数据的时候如何保护用户隐私,有没有什么方法对数据进行处理后既起到保密的作用又不影响计算机使用?
有数据后就是用统计和机器学习的方法去解决问题得出问题的最优解,这步我们叫 inference,不同于学术研究,在实际应用中我们会将多个模型进行组合使用取长补短从而得到更好的效果,稍后我会结合实例说明,
在有了 inference 结果之后,实际应用中不能只给一个预测结果,而是要结合数据对模型的预测结果进行更深入的分析和解释也就是 interpretation,这也是最近两年在深度学习之后比较热门的方向,因为深度学习虽然在整体的数据结果上取得了很不错的效果,但偶尔会在个别样本上给出令人难以理解的结果,有没有什么方法对深度学习这样的复杂模型进行解释,我将在后面介绍一种对黑盒模型进行解释的方法。
解释之后,该发现的问题找到原因,那么我们就要结合人工的知识和实际环境制定策略,并用自动化测试的方法去验证效果,这步我们叫 investigation,这一步其实最复杂,因为要结合人工知识而且在各个业务场景中验证方法都不一样,由于时间关系我这里介绍一种通用的方法 ABtest,ABtest 无论是在传统行业还是在互联网公司都已经被使用了很多年了,是一个非常有效的产品测试方法,但是即便是这种被广泛使用的方法,也需要根据实际应用场景进行设计,比如我们在微信上使用的很多产品是社交化的不能完全独立的分成 AB 两个集合,有时在小样本测试下有效不能保障放量后继续有效,后面我会给大家介绍一种我们改进的方法 Ntest。
好,说了这么多,我们先来宏观的看一下,在微信平台上我们正在做哪些尝试,这个图我 2015 年的时候就在 InfoQ 上分享过,当时我们的工作重点是在精准拉新这部分,因为当时在做朋友圈广告,但是拉新只是商业化的第一步,有了用户后,如何通过数据分析和自动化的方法做精细化运营降低用户流失率并提供个性化的服务提高产品体验才是企业成功的关键。
大家都知道小程序是微信生态的重要一环,因为它的便携性商家可以在微信小程序上以极低的成本获取用户,下一步我们还会依靠微信的大数据处理和机器学习的能力结合我们丰富的用户画像体系逐渐提供相关的分析工具和自动化测试工具帮助商家做好精细化运营提高用户体验。比如现在很多商家的促销展示对每个用户都是一样的,如果平台可以分析出当前用户里面哪些是最有价值的用户哪些是即将流失的用户,并提供一些自动化的测试工具验证运营效果,相信可以帮助商家大幅度的降低运营成本提高运营效果。今天我将结合其中的用户画像,流失预测,流失分析和 ABtest 相关技术和大家一起探讨一下微信在商业智能技术 4 个“in”上的技术实践。
先看数据整合 integration,这里我介绍一下实际应用中最常用到的用户画像技术,对一个企业来说最重要的资源无疑是它的用户,提供个性化和自动化的服务和产品必然需要足够的了解用户,那么用户画像就是用户在计算机中的表示形式。这里的挑战首先就是表示的方法,将用户表示成什么样的结构才方便计算机使用,另一个挑战是如何保护用户隐私,虽然我们对用户的敏感数据进行了脱敏,但用户的特征越多越容易反推回单个用户,有没有什么方法既能保护用户隐私又不影响计算机的使用?
先看用户画像的表示方法,用户画像的目的是为了在不同任务中度量用户和用户之间的相似度,那么通用的做法是将每个用户在数据库中表示成一个向量,向量和向量之间的距离有很多种数学方法计算比如常用的欧式距离和余弦,但实际使用中会根据不同应用场景定义相似度函数,或是在实际的数据上用机器学习的方法去拟合这个函数,有了这种对不同用户相似度度量的方法我们就可以做用户分类和聚类,或是提供对相似的用户推荐相同的商品这样的服务。
但是这个将用户转成向量的过程,在实际中却是非常复杂的,如果都是简单的标签那么常用的 onehot 编码就可以搞定,但很多数据是有结构的,例如微信中社交关系是一个网络结构,用户和公众号的关注关系是一个二部图的结构,用户的兴趣是一个随时间变化的序列结构。
我们在实践中社交关系这种网络结构使用了 node2vec 的方法转换成向量,使用的时候有些提高效果的小技巧比如好友关系其实是有权重的,好友和好友之间相互点赞和评论的越多权重就越大。 公众号的关注关系其实是一个稀疏矩阵,我们把每个用户关注的公众号作为一个词,把一个用户作为一个文档看待,这样就可以使用通用的主题模型给每个用户打上主题标签,推荐大家使用袁老师的 lightlda,非常适合大规模数据的训练,还有短期兴趣这种序列结构,文本,图像这些数据都可以用深度学习的方法 embedding 成向量,那么最终把这些向量拼接到一起就是计算机可以使用的用户特征向量。
上面的方法编码后,每个用户特征的维度是很高的,这意味着实际使用中需要足够多的训练样本否则就容易过拟合,但实际使用中用来训练的用户集大多数时候是非常有限的,要让算法支持较低的样本输入,必须要对初步编码后的用户特征向量做降维,现在有基于深度学习的 auto-encoder 的方法,在实际使用中我们发现它的效果比传统的 PCA 好很多,降维的另一个好处是对传统的标签进行了压缩和隐藏,压缩完成的向量不影响用户相似度的计算,但维度上比原始的向量小了很多,每一维的数值并没有实际的物理含义从而保护了用户隐私,便于在公司内进行共享使用。
关于用户隐私保护的问题这是公司内在处理用户数据时遵守的原则,文字比较多我就不念了。
对数据整合和编码后,下一步我们要使用统计和机器学习的方法去求解问题也就是 inference,这里我们来说 lookalike 这个模型。
lookalike 在商业化方向上有很多的应用场景,lookalike 最早是用在社交广告上的,通过商家上传的种子用户包扩展更多的相似用户用于做广告受众,广告投放中它的效果远好于标签筛选出来的用户,但是 lookalike 的本质是通过已知的一堆样本在另一个集合上去找相似的样本,同样的也可以用在流失预测上,我们知道上个月到现在已经流失的用户,在现有的用户群上做 lookalike 相似性扩展就可以找到正在流失或下一步可能流失的用户,lookalike 对线下店铺的智能运营也很有作用,我们通过已有用户在大盘全量用户上做 lookalike 就可以算出各个地方潜在的客户群体有多大,lookalike 不光用来找人还可以用在商品上,我们可以通过热门商品去商品库里面扩展找类似的商品,这就是智能选品的问题。
这是 lookalike 人群定向系统的大致流程,我们从种子包里过滤出我们自己系统里面的重合用户也就是这里的目标用户,同时从全量用户的其他用户中采样出一些用户作为对比用户,再从用户画像系统里提取出用户特征,这样我们有了一个 label 的正样本数据和一个 unlabel 的数据,可以用 PU learning 或是二分类的机器学习方法训练出模型,模型上线使用后,会有实时的反馈数据,我们会利用这部分实时数据再训练一个综合打分的算法,对线上的模型结果做出实时的调整。最终用这个最终打分对全量用户排序选出最相似的用户。
这里我们看一下 lookalike 打分算法的模型训练部分,前面说了不同于学术研究实际应用中很少使用一个模型,我多年的体会训模型和画画很像,你很难用一个笔刷完成整幅画作,刚开始的时候需要用粗的笔刷完成大的布局最后再用细的笔刷去勾勒细节。
在机器学习中常用的模型整合方法有 ensemble 和 jointtrain,lookalike 中比较通用的方法是左图这种先用 gbdt 学习特征再传给 LR,FM 或 DNN 的方法,之后 google 用了这种对 LR 和 DNN 进行联合训练的 wide&deep 模型。如果人工特征设计得好是可以结合两者优点取得非常好的效果的。我们系统实际使用的是右图这种 ensemble 的方法,因为 gbdt 是一种基于 boosting 的学习框架,那么理论上它可以 boost 任何模型,当然包括 dnn,这样就可以将这两种模型的优点结合起来了,他的训练方法是先训一个 dnn,这里不需要用太多的层数相当于用粗的笔刷去完成大致的轮廓,然后用 gbdt 进行 boosting,这相当于用更细的笔刷去刻画细节。
我们看一下 lookalike 应用的一个具体实例,lookalike 被广泛的应用于精准拉新,但我觉得相对于拉新降低用户流失率更重要,因为新用户可以通过广告或地推等方式花钱买到,但已有用户一旦流失就很难挽回,所以必须在流失之前采取措施。常用的激活策略有很多,比如促销商品,发优惠券或发红包等,假如有商家要拿出一笔钱给用户发红包,那么怎么花这笔钱呢?显然不是等用户已经流失了再发给他,因为这时用户已经不再打开应用了,等同的给每个用户发也不合理,因为预算有限。那么常用的方法是发给对平台有最有价值的用户和有可能要流失的用户,所以要做用户价值分析和流失预测。
这张图是流失预测和流失分析的流程图,我们使用刚流失的用户在当前的用户上面做 lookalike 就可以得到正在流失或即将流失的用户,在流失预测之后的流失分析是很必要的。因为流失有很多种情况,不同情况采取的策略是不同的。那么怎么做这个流失分析呢?这就是我们下面要讨论的问题。
我们继续上一节的话题以流失分析为例看一下第三个“in” interpretation。
模型的可解释性和精度同等重要,这是机器学习在实际使用和学术研究的一个重要区别,因为我们可以从解释的结果中发现模型本身是不是靠谱,这样的解释结果更容易说服模型的反馈对象有助于模型的推广。另外模型的使用者可以从这个结果中发现问题从而针对性的制定策略比如我们刚说的流失分析,其实在某些领域比如医疗和金融,不可解释的模型是无法推广的。
那么有没有一种方法可以同时得到比较高的精确度和可解释性呢?这其实是个鱼和熊掌的问题,因为模型的能力越强就越复杂越不容易解释,右上这个图说明了这种情况,横轴是模型的精确度,纵轴是模型的可解释性,可以看到可解释性很好的线性模型和决策树模型精度并不高,精确度很高的神经网络和深度学习解释性最差。
KDD2016 的一篇文章给出一个很新颖的方法,既然鱼和熊掌不可兼得,能不能用高精度的模型去解决问题,再用一个可解释的模型去解释这个高精度的模型?那么问题来了,可解释的模型一般非常简单比如线性模型,它无法去拟合像 DNN 这样一个非线性模型,例如右上图的这个分类结果,这篇论文给出了一个很新颖的算法 lime,因为无论模型多么复杂,每次也只需解释一个样本的预测结果,而非线性模型在单个的样本的局部是可以用线性模型近似的。
但是这样就有另外一个问题,要在这个样本局部进行拟合必须在这个样本周围有足够多的训练样本,lime 的做法是对样本的某些特征进行一些扰动产生一些新的样本,再用之前的高精度模型对这些样本进行预测。这样就产生了很多由高精度模型标注的样本,而且我们可以计算出每个生成样本和我们要解释的样本之间的距离,这时就可以用可解释的线性模型比如 lasso 对这个样本的局部进行拟合和解释了。
这是用户流失分析系统的框架,通过前面说的模型进行用户流失预测后得到了正在流失的用户和忠实用户,这里需要注意的是我们对用户特征做了 encoder,所以在解释的时候需要映射回之前可解释的特征表示并和编码器一起传给 lime,就可以对每个用户的流失预测结果进行解释了。我们会对全量用户的解释结果再用算法进行一次聚合,分析出正在流失用户和忠实用户整体的特征并将这个结果可视化的展示出来。
这是我们对一款游戏类小程序的用户流失分析结果的可视化展示,可以看出主要是学生用户正在流失可能是由于最近快期末考试了,我们还可以对这些用户进行聚类,右上角是在二维平面上的可视化聚类结果,使用者还可以再次下钻到各个子类中针对各个类的特点制定相应的运营策略。
有了分析结果后就是要结合人工知识制定策略并用自动化的方法在实际环境中验证结果我们叫 investigation,这里介绍一种 ABtest 的改进方法。
ABtest 源于医学的双盲实验,在互联网时代,它被广泛的应用于网站改版和产品升级后的效果测试。相对于观察上线前后的数据,abtest 可以有效的排除季节因素、市场环境因素的影响,现在 ABtest 也被用来分析不同广告或运营策略的效果。比如刚说的流失问题,我们分析问题后设计了一个降低流失的策略,要看这个策略有没有效果就要放到线上的真实环境中去测试,这是传统的 ABtest 的流程。
之所以叫 ABtest 是因为在实验时会将实验的用户分流成不使用策略的 control 和使用策略的 treatment 两组用户进行对比观察,这里有很多技术细节比如在多个实验并行进行时的正交分层模型,对 control 和 treatment 的同质校验,结果的显著性分析等,有很多论文讨论这些问题。我这里重点和大家一起交流一下在社交网络中的一些问题和改进方法。
在社交网络上要将用户分成两组完全独立的 control 和 treatment 是很困难的,因为用户和用户之间相互影响,比如我们微信上可以分享给好友的立减金,微信电商类小程序采用的拼单和组团的这种促销模式,这些红包和促销商品会在好友和好友之间传播,最终可能导致 control 和 treatment 都变好了或是都变差了。另外一个问题就是灰度实验的时候,在一个小的用户量下实验有效,在放量后会不会继续有效,因为放量后投放的密度变大了用户和用户之间的影响更大。这种影响可能导致之前的策略不起作用也可能导致之前的策略的效果成指数的放大。那么这个问题就变成了如何测试投放密度和实验效果的关系。
我们针对社交网络的特点设计了一种改进的策略 Ntest,和传统 ABtest 不同,Ntest 不是以单个用户作为测试单位而是以几十人到几百人的子网络作为测试单元,每次实验选择 N 个子网络作为实验组,并在各个实验组上采用不同的密度投放实验策略。最终对每个子网络计算实验指标,我们将这 N 个子网络的指标和密度的关系绘制在坐标系上,就可以分析出指标随密度变化的趋势,右图是常见的三种情况,横轴是策略在子网络上投放的密度,纵轴是当前指标的效果,上面这个图随着密度增大效果整体呈上升趋势,说明策略和当前指标是正相关的。同理这下面是负相关和不相关的大致情况。
最后我们总结一下机器学习方法落地实践的心得。
首先是我们要针对问题对数据进行整合和编码使其易于计算,数据整合后用多个模型组合使用可以取得更好的效果,对模型结果的分析和解释在模型推广时非常重要,最后任何结论都要回到实际业务场景中验证效果。
点击下方图片即可阅读
微信亿级用户异常检测框架的设计与实践