2013年总结

大概从去年9月份(研一开学)开始接触机器学习。到目前为止也有一年多,最近身心无力,有一种严重的挫败感。

最开始的时候关注搜索引擎,大概在去年8,9月份吧,最初是从北京理工大学的一篇论文开始的,那篇论文貌似是发表在2010年的KDD,主要讲的是根据标签密度抽取网页内容的方法。也是偶然从一个QQ群里看到有人讨论这篇论文,然后就拿来读了读,用C++写了网页爬取的程序,爬了一些新浪博客的内容,又用C++简单实现了一下论文的方法,先调用一个xml库将网页解析成DOM tree,然后获得tag之间的内容,密度值设置30左右时效果最好。后来就没有继续在做,主要是觉得太机械,不够智能。现在挺怀念那段时间的,虽然什么都不懂什么都不会,但是有很多时间可以尝试去做自己感兴趣的事情。而且那时候心态一直很好,什么问题都敢问,即使被人嘲笑了也觉得无所谓,就觉得自己很差被别人嘲笑也没什么,还有很多时间去学习,去做自己喜欢的事情。

九月份研究生开学,最初的一个月我一直处于恍惚之中,不是精神恍惚,是有些不敢相信现实:在社会上晃悠了将近2年的我,怎么现在又坐在教室里了?呵呵,现在想起来自己挺搞笑的。最初的一个月,几乎没怎么睡觉,每天都很亢奋,晚上睡的很晚,早上起得很早,从网上查机器学习的基本模型算法,计划一个个先学习一遍。花了将近一个月学习决策树,主要时间花在了看懂源码上了。现在觉得不该那么学习,方法不对,特别是要读懂上千行的代码,感觉有些不值得。

后来,爬微博上的内容,从网上搜集了一些资料,模拟登录新浪微博,以浏览网页方式爬取微博内容,用python写的,不过大部分代码都是从网上找的,根据微博ID一个一个爬,从文件中读取ID,发送命令,获取返回字符串,保存到硬盘里。微博ID是从梁斌博士那里copy的,那天上午我跑到清华,但梁博士说不在学校,然后我就在清华东门附近晃悠了一中午,午饭吃了肠粉,真不好吃,扔了。下午找到梁博士,copy,走人,在此向梁斌博士表示感谢。。话说我看到一个牌子上写搜狗与清华联合实验室什么的,感慨他们的条件真不错。记得临走时梁斌和我说:这些数据你拿着,预祝你在科研上能取得进步!唉,很可惜,自己并没有在科研上有什么进展。由于实验室没有服务器,我的小破笔记本又太慢,所以每个ID只爬取45条微博,我算了一下,如果只用笔记本的话,要爬到第二年8月份..于是我到处找服务器用,但是没找到,后来找到2个同学借用了实验室台式机。爬回来的数据占用空间太大,又用C++写程序提取内容,本来打算用之前实现的北理工论文方法的,但是效果不太好,微博本来就140字,一不小心一条微博就被丢掉了,所以就基于标签匹配的方式提取内容,主要是有转发的情况不好处理,不过,调调程序,总算搞定了。大概持续了将近一个月吧,也不知道爬回来的数据怎么用,就没继续做了。现在想想,那个时候还处于原始阶段,也就只能弄个爬虫基于规则写个程序什么的,太简单太原始,太傻太天真。

中间去过中科院信工所面试实习生,主要是想趁导师不在出去实习学点儿东西,也是想尽快做“真正的机器学习”,面试时问了我关于爬虫的事,貌似还有一些基本的机器学习算法的问题,一切顺利,但是问到实习时间时出问题了,时间达不到要求,然后就没去成。记得我还提了一个关于分类的想法,大概意思是:特征处理成向量形式,从前向后扫描时记录1所在的位置,对于每条样本,计算一个sum += exp(index_i),然后再根据每条样本计算得到的那个sum数值分类…,不过都是瞎想的,不可行。面试时信工所老师的意思是让我去做爬虫方面的事情,后来虽然没去,不过我细细想了一下:为啥是让我做爬虫?因为我当时的能力貌似只能做爬虫…然后我就想,不能这样,我得做些更有技术含量的事情。

回到学校后继续学习机器学习算法,李航的《统计学习方法》我是从前往后看的,特别是SVM那一章,不容易看懂,我就推公式,也泡图书馆查资料…推着推着,发现自己已经不是在学习机器学习的事情了,已经完全陷入了数学的包围圈,记得当时在图书馆读一本叫做least square什么什么的书,突然我又迷茫了:这样是不是不太好啊,这成了学数学了啊。我不讨厌数学,但是我更喜欢应用数学…于是,在20天左右之后,我又不知道该怎么办了。我焦虑,失眠,甚至有些失望,我每天呆在寝室学习,晚睡早起,目的就是想多学些东西,把我自大一以来浪费的时间,浪费的知识不会来,可是现在呢,感觉不到自己的进步…

