做事情要坚持,所以我还会在简书继续写下去。但是,我还是需要给大家解释一下消失的原因 -- 去工业界干活去了。现在人工智能是风口,所以各个公司都在焦虑。跟风吧,怕风停的时候摔死。不跟吧,怕大家都飞远了,自己还在地上跑。
经过将近两年的摸索,学习和实践,商用化,我对于机器学习的实践和落地的观点非常坚定了,那就是机器学习需要套路,而这个套路就是数据,算法,硬件。一切都是围绕这三件事情来做,而做事的需要人。现在市场上基本上充斥着统计出身的老妖怪,或者做软件的深度学习调参狂人,再就是漫无边际的微信架构师,头条机器学习达人,能够从规划云主机,配置centos或者ubuntu,安装GPU驱动,设计CPU+GPU计算集群,安装Anaconda和各种坑人的开源库(包含各种C库,比如OpenCV支撑视频,比如Kaldi支撑音频,比如fastText支撑文本),创建各种虚拟环境,tensorflow0.12,tensorflow0.9, tensorflow 1.0, theano, pytorch,安装hdfs,保存各种动辄几百G的文件,或者几千万个1k,2k的小文件,安装spark,安装ELK,安装Mongodb,Cassadra,Neo4j,写各种awk,perl,shell script,写各种SQL statments,从raw文件到csv文件,从csv文件到数据库,从一张表到另一张表,无穷无尽的格式化,过滤分割,过滤合并,过滤打标,过滤统计......等把数据整理好了,真正的长征才刚刚开始。tensorflow上的算法多,但是大多数都是原始的概念,不是运行起来无比复杂,就是跑了几个小时就挂了,或者在README.MD或者论文里面讲得效果如何如何的好,拿我自己的数据一跑,不是过拟合,就是不收敛,特别是跑文本学习数据的时候,大部分原创算法都是老外,或者在外国的中国人写的,使用的语料不是facebook就是twitter,本以为只要把中文分个词,或者按单个字处理,就可以套用英文的模型,结果完全不是那么回事,除了TF-IDF这类不涉及语法语义的算法还能这么移花接木的干,其它算法基本抓瞎。算法跑英文的结果能够很快收敛,换成中文,就看见cross entropy上蹿下跳的。预处理的格式也是千奇百怪,对话模型,有的是XML的格式,有的是Json,有的自成一套,编码格式也是GBK,UTF-8,GB2312,好容易可以把数据加载进来,过了第一关,你能得到的就是train_x, dev_x, Y_train_Y, dev_Y。接下来才是真正的考验,一个算法通常由运行模式,参数数据,模型数据,学习数据,评估数据等等组成,仔细的话,需要话2-3天看人家的论文了解算法主体,然后才能下手去写代码,写代码之前还要斟酌使用什么框架来做,毕竟从头写这种事情,我是不敢想,也不敢做的。还好,现在tensorflow一只独大,pytorch偶尔有一个半个好框架,但是架不住用tensorflow的人多,而且你越是用tensorflow,下一次你还会选择用,除非是你拿到一套代码是用theano,pytorch什么写的。抱歉我从来不提CNTK,为什么?你都不肯支持MacOS,我验证个算法还要装个ubuntu的虚拟机在我Macbook pro上,你说我会用CNTK吗?不管是自己写还是找来的算法,基本上开始都不会有什么好结果,为什么?第一,写的代码本身可能写错,比如数据形态处理错了,矢量,数据,矩阵,列表,字典在算法里面变来变去,格式错误。第二,算法大多数都是组合的,基本上很难直接估计收敛,所以基本上要靠固定大部分参数,对于一个参数大距离增加和减少来快速感知算法收敛的方向,这个过程非常原始而又不确定,我一直很渴望采用一个神经网络来调参,苦于我自己研究能力还不够,尝试了几次都无法正确对参数调整建模,但是我一直在关注那么使用神经网络来调参的研究。第三,随着机器学习的普及,大家对于机器学习的效果不再是一开始能够识别个手写字体,认个猫就哇哇的了。
隔了好长时间才更新,但是我会坚持写完。现在大家一般也都过了git clone个代码,wget或者curl个数据,python xxxx的阶段,或多或少手里都玩过一些机器学习的模型,目前大家最大的问题是手里有不少鸡肋模型,你说没用,confusion matrix还看得过去。但是你真指望去用,还真没办法用,为啥,分类/预测/识别率基本上在50%-70%徘徊。现在咋整呢?基本上就三板斧:
第一,你有足够数据吗?可劲的喂给模型去训练,祈祷是模型见识的数据还不够多,但是我觉得这种侥幸的心理不可取,你碰到了,算你走运,可是我可以说绝大多数情况是你全部数据都进去了也是白搭,为啥?你没明白为什么指标不高背后的原因。还有不服气的,说换个模型,反正天天有人往aexiv上投算法,github天天有各种算法改进版,这不是还是碰运气吗?不过,我觉得这个做法对于能力不足以自己优化模型的团队可以尝试,但是忠告是,你先有一个评测框架,把各种算法,各种数据扔进去测,快速评测,意味着你可以快速取巧,特定数据,特定算法,整体框架是一个逻辑上的随机森林(你且想象去吧)。至于调参这种事情,其实你可以自己想想,除非你使用调参程序,不然和应激反应的草履虫差不多,顾此失彼,在欠拟合和过拟合之间摇摆。所以,数据,算法,参数,这些加在一起,我算是第一板斧,也就是本能的调优,不是不好,是太碰运气了。
第二,现在开始进入真正的调优,理解模型的问题。模型千千万万,我这里限定范围,基本上就是机器学习和深度些许大路货的识别,分类,聚类,预测用,找例外很容易,搞定大路货才是真理。那么关键在于理解模型的误差。我尽量回避数学表示,因为我相信绝大多数人和我一样对于在网页编辑器里面输入公式抱有一种厌恶,所以我只套用数学老师的一句话“因为xxxx,所以我们很容易得到xxxxx”。这里,我说我们的模型的输出和实际输出之间的误差很容易表示成一个正态分布,并且拆分成为方差,偏差和不可消解的误差。说白了,模型训练的问题在于结果误差,误差能够想办法的就是偏差和方差。偏差对应着模型结果和实际结果的偏离程度,方差对应着模型结果围绕着实际结果波动的程度。继续一路跳过40-50个公式,直接看结论,为啥,互联网时代,我知道你们都要答案,不看过程,至于能不能理解结论从何而来,对于吃惯了快餐的浮躁的大众,已经不重要了,anyway,结论就是你发现你的模型出现偏差很大,也就是模型结果严重偏离训练数据,那么证明你的模型还不了解数据和数据形态,简单,增加描述数据的维度,就像是素描,看着不像,继续描嘛,多项式加高阶项,同时减少正则参数兰博达,不要问我为什么,有效果的话,请继续服药。如果模型的问题是波动,不收敛,那就是模型那没有找到数据变换的节奏,一个是训练数据提供的数据变化不够丰富,这个时候增加训练样本是有意义的,因为波动可能来自无关紧要的离群值,所以减少特征集合的size,同时增大正则参数,还是不要问我为什么。如果这个时候没有效果,请选择第三板斧。
第三,很神奇的第三板斧,自动化调参。KDnuggets 的主编 Matthew Mayo 写了一篇文章介绍了 AutoML 的概念,以及为什么要做自动机器学习。本文后附 AI 软件工程师 Thibault Neveu 发表在 Medium 的文章,介绍他如何训练神经网络自动编程。我曾经很兴奋,但是现在有些绝望,原因很简单,谁xxx的实际模型就这么简单,能够这么简单的模型,我看看,喝杯咖啡我也调出来了,还要费神写这么多p代码。但是,我内心有个小火花,就是有一天,AutoML能够逢山开路,遇水架桥。
写到这里吧。
戴德曼2017年7月14日于坡县