Top
首页 > 访谈 > 正文

今日头条杨震原:大数据催生全栈研发

如何应对挑战?杨震原通过多年实战的工作经验总结出的应对思路就是,只有更加广泛的学习,成为全栈的研发才是未来的解决之道。
发布时间:2015-12-02 11:17        来源:赛迪网        作者:徐培炎

在这个大数据的时代里,开发者要学什么?从cpu指令集到操作系统,从hadoop到统计原理,从机器学习到产品的应用?今日头条技术副总裁杨震原认为,只有通过学习才能够找到突破点。

1

今日头条技术副总裁 杨震原

杨震原在“2015 中国软件开发者大会(SDCC 2015)”期间接受采访时表示,数据越来越多,应用越来越多,硬件进步的趋势减慢,这就构成了大数据时代开发者面临的挑战。 

如何应对挑战?杨震原通过多年实战的工作经验总结出的应对思路就是,只有更加广泛的学习,成为全栈的研发才是未来的解决之道。

杨震原表示,当局部可以大幅度的改进时,更细的分工才会显露出优势,否则只有全栈才能够综合的考虑并找到突破点。

在最开始的时候,大家就是做CPU,有的人去做UI的改进,大家的分工非常的细。杨震原介绍,比如说像手机,一个人从硬件,芯片都是SOC的,交互整个的套都要去关注,当时就是很细的分工,很细的分工为什么能够大幅的改进?因为每一块都在大幅的改进,你作为开发者你就知道这个东西怎么样用?因为CPU再过一年你的机器已经换了,现在不是这样的时代了我们更细的分工不能够带来大量级,所以这就要求开发者必须要进行学习才能够带来突破。

为了更好的让开发者了解全栈研发,杨震原结合在今日头条中找到的改进点为实例:

第一个例子,系统工程和细节的交叉点。今日头条的内容推荐很重要的一部分就是针对一个你可能感兴趣的候选集进行惊喜的排序,这部分的一个核心就是进行了建模,把永辉的各种组合偏好记录下来。

比如说uid—keyword就表达了某个用户的特点。这里先不讨论各种模型的利弊,先看如何解决特征爆炸的问题。机器学习的领域来讲,通常这样的问题解决的思路有很多种,比如说通过sample数据,比如说可以L1正则,稀疏化特征,第三特征过滤,第四hashtrick,第516bit的压缩。 

这里的方法特别多,那么特征的过滤怎么样来做,这个问题就变得非常明确的问题,我们有3T的uniqkey,我们现在的任务非常的明确我们需要去统计并过滤掉频次在8次以下的Key,我相信这个问题很多人都有自己的解决方法。很直观的方法就是使用hadoop你要去干掉低频的,因为大量的都是低频的,你偶尔看到一个词,大量的都是低频的,而且有一个劣势就是无法流式计算,我们把这个做完,就超过了模型的时间。大家可能有一些优化的方法,但是总体来讲还是不大行的。 

第二个方案,内存的hash表,我们去过一遍数据,来维护一个内容的表。每次去查一下,如果说出来6次了,我现在第7次了,我们把超过了7次的全部都统计下来,其他的都扔掉,这里有一个问题就是规模的问题,一个hash 的结构,一个key要占用40bytes,40bytes会有指针的消耗和对企的问题。如果我们有200台机器,单机需要600G的内存,现在很多的机器都不支持这个内存,那么怎么样来做?

第三个方案,是谷歌在写的一个方法,这个方法是这样的我们使用的是bloomcounter,我们不要求完全精准过滤。多bit的bloomfilter,我们又叫做countingfilters。频次是小于等于7,需要3bit,冲突率约1.5%的情况下,需要6次探测,单bitbloomfiter约8.66bit。我非常的不喜欢bloomcounter 这个结构,因为它对cpu非常的不友好,大范围随机的访存,你计算的时间都可以忽略掉。所以我很不喜欢这个数据结构,有没有更好的做法呢?我们用了很简单的方法,效果非常好,这样来做。开地址的hash ,我们是用开地址的hash ,而不是冲突了之后放下一个,再冲突了再放下一个,我们最大的填充率按50%记,但key16bit,单机30g内存,冲突率和bloomcounter接近。