快期末考试了,我继续东一下西一下的学习机器学习,看优化算法方面的书,把本科时的数值分析也重新翻了出来。后来我觉得可能是因为我没有实际的应用场景,所以不知道具体该学什么,所以我决定找个应用方向,当时是从自然语言处理,推荐系统,数据挖掘三个方向选的,思来想去,选择了推荐系统。然后开始学习LDA,读blei的那篇经典论文,和北航一个博士师兄一起推导论文中的公式,看源代码,关于变分推理那部分的代码,真是难,还有梯度求导,花了好几个星期,期间还要参看其它论文,总之,又是一段时间的亢奋,记得那时候我经常每晚快12点了才从北航骑车回学校,冻得要死。后来寒假放假,室友都走完了,我还是每天早起晚归,还好北邮离北航不算太远。

年后,导师从国外回来了,要派我去公司实习,我是真不想去,想继续跟着北航博士师兄做事情,后来不得不去,我抱着试一试的态度过去一看,不到20人的公司,老板说,我们的技术是“国内领先的”,听到这句话我已经明白了…然后就是找导师谈我的想法,说我已经做了很多努力,想在机器学习这条路上走下去,花了不少时间和精力,导师同意了,所以我必须回实验室。记得是今年(2013年)的3月22号,我搬到了实验室,我说打算做推荐系统,导师就说让我要找到新的问题,要多看论文,可是我不知道怎么去找到新的问题,导师告诉我说,就是多看论文,你做的东西我也不懂,全靠你自己了。然后我就到处搜集论文,到处查资料,先行综述看起,看了一些论文,做了一些PPT,然后,问题还没有找到,我也很着急,可是也没办法, 我问导师:关于如何找到新问题,如何读论文,有没有一套方法论的东西?导师说没有。那好吧,我实在没办法了,继续读论文吧。然后发现online learning应该是个不错的方向,所以就查资料,关于online learning的一些算法,以及reinforcement learning的资料,还找到了VW的源代码去看,可是,我又陷入了一个误区,看什么源代码啊,要发现问题思考问题啊,唉,时间就是这么浪费的…

5月份的时候,我觉得推荐系统不好找到新问题,我觉得做个比较新的方向吧,应该容易找到新的问题,然后我就关注计算广告学,看刘鹏老师的视频,查相关资料,读相关论文。期间参加阿里实习生面试,通过了,6月底了才让去入职,话说效率好低。去了公司,亢奋,我每天6点就起床,先坐公交再坐地铁,7点10分左右能到公司,比别人早去2个小时。早班地铁上人少,我就拿起论文看。每天这样,一直到实习结束。实习的内容就是读读论文,讲讲论文,大部分都在读吧,一共讲了3次,然后就是一些小项目小程序,接触到了hadoop, 写了hadoop job, 对展示广告有了深入的了解,也做了一些实验。最大的收获是改掉了之前拿起论文就开始推导公式的坏毛病,都不看论文是解决什么问题的,这和之前的经历有关,之前做推荐方面的事情的时候,由于是跟着别人学习,所以自己just do, 没有问过why。也就是没有独自思考问题的能力。实习期间向刘鹏老师请教过,刘老师说E&E问题还有的搞,但是比较难,可是,我正是那种明知山有虎偏向虎山行的人,我一听比较难做,又亢奋了,就搞E&E了!所以整个暑假除了ctr预估方面论文,就是E&E的论文,快开学的时候,开始coding,打算把baseline实现了。开学后我把想法和导师一说,导师说只是个比例问题,还是不要搞了,所以就没继续做了。

回到实验室,重新开始关于ctr预估方面的学习,暑假的东西真是白做了,好痛心。又是一顿狂搜集资料,可惜的是这方面资料比较少。后来我一想,先实现baseline吧,就是线性模型logistic regression。找来kddcup 2012 track 2的数据自习研究,给自己的笔记本添了内存条,达到16G的土豪配置。然后学习MPI,Redis,处理数据,用C++编程…5900万的维度,1100万的样本,并行logistic regression,SGD的并行,读了AUC的资料,用C++写了个计算AUC的程序,一算,AUC最好才0.55,我还不如扔了算了……

过去的一年,我失败的一年,每天很忙碌,但是过的很乱,我现在很受伤,很受打击,最让我觉得毫无意义的是收集资料的时间,有时候想解决一个问题,论文就在那里,可是我却好不容易才找到,这些不是只靠输入关键词就能找到的论文,是最浪费我的生命的!我很羡慕那些有人指导有人带领的同学,他们的师兄师姐随手指定一些论文,就可以安心去读了。而我却还要一边读一边判断是否是我需要的,虽然有些是可以通过introduction或者conclusion直接判断的,但是有些是开始觉得是我想要的,然后看着看着就发现不是了,所以就丢掉继续找下一篇…就这样,TM的我的时间就这样没了!!!我到现在也没能仔仔细细认认真真读过超过20篇论文。时间总是在忧郁不觉中慢慢流逝,到头来什么也没得到。我有不少书,凸优化,PRML,MLAPP,每一本都是读一些,或者跳跃着读,从来没有系统的完整读过一本。

