作者:沙韬伟 来源:
摘要:电商行业中,对于用户的商品推荐一直是一个非常热门而且重要的话题,有很多比较成熟的方法,但是也各有利弊。
电商行业中,对于用户的商品推荐一直是一个非常热门而且重要的话题,有很多比较成熟的方法,但是也各有利弊,大致如下:
基于商品相似度:比如食物A和食物B,对于它们价格、味道、保质期、品牌等维度,可以计算它们的相似程度,可以想象,我买了包子,很有可能顺路带一盒水饺回家。
优点:冷启动,其实只要你有商品的数据,在业务初期用户数据不多的情况下,也可以做推荐
缺点:预处理复杂,任何一件商品,维度可以说至少可以上百,如何选取合适的维度进行计算,设计到工程经验,这些也是花钱买不到的
典型:亚马逊早期的推荐系统
基于关联规则:最常见的就是通过用户购买的习惯,经典的就是“啤酒尿布”的案例,但是实际运营中这种方法运用的也是最少的,首先要做关联规则,数据量一定要充足,否则置信度太低,当数据量上升了,我们有更多优秀的方法,可以说没有什么亮点,业内的算法有apriori、ftgrow之类的
优点:简单易操作,上手速度快,部署起来也非常方便
缺点:需要有较多的数据,精度效果一般
典型:早期运营商的套餐推荐
基于物品的协同推荐:假设物品A被小张、小明、小董买过,物品B被小红、小丽、小晨买过,物品C被小张、小明、小李买过;直观的看来,物品A和物品C的购买人群相似度更高(相对于物品B),现在我们可以对小董推荐物品C,小李推荐物品A,这个推荐算法比较成熟,运用的公司也比较多
优点:相对精准,结果可解释性强,副产物可以得出商品热门排序
缺点:计算复杂,数据存储瓶颈,冷门物品推荐效果差
典型:早期一号店商品推荐
基于用户的协同推荐:假设用户A买过可乐、雪碧、火锅底料,用户B买过卫生纸、衣服、鞋,用户C买过火锅、果汁、七喜;直观上来看,用户A和用户C相似度更高(相对于用户B),现在我们可以对用户A推荐用户C买过的其他东西,对用户C推荐用户A买过买过的其他东西,优缺点与基于物品的协同推荐类似,不重复了。
基于模型的推荐:svd+、特征值分解等等,将用户的购买行为的矩阵拆分成两组权重矩阵的乘积,一组矩阵代表用户的行为特征,一组矩阵代表商品的重要性,在用户推荐过程中,计算该用户在历史训练矩阵下的各商品的可能性进行推荐。
优点:精准,对于冷门的商品也有很不错的推荐效果
缺点:计算量非常大,矩阵拆分的效能及能力瓶颈一直是受约束的
典型:惠普的电脑推荐
基于时序的推荐:这个比较特别,在电商运用的少,在Twitter,Facebook,豆瓣运用的比较多,就是只有赞同和反对的情况下,怎么进行评论排序,详细的可以参见我之前写的一篇文章:应用:推荐系统-威尔逊区间法
基于深度学习的推荐:现在比较火的CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)都有运用在推荐上面的例子,但是都还是试验阶段,但是有个基于word2vec的方法已经相对比较成熟,也是我们今天介绍的重点。
优点:推荐效果非常精准,所需要的基础存储资源较少
缺点:工程运用不成熟,模型训练调参技巧难
典型:苏宁易购的会员商品推荐
现在苏宁的商品有约4亿个,商品的类目有10000多组,大的品类也有近40个,如果通过传统的协同推荐,实时计算的话,服务器成本,计算能力都是非常大的局限,之前已经有过几篇应用介绍:基于推荐的交叉销售、基于用户行为的推荐预估。会员研发部门因为不是主要推荐的应用部门,所以在选择上,我们期望的是更加高效高速且相对准确的简约版模型方式,所以我们这边基于了word2vec的原始算法,仿造了itemNvec的方式。
首先,让我们对itemNvec进行理论拆分:
目标商品的前后商品对目标商品的影响程度
这是两个用户userA,userB在易购上面的消费time line,灰色方框内为我们观察对象,试问一下,如果换一下灰色方框内的userA、userB的购买物品,直观的可能性有多大?
直观的体验告诉我们,这是不可能出现,或者绝对不是常出现的,所以,我们就有一个初始的假设,对于某些用户在特定的类目下,用户的消费行为是连续影响的,换句话说,就是我买了什么东西是依赖我之前买过什么东西。如何通过算法语言解释上面说的这件事呢?
大家回想一下,naive bayes做垃圾邮件分类的时候是怎么做的?
假设“我公司可以提供发票、军火出售、航母维修”这句话是不是垃圾邮件?
同理
我们只需要比较p1和p2的大小即可,在条件独立的情况下可以直接写成:
但是,我们看到,无论“我公司可以提供发票、军火出售、航母维修”词语的顺序怎么变化,不影响它最后的结果判定,但是我们这边的需求里面前面买的东西对后项的影响会更大。
冰箱=>洗衣机=>衣柜=>电视=>汽水,这样的下单流程合理
冰箱=>洗衣机=>汽水=>电视=>衣柜,这样的下单流程相对来讲可能性会更低
但是对于naive bayes,它们是一致的。
所以,我们这边考虑顺序,还是上面那个垃圾邮件的问题。
P1(“垃圾邮件”|“我公司可以提供发票、军火出售、航母维修”)
=p(“垃圾邮件”)p(“发票”)p(“军火”/“发票”)p(“军火”/“航母”)
P1(“正常邮件”|“我公司可以提供发票、军火出售、航母维修”)
=p(“正常邮件”)p(“发票”)p(“军火”/“发票”)p(“军火”/“航母”)
这边我们每个词只依赖前一个词,理论上讲依赖1-3个词通常都是可接受的。以上的考虑顺序的bayes就是基于著名的马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词下的联合概率问题,相关详细的理论数学公式就不给出了,这边这涉及一个思想。
更大的数据存储形式
我们常用的user到item的映射是通过one hot encoding的形式去实现的,这有一个非常大的弊端就是数据存储系数且维度灾难可能性极大。
回到最初的那组数据:现在苏宁的商品有约4亿个,商品的类目有10000多组,大的品类也有近40个,同时现在会员数目达到3亿,要是需要建造一个用户商品对应的购买关系矩阵做基于用户的协同推荐的话,我们需要做一个4亿X6亿的1/0矩阵,这个是几乎不可能的,Huffman采取了一个近似二叉树的形式进行存储:
我们以易购商品购买量为例,讲解一下如何以二叉树的形式替换one hot encoding存储方式:
假设,818苏宁大促期间,经过统计,有冰箱=>洗衣机=>烘干机=>电视=>衣柜=>钻石的用户下单链条(及购买物品顺序如上),其中冰箱总售出15万台,洗衣机总售出8万台,烘干机总售出6万台,电视总售出5万台,衣柜总售出3万台,钻石总售出1万颗
Huffman树构造过程
1.给定{15,8,6,5,3,1}为二叉树的节点,每个树仅有一个节点,那就存在6颗单独的树 2.选择节点权重值最小的两颗树进行合并也就是{3}、{1},合并后计算新权重3+1=4 3.将{3},{1}树从节点列表删除,将3+1=4的新组合树放回原节点列表 4.重新进行2-3,直到只剩一棵树为止
针对每层每次分支过程,我们可以将所有权重大的节点看做是1,权重小的节点看做是0,相反亦可。现在,我们比如需要知道钻石的code,就是1000,也就是灰色方框的位置,洗衣机的code就是111;这样的存储利用了0/1的存储方式,也同时考虑了组合位置的排列长度,节省了数据的存储空间。
最大化当前数据出现可能的概率密度函数
对于钻石的位置而言,它的Huffman code是1000,那就意味着在每一次二叉选择的时候,它需要一次被分到1,三次被分到0,而且每次分的过程中,只有1/0可以选择,这是不是和logistic regression里面的0/1分类相似,所以这边我们也直接使用了lr里面的交叉熵来作为loss function。
其实对于很多机器学习的算法而言,都是按照先假定一个模型,再构造一个损失函数,通过数据来训练损失函数求argmin(损失函数)的参数,放回到原模型。
让我们详细的看这个钻石这个例子:
第一步
p(1|No.1层未知参数)=sigmoid(No.1层未知参数)
第二步
p(0|No.2层未知参数)=sigmoid(No.2层未知参数)
同理,第三第四层:
p(0|No.3层未知参数)=sigmoid(No.3层未知参数)
p(0|No.4层未知参数)=sigmoid(No.4层未知参数)
然后求p(1|No.1层未知参数)xp(0|No.2层未知参数)xp(0|No.3层未知参数)xp(0|No.4层未知参数)最大下对应的每层的未知参数即可,求解方式与logistic求解方式近似,未知参数分布偏导,后续采用梯度下降的方式(极大、批量、牛顿按需使用)
商品的相似度
刚才在part three里面有个p(1|No.1层未知参数)这个逻辑,这个NO.1层未知参数里面有一个就是商品向量。
举个例子:
存在1000万个用户有过:“啤酒=>西瓜=>剃须刀=>百事可乐”的商品购买顺序
10万个用户有过:“啤酒=>苹果=>剃须刀=>百事可乐”的商品购买顺序,如果按照传统的概率模型比如navie bayes 或者n-gram来看,P(啤酒=>西瓜=>剃须刀=>百事可乐)>>p(啤酒=>苹果=>剃须刀=>百事可乐),但是实际上这两者的人群应该是同一波人,他们的属性特征一定会是一样的才对。
我们这边通过了随机初始化每个商品的特征向量,然后通过part three的概率模型去训练,最后确定了词向量的大小。除此之外,还可以通过神经网络算法去做这样的事情。
Bengio 等人在 2001 年发表在 NIPS 上的文章《A Neural Probabilistic Language Model》介绍了详细的方法。
我们这边需要知道的就是,对于最小维度商品,我们以商品向量(0.8213,0.8232,0.6613,0.1234,...)的形式替代了0-1点(0,0,0,0,0,1,0,0,0,0...),单个的商品向量无意义,但是成对的商品向量我们就可以比较他们间的余弦相似度,就可以比较类目的相似度,甚至品类的相似度。
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib as mt
from gensim.models import word2vec
from sklearn.model_selection import train_test_split
order_data = pd.read_table('C:/Users/17031877/Desktop/SuNing/cross_sell_data_tmp1.txt')
dealed_data = order_data.drop('member_id', axis=1)
dealed_data = pd.DataFrame(dealed_data).fillna(value='')
# 数据合并
dealed_data = dealed_data['top10'] + [" "] + dealed_data['top9'] + [" "] + dealed_data['top8'] + [" "] + \
dealed_data['top7'] + [" "] + dealed_data['top6'] + [" "] + dealed_data['top5'] + [" "] + dealed_data[
'top4'] + [" "] + dealed_data['top3'] + [" "] + dealed_data['top2'] + [" "] + dealed_data['top1']
# 数据分列
dealed_data = [s.encode('utf-8').split() for s in dealed_data]
# 数据拆分
train_data, test_data = train_test_split(dealed_data, test_size=0.3, random_state=42)
# 原始数据训练
# sg=1,skipgram;sg=0,SBOW
# hs=1:hierarchical softmax,huffmantree
# nagative = 0 非负采样
model = word2vec.Word2Vec(train_data, sg=1, min_count=10, window=2, hs=1, negative=0)
接下来就是用model来训练得到我们的推荐商品,这边有三个思路,可以根据具体的业务需求和实际数据量来选择:
# 最后一次浏览商品最相似的商品组top3
x = 1000
result = []
result = pd.DataFrame(result)
for i in range(x):
test_data_split = [s.encode('utf-8').split() for s in test_data[i]]
k = len(test_data_split)
last_one = test_data_split[k - 1]
last_one_recommended = model.most_similar(last_one, topn=3)
tmp = last_one_recommended[0] + last_one_recommended[1] + last_one_recommended[2]
last_one_recommended = pd.concat([pd.DataFrame(last_one), pd.DataFrame(np.array(tmp))], axis=0)
last_one_recommended = last_one_recommended.T
result = pd.concat([pd.DataFrame(last_one_recommended), result], axis=0)
考虑用户最后一次操作的关注物品x,干掉那些已经被用户购买的商品,剩下的商品表示用户依旧有兴趣但是因为没找到合适的或者便宜的商品,通过商品向量之间的相似度,可以直接计算出,与其高度相似的商品推荐给用户。
根据历史上用户依旧购买的商品顺序,判断根据当前这个目标用户近期买的商品,接下来他最有可能买什么?
比如历史数据告诉我们,购买了手机+电脑的用户,后一周内最大可能会购买背包,那我们就针对那些近期购买了电脑+手机的用户去推送电脑包的商品给他,刺激他的潜在规律需求。
# 向量库
rbind_data = pd.concat(
[order_data['top1'], order_data['top2'], order_data['top3'], order_data['top4'], order_data['top5'],
order_data['top6'], order_data['top7'], order_data['top8'], order_data['top9'], order_data['top10']], axis=0)
x = 50
start = []
output = []
score_final = []
for i in range(x):
score = np.array(-100000000000000)
name = np.array(-100000000000000)
newscore = np.array(-100000000000000)
tmp = test_data[i]
k = len(tmp)
last_one = tmp[k - 2]
tmp = tmp[0:(k - 1)]
for j in range(number):
tmp1 = tmp[:]
target = rbind_data_level[j]
tmp1.append(target)
test_data_split = [tmp1]
newscore = model.score(test_data_split)
if newscore > score:
score = newscore
name = tmp1[len(tmp1) - 1]
else:
pass
start.append(last_one)
output.append(name)
score_final.append(score)
在3.2中,我们根据了这个用户近期购买行为,从历史已购用户的购买行为数据发现规律,提供推荐的商品。还有一个近似的逻辑,就是通过目标用户最近一次的购买商品进行推测,参考的是历史用户的单次购买附近的数据,详细如下:
这个实现也非常的简单,这边代码我自己也没有写,就不贴了,采用的还是word2vec里面的predict_output_word(context_words_list, topn=10)
,Report the probability distribution of the center word given the context words as input to the trained model
其实,这边详细做起来还是比较复杂的,我这边也是简单的贴了一些思路,如果有不明白的可以私信我,就这样,最后,谢谢阅读。
——本文由作者 沙韬伟 投稿至数据分析网,并经编辑发布,版权归作者所有。
作者:沙韬伟,苏宁易购高级算法工程师。曾任职于Hewlett-Packard、滴滴出行。主要研究方向包括自然语言分析、机器学习和风控深度学习。目前专注于基于深度学习及集成模型下的用户行为模式的识别。
注:本文根据6月14日腾讯CDG社交与效果广告部 系统研发中心总监、专家工程师唐溪柳在“腾讯创新日”活动上所发表的《下一代全能广告系统架构》演讲整理而成。首发于微信号-「腾讯大讲堂」(TX_DJT),「AI早餐汇」经授权转载,禁止二次转载。
游戏、广告、电商是互联网3大现金流业务,去年腾讯广告收入增长54%达到270亿。本次分享和大家一起探讨在数据量急剧增长的情况下腾讯大统一广告系统的广告业务有什么特点,对技术架构有什么特殊的需求,支持和推动腾讯社交与效果广告的技术架构是怎么样的?社交、效果与品牌广告的大统一广告系统该具备什么样的架构形态和基础能力?
注:社交与效果广告(SPA)是腾讯的一个数据闭环系统,数据在系统中流动,并不断优化系统指标参数,这种类型的业务模式主要是搜索和广告,例如Google、百度 Facebook和阿里、腾讯SPA。SPA可以分成一些比较独立的平台系统,如广告播放与竞价平台、检索系统、点击回流与效果跟踪平台、模型训练与参数预测平台等分析系统。
以下为唐溪柳演讲实录:
大家好,非常高兴能有机会和大家分享一下腾讯社交与效果广告系统。
腾讯社交与效果广告(SPA)从最开始的广点通发展到现在,从每天收入百万级到现在的千万级,直至未来系统承载的目标可以达到每天亿级以上。这套架构经历了很多年的演变,核心一直没有太大的变化,这里给大家分享一下我们架构的方法论和演进的过程。
我的分享分成几个部分:首先介绍一下系统架构,然后是SPA研发体系,最后介绍一下架构中几个比较有意思的系统,一个是检索系统,也是这个架构的核心,另外是数据分析引擎。
系统架构
这是SPA整个业务的系统架构,大家可以看到,这里比较粗的黑线,是系统的数据流,数据是这个系统非常关键的因素,整个系统构建在数据的基础上,利用数据来不断的去优化这个系统。这种业务模式实际上是互联网中比较经典的业务模式,包括搜索、广告、电商,都是基于数据的大系统。腾讯SPA广告系统是比较好的数据驱动业务的模型。
整个广告系统可以分几个部分,最底层是广告引擎,这对于系统来说处于发动机的位置。为什么叫它发动机呢?因为广告引擎的作用是把流量端,例如微信、QQ,和广告侧的广告数据做一个匹配运算,万里挑一,从几十万广告中挑出前100广告。
然后是播放平台,会做一些和播放有关的策略。接下来是投放平台,是和广告主的接口,广告主投放创意,观察它的投放效果。下面是日志平台,每个数据的生产点不一样。在每个请求上面都有一个请求日志,广告曝光后有曝光日志,用户点击后有点击日志,如果发生了转化,广告主也会提供转化数据。
这些数据是用户在系统某一个时间点的切片,他们在时间轴上是不一样的,所以需要有一个系统把所有的数据对齐,我们把它称为日志处理平台。它将数据反馈到模型训练平台,这里可以利用数据进行学习和预测。广告系统还有垂直的业务,比如DMP数据管理平台,在这里广告主可以上传自己的用户数据,和腾讯内部的用户数据做一个交叉分析,得出他感兴趣的人群。
下面我会讲一下系统的数据流,会先从广告主一侧谈,然后再谈流量端。
广告主第一个行为是上传他的广告,设计一个创意,选择一个定向,上传广告。有了这个行为之后,系统会自动将广告插入到广告库,除了正常的数据库操作还会产生一个流水序列号,这对于系统相当于一个心跳,它对于系统的稳定性非常关键。
我们利用了一个开源软件zookeeper,利用了5台机器搭建的集群来产生一个序列号。因为有5台,可以容灾,只要3台正常工作,整个系统就可以正常工作。整个系统通过流水驱动接下来的流程。有一个发布系统,它会根据流水将广告库扩展到广告级别,部署到天津、上海、深圳三地的数据中心。
然后,有一个检索系统,建立倒排表,将广告质量的数据流关联到广告级别,生成索引文件。有了索引文件之后,会加载我们的索引文件,对外提供服务。
接下来是流量侧。首先有一个广告位管理系统,我们有一个移动联盟的业务,它有几十万的广告位,对于这么大规模的广告位,人工的方式没有办法管理,所以我们研发了一个广告位的管理系统。我们有多种接入,在CGI这个模块把所有的接入变成一个通用的请求,对后端屏蔽具体的接入方式。
在Mixer这个模块,会把用户的QQ号扩展成用户的年龄性别,还有很多垂直的业务,例如再营销,用户在电商平台的一些用户行为,比如说下单、收藏这些行为,也是在这里进入到系统。
Mixer将流量端用户标识扩展出用户画像后,会请求检索系统,我们会把它和广告数据关联起来运算。对于检索系统的返回,对每个广告会请求点击率预测和转化率预测服务,利用这些预测的值乘上广告的出价,形成一个打分叫做ECPM,用它进行排序,形成最有价值的广告返回给流量侧。
大家从前面的流程中可以看到,整个广告系统是一个链条比较长的系统,整个广告系统可能是一串项链,由很多珍珠串起来的。当某一个需求要落地的时候,要关联到许多环节。我们现在有几十种网络服务,每天有一百多次变更,整个部门有几百工程师,线上有一万多台服务器,总计800多万行源代码,整个部门的收入,每天几千万。
这里有一个冲突,如何在需求的变更和系统稳定性之间找到一个平衡,因为整个系统线上每天产生几千万收入,如果遇到代码的BUG或者发布的问题,这是要被问责的,因为造成了亏损。怎么解决?
经过了思考和创新,我们总结了一套打法,或者说最佳实践。首先统一代码规范,在底层研发了一个构建系统Blade,强制所有代码都必须有代码评审,然后才能提交。然后是自动化工具检查、持续集成系统。经过一系列的方法论或者规范之后,我们在稳定性和敏捷性中取得了平衡。
大家可以看到,我们的系统是一个长链条系统,但是如果对每一个网络服务来看,是分层的。最底层是构建系统,在构建系统上集成了很多对大规模软件工程的理解,例如集成了对单元测试的比较好的支持,集成了对内存泄露检测的支持,集成了对protocol buffer的支持,protocol buffer的生成文件不用提交到代码库,这样保持代码库的干净和整洁。在Blade之上有一个基础库,例如对文件系统的封装,就是文件类,可以统一访问本地文件或者网络文件。
C++访问HDFS比较麻烦,我们抽象出来之后,集中精力解决大家认为棘手的问题,让所有使用这个文件类的人都得到了收益。这个C++是内部开源的,大家可以看一下。在C++基础之上有一个RPC网络框架,加上Blade的支持,在这里开发一个网络服务是非常容易的。在网络框架之上是各种各样的网络服务,就是利用这些网络服务构建了整个SPA的架构,现在每天流水七千多万。
可以看一下,上面有流量接入的CGI,有一个实验系统,可以对系统变更做监测。里面有一个精排,可以对检索系统返回的广告做百里挑十、百里挑一的排序。所有这些服务都是基于同样的网络框架,所以可以做一个比较好的运维。
检索服务
接下来讲一下网络服务里面比较有意思的检索服务。大家可以看到,检索服务在链条的中间位置,之前没有用户数据,之后没有广告数据,所以这个检索是两路数据的交汇点。
我们对检索服务经过了三版的迭代,第一次实现的时候是采用传统的倒排表的形式,例如把年龄、性别、规格、地域等进行组合。在倒排表之后做过滤的逻辑。这个架构面临着一些问题,首先它的复杂度是M×N。但是广告的增加是业务的驱动力,比如说在电商大促,广告数量要翻一番,这时候系统的性能会急剧下降。
还有一个挑战,因为它只有6个维度进入倒排,超过6个维度,就需要用代码实现定向逻辑。但实际上定向产品是广告产品的驱动力,我们倾向于添加越来越多的定向产品,这样会导致代码越来越复杂,最终会导致代码失控。
接着我们开发出了第二代系统,做的第一件事情是把定向接口抽象化成一颗四层的树,它实际上是一颗四层的逻辑树。在离线的时候,把它变成三层结构。解决了随着广告数增加,算法性能下降的棘手问题。
第二代系统上线之后有比较好的效果,首先是增加定向,不用再改代码了,这是最大的好处。还有其他的好处,因为索引和定向接口标准化,减少了很多沟通的工作。还有定向维度进入倒排,增加定向产品不会导致性能下降。但是后来也遇到了一些挑战,第一是索引和排序之间的挑战,遇到的是检索和排序之间的问题,它们是通过数据来耦合,在需求变更的时候要频繁的修改这个接口。第二是所有的定向都是在统一的64位空间里,这个时候就没有办法支持不同空间的信息混排。例如分类的时候,苹果不知道是分到水果还是3C里面。没有提供一个维度的命中信息,例如命中了苹果,不知道这个广告被触发是因为命中了苹果,而不是其他的东西。
所以有了第三代系统,2013年12月份提出要开发第三代系统,2014年5月份全面上线,我们在Query和广告这两端都能够支持定向的表达式,目前来看是处在行业领先的水平。第三代系统的特点,首先它有更强的定向能力,因为它不是四层树,而是递归多叉树,(第二)然后是把排序接口标准化,大家可以通过它来开发和沟通。(第三)还有一个比较关键的特性是它能够融合各种用户标识,腾讯内部有很多用户标识,例如QQ号、微信号,还有IMEI、浏览器也有自己的标识。
这套系统具备的能力是能够把各个接口打通,这是它能够成功融合的关键特性。第四,支持不同空间信息的混排,每个定向ID都属于同一个空间或者不同的空间。第五,提供了一个附件机制,每个广告都有附件,可以添加二进制的信息流。这个系统是2014年4月份上线,现在离线有一百多台机器,在线几千台机器,收入是每天几千万。
下面我会讲一下检索系统要解决的核心问题。把这些问题进行抽象之后可以看到,就是两个简单的问题。
第一个问题是用户特征和广告定向要求要能够匹配。广告的定向要求是一个逻辑表达式,在这里是递归定义的多叉树。例如一个用户画像,男性,27岁,广州。第二个问题是流量要求和广告属性的匹配,例如这里有两个广告,第一个广告属性是教育行业文字广告,检索系统要做的是在非常短的时间内对两个表达式匹配做快速的求解,我们可以在5毫秒之内对几十万复杂的表达式进行求解。怎么解决这个问题?因为时间要求特别苛刻,如果对每个递归的多叉树测试特征,是不可能在这么短的时间内完成操作。
我们进行了创新,把这个逻辑运算问题转换成了一个计数和查找的问题。首先把递归多叉树变成了OR—AND—OR表达式。当做了这个转置之后,单独处理OR节点。对于AND节点,要精确的存储下来,例如这里有一个例子,广告一,把AND节点变成了内部的数据结构,这里有一个命中计数三次,也就是说它需要被命中三次才能触发。对于20-30、40-50岁的用户,存储为匹配项1。这就是匹配的原子单位。大家可以看到这里有个区间的东西,是传统的结构中没有的,是架构比较好的创新。这个区间的意义是可以把很多离散的空间在索引上作为原子的匹配项。
有一种技术是把经纬度变成整数,你可以认为是一些小方块,去描述地图上不规则多边形,但是有了这个区间之后,就可以用大小不一样的方块描述同一个多边形,这样可以省下很多小方块结点。所以这个区间是我们的创新,当然整个算法是一个比较大的创新。
把所有这些递归多叉树都转置存储下来之后,就形成了索引文件。再看一下,用这些索引文件怎么去匹配?首先看到,最左边有一个用户画像,比如说27岁,他在倒排表里面,在最下面有几个入口,这时候扫到27岁的时候,可以对应到匹配项A的命中加1操作。同样对于男这个用户画像的属性,也可以对应到匹配项A的命中加1操作。达到3的时候,索引项对应的广告就能够全部被触发。
大家可以看到,第三代检索系统上线之后,除了前面讲到的产品特性提升之后,还有性能上的提升。这是一些性能指标,也有很多关键特性,让广告在生命周期内缓慢播放,还有缓启动、急刹车。业务上线之后到现在发展比较顺利。现在每天是千万级,明年是每天将亿级的收入。
我们在2015年底发现技术面临了新的挑战,来自于对人群的洞察和分析。这里举一个例子,比如说产品经理,可能希望能够找到广告人群中的一些铜牌会员,并且是活跃用户、男性。他希望找到这些种子用户,利用他们做相似人群的扩展。如果数据量比较小的时候,例如几百万,是比较容易的问题,但是如果是数据量特别大,比如说是几千万甚至几十亿、几千亿的时候,我们之前的方法是写了很多Pig脚本程序去跑这个逻辑,但是这里有个冲突,产品经理需求非常多变,而且需要快速应对广告主。你去写脚本或者程序,需要程序员写代码,然后调试,这个过程比较慢,会产生一些问题。面对这个挑战,通过分析,利用已有的在检索上面的技术基础做了一些创新,我们研发了一个数据分析系统。
首先,把这个问题简单化或者抽象化,这个数据分析问题可以分成四步,第一是有原始的数据集,它是弹性的,可大可小。然后对数据集进行过滤,抽出子集,例如抽出所有的男性,或者所有的会员。然后在子集上面进行分组操作,再进行一些运算。
我们也给自己定了一些系统设计的约束。首先需要可扩展,因为面临的数据规模是可变的,从几百万条到几千亿条都有可能。然后是高性能,这是技术能够产生价值的地方,如果能做到这样,整个项目的运维成本就会降下来。有比较高的易用性,因为当时做核心系统开发的人很少,只有三个人,但是面对的需求方,有一百多位程序员在做数据相关的操作。所以只用三个人怎么应对一百多人的开发团队,就要求这个系统必须有非常强的易用性。
通过技术讨论和创新,我们选择出一个架构,比较好的解决了所有的这些约束。架构是基于SSD硬盘的检索架构,SSD硬盘越来越便宜,但是又提供了非常高的带宽和延迟,所以SSD是内存和传统硬盘之间的一个中间状态。这是我们的系统架构,首先系统分成全量和增量数据流,这样可以满足数据的准确性和及时性两种需求。
我们的索引分多片,例如一千片,利用多级聚合来加速。对外提供毫秒级的延时,能够提供同步的体验。之前大家使用PIG 可能需要一天能看到结果,现在用毫秒级就可以看到结果。集群上面会有Retrieval和
Aggregator两种模块。Aggregator模块集成Mysql Proxy,提供了很大的便利。对于检索系统来说,它的核心设计要素是检索文件的布局,我们根据它的一些设计约束,选择了一个列存储。我们会把所有的列单独存储,这样可以对每个列提供比较好的压缩。倒排链选择RoaringBitmap,可以在性能和空间之间得到平衡。
前面讲的是怎么利用倒排来加速过滤的过程,就是怎么样用倒排在一个比较大的数据集里面抽取出一个比较小的数据集。接下来面对的问题是怎么样对比较小的数据集进行分组的操作。Group by有两种操作。我们经过研究自己的情况,发现这两种方法都不太适用。第一种方法,系统是对单列建索引,没有联合索引的设计。所以我们基于自己的数据结构研发两种方法,包括正排数据实现分组和倒排数据实现分组。通过分组性能对比,可以看出比原来的数据库算法优秀很多。
我们还提供了一个分区管理的功能,例如分析过去60天的数据,超过60天就可以简单把数据删掉。在查询的时候,也可以检索对应天的数据,而不用去检索全量的数据。还有比较有意思的插件功能,这是因为在PivotEngine的推广过程当中发现有很多需求难以用SQL语言来满足,于是设计了一个插件架构。
系统的核心设计目标是性能和存储成本,我们的系统性能比Druid快一个数量级,存储成本也大幅度降低。
总结
下面是总结。我们做了很多架构设计,出发点都来自真实的业务需求。我们这个部门本身也有一个比较特殊的技术生态,这也来自业务特性。因为整个部门是一套架构,这样就要求整个团队需要比较密切的协作,需要互相理解对方的代码。对团队的代码能力要求很高,接口可读性要求也非常高,要求在一个技术生态体系内,我们为充分利用数据建立了很多基础架构。另外,广告系统这个行业,是技术密集的行业,技术能够推动产品的进步,能够对收入有影响。通过一些关键业务的创新,例如兼容不同ID的能力,能够帮助整合各种广告产品和广告形态。这些产品层面创新背后的驱动力都来自在技术上的积累和创新。
人工智能赛博物理操作系统
AI-CPS OS
“人工智能赛博物理操作系统”(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能)分支用来的今天,企业领导者必须了解如何将“技术”全面渗入整个公司、产品等“商业”场景中,利用AI-CPS OS形成数字化+智能化力量,实现行业的重新布局、企业的重新构建和自我的焕然新生。
AI-CPS OS的真正价值并不来自构成技术或功能,而是要以一种传递独特竞争优势的方式将自动化+信息化、智造+产品+服务和数据+分析一体化,这种整合方式能够释放新的业务和运营模式。如果不能实现跨功能的更大规模融合,没有颠覆现状的意愿,这些将不可能实现。
领导者无法依靠某种单一战略方法来应对多维度的数字化变革。面对新一代技术+商业操作系统AI-CPS OS颠覆性的数字化+智能化力量,领导者必须在行业、企业与个人这三个层面都保持领先地位:
重新行业布局:你的世界观要怎样改变才算足够?你必须对行业典范进行怎样的反思?
重新构建企业:你的企业需要做出什么样的变化?你准备如何重新定义你的公司?
重新打造自己:你需要成为怎样的人?要重塑自己并在数字化+智能化时代保有领先地位,你必须如何去做?
AI-CPS OS是数字化智能化创新平台,设计思路是将大数据、物联网、区块链和人工智能等无缝整合在云端,可以帮助企业将创新成果融入自身业务体系,实现各个前沿技术在云端的优势协同。AI-CPS OS形成的数字化+智能化力量与行业、企业及个人三个层面的交叉,形成了领导力模式,使数字化融入到领导者所在企业与领导方式的核心位置:
精细:这种力量能够使人在更加真实、细致的层面观察与感知现实世界和数字化世界正在发生的一切,进而理解和更加精细地进行产品个性化控制、微观业务场景事件和结果控制。
智能:模型随着时间(数据)的变化而变化,整个系统就具备了智能(自学习)的能力。
高效:企业需要建立实时或者准实时的数据采集传输、模型预测和响应决策能力,这样智能就从批量性、阶段性的行为变成一个可以实时触达的行为。
不确定性:数字化变更颠覆和改变了领导者曾经仰仗的思维方式、结构和实践经验,其结果就是形成了复合不确定性这种颠覆性力量。主要的不确定性蕴含于三个领域:技术、文化、制度。
边界模糊:数字世界与现实世界的不断融合成CPS不仅让人们所知行业的核心产品、经济学定理和可能性都产生了变化,还模糊了不同行业间的界限。这种效应正在向生态系统、企业、客户、产品快速蔓延。
AI-CPS OS形成的数字化+智能化力量通过三个方式激发经济增长:
创造虚拟劳动力,承担需要适应性和敏捷性的复杂任务,即“智能自动化”,以区别于传统的自动化解决方案;
对现有劳动力和实物资产进行有利的补充和提升,提高资本效率;
人工智能的普及,将推动多行业的相关创新,开辟崭新的经济增长空间。
给决策制定者和商业领袖的建议:
超越自动化,开启新创新模式:利用具有自主学习和自我控制能力的动态机器智能,为企业创造新商机;
迎接新一代信息技术,迎接人工智能:无缝整合人类智慧与机器智能,重新
评估未来的知识和技能类型;
制定道德规范:切实为人工智能生态系统制定道德准则,并在智能机器的开
发过程中确定更加明晰的标准和最佳实践;
重视再分配效应:对人工智能可能带来的冲击做好准备,制定战略帮助面临
较高失业风险的人群;
开发数字化+智能化企业所需新能力:员工团队需要积极掌握判断、沟通及想象力和创造力等人类所特有的重要能力。对于中国企业来说,创造兼具包容性和多样性的文化也非常重要。
子曰:“君子和而不同,小人同而不和。” 《论语·子路》云计算、大数据、物联网、区块链和 人工智能,像君子一般融合,一起体现科技就是生产力。
如果说上一次哥伦布地理大发现,拓展的是人类的物理空间。那么这一次地理大发现,拓展的就是人们的数字空间。在数学空间,建立新的商业文明,从而发现新的创富模式,为人类社会带来新的财富空间。云计算,大数据、物联网和区块链,是进入这个数字空间的船,而人工智能就是那船上的帆,哥伦布之帆!
新一代技术+商业的人工智能赛博物理操作系统AI-CPS OS作为新一轮产业变革的核心驱动力,将进一步释放历次科技革命和产业变革积蓄的巨大能量,并创造新的强大引擎。重构生产、分配、交换、消费等经济活动各环节,形成从宏观到微观各领域的智能化新需求,催生新技术、新产品、新产业、新业态、新模式。引发经济结构重大变革,深刻改变人类生产生活方式和思维模式,实现社会生产力的整体跃升。
产业智能官 AI-CPS
用“人工智能赛博物理操作系统”(新一代技术+商业操作系统“AI-CPS OS”:云计算+大数据+物联网+区块链+人工智能),在场景中构建状态感知-实时分析-自主决策-精准执行-学习提升的认知计算和机器智能;实现产业转型升级、DT驱动业务、价值创新创造的产业互联生态链。
长按上方二维码关注微信公众号: AI-CPS,更多信息回复:
新技术:“云计算”、“大数据”、“物联网”、“区块链”、“人工智能”;新产业:“智能制造”、“智能农业”、“智能金融”、“智能零售”、“智能城市”、“智能驾驶”;新模式:“财富空间”、“数据科学家”、“赛博物理”、“供应链金融”。
官方网站:AI-CPS.NET
本文系“产业智能官”(公众号ID:AI-CPS)收集整理,转载请注明出处!
版权声明:由产业智能官(公众号ID:AI-CPS)推荐的文章,除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,与您共同协商解决。联系、投稿邮箱:erp_vip@hotmail.com