浅谈机器学习里面的距离问题
本来想直接写浅谈数据结构的,但是发现这是一个计算机专业的术语,里面涉及了堆栈,数组,队列,图什么的,和我想说的并没有太大的关系,我可能更想说的是算法这一块。
算法太多了,就我了解的比较经典的就有线性回归,SVM,PCA,ICA,CCA,CNN等等,不一而足,懒得赘述。我想说一个最本质的东西,这应该是我在写了几十张草稿纸的计算,写了几个月代码之后,感觉最为重要的东西。就是一个词,距离。
这里的距离不是距离产生美的距离,也不是实实在在的距离,不是线上的距离,不是面上的距离,不是空间上的距离,而是数学里面抽象的距离。我没办法说的更形象一些,但是数学里面有明确的定义,一个是非负性,一个是你到我的距离等于我到你的距离,一个是满足三角不等式。笛卡尔给出了直角坐标系,向量的内积便是投影。如果我们把不同的向量往同一个方向投影,是不是就可以将不同的投影值看作是在该方向上的距离。PCA的主要问题就是寻找这个投影方向,教材也许有个很专业的说法叫做将方差最大化。当然求解时候得算特征值特征向量,遇到奇异矩阵还得做一些变换,都是题外话。
我自己这样总结,距离是个标量,所以用来比较大小再合适不过。多维的数据本质上是个多维的向量,要进行大小的比较自然很不方便,这里有个高大上的词,赋范向量空间,简言之就是个映射,将一个向量对应到一个非负实数,然后就可以比较大小了,这就是我理解的距离。测度论里面类似的映射还有一个,分布,注意了,这里还不是常说的分布函数,分布的常用形式是分布函数和特征函数。分布,是一个定义域为波雷尔事件域的一个实值函数。按照的我的理解,我们所说的概率的大小其实本质上经过了两次变换,单纯的概率是没有办法比较大小的,它必须映射到一个实数,比如抛掷硬币正面朝上的概率是0.5,买彩票中奖的概率是0.01,那我可以说为了获得些许成就感,我会选择抛硬币玩,而不是买彩票玩,这个时候,我们其实已经将距离比较完大小,回到波雷尔事件域了。
如果PCA是比较哪个方向的方差最大,那么CCA就是比较哪个方向的相关性最大,都是映射到非负实数集合。除了比较谁大,自然可以比较谁小,线性回归问题就是研究实际值与回归值的距离问题,自然是彼此越近越好了。同样的,我们需要从向量空间转身,来到赋范向量空间。利用矩阵的乘法,假设我们已经找到解,可以很快得出回归的参数。但是很多时候,我们想另辟蹊径,导数这么好的东西干嘛不用呢。线性回归可以求导,毕竟Convex的问题,不至于会出现两个极值点。SVM则是将求导运用到了更高的境界,这个方法有个专门的名字,叫做拉格朗日乘数法。拉格朗日告诉我们一个真理,我们可以找到一个点,一阶导为零的同时满足约束条件,我们可以用一个参数或者一组参数描述这个约束条件在范数空间的移动。
前面说过CCA要算两个向量之间的相关性,CNN里面则计算信号之间互相关和卷积。一般我们把神经网络比作黑匣子,因为信号之间卷积后,人类很难再从直观上进行解释,将中间层的卷积结果拿出来看会显得非常鬼畜。如果说哪里还用到距离的话,我们可以对训练结果进行打分,比较和理想值的距离,从而调整训练参数,哈哈哈,开始胡扯了。