到现在我突然觉得自己一无所获,一无所有,搞了一年的机器学习,感觉还不如别人天天没事儿刷刷题。但是我不后悔自己的选择,只是,接下来的一年要改变学习策略了。从现在起,有一年的实习时间,如果能找到合适的实习机会,就继续把全部精力放到机器学习这件事,继续做自己喜欢的研究性学习。如果不能找到合适的实习机会,那就把时间放在安心读书上,首先要做一个合格的码农。

未来的计划一是花时间继续刷题,而是认真读书PRML,MLAPP,convx optimization(感觉不如numerical optimization好啊),matrix analysis…去TM的论文,再也不会像以前那样花大量的时间就为了找到一篇论文!受够了!!!

百度计算广告学沙龙笔记

夏粉的分享:

        首先解释计算广告学,追求的是,在一定环境下用户与广告的最佳匹配,这里的一定环境下,包括用户的query,当前浏览的网页,也有一些用户个人信息,但是比较少,这是用户的隐私数据,不好拿到。

        点击率预估的问题:

                1表示用户点击,0表示没有点击或者用户根本没看到,这个和推荐系统中用户评分差不多啊,没评分的可能表示用户根本不感兴趣或者用户根本没看到。关键的问题是:特征维度高,数据量大(每天可能上亿次的请求)。

        数据预处理的问题,首先是展示于点击日志的拼接,我之前以为是在一起的。包括两方面:日志->数据,这是行上的处理,比如抽样,去除缺失数据什么的;日志->特征,这是矩阵中列的处理。

        数据/特征规模的问题:百亿广告(行),千亿/百亿级的特征(列),一个问题是类别不平衡(点击的少,未点击或者用户根本没看到的多),噪声大(恶意点击等等)。

        特征复杂度高:特征之间高度非线性,举个栗子:不同性别不同年龄段的人关注的广告不同,人工组合方式把特征的非线性表示出来,例如:什么样的人在什么时间应该展示出什么样的广告。话说我觉得应该是response与特征之间的高度非线性问题吧?不是特征之间的非线性,response可能依赖于非线性的某些特征,而这些特征根需要人工或者机器组合得到。

时效性高:点击率随着时间变化,也就是随着时间人的兴趣会变化。

话说核心还是人啊,有些情况下即使输入的query和广告毫不相关,用户也可能以很大的概率点击广告。当然,大部分情况下,query还是能反映出用户的一些意图的,从而推断用户的后续行为。

        新广告或者流量的上下线。

        数据训练频繁:包括模型更新,比如从LR->DeepLearning.另一个是策略调整(不明觉厉)。因此需要快速,要做的是1获取主要信息,2去噪,所以选择对点击概率分布足够多的样本。

        数据处理,去除一些可见/不完整样本,或则机器学习的方法进行样本采样。google的做法:某个query对应的广告一个都没被点击过,则以概率p去掉该query,但是在训练时对那些以P为概率删除的样本乘以一个权重r.目的是为了补偿它。具体见google的论文<>

        要用尽可能少的特征表示模型的数据,具体方法包括特征选择与特征删减。模型要小,满足速度上的需求。

        主要包括大量id类特征,少量连续型特征。注意是大量id类,少量连续型。id类特征使用one-hot encoding的编码方式。

        然后是一个loss function,和之前见到不同的是在非正则化项前加的C,等值线随着C的增大扩张,直到与约束(正则化项)相遇,最常见的是L1范数正则化。其实和之前的都一样。

        特征删减:虽然特征那么高维,其实模型真正能用上的特征是比较少的。可以在训练前判断哪些特征的权重可能为0,比如可以根据点击的情况,也就是真实的反馈判断哪些特征权值为0,可以用一个公式衡量特征的分数,例如百度的Fea-G算法(screening test?),新的特征以概率P加入;bloomfilter + 次数超过n次的才加入;google的做法。

        人工特征工程:构造高阶组合特征,描述特征间非线性关系(我还是觉得应该是response所需要的非线性特征之间的关系。ps:到底是特征间非线性关系,还是response与非线性特征之间的关系(线性or非线性)?),如下方法:1,人工经验,耗时,也容易达到上界;2,枚举,太慢了;这两种都无法泛化(泛化能力很弱)。

         下面,高大上的Deep Learning登场:

             DL能自动学习feature,在语音和图像上的情况是:特征少,数据量大。比如28*28的图片可以有几千万张。但是在计算广告学领域,特征的特点是大规模稀疏特征,1,目前尚无专门针对大规模稀疏特征的深度特征学习算法,2,主要是样本相对特征不充分,样本量相对特征量来说比较少。

            针对第一个问题,需要降维的方法,针对第二个问题,需要把样本相对多的找出来(比如PV比较多的feature,要充分学习一个feature,需要包含该feature的样本充足)。

