我解释下变量生成技术。变量生成技术不是我说的,同事问我有没有这项技术。我想了想,我还真在Yann LeCun(AI三巨头之一,Facbook人工智能实验室负责人)深度学习讲义上看过,于是,我把部分内容翻译了一下,太难的我就不翻译了。YannLeCun中文名是燕乐存,还有人叫他燕赤侠。
燕赤侠认为我们常用的线性机器算法(线性回归、感知器、逻辑回归)是有局限的。这个局限就是,线性识别器(不同类别的边界是一个超平面)实现线性可分是有很大局限的。看图比较清楚。
燕赤侠这么说是有理论根据的。这事儿半个世纪前就有定论了。1966年Cover证明了N个维度下,当P值远大于N值时,线性可分的概率逐渐趋向为零。这个拗口的定理,实际上是机器学习里为什么使用变量生成技术的动机(维基百科)。
假设P=1,办公室只有小王一个人,小王是男性,我们登记了小王周一到周五外卖都点了啥(N=5),周一小炒、周二叉烧等,然后我们当然可以宣布,周一到周五点这些菜的是一名男性。随后办公室来了小李,小李也是男性,算上小王,办公室里P=2,因为P<N,所以无论小李每天点的菜是不是和小王一样,依然可以大概率把小李和小王判断为男性,但是当P的数量增长,出现女性员工,当P=5,P=N时,单纯使用周一到周五吃了啥,男女线性可分的概率降到50%,等员工越来越多时,线性可分的概率降为零。
燕赤侠指出了其中的问题。如果想判别P个人的性别,实际上有2^P种可能的二次线性可分。可是,只有N个变量,即只有N种线性可分的可能。很明显,不够分嘛!当P越来越大,线性可分的概率那是越来越少、越来越少。
引申一些问题。为啥人类社会是组织化的?几个人工作叫小组、组大了变科室、科室大了变部门、部门大了变公司。可不可以这样理解:人类在组织思维上仍然停留在线性可分的层次(或者高一点点)上,当组员数量到达一定瓶颈时,实现有效划分的概率为零,必须上升至科室的层面,1000名男女老少分到20个科室,同理推至部门或公司层面。
再扯远一点,滴滴公司下的司机算不算去组织化的?出租车司机原本在每个地区隶属于不同出租车公司的,例如,广州出租车,不同颜色代表了不同的公司,提供类似服务的滴滴公司在全国却只有一家。有人说机器社会的效率要远高于人类社会的效率。
燕赤侠又画了两张图。然后说,很多看似很简单的二分问题不能线性划分,这种情况下,我们怎么把它变成线性可分的呢?
燕赤侠接着说,还是有办法教计算机画圆的。这个办法就是我们初中学过的二次多项式。(x1+x2)^2=x1^2+x2^2+2*x1*x2,原先两个变量,加起来,再来个平方,是不是不一样了。按这个玩法,原来N个变量,可以扩展至N*(N+1)/2,例如10个变量,这么一搞,就变成10*11/2=55个变量,结果很可观啊!二次多项式可以教会计算机什么呢?除了画圆,还可以画抛物线、双曲线。
刚才玩的是二次多项式,如果扩展到三次、四次多项式,好不好啊?燕赤侠说,同学们,不行啊。这么搞,要计算太多参数,会搞死计算机的。例如,手写数字识别,每个数字有256个变量,二次多项式后,变量扩展到32896,三项多项式后,变量扩展至2796160,四次多项式后,变量扩展至247460163.....,这是坑爹的节奏啊!
多项式能解决部分问题,只是高阶多项式后,新增的变量控制不住啊,跑得太远。燕赤侠随后介绍了一个方法,其实也不新了,就是核函数(kernals)。
其实把多项式和核函数放在一起比较,就比较容易理解了。
我觉着燕赤侠的手绘画极好的。核函数(Kernals)最早的历史可以追溯至1909年,很遥远。查百度百科,有一个非常复杂的解释:核函数包括线性核函数、多项式核函数、高斯核函数等,其中高斯核函数最常用,可以将数据映射到无穷维,也叫做径向基函数(Radial Basis Function 简称 RBF),是某种沿径向对称的标量函数。再往下,就是希尔伯特空间了。总之,啃下这些字怕得花一段时间了。
其实,燕赤侠下面这张讲义,是有很多线索的。我们刚刚提到当样本数量P大于变量维度N的数量时,线性可分就变得越来越不可能。但是当P=N的时候,线性可分的概率还是有50%的。看看下面手绘图,输入变量X的上一层是不是有P个红盒子啊!先不管红盒子干什么的,变量维度是不是从N增长到P了?是啊,好神奇啊,怎么做的啊?再看一下标题,Sample-Centered Basic Functions,以样本为中心的基函数,每个样本点作为一个变量生成器,P条数据是不是就有P个变量了?线性可分的概率是不是增大了?这也解释了工程上的一个问题,系统上部署一个模型,模型有20~30个关键变量,用户数量不断增加,就是P的数量在增长,按说P的数量很快就会超过变量数量,线性可分会变得越来越难,为什么我们没有高呼“加变量!加变量!”,或者“换模型!换模型!”,因为核函数保证了变量数量始终和样本数量是一致的,所以模型是可以稳定存在一段时间的。
先讲到这里。有些问题在实践上还有非常多的细节要考虑。我基本上照着燕赤侠的手绘图去理解这件事的,太学究的事情,我也没太考虑。我再讲讲这件事的背景,大家一定喜欢。
事情是这样的。前天同事给了我一份别家公司的PPT,我看了一下,里面提到他们可以把20个变量通过变量生成技术自动生成万级变量,使得模型越发精准。这个我没太在意,然后不靠谱的是,他们说“冠军挑战者比赛”是他们的创新,我当时眼前立刻飘来“从未见如此厚颜无耻之徒!”,但这也没什么。紧接着,另外一个同事开始向我询问变量生成技术,我意识到事情的严重性,“各位同仁,这个坑咱不能跳啊!”。所以,就有了上面这些罗嗦。我也不知道大家明不明白,那我就再高呼一下:
变量生成技术只是为了线性可分,实现这个事不难(从核函数算起,可有100多年了),计算资源充足的话,用三、四阶多项式也可以实现啊,但是这样资源消耗下,提高那么一丁点性能,到底值不值得啊!打火机接煤气瓶,天天带着,80年都不用灌气哈!
下午和一家公司的IT总监交流。他说他们比较头疼的是,怎么将多家数据公司的几千维度数据进行整合,这些数据之间是冲突的,整合完再建模,真正用起来的关键变量也就几十个。实际上是这样的,传统的风控模型都是要规则化的(这个我和他讨论了下,如果不搞规则化行不行?),如果真搞上万的变量,规则引擎放不下啊!
这行当混水摸鱼的实在太多,如影相随,只能努力提高知识水平了。
吹牛和扯淡都不是长久之计!
简书第一篇,要抄拿去,不保证正确,拿去吹水,小心吊打!