sign5bit的数据和其他的不同,我去查一个东西的时候,就是一个表的指,之后我用第二个函数来算出去如果说找到冲突之后,以前是1,1就加到2,2就加到3,我们就用到一个hash 用到非常小的一个结果而言,所以我们就要知道,这个hash 的函数不同,所以它是一个有损的hash ,这个有多大的好处呢?它是bloomcounter性能的6倍,因为它只需要一次访存,所以我们的性能就提升了6倍,这个事情就使得我们对模型训练的时间,提高到了原来的2倍,所以我们在万兆的网络连接上,20个小时都可以传完,是用到fiter的方法,我就希望用到很细节的方法来表达,这些都可以和工程相结合起来,找到结合点的时候就要把规矩和规模进行提升,这些提升所带来的效果是很大的。

第二个例子,理论的研究和实践的结合。对于一个LR model来讲,使用不同的学习率、不同正则项,收敛的效果是不同的。这当中是自带了效果,但是初始的学习率还是会带来很大的影响。除了weiglt的参数之外,我们还有学习率、L1等的超参数。手工调参是非常困难的问题。

由于头条的训练样本很大,不同特征之间的频次相差非常大,有多大的?会相差7个数量级,我们的频次可能是几千万次,有的出现频次只有20、30次。所以针对不同类型的特征我们针对不同的超参数。特征的类型我们是按照特定的规则来分有上百个,每个特征的类型都有正则率和特征的参数,这样我们就几百个参数,这个是没有办法调整的,所有这个事情是是不能够训练的,这是一个很痛苦的问题,有什么解决的方法呢?头条在这一块是有创新的,当然这些工作都是我们团队来做的。 

所以大家想一下,超参的本质是什么?就是要去寻找过拟合和训练不足之间的最佳的平衡点,我训练是在一个训练集之中去做优化,我上线是在上线的集合之中来做,这两个数据集的分布是不同的,超参数就是去调这个东西,我训练不充分不好,我就是要做到在上线的情况下最优的超参数。我们把数据分为训练集验证集和测试集,我们在训练集之中去优化参数,我们可以做的事情是在验证集之中去优化超参数,目标是降低验证集的loss,这是更加的接近线上的分布,这是一个本质的方法我们可以找到最优点,同时这个方法是服务做好的。

如此,在验证集上去优化参数,在ftrl下,超参是可以导的,这是最有意思的事情。这个l1正则项梯度,这个是可以求出来的,对l2的正则项也是可以求出来的,所以我们就有自动调参的流程,来算出更新,然后在验证集中去验证,就用到这些相应的方法,如何去把验证集去进行训练,这是有讲究的,如果验证集太近和太远都是不好的,这些都是细节的问题。也有新的问题,学习中的验证怎么样调?做这一块的人,最头痛的事情就是调参,但是我可以把几百个参数变成只有几个——参数可以调了,这个事情我们已经把它实现了并且在头条上全面的上线了,取得了什么效果呢?就是我们的离线评估UAC的面积,有2.2个绝对百分点的收益,在线的CTR有7.5个相对百分点的收益,这是非常重大的改进。 

这个项目不仅仅有一个很好的实际效果,在算法的领域上也有一定的突破,我们之后也打算把这个整理一下,在期刊上去发一个内容来试一下,今日头条是第一次这么做的。

第三个例子,算法和产品,UI的结合。今日头条不仅仅有文章还有视频,视频的低质内容的控制是很重要的,我们有很多的办法去改进这个问题,有一些账号去评级,通过账号订阅的比例,效果都不好,之后我们用了一个办法,效果会大幅度的提升,说出来大家会觉得很简单,点赞。

今日头条在视频播放的列表页放出了顶踩按钮,这样的使用就会大幅的提升,所以通过简单的加入顶踩的数据的统计,会对低质的打击效果明显提高。这就是一个很简单的,就是和产品结合,大家很多时候会举很多的例子,比如说以前肥皂盒的例子,技术的方案就是要解决问题你有简单的方法去解决问题这才是更有意义的创新。

专题访谈

合作站点
stat