不过,网盟团队研发了能直接应用于大规模sparse特征的深度特征学习算法DANNOVA。逐层贪婪算法(这个信息比较有用):单特征->二阶组合->高阶组合。PPT上有个图。另外的问题:训练数据要少,模型需要稀疏才行,这样速度才会快。

            优化算法:google保留前N次的梯度,这个貌似是针对L-BFGS说的?每条样本要多训练几次,一次学不完样本中的所有信息(这个我没明白,一次不久行了吗?)。SOA算法,貌似是模型优化算法?

            对于L-BFGS算法来说,每一次的梯度之差,步长之差都要保留,为了根据割线定理计算hession矩阵?,由于是个向量,而且维度上千亿,所以对内存是个很大的挑战,而且,当特征矩阵的谱很大时(特征值变化范围较大),收敛速度慢;启动慢,每次重新训练时都要先得到历史上m次的梯度之差,当初始点离真实的解很近时不能很快收敛到真实解。百度自己的shooting算法,对hession矩阵分块,使得特征值差不多的靠的更近。

    陈雨强的分享:

        首先说广告中的长尾分布,长尾query,百度每天有约20%的query是历史记录中从没有出现过的。长尾问题,是针对query的长尾。不是广告的长尾(展示广告中是广告长尾?)理解点击:1,广告并不是用户所需要的信息(这个容易理解)2,不只是<ad-query>语义。做搜索还行,做广告就不行,对搜索广告来说,语义不是最关键的。

        数据比较复杂,则模型也要复杂;数据与模型要线性的?(模型与非线性特征之间的线性?)。常用的方法:大量特征+线性模型;小量特征+非线性模型。

    各大公司的方法,来自于论文以及各种传说:

        1,小规模feature + 非线性模型:MS:浅层ANN;yahoo!:GBDT;淘宝:局部线性LR(从盖坤的PPT上可以看到);facebook:二层结构,low hierarchies + high hierarchies

        2, 大规模特征+线性模型:百度,特征精细描述用户行为,比如query是否有空格等等。

        已经证实LR对ctr预估问题有效。通过设计特征提升准确度,feature engineering.

        L-BFGS:特征向量上千亿维,一条历史记录的梯度都要占用很大内存。可以使用坐标下降法,随机挑选n列(虽然是随机,但是要尽量使得能遍历全部)update。

        优化数据流:所用时间少。

        LR:人工加特征,组合特征。但是,人工的方式目前已经没法做了,如何改进?

高大上Deep Learning:

        1,学习高层特征,2,逐层贪心算法学习(again)。

        DL所遇到的问题:1,特征维度太高,2,模型不能太大,因为要数十毫秒内给出结果(只在线上的时候)。所以要对特征降维:各种降维算法(主要针对id类的,embedding function),连续值型的没必要了。

        对于大规模feature,使用cpu/LBFGS即可;小规模feature(容量合适的情况下),可以使用GPU()。

        另一个问题:E&E问题,这个就是机制的问题了。baseline算法比如LR可以接触到更多的badcase,从而很好的训练模型,DL接触的机会小,难以说明是不是改进的算法不行。

        大家提的一些问题:

         1,特征降维:根据特征的层级性。2,数据分布不一致:迁移学习,原数据->目标数据,通过学习数据量比较多的原数据的特征,加入到目标数据中,另外,定义元数据与目标数据的相似度。3,要实用更通用的特征,泛化能力强。4,分布式,SGD不适合分布式,mini-batch SGD,一般是100左右的batch。异步SGD。

总结:

    核心还是人。

    网搜和商搜用DL的方式不同:网搜直接针对高维稀疏特征,输入是单特征;商搜是先降维(有监督、无监督方法),针对categorical variable降维。方法还是逐层训练不是直接BP。

    另外夏粉提到的数据压缩Fea-G,不知道是指的哪些方法。

    DL省去了人工组合特征,让机器自己找,有监督的方法会不会更好些?特征可以是高阶,但是特征和模型要线性。

    以前考虑广告数据和图像语音数据的不同,图像,语音数据具有结构性,可以抽象出直观的high level feature,所以DL取得的效果比较好。现在觉得,那并不是主要原因吧,关键应该还是非线性模型对线性低阶特征的拟合。

    至少知道了我之前的想法中哪些是合理的,哪些是无解的。没办法,没人带就自己一点点儿琢磨吧…