This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
<audio id="audio" title="11 | 基础线性回归:一元与多元" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1b/d0/1b3b95f45c0a3cb24a017cbc638273d0.mp3"></audio>
从今天开始,专栏将进入统计机器学习模块。虽然统计机器学习中千姿百态的模型让人眼花缭乱,但究其本原,它们都来源于最原始的**线性回归**linear regression
在我看来,**线性模型最大的优点不是便于计算,而是便于解释**。它能以简洁明了的方式清晰体现出输入的变化如何导致输出的变化。正所谓“一生二,二生三,三生万物”,将不同的改进方式融入线性模型的基本思想中,就可以得到各种巧夺天工的复杂方法。
在第一季“人工智能基础课”专栏中我介绍了线性回归的原理证明了当噪声满足正态分布时基于最小二乘法least squares的线性回归和最大似然估计是等价的。
[《机器学习 | 简约而不简单:线性回归》](https://time.geekbang.org/column/article/1865)
这次我们换个角度,来看看**最小二乘法的几何意义**。之前,线性回归的数学表达式被写成$f({\bf x}) = {\bf w} ^ T {\bf x} = \sum_{i = 0}^{n} w_i \cdot x_i$。但在讨论几何意义时,这个表达式要被改写成
$$ f({\bf x}) = 1 \cdot \beta_0 + \sum\limits_{j = 1}^n x_j \cdot \beta_j = {\bf x} ^ T {\boldsymbol \beta}$$
可别小看这个简单的写法变化,从列向量$\bf x$到行向量${\bf x} ^ T$的改变就像矩阵的左乘和右乘一样具有不同的意义。
当输出被写成${\bf w} ^ T {\bf x}$时,其背后的寓意是每个包含若干输入属性和一个输出结果的样本都被视为一个整体,误差分散在不同的样本点上;而当输出被写成${\bf x} ^ T {\boldsymbol \beta}$时,其背后的寓意是**每个单独属性在所有样本点上的取值被视为一个整体,误差分散在每个不同的属性上**。但横看成岭侧成峰,观察角度的变化不会给观察对象本身造成改变,数据本身是没有变化的。
假设数据集中共有$N$个样本,那么${\bf x} ^ T$就变成了$N \times (n + 1)$维的数据矩阵${\bf X}$,它的每一行表示的都是同一个样本的不同属性,每一列则表示不同样本中的相同属性。如果待拟合数据的特性完美到任意两个属性都线性无关的话,${\bf X}$就可以看成一个由它的所有列向量所张成的空间。
一般来说,属性的数目$n$会远远小于数据的数目$N$,因此${\bf X}$张成的是$N$维空间之内的**n维生成子空间**,或者叫**n维超平面**。这个超平面的每一个维度都对应着数据集的一个列向量。理想条件下,输出${\bf y}$作为属性的线性组合,也应该出现在由数据属性构成的超平面上。但受噪声的影响,真正的${\bf y}$是超平面之外的一个点,这时就要退而求其次,在超平面上找到离${\bf y}$最近的点作为最佳的近似。
<img src="https://static001.geekbang.org/resource/image/91/6a/91630269661d3cb444d8c8beafef606a.png" alt="">
最小二乘的几何意义图片来自Elements of Statistical Learning图3.2
在上图中,黄色区域表示由所有属性张成的超平面;黑色向量$x_1$和天蓝色向量$x_2$表示输入属性;红色实线$y$表示真实输出,水平的红色虚线$\hat y$表示数据的最优估计值(属性的线性组合);垂直的红色虚线表示$y$与$\hat y$的残差,它与超平面正交。
根据几何知识不难得出,要找的最佳近似$\hat {\bf y}$就是${\bf y}$在超平面上的投影,而最佳近似所对应的系数$\hat {\boldsymbol \beta}$就是线性回归的解,点$\hat {\bf y} = {\bf X}{\boldsymbol \beta}$和${\bf y}$之间的距离就是估计误差,也叫**残差**residual它就是最小二乘法最小化的对象其表达式是$|| {\bf y} - {\bf X}{\boldsymbol \beta}|| ^ 2$。对参数$\boldsymbol \beta$求导不难得到,能够使均方误差最小化的参数$\hat {\boldsymbol \beta}$应该满足
$$({\bf y} - {\bf X} \hat {\boldsymbol \beta})^T {\bf X} = 0$$
这个式子说明了最小二乘法的几何意义:**计算高维空间上的输出结果在由所有属性共同定义的低维空间上的正交投影**orthogonal projection。投影操作意味着残差不会在数据维度上遗留任何分量这种基于误差和数据正交性的最优解也经常出现在信号处理当中。
在实际应用中,如何解释线性回归的结果呢?下面这个例子可以说明。
眼下世界杯正进行得如火如荼。如果爱好足球你一定不会对数据网站WhoScored感到陌生它的一大特色是会在每场比赛结束后根据球员表现给出评分0分最低10分最高。虽然这个评分系统能够直观体现谁踢得好谁踢得差但关于其专业性的质疑却从未停止。那么WhoScored的评分到底准不准呢我们不妨用线性回归做个测试。
如果WhoScored的评分足够合理那球员的评分就应该和球队的成绩呈现出正相关而线性又是正相关最直接的描述。为了验证球队赛季积分$y$和所有球员的赛季平均评分$x$之间是否存在线性关系我从网站上复制了2017~18赛季英超联赛的相关数据这个包含20个样本的小数据集就是训练集。在拟合数据时我使用的第三方库是StatsModels之所以选择这个库是因为它能够给出更多统计意义上的结论这些结论对于理解线性回归模型大有裨益。
<img src="https://static001.geekbang.org/resource/image/36/19/360671586fa22fed7e45426268371b19.png" alt="">
2017~18赛季英超联赛积分榜与评分榜图片来自whoscored.com
在模型拟合之前有必要对输入数据做一点处理,那就是将因变量从球队的赛季总积分转换成场均积分。在足球联赛中,一场比赛的胜/平/负分别对应3/1/0分因此计算场均积分可以看成是某种意义上的归一化使数据在[0, 3]这个一致的较小尺度上得到更加直观的比较。
在使用StatsModels拟合模型时首先要用add_constant函数在每个输入数据的后面添加一个1借此把常数项纳入模型之中接下来就可以调用OLS也就是普通最小二乘法ordinary least squares作为拟合对象计算线性模型的参数最后使用fit函数获取拟合结果。要查看拟合模型的统计特性只需打印出模型的summary。下图就是对英超数据集的拟合结果。
<img src="https://static001.geekbang.org/resource/image/05/15/05fcc9f44fa1cde4249c081b87aaaa15.png" alt="">
可以看到模型拟合最核心的结果显示在第二排coef表示的是参数的**估计值**,也就是通过最小二乘计算出的权重系数。拟合结果告诉我们,球队场均积分$y$和球员平均评分$x$之间的关系可以近似表示为回归式$y = 3.0685x - 19.4345$这说明如果所有球员共同努力将平均评分拉高0.1的话球队在每场比赛中就能平均多得0.306分。
右侧std err表示的是参数估计的**标准误**standard error虽然最小二乘得到的是无偏估计量意味着估计结果中不存在系统误差但每一个特定的估计值结果依然会在真实值的附近波动标准误度量的就是估计值偏离真实值的平均程度。
最后两列[0.025 0.975]给出了95%置信区间每个参数真实值落在这个区间内的可能性是95%。对于线性回归而言置信下界和上界分别是估计值减去和加上二倍的标准误也就是coef$\pm 2 \times$std err。
置信区间告诉我们平均评分拉高0.1并不意味着球队每场一定能多得0.306分但多得的分数基本在0.258到0.356之间。如果用2016-17赛季的数据作为训练数据的话这个数据的计算结果就变成了0.33——也落在置信区间之内,这也验证的估计结果的波动性。
中间两列中的t和P&gt;|t|都是统计学中的关键指标它们评估的是拟合结果的统计学意义。t代表$t$统计量($t$-statistic表示了参数的估计值和原始假设值之间的偏离程度。在线性回归中通常会假设待拟合的参数值为0此时的$t$统计量就等于估计值除以标准误。当数据中的噪声满足正态分布时,$t$统计量就满足$t$分布其绝对值越大意味着参数等于0的可能性越小拟合的结果也就越可信。
P&gt;|t|表示的则是统计学中争议最大的指标——**$p$值**。$p$值($p$-value是在当原假设为真时数据等于观测值或比观测值更为极端的概率。简单地说$p$值表示的是数据与一个给定模型不匹配的程度,$p$值越小说明数据和原假设的模型越不匹配也就和计算出的模型越匹配。在这个例子里原假设认为待估计的参数等于0而接近于0的$p$值就意味着计算出的参数值得信任。
看完第二排再来看第一排也就是对模型拟合数据的程度的评价重要的指标在右侧一列。R-squared表示的是$R ^ 2$统计量,也叫作**决定系数**coefficient of determination这个取值在[0, 1]之间的数量表示的是输出的变化中能被输入的变化所解释的部分所占的比例。在这个例子里,$R ^ 2 = 0.905$意味着回归模型能够通过$x$的变化解释大约91%的$y$的变化这表明回归模型具有良好的准确性回归后依然不能解释的9%就来源于噪声。
$R ^ 2$统计量具有单调递增的特性,即使在模型中再添加一些和输出无关的属性,计算出来的$R ^ 2$也不会下降。Adj. R-squared就是校正版的$R ^ 2$统计量。当模型中增加的变量没有统计学意义时,多余的不相关属性会使校正决定系数下降。校正决定系数体现出的是正则化的思想,它在数值上小于未校正的$R ^ 2$统计量。
<img src="https://static001.geekbang.org/resource/image/f1/12/f10dbfe18075c3370780c079b3e4da12.png" alt="">
英超数据集上简单线性回归(左)和多元线性回归(右)的拟合结果
上图给出了英超数据集上简单线性回归和多元线性回归的拟合结果其中蓝点为数据点红点为预测点。在简单回归中大部分数据点集中在拟合直线附近一个明显的异常点是中游球队水晶宫Crystal Palace
回到英超数据集的例子图形结果和数值指标都表明线性回归能够较好地拟合两者之间的关系这说明WhoScored的评分系统是值得信任的。但这个例子只是线性回归的一个特例它特殊在输出的因变量只与单个的输入自变量存在线性关系这种模型被称为**简单线性回归**simple linear regression。更一般的情况是因变量由多个自变量共同决定对这些自变量同时建模就是**多元线性回归**multivariate linear regression
与简单线性回归一样,多元线性回归中的参数也要用最小二乘法来估计。还是以积分和评分的关系为例,在简单线性回归中,自变量是所有球员在所有比赛中评分的均值,但是球场上不同位置的球员发挥的作用也不一样。为了进一步分析不同位置球员对球队表现的影响,就要将单个自变量替换成不同位置球员(门将/后卫/中场/前锋)在整个赛季中的平均评分,再使用多元回归进行拟合。
在这个实例中多元回归的属性也就是自变量被设置为每队每个位置上出场时间较多的球员的赛季平均评分的均值所有选中球员的出场时间都在1000分钟以上。
利用OLS模型可以得到多元回归的结果可如果对结果加以分析就会发现一个有趣的现象一方面多元模型的校正决定系数是0.876,意味着所有位置评分共同解释了输出结果的大部分变化,这也可以从预测值与真实值的散点图上观察出来;可另一方面,只有后卫评分和前锋评分的$p$值低于0.05,似乎球队的战绩只取决于这两个位置的表现。
<img src="https://static001.geekbang.org/resource/image/3e/3f/3eac1545011c74a9d2f0b4bbff61383f.png" alt="">
看起来校正决定系数和$p$值给出了自相矛盾的解释,这时就需要观察另外一个重要的指标:**$F$统计量**。
$F$统计量($F$-statistic主要应用在多元回归中它检验的原假设是所有待估计的参数都等于0这意味着只要有一个参数不等于0原假设就被推翻。$F$统计量越大意味着原假设成立的概率越低,理想的$F$值应该在百千量级。可在上面的多元回归中,$F$统计量仅为34.57,这就支持了$p$值的结论:估计出的参数的统计学意义并不明显。
英超数据集在统计上的非显著性可能源自过小的样本数导致的过拟合也可能源自不同属性之间的共线性collinearity。可在更广泛的意义上它揭示的却是多元线性回归无法回避的一个本质问题**模型虽然具有足够的精确性,却缺乏关于精确性的合理解释**。
假定数据共有10个属性如果只保留10个属性中的5个用于拟合的话肯定会有不止一个5元属性组能够得到彼此接近的优良性能可对不同5元组的解读方式却会大相径庭。这种现象就是统计学家莱奥·布雷曼口中的“罗生门”Rashomon
《罗生门》是日本导演黑泽明的作品,取材于日本作家芥川龙之介的小说《草莽中》。一名武士在竹林中被杀,不同当事人的供词既是不同程度上的事实,也是不同角度下的谎言。布雷曼用这个词来描述最优模型的多重性,以及由此造成的统计建模的艰难处境:当不同的多元线性模型性能相近,却公说公有理婆说婆有理时,到底应该如何选择?
将“罗生门”深挖一步,就是机器学习和统计学在认识论上的差异:统计学讲究的是“知其然,知其所以然”,它不仅要找出数据之间的关联性,还要挖出背后的因果性,给计算出的结果赋予令人信服的解释才是统计的核心。
相比之下,机器学习只看重结果,只要模型能够对未知数据做出精确的预测,那这个模型能不能讲得清楚根本不是事儿。四十年前那句名言说得好:不管白猫黑猫,抓住耗子就是好猫。这句话用在机器学习上再合适不过了。
今天我向你介绍了基于最小二乘法的线性回归模型的理解以及从统计学角度的阐释,其要点如下:
<li> 线性回归拟合的是高维空间上的输出结果在由所有属性共同定义的低维空间上的正交投影;
</li>
<li>简单线性回归的统计意义可以用$t$统计量和$p$值等指标描述;
</li>
<li>多元线性回归的统计意义可以用$F$统计量描述,但回归结果可能缺乏对模型的解释能力;
</li>
<li>机器学习与统计学的区别在于机器学习重于预测,统计学则重于解释。
</li>
本篇中的例子只以2017~18赛季英超联赛的数据作为训练数据集。如果使用不同赛季的数据训练的话你就会发现每次拟合出来的系数都不一样。这样的事实会让你如何看待估计出的系数的准确性呢
欢迎发表你的观点。
注:本文中的数据及代码可在下面地址查看。
[https://github.com/tywang89/mlin40](https://github.com/tywang89/mlin40)
<img src="https://static001.geekbang.org/resource/image/4a/0e/4a5252f252a57c57082db5580436730e.jpg" alt="">

View File

@@ -0,0 +1,138 @@
<audio id="audio" title="12 | 正则化处理:收缩方法与边际化" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/93/30/93d6e586eb1fe5d8186824c994112430.mp3"></audio>
今天的内容是线性回归的正则化扩展。正则化称得上是机器学习里的刮骨疗毒刮的是过拟合overfitting这个任何机器学习方法都无法摆脱的附骨之疽。
本质上讲,**过拟合就是模型过于复杂,复杂到削弱了它的泛化性能**。由于训练数据的数目是有限的,因此我们总是可以通过增加参数的数量来提升模型的复杂度,进而降低训练误差。可人尽皆知的是,学习的本领越专精,应用的口径就越狭窄,过于复杂的模型就像那个御膳房里专门切黄瓜丝的御厨,让他改切萝卜就下不去刀了。
正则化regularization是用于抑制过拟合的方法的统称它**通过动态调整估计参数的取值来降低模型的复杂度,以偏差的增加为代价来换取方差的下降**。这是因为当一些参数足够小时,它们对应的属性对输出结果的贡献就会微乎其微,这在实质上去除了非相关属性的影响。
在线性回归里最常见的正则化方式就是在损失函数loss function中添加**正则化项**regularizer而添加的正则化项$R(\lambda)$往往是待估计参数的$p$-范数。将均方误差和参数的范数之和作为一个整体来进行约束优化,相当于额外添加了一重关于参数的限制条件,避免大量参数同时出现较大的取值。由于正则化的作用通常是让参数估计值的幅度下降,因此在统计学中它也被称为**系数收缩方法**shrinkage method
将正则化项应用在基于最小二乘法的线性回归中,就可以得到**线性回归的不同修正**penalized linear regression。添加正则化项之后的损失函数可以写成**拉格朗日乘子**的形式
$$\tilde E({\bf w}) = \dfrac{1}{2} \sum\limits_{n = 1}^ N [f(x_n, {\bf w}) - y_n] ^ 2 + \lambda g( || {\bf w} ||_p), g( || {\bf w} ||_p) &lt; t$$
其中的$\lambda$是用来平衡均方误差和参数约束的超参数。当正则化项为1-范数时,修正结果就是**LASSO**当正则化项为2-范数的平方时,修正结果就是**岭回归**当正则化项是1-范数和2-范数平方的线性组合$\alpha || {\bf w} ||_2^2 + (1 - \alpha) || {\bf w} ||_1$时,修正结果就是**弹性网络**elastic net
<img src="https://static001.geekbang.org/resource/image/df/7b/df5e678dfc357cab477a80aac179dc7b.png" alt="">
正则化对线性回归的改进图片来自Pattern Recognition and Machine Learning图3.4
岭回归和LASSO具有不同的几何意义。上图给出的是岭回归和LASSO的可视化表示。图中的蓝色点表示普通最小二乘法计算出的最优参数外面的每个蓝色圆圈都是损失函数的等值线每个圆圈上的误差都是相等的从里到外误差则越来越大。
红色边界表示的则是正则化项对参数可能取值的约束,这里假定了未知参数的数目是两个。岭回归中要求两个参数的平方和小于某个固定的取值,即$w_1 ^2 + w_2 ^ 2 &lt; t$因此解空间就是浅色区域代表的圆形而LASSO要求两个参数的绝对值之和小于某个固定的取值即$|w_1| + |w_2| &lt; t$,因此解空间就是浅色区域代表的方形。
不管采用哪种正则化方式,最优解都只能出现在浅色区域所代表的约束条件下,因而误差等值线和红色边界的第一个交点就是正则化处理后的最优参数。交点出现的位置取决于边界的形状,圆形的岭回归边界是平滑的曲线,误差等值线可能在任何位置和边界相切。
相形之下方形的LASSO边界是有棱有角的直线因此切点最可能出现在方形的顶点上这就意味着某个参数的取值被衰减为0。
这张图形象地说明了岭回归和LASSO的区别。岭回归的作用是衰减不同属性的权重让所有属性一起向圆心收拢LASSO则直接将某些属性的权重降低为0完成的是属性过滤的任务。
而弹性网络作为两者的折中,结合了不同的优点:它不会轻易地将某些属性抛弃,从而使全部信息得以保留,但对不重要的特征也会毫不手软地大幅削减其权重系数。
对正则化以上的认识都来自于频率主义的视角。在上一季的专栏中我曾介绍过,从概率的角度看,岭回归是当参数$\bf w$满足正态分布时用最大后验概率进行估计得到的结果LASSO是当参数$\bf w$满足拉普拉斯分布时,用最大后验概率进行估计得到的结果。
这样的结论体现出贝叶斯主义对正则化的理解:**正则化就是引入关于参数的先验信息**。
但是翻开贝叶斯主义的机器学习词典你不会找到“正则化”这个词因为这个概念并没有显式地存在而是隐式地融于贝叶斯定理之中。贝叶斯方法假设待估计的未知参数满足一定的概率分布因此未知参数对预测结果的影响并不体现为满足某种最优性的“估计值”而是通过积分消除掉未知参数引入的不确定性。这个过程在之前探讨贝叶斯视角下的概率时已经通过Alice和Bob投球的例子加以解释你可以回忆一下。
在贝叶斯的术语里,将未知随机变量按照其概率分布积分成常量的过程叫**边际化**marginalization。边际化是贝叶斯估计中非常重要的核心概念它起到的正是正则化的作用。
还是以线性回归为例,假定每个输出$y$都是其属性$\bf x$的线性组合与服从正态分布$N(0, \sigma ^ 2)$的噪声的叠加,属性的权重系数$\bf w$则服从$N(0, \alpha)$的先验分布。
那么利用训练数据$\bf y$估计测试数据$y^*$时输出的预计分布predictive distribution就可以写成以下的条件概率
$$p(y^* | {\bf y}, \alpha, \sigma ^ 2)$$
$$= \int p(y^* | {\bf w}, \sigma ^ 2) p({\bf w} | {\bf y}, \alpha, \sigma ^ 2) {\rm d}{\bf w}$$
在这个式子中,$\alpha$和$\sigma ^ 2$都是独立于训练数据的超参数。在频率主义的最大似然估计中,预测结果并不会将参数$\bf w$的估计准确性表示到结果中。
而贝叶斯主义则根据$\bf w$每一个可能的取值计算出对应结果$y^*$,再对连续分布的$\bf w$取平均。
就可以得到$y^*$的概率分布,这就是上面这个表达式的含义。
对于预测结果$y^*$来说,它的不确定性既来自于训练数据$\bf y$,也来自于未知的超参数$\alpha$和$\sigma ^ 2$。
但事实上超参数只是人为设定的数值,在真实的估计任务中,我们需要得到与任何多余参量都没有关系的$p(y^* | {\bf y})$。
在全贝叶斯的框架下,要积分掉超参数的影响,就必须一视同仁地对超参数进行概率分布$p(\alpha)$和$p(\sigma ^ 2)$的建模,这些超参数的先验信息就被叫作**超先验**hyperprior
引入超先验后,目标概率就可以写成
$$p(y^* | {\bf y}) $$
$$= \int p(y^* | {\bf w}, \sigma ^ 2) p({\bf w}, \alpha, \sigma ^ 2 | {\bf y}) {\rm d}{\bf w} {\rm d} \alpha {\rm d} \sigma ^ 2 $$
看到这里,你肯定被这么多乱七八糟的符号搞的晕头转向了!因为正常人都会有这种感觉。这正是贝叶斯概率为人诟病的一个缺点:**难以求出解析解**
要计算这个复杂的积分必须使用一些近似的技巧。首先,利用条件概率的性质,上式中的第二个积分项,也就是已知训练数据时参数和超参数的条件概率可以改写成
$$p({\bf w}, \alpha, \sigma ^ 2 | {\bf y}) = p({\bf w} | {\bf y}, \alpha, \sigma ^ 2) p(\alpha, \sigma ^ 2 | {\bf y})$$
等式右侧的第一项其实就是岭回归的最优参数可以证明这个概率服从参数已知的正态分布因而可以看成一个确定项。可在计算第二项也就是根据训练数据确定超参数时就只能将实数域上的概率密度近似为最可能most probable的取值$\alpha_{MP}$和$\sigma^2_{MP}$,用点估计结果代替原始的概率分布。
利用贝叶斯定理可以得出,最可能的超参数取值应该让下面的后验概率最大化
$$p(\alpha, \sigma ^ 2 | {\bf y}) = \dfrac{p({\bf y} | \alpha, \sigma ^ 2) p(\alpha) p(\sigma ^ 2)}{p({\bf y})}$$
在计算中,分母上的$p({\bf y})$与超参数无关,因此可以忽略不计;由于超参数的取值是任意的,将它们的超先验分布设定为**无信息的先验**uninformative prior就是合理的选择$p(\alpha)$和$p(\sigma ^ 2)$也就会以常数形式的均匀分布出现。
所以,寻找最可能的$\alpha_{MP}$和$\sigma^2_{MP}$就变成了计算**边际似然概率**marginal probability$p({\bf y} | \alpha, \sigma ^ 2)$的最大值。把边际似然概率对待估计的参数进行展开,就可以将后验概率最大化等效成似然概率最大化
$$p({\bf y} | \alpha, \sigma ^ 2) = \int p({\bf y} | {\bf w}, \sigma ^ 2) p({\bf w} | \alpha) {\rm d} {\bf w}$$
积分的第一项是最大似然估计的解,第二项则是参数满足的先验分布,经过复杂的计算可以得出,积分结果仍然具有正态分布的形式,下面的任务就是找到使训练数据$\bf y$出现概率最大的一组超参数$\alpha$和$\sigma ^ 2$。表示噪声的强度的超参数$\sigma ^ 2$其实是个固定的取值,通常可以通过多次试验直接测出。在确定$\sigma ^ 2$之后,就可以用梯度下降法来找到最优的$\alpha$了。
总结起来,利用贝叶斯概率来确定最优参数的步骤可以归纳如下:求解的对象是已知训练数据时,测试数据的条件概率$p(y^* | {\bf y})$,要计算这个条件概率就要对所有未知的参数和超参数进行积分,以消除这些变量。
而在已知的数据和未知的超参数之间搭起一座桥梁的,正是待估计的参数$\bf w$,它将$p(y^* | {\bf y})$的求解分解成两部分,一部分是根据已知数据推断参数,另一部分是根据参数推断未知数据。
而在根据已知数据推断参数时,又要先推断超参数,再利用超参数和数据一块儿推断参数。对超参数的推断则可以通过边际似然概率简化。
<img src="https://static001.geekbang.org/resource/image/14/8b/1420a6f6f35e5fa20c6bd837ab33028b.png" alt="">
和具有直观几何意义的岭回归相比,贝叶斯边际化处理中一个接一个的条件概率没法不让人头疼。这么复杂的方法到底意义何在呢?它的价值就在于**计算出的结果就是最优的结果**。
频率主义的正则化只是引入了一个正则化系数$\lambda$,但$\lambda$的最优值到底是多少呢只能靠重复试验确定这就需要用验证数据集validation set来评估每个备选$\lambda$的最优性。
相比之下,贝叶斯主义的边际化就简化了最优化的过程,让边际似然概率最大的超参数就是最优的超参数。
这样做的好处就是所有数据都可以用于训练,不需要额外使用验证集,这在数据较少时是非常有用的。
在编程中很多第三方的Python库都可以直接实现不同的正则化处理。在Scikit-learn库中线性模型模块linear_model中的Lasso类和Ridge类就可以实现$l_1$正则化和$l_2$正则化。使用这两个类对上一篇文章中拟合出来的多元线性回归模型进行正则化处理,将两种算法中的正则化项参数均设置为$\lambda = 0.05$,就可以得到修正后的结果:
<img src="https://static001.geekbang.org/resource/image/78/a0/7868c3955c2c4cb5820487f0847eb8a0.png" alt="">
线性系数的变化直观地体现出两种正则化的不同效果。在未经正则化的多元线性回归中,用红框圈出来的系数比较反直觉,因为它意味着门将的表现对球队积分起到的是负作用,这种结论明显不合常理。
这个问题在两种正则化操作中都得以解决。
LASSO将4个特征中2个的系数缩减为0这意味着一半的特征被淘汰掉了其中就包括倒霉的守门员。在LASSO看来对比赛做出贡献的只有中场和前锋球员而中场的作用又远远不及前锋——这样的结果是否是对英超注重进攻的直观印象的佐证呢
和LASSO相比岭回归保留了所有的特征并给门将的表现赋予了接近于0的权重系数以削弱它对结果的影响其它的权重系数也和原始多元回归的结果更加接近。但LASSO和岭回归的均方误差都高于普通线性回归的均方误差LASSO的性能还要劣于岭回归的性能这是抑制过拟合和降低误差必然的结果。
<img src="https://static001.geekbang.org/resource/image/91/48/91dbf6e4c95066505f305be6dccccd48.png" alt="">
不同回归算法的拟合结果示意图蓝点为多元线性回归绿点为LASSO红点为岭回归
今天我和你分享了频率观点下的正则化和贝叶斯观点下的边际化,以及它们在线性回归中的应用,其要点如下:
<li> 正则化的作用是抑制过拟合,通过增加偏差来降低方差,提升模型的泛化性能;
</li>
<li>正则化项的作用是对解空间添加约束,在约束范围内寻找产生最小误差的系数;
</li>
<li>频率视角下的正则化与贝叶斯视角下的边际化作用相同;
</li>
<li>边际化对未知的参数和超参数进行积分以消除它们的影响,天然具有模型选择的功能。
</li>
最后需要说明的是,正则化的最优参数通常会通过交叉验证进行模型选择来产生,也就是在从不同数据子集上计算出的不同$\lambda$中择优取之。由于英超数据集的样本数目较少,所以没有添加交叉验证的过程。
岭回归和LASSO虽然都能降低模型的方差但它们处理参数的方式不同得到的结果也不一样。那么在你看来这两种正则化手段分别适用于什么样的场景呢
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/85/59/852b2d7fcc6403e1af4130152f38b659.jpg" alt="">

View File

@@ -0,0 +1,132 @@
<audio id="audio" title="13 | 线性降维:主成分的使用" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b8/a8/b872f7b08e157a33c2707ca734d5b8a8.mp3"></audio>
在前一篇文章中我以岭回归和LASSO为例介绍了线性回归的正则化处理。这两种方法都属于**收缩方法**shrinkage method它们能够使线性回归的系数连续变化。但和岭回归不同的是LASSO可以将一部分属性的系数收缩为0事实上起到了筛选属性的作用。
和LASSO这种间接去除属性的收缩方法相对应的是**维度规约**。维度规约这个听起来个高大上的名称是数据挖掘中常用的术语,它有一个更接地气的同义词,就是**降维**dimensionality reduction也就是直接降低输入属性的数目来削减数据的维度。
对数据维度的探讨来源于“**维数灾难**”curse of dimensionality这个概念是数学家理查德·贝尔曼Richard Bellman在动态优化问题的研究中提出的。
发表于《IEEE模式分析与机器智能汇刊》IEEE Transactions on Pattern Analysis and Machine Intelligence第1卷第3期的论文《维数问题一个简单实例A Problem of Dimensionality: A Simple Example》在数学上证明了当所有参数都已知时属性维数的增加可以让分类问题的错误率渐进为0可当未知的参数只能根据数量有限的样本来估计时属性维数的增加会使错误率先降低再升高最终收敛到0.5。
这就像一群谋士七嘴八舌在支招,当领导的要是对每个人的意见都深入考虑再来拍板的话,这样的决策也没什么准确性可言了。
**维数灾难深层次的原因在于数据样本的有限**。当属性的维数增加时每个属性每个可能取值的组合就会以指数形式增长。对于二值属性来说2个属性所有可能的取值组合共有4种可每增加一个属性可能的组合数目就会翻番。
一般的经验法则是每个属性维度需要对应至少5个数据样本可当属性维数增加而样本数目不变时过少的数据就不足以体现出属性背后的趋势从而导致过拟合的发生。当然这只是维数灾难的一种解释方式另一种解释方式来源于几何角度的数据稀疏性这里暂且按下不表。
在数据有限的前提下解决维数灾难问题,化繁为简的降维是必经之路。降维的对象通常是那些“食之无味,弃之可惜”的鸡肋属性。食之无味是因为它们或者和结果的相关性不强,或者和其他属性之间有较强的关联,使用这样的属性没有多大必要;弃之可惜则是因为它们终究还包含一些独有的信息,就这么断舍离又会心有不甘。
如果像亚历山大剑斩戈尔迪之结一般直接砍掉鸡肋属性,这种“简单粗暴”的做法就是**特征选择**feature selection。另一种更加稳妥的办法是破旧立新将所有原始属性的信息一点儿不浪费地整合到脱胎换骨的新属性中这就是**特征提取**feature extraction的方法。
无论是特征选择还是特征提取,在“人工智能基础课”中都有相应的介绍。
今天我要换个角度,先从刚刚介绍过的岭回归说起。假设数据集中有$N$个样本,每个样本都有$p$个属性,则数据矩阵$\bf X$的维度就是$N \times p$。将中心化处理后,也就是减去每个属性平均值的$\bf X$进行奇异值分解singular value decomposition可以得到
$$ {\bf X} = {\bf U} {\bf D} {\bf V}^T $$
其中的$\bf U$和$\bf V$分别是$N \times p$维和$p \times p$维的正交矩阵,其各自的所有列向量可以张成一个子空间;$\bf D$则是对角矩阵,对角线上的各个元素是数据矩阵$\bf X$按从大到小顺序排列的奇异值singular value$d_j$。可以证明,岭回归求出的最优系数可以写成$\hat \beta = ({\bf X}^T {\bf X} + \lambda {\bf I}) ^ {-1} {\bf X}^T {\bf y}$。将$\bf X$的奇异值分解代入岭回归的预测输出中,就可以得到:
$$ {\bf X} {\hat \beta} = \sum\limits_{j = 1}^p {\bf u}_j \dfrac{d^2_j}{d^2_j + \lambda}{\bf u}^T_j {\bf y}$$
其中的${\bf u}_j$是矩阵$\bf U$的列向量,也是$\bf X$的列空间的一组正交基,而岭回归计算出的结果正是将训练数据的输出$\bf y$投影到以${\bf u}_j$为正交基的子空间上所得到的坐标。除了空间变换之外,岭回归的收缩特性也有体现,那就是上式中的系数。当正则化参数$\lambda$一定时,奇异值$d_j$越小,它对应的坐标被衰减地就越厉害。
除了经历不同的收缩外,奇异值$d_j$还有什么意义呢?$d_j$的平方可以写成对角矩阵$\bf D$的平方,利用奇异值分解又可以推导出${\bf D}^2$和数据矩阵$\bf X$如下的关系
$$ {\bf X}^T{\bf X} = {\bf V} {\bf D}^2 {\bf V}^T $$
这个表达式实际上就是矩阵的**特征分解**eigen decomposition等式左侧的表达式实际上就是数据的协方差矩阵covariance matrix乘以维度$N$$\bf V$中的每一列$v_j$都是协方差矩阵的特征向量,${\bf D}^2$中的每个对角元素$d^2_j$则是对应的特征值。如果你对主成分分析还有印象,就不难发现每一个${\bf X}{\bf v}_j$都是一个主成分principal component第$j$个主成分上数据的方差就是$d^2_j / N$。
解释到这儿,就能够看出岭回归的作用了:**岭回归收缩系数的对象并非每个单独的属性,而是由属性的线性组合计算出来的互不相关的主成分,主成分上数据的方差越小,其系数收缩地就越明显**。
数据在一个主成分上波动较大意味着主成分的取值对数据有较高的区分度,也就是上一季中提到的“最大方差原理”。反之,数据在另一个主成分上方差较小就说明不同数据的取值较为集中,而聚成一团的数据显然是不容易区分的。岭回归正是通过削弱方差较小的主成分、保留方差较大的主成分来简化模型,实现正则化的。
<img src="https://static001.geekbang.org/resource/image/ea/64/ea5287f918ab983e30607dc988839264.png" alt=""><br>
不同方差的主成分示意图2点钟方向的主成分方差较大11点钟方向的主成分方差较小图片来自维基百科
看到这里你可能就想到了:既然主成分都已经算出来了,与其用岭回归兜一个圈子,莫不如直接使用它们作为自变量来计算线性回归的系数,这种思路得到的就是**主成分回归**principal component regression
主成分回归以每个主成分${\bf z}_j = {\bf X} {\bf v}_j$作为输入计算回归参数。由于不同的主成分是两两正交的,因此这个看似多元线性回归的问题实质上是多个独立的简单线性回归的组合,每个主成分的权重系数可以表示为
$$ \hat \theta_m = \dfrac{&lt;{\bf z}_m, {\bf y}&gt;}{&lt;{\bf z}_m, {\bf z}_m&gt;} $$
其中$&lt;&gt;$表示内积运算。需要注意的是这里的$\bf y$和数据矩阵的每一列${\bf x}_j$都要做去均值的处理,主成分回归的常数项就是$\bf y$,也就是所有数据输出结果的均值$\bar y$。
当主成分回归中使用的主成分数目等于数据的属性数目$p$时,主成分回归和岭回归的结果是一致的。可如果放弃方差最小的若干个主成分,得到的就是约化的回归结果,从而更加清晰地体现出主成分分析的思想。
主成分分析是典型的特征提取方法,它和收缩方法的本质区别在于将原始的共线性特征转化为人为生成的正交特征,从而带来了数据维度的约简和数据压缩的可能性。数字图像处理中的特征脸方法是主成分回归最典型的应用之一。
所谓“**特征脸**”eigenface实际上就是用于人脸识别的主成分。用特征脸方法处理的人脸图像都具有相同的空间维度假定图像的像素数目都是$100 \times 100$那么每一个像素点都是一个属性数字图像就变成了10000维空间中的一个点。可一般数字图像慢变特性决定了这10000个特征之间具有很强的关联直接处理的话运算量较大不说还未必有好的效果可谓事倍功半。
<img src="https://static001.geekbang.org/resource/image/e6/37/e6fd81d7312849205e57e1007c792037.png" alt=""><br>
根据AT&amp;T Laboratories Cambridge Facedatabase人脸数据库生成的特征脸
图片来自https://www.bytefish.de/blog/eigenfaces/
引入主成分分析后情况就不一样了。主成分分析可以将10000个相互关联的像素维度精炼成100150个特征脸再用这些特征脸来重构相同形状的人脸图像。
上图是真实计算出的一组特征脸图像如果是晚上一个人在家玩手机的话那这组惊悚的特征脸很可能让你吓得不轻。可如果你能想明白一个问题这只是一组被打成正方形的10000多维的相互正交的主成分而原始图像让它们碰巧具有了人脸的轮廓这些人不人鬼不鬼的东西就没有那么恐怖了。
这些主成分可以用来分解任意一张面孔,说不定我的一寸照片就可以表示成$27% \times Ef_1 + 6% \times Ef_2 + 49% \times Ef_3 + \cdots + 34% \times Ef_{16}$的组合呢。
前面对主成分分析的解释都是从降维的角度出发的。换个角度,主成分分析可以看成**对高斯隐变量的概率描述**。隐变量latent variable是不能直接观测但可以间接推断的变量虽然数据本身处在高维空间之中但决定其变化特点的可能只是有限个参数这些幕后的操纵者就是隐变量寻找隐变量的过程就是对数据进行降维的过程。
**概率主成分分析**probabilistic principal component analysis体现的就是高斯型观测结果和高斯隐变量之间线性的相关关系它是因子分析factor analysis的一个特例。概率主成分分析的数学推导比较复杂在这里不妨直接给出结论
假定一组数据观测值构成了$D$维向量$\bf X$,另外一组隐变量构成了$Q$维向量$\bf Z$,两者之间的线性关系就可以表示为
$$ {\bf X} = {\bf W} {\bf Z} + \boldsymbol \mu + \boldsymbol \epsilon$$
其中关联矩阵$\bf W$是由标准正交基构成的矩阵,非零向量$\boldsymbol \mu$表示观测值的均值,$\boldsymbol \epsilon$则是服从标准多维正态分布$N({\bf 0}, \sigma^2{\bf I})$的各向同性的噪声。如果假设隐变量$\bf Z$具有多元标准正态形式的先验分布$p({\bf Z})$,去均值观测数据${\bf X}$的对数似然概率可以写成
$$ \log p({\bf X} | {\bf W}, \sigma^2) = - \dfrac{N}{2} \ln |{\bf C}| - \dfrac{1}{2} \sum\limits_{i = 1}^N {\bf x}_i^T {\bf C}^{-1} {\bf x}_i$$
其中${\bf C} = {\bf W}{\bf W}^T + \sigma^2{\bf I}$。计算可得,让似然概率取得最大值的参数值为$\hat {\bf W} = {\bf V}({\bf D}^ 2 - \sigma^2{\bf I}) ^ {1/2}$。根据这个$\hat {\bf W}$又可以计算出超参数$\sigma ^ 2$得最大似然估计值$\hat \sigma ^ 2 = \dfrac{1}{D - Q} \sum\limits_{j = Q + 1}^D d_j^2$,这说明噪声方差就是所有被丢弃的主成分方差的均值。而当$\boldsymbol \epsilon \rightarrow 0$时,概率主成分分析的线性系数$\hat {\bf W}$就会退化为经典的主成分分析中的$\bf V$。
除了似然概率外,根据正态分布的性质也可以计算出隐变量的后验概率$p({\bf Z} | {\bf X})$。令$\hat {\bf F} = \hat {\bf W}^T \hat {\bf W} + \hat \sigma^2 {\bf I}$,后验概率满足的就是以$\hat {\bf F} ^ {-1}\hat {\bf W} {\bf X}$为均值,$\sigma ^ 2 \hat {\bf F}^{-1}$为方差的正态分布。当$\boldsymbol \epsilon \rightarrow 0$时,隐变量的最优值就会收敛为经典主成分${\bf XV}$。
在实际问题中使用的主成分数目是个超参数需要通过模型选择确定而概率主成分分析对测试数据的处理就可以完成模型选择的任务。从重构误差的角度出发经典主成分分析一般会让被选中的主成分的特征值之和占所有特征值之和的95%以上。在贝叶斯框架下,计算最优的主成分数目需要对所有未知的参数超参数进行积分,其过程非常复杂,在这里就不讨论了。
同其他隐变量模型一样,概率主成分分析也是个生成模型,其生成机制如下图所示。首先从服从一维正态分布的隐变量$z$中得到采样值$\hat z$,以${\bf w}z + \boldsymbol \mu$为均值的单位方差二维正态分布就是数据$\bf x$的似然分布,将先验分布与似然分布相乘,得到的就是最右侧的二维分布$p(\bf x)$了。
<img src="https://static001.geekbang.org/resource/image/92/e9/92ea88cc40155f4fa2e50b4e24c891e9.png" alt="">
图片来自Machine Learning: A Probabilistic Perspective, 图12.1
在Scikit-learn中主成分分析对应的类是PCA它在decomposition的模块种。还是以英超数据集为例对多元线性回归的数据进行主成分分析可以得到10个主成分的方差以及它们占总方差的比例
<img src="https://static001.geekbang.org/resource/image/39/91/390f6ca36bd154f9d0d61e58f79b8891.jpeg" alt="">
英超数据集上所有主成分的方差及其比例
从结果中可以看出方差最大的主成分占据了近4/5的总方差前两个主成分的方差之和的比例则超过了90%。在对数据进行降维时如果将方差的比例阈值设定为95%保留的主成分数目就是2个这说明2个主成分已经足以解释输出结果中90%的变化。
<img src="https://static001.geekbang.org/resource/image/31/48/31f4e937adea5a8ed8ce4edb19a95d48.png" alt="">
使用前两个主成分对英超数据集进行变换的结果
为了对主成分分析后的数据分布产生直观的认识,可以将变换后的数据点显示在低维空间中,以观察它们的集中程度。出于观察方便的考虑,在可视化时只选择了方差最大的前两个主成分,虽然这样做会造成较大的误差,但变换后的数据就可以在平面直角坐标系上显示出来,如上图所示。
可以看出,经过变换后的数据点依然分散在整个二维平面上,但根据它们在横轴上的取值已经可以近似地将数据划分为两个类别,其原因很可能是蓝线两侧的数据代表了两种类型的球队风格,就像来自两个高斯分布的随机数。
今天我和你分享了从岭回归到主成分回归的推导过程,以及作为降维方法和特征提取技术的主成分分析,其要点如下:
<li>
在有限的数据集下,数据维度过高会导致维数灾难;
</li>
<li>
降维的方法包括特征选择和特征提取;
</li>
<li>
主成分分析将原始的共线性特征转化为新的正交特征,从而实现特征提取;
</li>
<li>
概率主成分分析是因子分析的一种,是数据的生成模型。
</li>
在机器学习中,还有一种和主成分分析名字相似的方法,叫作**独立成分分析**independent component analysis。那么这两者之间到底有什么区别和联系呢
你可以查阅资料加以了解,并在这里分享你的理解。
<img src="https://static001.geekbang.org/resource/image/58/d9/58c45c5e94e8d8c8f05e4f355790cbd9.jpg" alt="">

View File

@@ -0,0 +1,106 @@
<audio id="audio" title="14 | 非线性降维:流形学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/39/05/396c39f2b9b42ab33ffe206de15d5205.mp3"></audio>
“云行雨施,品物流形”,这是儒家经典《易经》对万物流变的描述。两千多年之后,“流形”一词被数学家借鉴,用于命名与欧几里得空间局部同胚的拓扑空间。
虽然流形这个词本身有着浓厚的学院派味道但它的思想你却一点儿不会陌生。最著名的流形模型恐怕非瑞士卷Swiss roll莫属。如图所示的瑞士卷是常见的糕点只是它的名字未必像它的形状一样广为人知。瑞士卷实际上是一张卷起来的薄蛋糕片虽然卷曲的操作将它从二维形状升级成了三维形状但这个多出来的空间维度并没有产生关于原始结构的新信息所以瑞士卷实际上就是嵌入三维空间的二维流形。
<img src="https://static001.geekbang.org/resource/image/53/86/53a1b1dfe765e972d49f89f2c459a886.png" alt="" />
瑞士卷(左)与瑞士卷流形(右)示意图
图片来自维基百科与http://yinsenm.github.io/figure/STAT545/Swiss.png
在机器学习中,**流形**manifold指的是嵌入在高维数据空间中的低维子空间它的维数是低维数据变化的自由度degree of freedom of variability也叫作固有维度intrinsic dimensionality。**流形学习**manifold learning正是通过挖掘数据的内在结构实现向固有维度的降维从而找到与高维原数据对应的低维嵌入流形。
和主成分分析相比,流形可以是线性的,但更多是非线性的。正因如此,流形学习通常被视为**非线性降维方法的代表**。它不仅能够缓解维数灾难的影响,还具有比线性降维方法更强的特征表达能力。除了非线性外,流形学习的方法一般还是**非参数的**,这使流形能够更加自由地表示数据的固有维度和聚类特性,但也让它对噪声更加敏感。
要将数据从高维空间映射到低维流形上,首先要确定低维流形的结构,其次要确定高维空间到低维流形的映射关系。可在实际问题中,不管是流形结构还是流形维数都不是已知的,因此有必要做出一些先验假设以缩小问题的解空间。当关于流形的假设聚焦在数据的几何性质上时,就可以得到**多维缩放**multiple dimensional scaling算法。
在确定流形结构时,多维缩放让高维空间上的样本之间的距离在低维空间上尽可能得以保持,以距离重建误差的最小化为原则计算所有数据点两两之间的距离矩阵。根据降维前后距离保持不变的特点,距离矩阵又可以转化为内积矩阵。利用和主成分分析类似的方法可以从高维空间上的内积矩阵构造出从低维空间到高维空间的嵌入,其数学细节在此就不赘述了。
可是,原始高维空间与约化低维空间距离的等效性是不是一个合理的假设呢?想象一下你手边有个地球仪,这个三维的球体实际上也是由二维的世界地图卷成,因而可以约化成一个二维的流形。如果要在流形上计算北京和纽约两个城市的距离,就要在地球仪上勾出两点之间的“直线”,也就是沿着地球表面计算出的两个城市之间的直线距离。但需要注意的是,这条地图上的直线在二维流形上是体现为曲线的。
这样计算出的流形上的距离是否等于三维空间中的距离呢?答案是否定的。北京和纽约两点在三维空间中的欧氏距离对应的是三维空间中的直线,而这条直线位于地球仪的内部——按照这种理解距离的方式,从北京去纽约应该坐一趟穿越地心的直达地铁。这说明多维缩放方法虽然考虑了距离的等效性,却没能将这种等效性放在数据特殊结构的背景下去考虑。它忽略了高维空间中的直线距离在低维空间上不可到达的问题,得到的结果也就难以真实反映数据的特征。
吸取了多维缩放的经验教训美国斯坦福大学的约书亚·泰宁鲍姆Joshua Tenenbaum等人提出了等度量映射的非线性降维方法。**等度量映射**isometric mapping以数据所在的低维流形与欧氏空间子集的等距性为基础。在流形上描述距离的指标是**测地距离**geodesic distance它就是在地图上连接北京和纽约那条直线的距离也就是流形上两点之间的固有距离。
在流形结构和维度未知的前提下测地距离是没法直接计算的。等度量映射对这个问题的解决方法是利用流形与欧氏空间局部同胚的性质根据欧氏距离为每个点找到近邻点neighbors直接用欧氏距离来近似近邻点之间的测地距离。
在这种方法中,测地距离的计算就像是奥运火炬,在每一个火炬手,也就是每一个近邻点之间传递。将每个火炬手所走过的路程,也就是每两个近邻点之间的欧氏距离求和,得到的就是测地距离的近似。
在每一组近邻点之间建立连接就可以让所有数据点共同构成一张带权重的近邻连接图。在这张图上,相距较远的两点的测地距离就被等效为连接这两点的最短路径,这个问题可以使用图论和网络科学中发展非常成熟的**Dijkstra算法**来求解。计算出距离矩阵后,等度量映射的运算和多维缩放就完全一致了。
<img src="https://static001.geekbang.org/resource/image/e9/96/e9a0de55535bc872385c1676a8deef96.png" alt="" />
图A表示测地距离与欧氏距离的区别图B表示利用近邻点近似计算测地距离图C表示真实测地距离与近似测地距离的比较图片来自A global geometric framework for nonlinear dimensionality reduction, Science, vol. 290, 2319-2323
等度量映射关注的是全局意义上数据的几何结构,如果只关注数据在某些局部上的结构,其对应的方法就是局部线性嵌入。
**局部线性嵌入**locally linear embedding由伦敦大学学院的萨姆·洛维思Sam Roweis等人提出其核心思想是待求解的低维流形在局部上是线性的每个数据点都可以表示成近邻点的线性组合。求解流形的降维过程就是在保持每个邻域中的线性系数不变的基础上重构原数据点使重构误差最小。
局部线性嵌入的实现包括两个步骤在确定一个数据点的近邻点后首先根据最小均方误差来计算用近邻点表示数据点的最优权值需要注意的是所有权值之和是等于1的接下来就要根据计算出的权值来重构原数据点在低维空间上的表示其准则是重构的近邻点在已知权值下的线性组合与重构数据点具有最小均方误差。对重构映射的求解最终也可以转化为矩阵的特征值求解。
<img src="https://static001.geekbang.org/resource/image/c4/0a/c41b0bb1261a7d7d21218f71cd5d7e0a.png" alt="" />
图A表示为数据点$X_i$选择近邻点图B表示将$X_i$表示为近邻点的线性组合并计算系数$W_{i \cdot}$图C表示保持$W_{i \cdot}$不变重构数据点$Y_i$图片来自Nonlinear dimensionality reduction by locally linear embedding, Science, vol. 290, 2323-2326
将两种典型的流形学习算法加以比较,不难发现它们的区别在于对流形与欧氏空间关系的理解上。流形与欧氏空间就像两个平行世界,将它们联系起来的羁绊是拓扑性质的保持。
等度量映射理如其名,它将距离视为空间变换过程中的不变量,强调的是不同数据点关系的不变性,以及数据全局结构的完整保持。打个比方,如果把全局结构看作一个拼图玩具,等度量映射的任务就是将每一块拼图所代表的邻域正确组合,从而构成完美的完整图案。
相比之下,局部线性嵌入在乎的只有数据关系在某个邻域上的不变性。数据点可以用它的邻近点在最小二乘意义下最优的线性组合表示,这个局部几何性质是不会改变的。可是在邻域之外,局部线性嵌入并不考虑相距较远的数据点之间关系的保持,颇有些“各人自扫门前雪,莫管他人瓦上霜”的意味。显然,局部线性嵌入在拼图时更加随意,只要把所有的拼图块按嵌入关系连成一片就可以了,至于拼出什么奇形怪状都不在话下。
<img src="https://static001.geekbang.org/resource/image/69/39/69801c295e51cc061fb4586114b33a39.png" alt="" />
基于全局信息的等度量映射(左)和基于局部信息的局部线性嵌入(右)
不管是等度量映射还是局部线性嵌入,都以几何性质作为同构的基础。如果要从概率角度理解流形学习,最具代表性的例子非随机近邻嵌入莫属。**随机近邻嵌入**stochastic neighbor embedding的核心特点是保持降维前后数据的概率分布不变它将高维空间上数据点之间的欧氏距离转化为服从正态分布的条件概率
$$ p_{j | i} = \dfrac{\exp (- || x_i - x_j || ^ 2 / 2 \sigma_i^2)}{\sum_{k \ne i} \exp (- || x_i - x_j || ^ 2 / 2 \sigma_i^2} $$
上式中的$\sigma_i$是困惑度参数perplexity可以近似地看成近邻点的数目。这个概率表达式来描述不同数据点之间的相似性。简单地说相距越近的点形成近邻的概率越大相似的概率也就越大。这就像我们在上学时按照身高排队一样站在一起的人身高会更加接近位于队首和队尾两个极端的人则会有较大的身高差。
映射到低维空间后随机近邻嵌入按照和高维空间相同的方式计算低维空间上的条件概率并要求两者尽可能地相似也就是尽可能地保持数据间的相似性。重构的依据是让交叉熵cross entropy也就是KL散度Kullback-Leibler divergence最小化。
但KL散度不对称的特性会导致相聚较远的点体现为较大的散度差为了使KL散度最小化数据点映射到低维空间之后就会被压缩到极小的范围中。这就像一群学生突然被紧急集合到操场上挤在一起之后根本分不清哪些人来自于哪个班这就是所谓的**拥挤问题**crowding problem
为了解决拥挤问题,深度学习的泰斗乔弗雷·辛顿和他的学生提出了$t$分布随机近邻嵌入($t$-distributed stochastic neighbor embedding
新算法主要做出了两点改进:首先是将由欧氏距离推导出的条件概率改写成对称的形式,也就是$p_{ij} = p_{ji} = (p_{i | j} + p_{j | i}) / 2$,其次是令低维空间中的条件概率服从$t$分布(高维空间中的正态分布保持不变)。这两种改进的目的是一样的,那就是让相同结构的数据点在低维空间上更加致密,不同结构的数据点则更加疏远。事实证明,这一目的达到了。
线性可以看成是非线性的特例,从这个角度出发,概率主成分分析其实也可以归结到广义的流形学习范畴中。还记得前一篇文章的图片吗?两个满足正态分布的隐变量使数据分布呈现出类似煎饼的椭圆形状,这张煎饼实际上就是流形。煎饼所在的超平面显示的只是数据的投影,之所以选择这个平面来投影是因为数据的变化集中在这里。相比之下,数据在垂直于超平面的方向上方差较小,因而这些变化在降维时可以忽略不计。
既然都能实现数据的降维,那么以主成分分析为代表的线性方法和以流形学习为代表的非线性方法各自的优缺点在哪里呢?一言以蔽之,线性方法揭示数据的规律,非线性方法则揭示数据的结构。
主成分分析可以去除属性之间的共线性,通过特征提取揭示数据差异的本质来源,这为数据的分类提供了翔实的依据;而流形学习虽然不能解释非线性变化的意义,却可以挖掘出高维数据的隐藏结构并在二维或三维空间中直观显示,是数据可视化的利器,而不同的隐藏结构又可以作为特征识别的参考。
Scikit-learn中包括了执行流形学习的manifold模块将常用的流形学习方法打包成内置类调用Isomap、LocallyLinearEmbedding和TSNE等类就可以计算对应的流形算法的细节都被隐藏在函数内部只需要输入对应的参数即可。
用以上算法将多元线性回归的英超数据集投影到二维流形上由于数据集中的数据点较少各种算法中近邻点的数目都被设置为2个得到的结果如下。可以看出三种方式计算出的流形中似乎都存在这一些模式但说明这些模式的意义可就不像将它们计算出来那么简单了。
<img src="https://static001.geekbang.org/resource/image/2b/94/2b4347948da1315c9ff7f64aae9fae94.png" alt="" />
对英超数据集进行非线性降维的结果,使用的算法从左到右分别为等距离映射、局部线性嵌入和$t$分布随机近邻嵌入
今天我和你分享了几种典型的流形学习方法,但没有过多涉及这些方法的数学细节,感兴趣的话,你可以参考不同算法的原始论文。今天的内容要点如下:
<li>
流形学习是非线性的降维方法,目的在于找到与高维数据对应的低维嵌入流形;
</li>
<li>
等度量映射是基于全局信息的流形学习方法,通过测地距离和欧氏距离的等效性计算流形;
</li>
<li>
局部线性嵌入是基于局部信息的流形学习方法,通过局部线性系数的不变性计算流形;
</li>
<li>
$t$分布随机近邻嵌入将欧氏距离映射为相似性,利用相似性的保持计算流形。
</li>
从前文中英超数据集的流形可以看出,当现实中复杂的高维数据被映射到二维或三维流形上时,大呼神奇之后如何对得到的结果加以解释又是个棘手的问题。那么你觉得流形学习到底具有哪些实在的作用呢?
欢迎分享你的观点。
<img src="https://static001.geekbang.org/resource/image/e5/b0/e54a47927a28f4d75cb141786d51c4b0.jpg" alt="" />

View File

@@ -0,0 +1,138 @@
<audio id="audio" title="15 | 从回归到分类:联系函数与降维" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/8a/49/8afe4b5a5412a6f189e1566972004c49.mp3"></audio>
线性模型最初被用来解决回归问题regression可在实际应用中更加普遍的是分类问题classification。要用线性模型解决分类问题的话就需要将线性模型原始的连续输出转换成不同的类别。
在分类问题中,一种特殊的情况是类别非黑即白,只有两种,这样的问题就是二分类问题,它可以看成是多分类问题的一个特例,也是今天讨论的对象。
将回归结果转化为分类结果,其实就是将属性的线性组合转化成分类的标准,具体的操作方式有两种:一种是**直接用阈值区分回归结果**,根据回归值与阈值的关系直接输出样本类别的标签;另一种是**用似然度区分回归结果**,根据回归值和似然性的关系输出样本属于某个类别的概率。
这两类输出可以分别被视为**硬输出**和**软输出**,它们代表了解决分类问题不同的思路。
**硬输出是对数据的分类边界进行建模**。实现硬输出的函数,也就是将输入数据映射为输出类别的函数叫作**判别函数**discriminant。判别函数可以将数据空间划分成若干个决策区域每个区域对应一个输出的类别。不同判别区域之间的分界叫作**决策边界**decision boundary对应着判别函数取得某个常数时所对应的图形。用线性模型解决分类问题就意味着得到的决策边界具有线性的形状。
最简单的判别函数就是未经任何变换的线性回归模型$ y({\bf x}) = {\bf w} ^ T {\bf x} + b$,它将回归值大于某个阈值(可以通过调整截距$b$设置为0的样本判定为正例小于阈值的样本则判定为负例。
在处理多分类任务时,判别函数对每个类别都计算出一组系数${\bf w}_k$和$b_k$,并选择使$y_k({\bf x})$最大的$k$作为输出类别。如果分类的边界较为复杂,还可以通过基函数的扩展或者核技巧来突破线性的限制,相关的内容会在后面的文章中涉及。
今天我们先来看看**基于软输出的分类方法**。软输出利用的是似然度,需要建立关于数据的概率密度的模型,常见的具体做法是对线性回归的结果施加某种变换,其数学表达式可以写成
$$ y({\bf x}) = g ^ {-1} ({\bf w} ^ T {\bf x} + b)$$
这里的$g(\cdot)$被称为**联系函数**link function其反函数$f(\cdot) = g ^ {-1}$则被称为**激活函数**activation function。**正是联系函数架起了线性模型从回归到分类的桥梁**。
**最典型的软输出分类模型就是逻辑回归**。在“人工智能基础课”中我曾介绍过逻辑回归logistic regression是基于概率的分类算法估计的是样本归属于某个类别的后验概率那么根据贝叶斯定理二分类问题中的后验概率就可以写成
$$ p(C_1 | {\bf x}) = \dfrac{p({\bf x} | C_1) p(C_1)}{p({\bf x} | C_1) p(C_1) + p({\bf x} | C_2) p(C_2)}$$
对这个表达式做个简单的变量代换,就可以得到
$$ p(C_1 | {\bf x}) = \dfrac{1}{1 + \exp(-a)} = \sigma(a) $$
这里的$\sigma (\cdot)$表示对数几率函数logistic function也就是逻辑回归的联系函数这个非线性的联系函数可以将任意输入映射到[0, 1]之间。对数几率函数的自变量$a$可以改写成
$$ a = \ln \dfrac{p({\bf x} | C_1) p(C_1)}{p({\bf x} | C_2) p(C_2)} = \ln \dfrac{p({\bf x} | C_1)}{p({\bf x} | C_2)} + \ln \dfrac{p(C_1)}{p(C_2)} = {\bf w}^T {\bf x} + b $$
逻辑回归并不能直接给出参数$\bf w$的解析解因此需要结合最优化的方法使用。确定参数最常用的方式是使用最大似然估计maximum likelihood estimation找到如训练数据匹配度最高的一组参数。
在二分类问题中,若假设当$\bf x$属于类$C_1$时,输出的分类结果$r$为1属于类$C_2$时,输出的分类结果$r$为0那么每个单独的分类结果都满足参数为$\sigma ({\bf x})$的两点分布,所有结果构成的向量$\bf r$就会满足二项分布,这时的似然概率就可以写成分类结果的连乘
$$ p({\bf w}, b | {\bf x}) = \prod\limits_i \sigma ({\bf x_i}) ^ {r_i} [1 - \sigma ({\bf x_i})] ^ {(1 - r_i)} $$
对似然概率求对数并求解最大值,就可以得到最优的参数了。
和逻辑回归相似的另一种分类模型是线性判别分析,它不仅要估计数据的概率密度,还应用了降维的思想。在前面的两篇文章中,我和你分享了对数据进行线性降维和非线性降维的方法。
其实降维不光是数据预处理的一种手段,它还可以用来执行分类任务——本质上讲,分类问题就是将高维的数据投影到一维的类别标签上。
维度的下降会导致信息的损失,从而使数据在标签维度上产生重叠。属于相同类别的数据重叠在一起并不是严重的问题,但类别不同的数据的重叠就会增加分类问题的错误率,因此**好的分类算法既要让相同类别的数据足够接近,又要让不同类别的数据足够远离**。基于这一原则进行分类的方法就是线性判别分析。
用于二分类的**线性判别分析**由著名的统计学家罗纳德·费舍尔于1936年提出按人类的年龄计算已是耄耋之年。归根结底线性判别分析也是从概率出发假设不同类别的数据来源于均值不同而方差相同的正态分布通过判定数据归属于不同正态的可能性来确定类别。
但在设计线性判别分析时,费舍尔利用了一种不同的思路。在计算二分类问题的决策边界时,线性判别分析首先要计算两个类别中数据的均值,以此作为特征来区分不同的类别,让不同类别的数据足够远离就是让两个均值在决策边界上的投影之间的距离足够大。
但仅是均值远离还不够。数据在不同维度上的分布不同会导致有些方向的方差较大,而有些方向的方差较小。如果仅仅考虑均值而忽略了方差,就可能导致判决边界落在波动较大的方向上,由此产生的长尾效应容易使不同类别的数据互相重叠,从而影响分类的精度。因此在投影时,还要让相同类别的数据尽可能集中分布,以避免混叠的出现。
假定训练数据分属两个类别$C_1$和$C_2$,每个类别中数据的均值用向量${\bf m}_1$和${\bf m}_2$表示,那么这两个均值在超平面${\bf y} = {\bf w} ^ T {\bf x} + b$上的投影就等于
$$m_k = {\bf w} ^ T {\bf m}_k (k = 1, 2)$$
降维后两个类各自的方差可以表示为
$$s_k = \sum_{n \in C_k} (y_n - m_k) ^ 2 (k = 1, 2)$$
要同时保证类间距最大和类内方差最小,可以通过最大化下面的目标函数来实现
$$ J({\bf w}) = \dfrac{(m_2 - m_1) ^ 2}{s_1^2 + s_2^2} $$
其中待求解的参数$\bf w$需要满足归一化条件$|| {\bf w} ||_2^2 = 1$,而这并不会对$\bf w$的方向造成影响。将线性回归模型代入$J({\bf w})$的表达式,可以将它改写成
$$ J({\bf w}) = \dfrac{{\bf w} ^ T {\bf S}_B {\bf w}}{{\bf w} ^ T {\bf S}_W {\bf w}} $$
这里有这么几个概念。
**类间协方差矩阵**between-class covariance matrix
$${\bf S}_B = ({\bf m}_2 - {\bf m}_1)({\bf m}_2 - {\bf m}_1)^T$$
**类内协方差矩阵**within-class covariance matrix
$${\bf S}_W = \sum_{n \in C_1}({\bf x}_n - {\bf m}_1)({\bf x}_n - {\bf m}_1)^T + \sum_{n \in C_2}({\bf x}_n - {\bf m}_2)({\bf x}_n - {\bf m}_2)^T$$
两者之商的学名叫作**广义瑞利商**generalized Rayleigh quotient。可以求出使广义瑞利商最大化的解析解为${\bf w} = {\bf S}^{-1}_{\bf w} ({\bf m}_2 - {\bf m}_1)$。
单从形式上看,线性判别分析和主成分分析同属于降维技术,有不少相似的地方,但两者却有本质上的区别。主成分分析的目的是保留不确定性,是通过选择方差最大的主成分来实现信息损失最小的数据低维度重构,整个过程是无监督的。
相比之下, 线性判别分析在降维时要利用数据的类别,因而属于监督学习的范畴,学习的目的则是消除不确定性。消除的不确定性就是类间方差,这部分信息被提取到了类别标签中。分类之后数据的方差越小,意味着降维后剩余的类内不确定性就越小。
在实际应用中,通常可以先使用主成分分析进行特征提取,再利用线性判别分析做训练。这就相当于先把数据的信息集中在某些特征上,再利用不同的类别把这些信息提取出来。
<img src="https://static001.geekbang.org/resource/image/67/21/67ccd297150005491237549be16f1a21.png" alt="" />
主成分分析(左)与线性判别分析(右)的对比
图片来自https://zybuluo.com/anboqing/note/117518
将线性模型扩展到分类问题中时,线性判别分析和逻辑回归作为两种具有代表性的模型,都是基于概率生成线性的分类边界,因此有必要做一比较。
线性判别分析就像个傲娇的老师,只愿意指导天赋异禀的学生,这体现在它对数据的要求上:第一,每个类别的数据必须服从潜在的多元正态分布;第二,每个类别的数据必须具有相同或者相近的协方差矩阵;第三,数据的属性之间不能存在较强的共线性,计算出的协方差矩阵应为满秩矩阵;第四,数据中尽可能不存在异常点。
虽然在实际问题中,一定程度上放宽这些条件并不会对线性判别分析的性能产生太大的影响,但这些条件还是严重地限制了方法的应用,使找到一个能解决的问题比解决这个问题更加困难。
相比之下,逻辑回归就没有那么多讲究了,这个老师不管学生好坏都能因材施教。它无需对数据分布做出任何先验假设(两点分布是二分类问题必然的结果),对数据的协方差矩阵和共线性也没有特殊的要求。即使当数据集中存在一些异常点,逻辑回归也能完成精确地分类。整体来说,线性判别分析只能在所有条件都满足时发挥出最佳的性能,在任何其他的场景下都要略逊逻辑回归一筹。
虽然实现的方式有所不同,但本篇所介绍的两种解决分类问题的方法在思想上是一致的,那就是**根据数据的概率密度来实现分类**。这两种基于似然度likelihood-based的模型在执行分类任务时不是以每个输入样本为单位而是以每个输出类别为单位将每个类别的数据看作不同的整体并寻找它们之间的分野。这样看来数据和人一样也要面临站队的问题啊
在Scikit-learn中线性判别分析在模块discriminant_analysis中实现逻辑回归则在模块linear_model中实现。由于逻辑回归需要使用有标签的数据因而原来的回归数据就不能使用了。
这次使用的数据依然来自于WhoScored的英超技术统计我选取了17/18赛季平均评分最高的20名中卫和20名中锋他们的首发次数均在15次以上。数据的属性包括每个人的场均射门数和场均铲球数两个维度位置则作为分类标签出现。熟悉足球的朋友肯定明白中卫的铲球数较多而中锋的射门数较多因此这两个指标可以用来作为判断位置的根据。
<img src="https://static001.geekbang.org/resource/image/7a/a8/7af3b9ec978858fff8f033613cc18ea8.png" alt="" />
线性判别分析和逻辑回归在中卫-中锋数据集上的决策边界,红色圆点代表中卫,蓝色三角代表中锋
用上面的数据集训练使用不同的线性分类模型得到的效果也不相同。这个数据集本身是线性可分的也就是存在将两个类别完全区分开来的线性边界这条边界也被逻辑回归正确地计算出来。可遗憾的是线性判别分析并没有找到准确的边界而是将一个热爱防守的前锋斯旺西城18号乔丹·阿尤每场的铲球多过射门这不禁让人想起著名的防守型前锋德克·库伊特误认成后卫。
直观地从数据分布的图示看,这个被线性判别分析误分类的蓝点和其他蓝点相距较远,反倒是和红点更加接近,怎么看怎么像是个异常点。在计算数据的统计特性时,这个离群索居的样本远离了归属类的均值,也就难怪会被同伴所抛弃。这也印证了前面的说法:线性判别分析需要较强的假设来支持。
今天我和你分享了使用线性模型解决分类问题的方法,其要点如下:
<li>
在解决分类问题时,线性模型的回归值可以通过联系函数转化为分类结果;
</li>
<li>
线性判别分析假定数据来自均值不同但方差相同的正态分布,通过最大化类间方差与类内方差的比值计算线性边界;
</li>
<li>
逻辑回归计算的是不同类别的概率决策边界,输出的是给定数据属于不同类别的后验概率;
</li>
<li>
基于线性模型的分类方法计算出的决策边界是输入属性的线性函数。
</li>
当线性边界不足以完成分类任务时线性判别分析可以推广为二次判别分析Quadratic Discriminant Analysis那么两者之间存在这哪些区别和联系呢
你可以查阅资料加以了解,并在这里分享你的理解。
<img src="https://static001.geekbang.org/resource/image/0d/17/0d023e8d04ba041ad8fec5050562cd17.jpg" alt="" />

View File

@@ -0,0 +1,90 @@
<audio id="audio" title="16 | 建模非正态分布:广义线性模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/06/3c/06336e9b7f271d0d26395fa31646883c.mp3"></audio>
直观来看,上一篇文章介绍的逻辑回归只是对普通线性回归的输出加以变换,以满足问题的需要。但在这简单的现象背后,以逻辑回归为代表的这类线性模型的推广具有更加深刻的数学内涵,因而被称为**广义线性模型**generalized linear model
线性模型的意义是建立了自变量和因变量的关联,当自变量变化时,因变量也会出现依照比例同等程度的变化。可是现实世界不是数学模型,如果硬要将线性模型套用在实际问题中,很可能会闹出笑话。
如果线性回归告诉你气温每下降1度海滩上的游客就会减少100人那么这条规律适用于科帕卡巴纳或者芭堤雅的问题不大因为这些著名的度假胜地的游客基数数以万计。可是对于一个最多只能接待80名游客的不知名小海滩来说气温下降1度意味着游客数目变成了-20难不成工作人员也被冻跑了吗这和不能听相声是一个道理“笑一笑十年少”也是个线性模型要是这个模型属实的话哪怕只听一分钟相声我都要回到娘胎里去了。
物理学中有个概念叫**半衰期**不严格地说它指的是放射性元素的原子核半数发生衰变所需要的时间。元素的半衰期和原子的总量无关100个原子中衰变50个的时间和剩下的50个原子中衰变25个的时间是一致的。和线性模型相比以半衰期为代表的建模方式似乎更加符合真实世界的规律因变量变化的绝对尺度通常是非线性的但其变化比率却会和自变量呈现线性关系。
半衰期的思路也可以自然地延伸到离散输出的问题当中。如果说气温每上升1度某人去海滩的概率就会翻一番这是否意味着在原本有75%的概率去海滩时温度的上升会将这个概率提高到150%呢?肯定不是。气温升高会让去海滩的概率增大,不去海滩的概率减小。如果将去与不去的概率之比定义为**几率**odd那么气温升高会导致相对的几率而非绝对的概率翻一番显然是更合理的解释。按这种方式计算气温上升1度会让75%的概率变成85.7%,这样就说得通了。
除了能否真实表示自变量和因变量的关联之外线性回归将因变量的误差定义为正态分布其实也是过于理想的假设。比如当因变量是离散输出时使用正态分布假设的建模效果自然会大打折扣。在一场足球比赛中某只球队进球数目超过8个的概率微乎其微。因而在预测某队的进球数时用正态分布对分布在01234567这些离散数值上的因变量进行建模就缺乏合理性泊松分布才是更好的选择。
可不巧的是,正态分布恰恰是狭义线性模型的核心成分,它是联结最小均方误差和最大似然估计的纽带。在求解时,狭义的线性模型建立在最小均方误差的意义上,其解析解可由普通最小二乘法求得,求解时的一个基本前提是因变量,也就是回归结果的误差服从正态分布,这个推导过程我在“人工智能基础课”中有详细介绍。
误差的正态分布意味着因变量既可以增加也减少,其增加或者减少的范围虽然不存在上限,却以较大的概率出现在一个较小的区间内。如果按照前文的方式改造狭义线性模型的话,噪声的正态性质就不能得以保持,简洁明晰的解析解也会不再适用。因此,要拓展线性模型的应用范围,新的数学工具不可或缺。
**广义线性模型**generalized linear model就是这样的数学工具。在广义线性模型中因变量可以满足任意形式的**概率分布**,它与自变量的线性组合之间的关系由**联系函数**定义。**逻辑回归就是广义线性模型的一个实例**,它的因变量是二进制的输出,联系函数则是对数几率函数。这个实例体现出了在一般意义上,广义线性模型要满足一些共性的条件。
首先,**广义线性模型的基础是指数分布族**exponential family。模型的因变量$y$由自然参数natural parameter$\boldsymbol \eta$决定,$y$的概率密度函数可以写成
$$ p(y; \boldsymbol \eta) = b(y) \exp [ \boldsymbol \eta ^T T(y) - a(\boldsymbol \eta)] $$
其中的$T(y)$是个充分统计量sufficient statistic通常令它等于$y$本身;$b(\cdot)$和$a(\cdot)$都是已知的函数。虽然这个模型看起来比较复杂,但只要选择合适的$b(\cdot)$和$a(\cdot)$,常见的正态分布和指数分布等连续型分布,以及二项分布和泊松分布等离散性分布都能够满足这个条件,也就都属于指数分布族。
在因变量属于指数分布族的前提下,广义线性模型需要求解给定数据$\bf X$时,充分统计量$T(y)$的条件期望。当$T(y) = y$时,模型的任务就退化为求解$E(y | {\bf X}) = \mu$,求解的方法就是**利用联系函数定义代表自变量的数据和因变量的条件期望值之间的关系**。
“线性”的含义正体现在联系函数的反函数$g(\cdot) {-1}$的输入,也就是自然参数$\boldsymbol \eta$是数据的**线性组合**,写成数学表达式就是
$$ \mu = g ^ {-1}(\boldsymbol \eta) = g ^ {-1} ({\bf X}{\boldsymbol \beta}) $$
这说明数据的线性组合${\bf X}{\boldsymbol \beta}$就是联系函数在输入为条件期望$\mu$时的输出。
总结下来,**指数分布族、联系函数和线性关系共同构成了广义线性模型的三大要素**。自变量的线性组合就是指数分布族的自然参数,它被送入到激活函数中,计算得出给定数据时因变量的条件期望。在这个更加通用的概念层面上,我们就可以重新审视逻辑回归。
逻辑回归的输出$y$服从两点分布,如果两点分布的参数是$\psi$,它的概率质量函数就可以写成$p(y; \psi) = \psi ^ y (1 - \psi) ^ {1 - y}$,这个表达式稍做数学整理就是
$$ p(y, \psi) = \exp [y \log \dfrac{\psi}{1 - \psi} + \log (1 - \psi)] $$
令自然参数$\eta$等于标量$\log[\psi / (1 - \psi)]$,充分统计量$T(y)$等于$y$,两个函数$b(y) = 1, a(\eta) = -\log (1 - \psi)$,逻辑回归中的因变量分布就变化为指数分布族的表示形式,因而属于指数分布族。这时,因变量$y$在数据$\bf X$和参数$\psi$下的条件期望就等于$E(y | {\bf X}, \psi) = \psi = [1 + \exp(-\eta)] ^ {-1}$,这就是逻辑回归使用对数几率函数的原因所在。再将自然参数写成数据的线性组合,就是逻辑回归的方法了。
回头来看,广义线性模型解决了前文中提到的狭义线性模型的两个问题,这两个问题体现在广义线性模型的两种成分之上。自变量和因变量之间的系统性关联在广义线性模型中体现为**系统成分**systematic component。和狭义线性模型一样系统成分仍然保留着对自变量的线性性质只不过自变量线性组合的结果不再直接和因变量对应而是要先做出非线性的变换。
因变量的误差在广义线性模型中以**随机成分**random component的角色出现。随机成分不受正态分布的限制可以被建模成任何属于指数分布族的概率分布。使用指数分布族后因变量的均值就能够决定误差的性质从而包含了更多的信息。这不仅大大拓展了广义线性模型的应用范围还保留了利用最大似然估计计算最优参数的可行性。
说到现在,系统成分和随机成分还是井水不犯河水的独立数量,将它们联系起来的任务就落在了联系函数身上。**联系函数将因变量的数学期望表示成自变量线性组合的函数**。
在普通线性模型中,联系函数就是因变量本身;而在逻辑回归等比较简单的广义线性模型里,联系函数将指数分布中的自然参数表示成自变量的线性组合,这样的联系函数就是**正则联系函数**canonical link
正则联系函数的好处是保证待估计参数$\boldsymbol \beta$的最小完全统计量存在,所有关于$\boldsymbol \beta$的信息都可以由一个和$\boldsymbol \beta$维度相同的函数获得。
和普通线性模型一样,广义线性模型也可以从贝叶斯的角度去认识。
贝叶斯学派将待估计的参数同样视为随机变量,因此可以假设参数$\boldsymbol \beta$满足多维正态分布,并将它结合到原始的最大似然估计中。之所以不使用均匀分布作为先验分布的原因是当训练数据线性可分时,这种无信息的先验会让似然估计无法计算出结果,相当于将简单的问题复杂化。引入先验分布可以简化模型选择的过程,自动起到正则化的作用,但其计算也会更加复杂,需要通过数值方法来求解。
Scikit-learn库只能够实现逻辑回归要构造通用意义上的广义线性模型的话就要借助侧重统计分析的statsmodels。在这里我以泊松回归Poisson regression为例。
泊松分布适用于描述单位时间或空间内随机事件发生的次数,比如电话交换机接到呼叫的次数,汽车站台的候客人数,机器出现的故障数,自然灾害发生的次数等。在足球比赛中,由于某支球队在每场比赛的进球数是典型的计数型变量,故而通常使用泊松分布来建模。
如果以新科英超冠军曼城队作为数据采集对象统计曼城队在2017-18英超赛季所有主场比赛中的进球数得到的就是包含19个样本的数据集。这个数据集的因变量是符合泊松分布的进球数目自变量则考虑了一系列和进攻有关的数据包括射门次数shots、射正次数shots on target、传球成功率pass accuracy、争顶成功率aerial dual success、过人次数dribbles won和控球比率possession这么几个属性。用这些属性对进球数进行泊松回归的拟合可以得到如下的结果
<img src="https://static001.geekbang.org/resource/image/88/70/88957df8b72281e96da038fbd3666970.png" alt="" />
从结果中可以看出,泊松回归使用的联系函数是自然对数函数。在统计学的显著性上,射正次数、传球成功率和控球比率三个属性对进球数有明显的影响,另外三个属性对进球数基本没有贡献。利用这三个强相关的属性来拟合泊松回归,又可以得到下面的结果
<img src="https://static001.geekbang.org/resource/image/13/4b/138d35caafe71d6fa726e7dbaef1d64b.png" alt="" />
可以看到,基于强相关属性计算出的线性系数基本没有变化。由于泊松回归使用的联系函数是对数函数,所以线性回归分析出来的结果是因变量期望值的对数,要解释计算出的参数就得对它们做个指数运算。$exp(x_1) = 1.18$可以粗略地解释为当其他条件不变时每多一脚命中门框的射门都能让进球数变成原来的1.18倍。但整体来看,广义线性模型在增强表达能力时,付出的是可解释性的代价。
今天我和你分享了广义线性模型的概念与原理,它克服了狭义线性模型的一些限制,拓展了线性模型的应用范围。其要点如下:
<li>
广义线性模型从模型解释性和变量分布特性上对普通线性模型做了推广;
</li>
<li>
广义线性模型假定因变量服从指数分布族中的概率分布,这代表了模型中的随机成分;
</li>
<li>
广义线性模型中的自变量和因变量依然由线性系数决定,这代表了模型中的系统成分;
</li>
<li>
联系函数建立系统成分和随机成分的关系,将指数分布的自然参数表示为自变量的线性组合。
</li>
最后要说明的是广义线性模型和一般线性模型general linear model虽然名字相似却是两个不同的概念你可以了解下他们之间的区别并在这里分享你的理解。
<img src="https://static001.geekbang.org/resource/image/1b/26/1baff289ad8b330d7b4beab3a4c40f26.jpg" alt="" />

View File

@@ -0,0 +1,102 @@
<audio id="audio" title="17 | 几何角度看分类:支持向量机" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f2/ef/f227a2987d4e5dc0a15d09e8ebf45fef.mp3"></audio>
前文中介绍过的逻辑回归是基于似然度的分类方法,通过对数据概率建模来得到软输出。而在另一类基于判别式的硬输出分类方法中,代表性较强的就得数今天要介绍的支持向量机了。
支持向量机并不关心数据的概率而是要基于判别式找到最优的超平面作为二分类问题的决策边界。其发明者弗拉基米尔·瓦普尼克Vladimir Vapnik用一句名言清晰地解释了他的思想能走直线就别兜圈子。
当然啦这是“信达雅”的译法老瓦的原话是“不要引入更加复杂的问题作为解决当前问题的中间步骤When trying to solve some problem, one should not solve a more difficult problem as an intermediate step. )”。
在他看来,估算数据的概率分布就是那个作为中间步骤的复杂问题。这就像当一个人学习英语时,他只要直接报个班或者自己看书就行了,而不需要先学习诘屈聱牙的拉丁语作为基础。既然解决分类问题只需要一个简单的判别式,那就没有必要费尽心机地去计算似然概率或是后验概率。正是这化繁为简的原则给支持向量机带来了超乎寻常的优良效果。
一提到支持向量机大部分人的第一反应都是核技巧。可核技巧诞生于1995年而支持向量机早在30年前就已经面世。支持向量机support vector machine是基于几何意义的非概率线性二分类器所谓的核技巧kernel trick只是支持向量机的一个拓展通过维度的升高将决策边界从线性推广为非线性。所以对于支持向量机的基本原则的理解与核技巧无关而是关乎**决策边界的生成方式**。
<img src="https://static001.geekbang.org/resource/image/0d/06/0d6eb1459f72940dc932795f345bae06.png" alt="" />
线性可分数据集的决策边界(图片来自维基百科)
想象一下,如果一个数据集是二维平面上的线性可分数据集,那它的决策边界就是一条简单的直线。可这条能将所有训练数据正确区分的直线是不是唯一的呢?显然,答案是否定的,因为两个最近的异类点之间存在一段距离,这从上图中就能看出。事实上,像这样的能正确区分数据的直线有无数条。
那么问题来了:在这些直线里,哪一条是最好的呢?这里我们抛开复杂的数学证明,而是通过直观的几何视角来解释:回头看看上面的示意图,蓝色直线$H_2$和红色直线$H_3$都能不出任何错误地完成分类。那么在不存在关于数据的其他信息的情况下,你是会选择$H_2$还是$H_3$作为最优决策边界呢?
这里我们先抛除数据的抽象意义,而是把不同颜色的原点想象成是正在打仗的两支军队,现在双方要停火休战,自然要划出一条停火线,以及由停火线延伸出来的非交战区。如果你是黑军的司令官,那就断然不会选择$H_1$作为停火线,因为它直接把你的一部分麾下赶到对方的阵地当中,把自己人拱手相让可不是优秀的指挥官该做的事情。
既然$H_1$不行,那$H_2$行不行呢?这样一条停火线能保证双方各自坚守阵地,看起来是个不错的选择。可问题在于它离双方的阵地太近了,如果有些人存心越雷池搞事,他完全可以偷偷地穿越非交战区并越过停火线,打一梭子黑枪就跑。由于停火线和阵地的距离太近,白军的骚扰部队完全可以在你发现之前就神不知鬼不觉地完成任务并且安全返回了。虽然你的黑军也可以同样地操作以眼还眼以牙还牙,但归根结底还是不利于和平的嘛!
如此看来,能够入你法眼的停火线就只有$H_3$了,它既保证了所有士兵都驻扎在自己的阵地当中(数据中没有分类错误),又划定出足够宽阔的非交战区,杜绝了偷袭的可能性(数据与决策边界的距离足够大)。有了这样一条理想的停火线,谈判时心里是不是也会多几分踏实呢?
说完这个类比,还是要书归正传,回到数据本身。**机器学习的算法关注的不仅是训练误差,更是泛化误差**。
在上面的二分类问题中,边界$H_2$过于靠近一些训练数据,那么这些靠近边界的数据受噪声或干扰影响时,得到的真实数据就更容易从一个类别跳到另外一个类别,导致分类的错误和泛化性能的下降。相比之下,边界$H_3$距离两侧的数据都比较远,如果这些数据点要从$H_3$的一侧跳到另一侧的话,它们要跨越的距离就会更大,跳过去的难度也就大多了。
直观的几何意义告诉我们,位于不同类别数据正中间的决策边界对样本扰动的容忍度最高,在未知数据上的泛化性能也就最好。那么问题来了:什么样的超平面才算“正中间”呢?这就得通过构造最优化问题来解决啦!相关内容在“人工智能基础课”中已有介绍,在这里就不重复了。
换个角度看,正中间的超平面实际上就是**几何意义上最优的决策边界**。还是以二维平面为例,不妨假设存在能够将数据完全区分开来的两条平行线,所有正类数据点都在这两条平行线的一侧,所有负类数据点则在平行线的另一侧。更重要的是,我们要让这两条平行线中的一条经过一个正类点,另一条则经过一个负类点。不难发现,这两个点就是欧氏距离最近的两个异类点了。
接下来,让这两条平行线以它们各自经过的异类点为不动点进行旋转,同时**保证平行关系和分类特性不变**。在旋转的过程中,两个不动点之间的欧氏距离是不变的,但两条线的斜率一直在改变,因此它们之间的距离也会不断变化。当其中一条直线经过第二个数据点时,两条直线之间的距离就会达到最大值。这时,这两条平行线中间的直线就是最优决策边界。
如果你对上一季的内容还有印象就会想到,**落在两条平行线上的几个异类点就是支持向量**support vector。如果将最优决策边界看成一扇双向的推拉门把这扇门向两个方向推开就相当于两条平行线的距离逐渐增加。当这两扇门各自接触到支持向量时停止移动留下来的门缝就是两个类别之间的间隔。
<img src="https://static001.geekbang.org/resource/image/02/27/02c18abd0da8e95346fc5a931b065e27.png" alt="" />
最优分隔超平面与支持向量(图片来自维基百科)
**间隔margin是支持向量机的核心概念之一它是对支持向量到分离超平面的距离度量可以进一步表示分类的正确性和可信程度**。根据归一化与否的区别,间隔还可以分成**几何间隔**geometric margin和**函数间隔**functional margin这两者的定义也在“人工智能基础课”中已经做过介绍你可以回忆一下。
当数据线性可分时,分离超平面有千千万,但几何间隔最大的只有一个。**支持向量机的基本思想就是找出能够正确划分数据集并且具有最大几何间隔的分离超平面**maximum-margin hyperplane
可是,只是将线性可分的数据分开不算本事,应用在线性不可分的数据上时,支持向量机会不会像单层感知器一样崩溃呢?肯定会啦!但支持向量机明白不能不撞南墙不回头,既然将全部数据点正确分类是不可能完成的任务,那就不如退而求其次,以放过几个漏网之鱼为代价来保证大多数数据的正常分类。
这些漏网之鱼就是通常所说的异常点,它们将线性可分条件下的**硬间隔**hard margin变成了线性不可分条件下的**软间隔**soft margin这就让支持向量机的优化对象从原始的间隔距离变成了间隔距离和分类错误率的折中。
在计算软间隔时,支持向量机利用**合页损失函数**hinge loss来表示分类错误率。合页损失可以看成是对计数表示的分类错误率的近似。从它的图像可以看出作为一个连续函数合页损失只计算了错误分类结果的相关指标分类正确的数据对它是没有贡献的。
因此在软间隔的优化中,也只需要考虑几个异常点对决策边界的影响。这恰恰体现出了支持向量机的思想方法:**最终的决策边界仅与少数的支持向量有关,并不会受到大量普通数据的影响**。
合页损失的引入可以看成是对线性可分支持向量机的正则化处理,在优化问题中它们会以**松弛变量**slack variable的形式出现。在瓦普尼克的词典里这个思想叫作**结构风险最小化**structrual risk minimization。和结构风险最小化相对应的是**经验风险最小化**empirical risk minimization表示的就是训练误差最小。
在之前的文章中我们多次提到,训练误差太小并不是好事,这很有可能导致模型过于复杂而出现过拟合。结构风险最小化就是带着抑制过拟合的任务出现的。
瓦普尼克将支持向量机的泛化误差$R({\bf w}, b)$分成了两部分,即$R({\bf w}, b) = R_{emp}({\bf w}, b) + \phi$。其中$R_{emp}({\bf w}, b)$是模型在训练集上的经验风险,也就是**训练误差**$\phi$则表示了训练误差在泛化时的置信区间,也可以叫作**置信风险**这是个和假设空间的VC维有关的量。
**假设空间的VC维越小意味着模型的复杂度越低对应的置信误差就越小模型的泛化性能也就越强**
除了间隔之外,支持向量机的另一个核心概念是**对偶性**duality。间隔的作用体现在原理上而对偶性的作用体现在实现上。虽然通过前面那些形象的例子我解释了为什么最优的决策边界会存在它们却解决不了如何求解最优边界的问题。无论是硬间隔的计算还是软间隔的计算都可以通过拉格朗日乘子的引入将原始问题转化成对偶问题来找到最优解。这部分内容在下一篇中会出现这里先做个铺垫。
用于试验支持向量机的数据也来自英超,关注的焦点在于不同的比赛风格。传统的英式足球强调身体对抗、长传冲吊与高举高打,来自大陆和南美的拉丁派打法则偏重于对球的控制和精准传切,这两种不同的风格可以通过比赛数据直观体现出来。
我将以2017-18赛季英超联赛冠军曼城Manchester City和副班长西布罗姆维奇West Bromwich Albion38场联赛的数据作为样本每个样本都包含每场比赛的长传数目、短传数目、头球射门数和脚下射门数4个属性实际使用的则是前两者和后两者各自的比值。
在Python中实现支持向量机需要调用Scikit-learn库中的svm模块通过其中的SVC类来实现分类。要生成线性边界需要将SVC中的kernel参数设置为linear同时还要将常数项$C$设置为一个接近正无穷的值,以避免正则化的使用。
此外在svm模块中还有另外一个名为LinearSVC的类其功能与linear kernel的SVC近似但在同一个数据集上得到的结果是不同的。两者的区别你可以参考这个网页https://stackoverflow.com/questions/45384185/what-is-the-difference-between-linearsvc-and-svckernel-linear在此感谢原作者。
<img src="https://static001.geekbang.org/resource/image/29/e3/291ee10e303f2cc718686ac4d15106e3.png" alt="" />
用支持向量机对比赛风格数据集的分类结果
将数据点以传球比和射门比为横纵坐标画在同一个坐标平面内,得到的就是上图的结果,图中的横坐标是长传数与短传数之比,纵坐标为头球射门与脚下射门之比。可以看出,曼城的球风是长传少头球少,而西布朗恰恰相反。
但具体到不同的比赛中偶尔也会出现与常规球风相左的情形这就是数据集中的异常点。由于这个数据集并不是线性可分的因而只能用软间隔来刻画。从图上看支持向量机的分类结果差强人意除了3个明显的异常点外其他数据的划分都是正确的。有些数据点虽然距离最优分离超平面较近但并没有出现错误。
今天我和你分享了支持向量机的概念与原理,着重从几何意义上解释了算法的来龙去脉,其要点如下:
<li>
支持向量机是基于线性判别式几何意义的分类算法;
</li>
<li>
支持向量机通过间隔最大化来定义最优的决策边界;
</li>
<li>
支持向量机通过对偶问题来求解最优的决策边界;
</li>
<li>
支持向量机的目标是让结构风险最小化。
</li>
支持向量机固然好用,却由于原理的限制而不能直接地推广到多分类问题上,其几何意义在多分类任务中并不能直观地体现。那么支持向量机如何解决多分类问题呢?
你可以查阅相关资料,并在这里分享你的见解。
<img src="https://static001.geekbang.org/resource/image/03/7d/036637d03fd1c7c6bd96920ee7bdcc7d.jpg" alt="" />

View File

@@ -0,0 +1,130 @@
<audio id="audio" title="18 | 从全局到局部:核技巧" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3d/48/3d3e5bab117d2bc462d855a26b23ea48.mp3"></audio>
俗话说得好:“支持向量机有三宝,间隔对偶核技巧”。在上一篇文章中我和你分享了间隔这个核心概念,今天就来看看对偶和核技巧的使用。对偶性主要应用在最优决策边界的求解中,其逻辑比较简单。
但在介绍核技巧时,会先后涉及核函数、核方法、核技巧这些近似的概念。虽然从名字上看,它们都是“核”字辈的兄弟,但是在含义和用途上却不能一概而论,因此有必要对它们做一些系统的梳理。
当支持向量机用于线性可分的数据时,不同类别的支持向量到最优决策边界的距离之和为$2 / || {\bf w} ||$,其中的${\bf w}$是超平面的线性系数,也就是法向量。不难看出,让间隔$|| {\bf w} || ^ {-1}$最大化就是让$|| {\bf w} || ^ 2$最小化,所以线性可分的支持向量机对应的最优化问题就是
$$ \mathop {\min }\limits_{{\bf w}, b} \dfrac{1}{2} || {\bf w} || ^ 2$$
$$ {\rm s.t.} y_i ({\bf w} \cdot {\bf x}_i + b) \ge 1$$
其中$y_i$为数据点${\bf x}_i$对应的类别,其取值为$\pm 1$。
这个问题本身是个**凸二次规划**convex quadratic programming问题求解起来轻松加随意。但借助拉格朗日乘子这个原问题primal problem就可以改写成所谓的广义拉格朗日函数generalized Lagrange function
$$ L({\bf w}, b, {\boldsymbol \alpha}) = \dfrac{1}{2} || {\bf w} || ^ 2 + \sum\limits_{i = 1}^m \alpha_i[1 - y_i ({\bf w} \cdot {\bf x}_i + b)] $$
其中每个$\alpha_i$都是$\boldsymbol \alpha$的分量。和原来的优化问题相比,除了和决策边界有关的变量${\bf w}$和$b$之外广义拉格朗日函数还引入了一组不小于0的参数$\alpha_i$。
这个式子其实从另一个角度说明了为什么最优决策边界只取决于几个支持向量。对于不是支持向量的数据点来说,等式右侧第二项中的$1 - y_i ({\bf w} \cdot {\bf x}_i + b)$是小于0的因此在让$L({\bf w}, b, {\boldsymbol \alpha})$最小化时,必须把这些点的贡献去除,去除的方式就是让系数$\alpha_i = 0$。这样一来,它们就成来支持向量机里的路人甲乙丙丁了。
广义拉格朗日函数的最优化可以分成两步:先把$ L({\bf w}, b, {\boldsymbol \alpha})$看成$\boldsymbol \alpha$的函数,在将${\bf w}$和$b$视为常量的前提下求出其最大值。由于$\boldsymbol \alpha$在求最值时被消去,这时求解出的
$$\theta _p ({\bf w}, b) = \mathop {\max}\limits_{\boldsymbol \alpha} L({\bf w}, b, {\boldsymbol \alpha})$$
就是只和${\bf w}$和$b$有关的函数了。
接下来如何确定最优的决策边界参数呢?这里要分两种情况来考虑。当参数${\bf w}$和$b$不满足原问题的约束时,总会找到能让目标函数取值为正无穷的$\boldsymbol \alpha$,这意味着最大值其实就是不存在。只有符合原问题的要求时,$\theta _P ({\bf w}, b)$的最大值才有意义。
那么这个最大值等于多少呢?由于$\alpha_i$和$1 - y_i ({\bf w} \cdot {\bf x}_i + b)$的符号相反因此两者之积必然是小于0的由此不难得出$\theta _P ({\bf w}, b) = || {\bf w} || ^ 2 / 2$。这里需要注意的是,在确定最优的$\boldsymbol \alpha$时,原始的优化对象$|| {\bf w} || ^ 2 / 2$是作为常数项出现的。
经过一番折腾之后,原始的最小化问题就被等效为$\mathop {\min }\limits_{{\bf w}, b} \theta _p ({\bf w}, b)$,也就是广义拉格朗日函数的极小极大问题。这个极小极大问题是先对$\boldsymbol \alpha$求极大,再对${\bf w}$和$b$求极小。如果对上一季的内容还有印象的话你是不是会一拍大腿一边最大一边最小这不就是传说中的鞍点saddle point
计算多重积分时,调换积分顺序是简化计算的常用技巧,这种思路在对偶问题中同样大有用武之地。“极小极大”调个个儿就变成了“极大极小”,确定参数的顺序也要相应地反转。对于支持向量机来说,其广义拉格朗日函数的极大极小问题具有如下的形式
$$ \mathop {\max}\limits_{\boldsymbol \alpha} \theta _D(\boldsymbol \alpha) = \mathop {\max}\limits_{\boldsymbol \alpha} \mathop {\min }\limits_{{\bf w}, b} L({\bf w}, b, {\boldsymbol \alpha}) $$
让广义拉格朗日函数对决策边界的两个参数$\bf w$和$b$的偏导数为0就可以得到
$$ {\bf w} = \sum\limits_{i = 1}^m \alpha_i y_i {\bf x}_i, \sum\limits_{i = 1}^m \alpha_i y_i = 0 $$
将解出的约束关系先代入到$L({\bf w}, b, {\boldsymbol \alpha})$中,再作为拉格朗日乘子项引入$L({\bf w}, b, {\boldsymbol \alpha})$的优化就可以得到原优化问题的对偶问题dual problem
$$ \mathop {\max}\limits_{\boldsymbol \alpha} \sum\limits_{i = 1}^m \alpha_i - \dfrac{1}{2} \sum\limits_{i = 1}^m \sum\limits_{j = 1}^m \alpha_i \alpha_j y_i y_j {\bf x}_i^T {\bf x}_j$$
$$ {\rm s.t.} \sum\limits_{i = 1}^m \alpha_i y_i = 0, \alpha_i \ge 0$$
虽然一顿操作猛如虎将原问题变成了对偶问题,但这两者之间到底能不能完全划等号还是个未知数呢。直观地看,原函数求出来的是$L({\bf w}, b, {\boldsymbol \alpha})$最大值的下界,对偶函数求出来的是$L({\bf w}, b, {\boldsymbol \alpha})$最小值的上界,后者肯定不会大于前者,但也不是无条件地相等。
好在在数学上可以证明,当上面的过程满足**Karush-Kuhn-Tucker条件**简称KKT条件是一组关于$\boldsymbol \alpha$、${\bf w}$和$b$的不等式)时,原问题和对偶问题才能殊途同归。**支持向量机对原问题和对偶问题之间等价关系的利用就是它的对偶性duality**。
说完了对偶性,下面就轮到核技巧了。在核技巧这台大戏里,第一个出场的是**核函数**,这才是“核”字辈这些兄弟里的开山鼻祖。
要理解核函数,还是要从史上最著名的线性不可分问题——异或问题出发。假设待分类的四个点$(x_1, x_2)$分别为$(\pm 0, \pm 1)$,那么只需要添加一个多项式形式的新属性$\phi ({\bf x}) = (x_1 - x_2) ^ 2$,就可以将原来的四个点分别映射为三维空间上的(0, 0, 0), (0, 1, 1), (1, 0, 1)和(1, 1, 0)。这时,在三维空间中只需要将原来的数据平面稍微向上抬一点,就能完美地区分两个类别了。
既然$\phi ({\bf x})$能生成新的属性,它就是传说中的核函数吧?非也!$\phi ({\bf x})$只是特征映射feature map它的作用是从原始属性生成新的特征。**对高维空间上新生成的特征向量进行内积运算,得到的才是真正的核函数**kernel function。核函数的数学表达式具有如下的形式
$$ k({\bf x}, {\bf x}) = \phi ({\bf x}) ^ T \phi ({\bf x}) $$
核函数的这个公式给出了生成条件而非判定条件。当给定特征的映射方式后,可以用它来计算核函数;但是当给出一个确定的函数时,如何判定它能不能作为核函数呢?**梅塞尔定理**Mercers theorem解决了这个判定问题。
这个定理于1909年由英国数学家詹姆斯·梅塞尔James Mercer提出其内容是任何满足对称性和半正定性的函数都是某个高维希尔伯特空间的内积。只要一个函数满足这两个条件它就可以用做核函数。但梅塞尔定理只是判定核函数的充分而非必要条件不满足梅塞尔定理的函数也可能是核函数。
之所以要将特征映射表示成核函数,是因为内积的引入简化了高维空间中的复杂运算。映射到高维空间后,待优化的对偶问题就变成了
$$ \mathop {\max}\limits_{\boldsymbol \alpha} \sum\limits_{i = 1}^m \alpha_i - \dfrac{1}{2} \sum\limits_{i = 1}^m \sum\limits_{j = 1}^m \alpha_i \alpha_j y_i y_j \phi({\bf x}_i)^T \phi({\bf x}_j) $$
按照一般的思路,要直接计算上面的表达式就先得写出$\phi (\cdot)$的形式,再在新的高维特征空间上计算内积,但这在实际运算中存在很大困难。尤其是当$\phi (\cdot)$的表达式未知时,那这内积就没法计算了。可即使$\phi (\cdot)$的形式已知,如果特征空间的维数较高,甚至达到无穷维的话,内积的运算也会非常困难。
这时就需要核函数来发挥威力了。核函数说到底是瓦普尼克“能走直线就别兜圈子”思想的产物。既然优化的对象是内积的结果,那么直接定义内积的表达式就可以了,何苦还要引入特征映射和特征空间这些个中间步骤呢?更重要的是,梅塞尔定理为这种捷径提供了理论依据,只要核函数满足对称性和半正定的条件,对应的映射空间就铁定存在。
所以核函数的引入相当于隐式定义了特征映射和特征空间,无需关心这些中间结果的形式就能直接计算待优化的内积,从而大大简化计算。
从核函数出发,可以衍生出其他和“核”相关的概念。**从思想上讲核方法kernel method表示的是将低维空间中的线性不可分问题通常可以转化为高维空间中的线性可分问题的思路从运算上讲核技巧kernel trick表示的是通过间接定义特征映射来直接计算内积的运算方法**。两者就像同一枚硬币的两面,虽然浑然一体但还是有所区别,因而有必要加以说明。
在实际应用中,有一类特殊的**平稳核函数**stationary kernel它的参数是两个原始参数之差也就是$k({\bf x}, {\bf x}) = k({\bf x} - {\bf x})$。平稳核函数满足平移不变性translation invariance只要输入$\bf x$和${\bf x}$的相对位置不变,核函数的取值就不会发生变化。如果在平移不变性的基础上再定义**各向同性**homogeneity那核函数的取值就会进一步与方向无关这样的核函数就可以表示为$k({\bf x}, {\bf x}) = k(|| {\bf x} - {\bf x} ||)$。
一种满足平移不变性和各向同性的核函数是**径向基核**radial basis function kernel其表达式为
$$ k({\bf x}, {\bf x}) = \exp(-\dfrac{|| {\bf x} - {\bf x} || ^ 2}{2\sigma ^ 2}) $$
在数学上可以推导出,径向基核所对应的特征映射是无穷维的,也就是隐式的特征空间是无穷维的空间。计算无穷维的特征映射是个复杂的任务,但径向基核的出现聪明地绕开了这个障碍。应用在支持向量机中,径向基核可以将线性边界变换成非线性边界。
在Scikit-learn中设置核函数的方法并不难只需要将SVC类中的参数kernel设置为rbf即可也可以使用其他类型的核函数。径向基核的参数$\sigma$决定了高斯函数的宽度但在SVC类中这个参数是以$\gamma = 1 / 2\sigma ^ 2$的形式出现的这意味着调用SVC类时$\gamma$设置得越大,核的宽度实际上就越窄。
除了核宽度之外,另一个需要需要设置的是正则化参数$C$,这个参数越大,正则化的效果就越弱,当$C$接近正无穷时,计算出来的就是未经正则化处理的结果。将径向基核应用到线性不可分的数据集中,就可以将两类数据完全分开,如下图所示。在结果中,较大的$C$让最优决策边界有过拟合的趋势。
<img src="https://static001.geekbang.org/resource/image/66/e2/66d924eaf06752e0230d0ef1f6c105e2.png" alt="">
使用径向基核的支持向量机对曼城-西布朗数据集的分类结果
**除了简化内积运算之外核函数更本质的意义在于对相似性度量similarity measure的表示**。回忆一下线性代数的内容,内积表示的是两个向量之间的关系。如果将两个向量归一化后再来计算内积,那么求出来的就是两者之间的夹角。而作为原始内积的非线性拓展,核函数重新定义了数据的表征框架:将每个维度上的绝对坐标替换成两两之间的相似度。
这样一来,分类问题就变成了从几何意义出发,基于相似性度量在高维的特征空间上找到线性决策边界,再将它映射成低维空间上非线性的决策边界。
在直观的认识中,两个数据点相距越近,它们归属于同一类别的可能性就越高。如果将径向基的结果看成数据点相似度的话,那么$\bf x$和${\bf x}$离得越近两者之间的相似度就越高接近于1反过来离得越远相似度就越低接近于0
接下来,计算出的相似度就成为分类的依据:和哪个类别的相似度高,未知的数据点就归属于哪个类别。和线性判别分析和逻辑回归这些参数化的分类模型相比,核函数更多地借鉴了物以类聚的简单逻辑。
将这种逻辑引申一步就可以得到,**核函数是实现局部化localization的工具**。在解决回归问题时,核函数本质上也是一组权重系数,但它和线性模型中权重系数的区别在于它是取决于距离的,由距离表征的相似度决定了系数的取值。在整体上,数据空间的全局参数并不能通过最小二乘等全局性方法计算出来,而是要将每个核函数所表示的局部尺度特征叠加在一起。
这样看来,每个核函数都像是战国中雄踞一方的诸侯,其势力在远离权力中心的过程中不断减弱。和这些叱咤一方的诸侯相比,作为全局参数模型的周天子就完全是个摆设了。
今天我和你分享了支持向量机中对偶和核技巧的概念与原理,其要点如下:
<li>
支持向量机在求解最优边界时需要利用对偶性,将原问题转化为对偶问题求解;
</li>
<li>
在思想上,核方法将高维空间上的线性边界转化成低维空间上的非线性边界;
</li>
<li>
在运算上,核技巧能在低维空间中直接计算高维空间中的内积;
</li>
<li>
核函数具有局部化的特点,是从全局模型到局部模型的过渡手段。
</li>
其实在“人工智能基础课中”,高斯形式的径向基函数就有过亮相,它出现在径向基神经网络的介绍中。你可以复习一下这一部分的内容,借此加深对核函数与局部特性关系的理解。
**拓展阅读**
[《人工神经网络 | 各人自扫门前雪:径向基函数神经网络》](https://time.geekbang.org/column/article/2447)
说明:知识具有内在联系性,有些内容在“人工智能基础课”里有不同角度的介绍。拓展阅读是为了让你更方便地回顾内容,如已订阅可以直接点击进入文章复习。不阅读,也不影响当前的学习。
<img src="https://static001.geekbang.org/resource/image/28/a7/28e766563bb973126e37b6266b402aa7.jpg" alt="">

View File

@@ -0,0 +1,116 @@
<audio id="audio" title="19 | 非参数化的局部模型K近邻" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/2e/22/2e977dba5d760a8a6df3f6b34be9c122.mp3"></audio>
到目前为止,专栏中介绍的机器学习模型都属于参数模型,它们利用训练数据求解出关于问题的一般性知识,再将这些知识通过全局性模型的结构和参数加以外化。
一旦模型的结构和参数被确定,它们就不再依赖训练数据,可以直接用于未知数据的预测。而径向基核的出现一定程度上打破了这种规律,它将普适的全局特性打散成若干局部特性的组合,每个局部特性只能在它所覆盖的近邻区域内得以保持,由此产生的非结构化模型会具有更加灵活的表示能力。
在我看来,**局部化的核心作用是模型复杂度和拟合精确性的折中**。如果将整个输入空间看作一个大的整体区间,对它进行全局式的建模,那么单个模型就足以描述输入输出之间的规律,但这不可避免地会对表达能力造成较大的限制。
一个极端的情形是让所有输入的输出都等于同一个常数,这样的模型显然毫无信息量可言。可是在另一个极端,如果将局部特性继续加以细化,细化到让每个数据点都定义出不同局部特性的子区间,其结果就是基于实例的学习。
**基于实例的学习**instance-based learning也叫**基于记忆的学习**memory-based learning**它学习的不是明确的泛化模型,而是样本之间的关系**。
当新的样本到来时,这种学习方式不会用拟合好的算式去计算输出结果或是输出结果的概率,而是根据这个新样本和训练样本之间的关系来确定它的输出。在本地化的语境里,这就叫“近朱者赤,近墨者黑”。
在基于实例的学习方法中,最典型的代表就是$k$近邻。$k$近邻算法($k$-nearest neighbors algorithm可能是最简单的机器学习算法它将每个训练实例都表示成高维特征空间中的一个点。
在解决分类问题时,$k$近邻算法先找到高维空间中与未知实例最接近的$k$个训练实例,再根据少数服从多数的原则,将这$k$个实例中出现最多的类别标签分配给未知的实例。从贝叶斯定理的角度看,按照少数服从多数分配标签与后验概率最大化是等效的。
下图是$k$近邻算法的一个简单的例子。训练数据属于两个不同的类别,分别用蓝色方框和红色三角表示,绿色圆圈则代表待分类的数据点,其类别由$k$近邻算法决定。可以看到,当$k$等于3时离未知数据最近的三个点是两红一蓝因此数据会被归类为红色三角。可是当$k$从3增加到5时多出来的两个实例都是蓝色的这无疑会导致分类结果发生逆转。
<img src="https://static001.geekbang.org/resource/image/e7/ef/e780b42d95a9d577c264fa1183b571ef.png" alt="" />
k近邻算法示意图图片来自维基百科
这个例子说明了$k$近邻算法的一个特点,就是超参数$k$对性能的影响。作为一种局部加权模型,$k$近邻并不形成关于数据生成机制的全局性假设,而是刻画了数据在不同局部结构上的规律,局部结构的范围就是由$k$来定义的。
在本质上,超参数$k$和径向基核(以及其他的核函数)是一样的,只不过径向基核在定义局部结构时使用了连续分布的权值,所有数据对局部特征都有或大或小的贡献;而$k$近邻使用了离散分布的权值,只有部分足够接近的数据才有资格定义局部特征,它可以视为是可变带宽的径向基核。
从另一个角度看,超参数$k$表示了模型的复杂度,准确地说是和模型的复杂度成反比关系。如果训练集的容量为$N$,算法的有效参数数目就可以近似表示为$N / k$。
$k$均值的分类结果实质上是近邻区域内(就是上图中的圆圈)多个训练实例的平均,越大的$k$值意味着近邻区域包含的点数越多,平均化的程度就越高,对训练实例中噪声的平滑效果也就越好,相应的模型复杂度就越低。$k$的一个极端取值是直接等于训练集的容量,这相当于所有数据共同定义了同一个局部结构,这时的$k$近邻就退化成稳定的全局模型了。
反过来,越小的$k$值意味着近邻区域越狭窄,平均化的程度也就越低。这时的分类结果只由离未知数据点最近的少量训练实例决定,因而更容易受到这些实例中噪声的影响,也会表现出更强的过拟合倾向。当$k$等于1时未知数据的类别只取决于离它最近的训练实例。
这时画出每个训练实例的近邻边界,所有的近邻边界共同构成了对特征空间的**Voronoi划分**Voronoi tessellation。当训练实例较多时这种1近邻算法计算出的分类边界会非常复杂其泛化性能较差。
除了超参数$k$之外,$k$近邻算法的另一个变量是对距离的定义方式,也就是如何衡量哪些点才是“近邻”的标准。最常用的距离度量无疑是**欧氏距离**,可除此之外,**闵可夫斯基距离**Minkowski distance、**曼哈顿距离**Manhattan distance和**马氏距离**Mahalanobis distance也可以应用在$k$近邻算法中,不同的距离代表的是对相似性的不同理解,在不同意义的相似性下,分类结果往往也会有所区别。这些距离是如何来定义的,你可以自己查阅。
对距离的依赖性给$k$近邻算法带来了一个新问题,那就是**维数灾难**。在之前介绍维数灾难时我曾经留了一个扣,现在就该解开它了。简而言之,维数灾难对$k$近邻算法的影响在于在高维空间中,曾经的近邻没有那么“近”了。不管特征空间的维度是多少,近邻区域的维度和特征空间的维度都是一致的。在这个前提下,要在特征维度增加时维持对特征空间的覆盖率不变,近邻区域在每个维度上的尺度就会越来越大。
维数灾难的几何意义其实可以直观地想象出来。如果特征空间是一条长度为1的一维直线那任意一个长度为0.1的线段都能覆盖特征空间上10%的区域。可一旦特征空间变成二维要在边长为1的正方形里圈出一个面积为0.1的小正方形,小正方形的边长就增加到$\sqrt{0.1} = 0.316$。这样一来,当数据点的数目不变时,维度的升高会导致原始的低维近邻点变得越来越稀疏,由近邻点所定义的局部结构也会越来越大。这样的局部结构失去了局部的意义,想让算法保证精确的分类性能就越困难了。
<img src="https://static001.geekbang.org/resource/image/6c/84/6c46d7f840c8e8badd37405d924fdc84.png" alt="" />
维度的升高会导致原始的低维近邻点变得越来越稀疏
图片来自http://cleverowl.uk/2016/02/06/curse-of-dimensionality-explained/
解决维数灾难最直接有效的方式就是**增加数据点的数量**,当数据点的数量没法增加时就得退而求其次,想办法**降低特征空间的维度**。还记得降维的主要方法吗?特征选择和特征提取都可以用于$k$近邻算法对数据的预处理。
作为典型的非参数方法,$k$近邻算法的运行方式和以线性回归为代表的参数方法截然相反。线性回归的运算量主要花在参数拟合上,利用大量的训练数据来拟合出使均方误差最小的一组参数。
一旦这组参数被计算出来,训练数据的历史使命就完成了,新来的数据都会用这组参数来处理。可$k$近邻算法的训练过程没那么复杂,只需要将数据存储下来就行了。可是对新实例进行分类时,$k$近邻算法需要找到离它最近的$k$个训练实例,这才是算法主要的运算负荷。
虽然是频率主义的方法,但以核函数和$k$近邻为代表的非参数方法也可以用来完成贝叶斯统计中**概率密度估计**density estimation的任务。如果用**参数方法**来进行密度估计,就需要先确定待估计概率密度的形式,再根据训练数据计算表示数字特征的参数。
比如假定概率密度具有正态分布的形式,那就需要估计它的均值和方差;具有指数分布的形式就要估计指数分布的参数。显然,参数化密度估计对概率密度形式的假设具有很强的依赖性,如果对概率分布的形式判断错误,那系数计算得再精确也是南辕北辙。
相比之下,非参数的密度估计就不会对待估计的分布做出什么先验假设,只是假定所有数据满足独立同分布的条件,因而具有更高的灵活性。但要讨论非参数密度估计方法,还是得从一种参数方法——**直方图法**histogram说起。
在统计学生成绩时,通常会计算&lt;60、60~70、70~80、80~90和&gt;90这些分数段内各有多少人来大致绘出成绩的分布情况这就是典型的直方图。直方图法将样本的取值范围划分成若干个等间隔子区间再统计出现在每个子区间上的样本数目。在直方图上第$i$个子区间上的概率可以表示成
$$ p_i = \dfrac{n_i}{N\Delta} $$
其中$n_i$是落在这个子区间内的样本数,$N$是样本容量,$\Delta$是每个子区间的宽度,它决定了直方图的分辨率。$\Delta$的取值过小会让直方图过于细密,让过多的局部细节掩盖了分布的整体结构;取值过大又会让直方图过于平滑,体现不出潜在的多模式趋势。要对概率密度做出精确的估计,必须要选择合适的区间宽度。
**直方图方法的一个问题在于计算出的概率密度不是连续函数**。要解决这个问题,可以将原始的子区间替换成平滑的连续函数,这就让整体概率密度等于所有局部概率密度的叠加,避免了不连续点的出现。
那么用来插值的连续函数应该满足什么样的条件呢?平滑特性决定了它不能只管自己,也要刻画数据的局部特性。那么刻画局部特性的工具是什么呢?核函数嘛!把核函数用于密度估计,就是非参数的**核密度估计方法**kernel density estimation
<img src="https://static001.geekbang.org/resource/image/93/a4/9324a3f05f928041202d39dc4624cfa4.png" alt="" />
直方图(左)与核密度估计(右)(图片来自维基百科)
可有了核函数还不够,还需要确定它的带宽。在密度估计中,核函数带宽决定了局部结构的范围,其作用和直方图的子区间宽度类似。核函数的带宽过大会导致过度平滑,带宽过小则会导致欠平滑,在实际应用中可以通过最优化类似均方误差的指标来确定。
核密度估计虽然能够给出连续的概率密度,但它所有的局部结构都由相同的带宽决定。可是在特征空间上,不同区域数据的密度不同,其局部结构也应该有所区别,这时就需要引入$k$近邻算法的思想。在基于近邻的密度估计中,近邻点的数目$k$是唯一的参数,每个数据点的带宽就是第$k$个最近点和它的距离。和核密度估计的带宽一样,$k$值同样定义了局部结构的性质,因此在选择时也要慎之又慎。
核密度估计和近邻密度估计可以从一个统一的宏观视角加以审视。在高维空间中,如果将数据$\bf x$的局部结构定义为$R$,那么其概率密度就可以表示为
$$ p({\bf x}) = \dfrac{K}{NV} $$
其中$K$表示$R$中的数据点数目,$V$表示$R$的体积,它们都是不确定的量。如果设置$V$固定、$K$可变来估计概率密度,得到的就是核密度估计;如果设置$K$固定、$V$可变来估计概率密度,得到的就是近邻密度估计。
当样本容量$N \rightarrow +\infty$时,$V$会随着$N$的增加而缩小,以保证$R$上的概率密度为常数;$K$则会随着$N$的增加而增加,以保证$R$上的概率密度存在明显的峰值。这时,两种非参数的估计结果都会收敛到真实的概率密度。
和支持向量机一样,$k$近邻算法也可以用来解决分类问题。利用Scikit-learn中的KNeighborsClassifier类可以计算出曼城-西布朗数据集中的分类边界,其中$k$的取值分别被设置为17和15。可以看到$k = 1$时所有训练数据都能正确分类,而$k = 15$时误分类率超过了10%。
这说明当超参数$k$的取值逐渐变大时,训练数据的误分类率在不断提升,但计算出的分类边界也变得越来越平滑。这是偏差-方差折中的典型体现。
<img src="https://static001.geekbang.org/resource/image/19/17/198e43d514ea7ae95d20ef0a249cd717.png" alt="" />
今天我和你分享了基于实例的学习方法,以及它的典型代表$k$近邻算法,其要点如下:
<li>
基于实例的学习方法学的不是明确的泛化模型,而是样本之间的关系;
</li>
<li>
$k$近邻算法是非参数的局部化模型,具有无需训练的优点,但分类新实例的计算复杂度较高;
</li>
<li>
$k$近邻算法的性能取决于超参数$k$的取值和距离的定义方式;
</li>
<li>
核方法和近邻算法都可以用于数据的概率密度估计。
</li>
$k$近邻方法是一种消极学习lazy learning方法它并不会从训练数据中直接获取泛化决策而是将它延迟到新样本出现的时候。相比之下前面介绍的其他方法都属于积极学习active learning方法在新样本出现前就做好了泛化工作。
那么,你觉得消极方法和积极方法有什么原理和性能上的优缺点呢?
欢迎分享你的观点。
<img src="https://static001.geekbang.org/resource/image/c7/d6/c70b1d8ad0befe6c23c2d8ffc9b2f9d6.jpg" alt="" />

View File

@@ -0,0 +1,130 @@
<audio id="audio" title="20 | 基于距离的学习:聚类与度量学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/31/3b/312ec40aba174119a6eef89e4789c73b.mp3"></audio>
截至目前,我所介绍的模型都属于监督学习范畴,它们处理具有标签的输入数据,给出意义明确的输出,回归模型输出的是连续的回归值,分类模型输出的是离散的类别标签,这些模型都属于**预测模型**predictive model
另一类模型则隶属于无监督学习,这类模型学习没有标签的数据,其作用也不是计算类别或回归值,而是要揭示关于数据隐藏结构的一些规律,因此也被称为**描述模型**descriptive model。**聚类算法就是最具代表性的描述模型**。
聚类分析cluster analysis实际上是一种分组方式它使每一组中的组内对象的相似度都高于组间对象的相似度分出来的每个组都是一个簇cluster。由于相似度是聚类的依据作为相似度主要度量方式之一的距离就在聚类中发挥着重要作用。
在“人工智能基础课”中,我曾介绍过四种主要的聚类算法,你可以结合下面的要点图回忆一下。除了以概率分布为基础的分布聚类以外,其他三类聚类算法都涉及对距离的使用,而其中最典型的就是$k$均值所代表的原型聚类算法。
<img src="https://static001.geekbang.org/resource/image/be/6f/be9208083ca3c520e1c530efd3b4dd6f.jpg" alt="" />
[《机器学习 | 物以类聚,人以群分:聚类分析》](https://time.geekbang.org/column/article/2196)
理解$k$均值算法的基础是理解它对距离的使用方式。前面介绍的$k$近邻算法其实也用到了距离近邻的选择就是以距离为依据的。但近邻点是以内收的形式影响未知的数据所有近邻点按照一定的规则共同决定处于中心的未知数据的类别。如果将这种影响的方式调转方向让处于中心的样本作为原型prototype像一个小太阳一样用万有引力牵引着周围的其他样本那么其他样本就会像卫星一样被吸附在原型周围共同构成一个星系也就是簇。
和万有引力类似,$k$均值算法中定义的相似度也与距离成负相关关系,样本离原型的距离越小,两者之间的引力越大,相似度也会越高。但和天文学中的星系不同的是,$k$均值算法中簇的中心不会固定不变,而是要动态变化。
如果一个样本离原型太远的话,那引力就可能会减弱到让这个样本被另一个原型吸走,转移到另一个簇当中。簇内样本的流入流出会让簇的中心发生改变,进而影响不同簇之间的动态结构。好在动态结构最终会达到平衡,当所有样本到其所属簇中心的平方误差最小时,模型就会达到稳定下来。
如果聚类的任务是将$N$个数据点聚类成为$K$个簇,那它的目标函数就可以写成
$$ J = \sum\limits_{n = 1}^N \sum\limits_{k = 1}^K r_{nk} || x_n - \mu_k || ^ 2 $$
其中$x_n$是数据点,$\mu_k$是第k个簇的中心也就是簇中所有数据点的均值$r_{nk}$是数据点和簇之间的关系:当$x_n$被归类到第$k$个簇时为1否则为0。
在$\mu_k$确定的前提下,将数据点$x_n$归类到离它最近的那个中心$\mu_k$就能让$J$取到最小值,这时的$r_{nk}$就是最优的。
确定所有的$r_{nk}$后,利用求导可以进一步确定$\mu_k$的最优值,其表达式为
$$ \mu_k = \dfrac{\sum_n r_{nk}x_n}{\sum_n r_{nk}} $$
也就是当前簇中所有数据点的均值。由于$k$均值本身是个NP难问题所以上面的算法并不能够保证找到全局最小值很有可能会收敛到局部的极小值上。
根据上面的流程可以总结出$k$均值算法的步骤。
首先从数据集中随机选取$k$个样本作为$k$个簇各自的中心,接下来对其余样本分别计算它们到这$k$个中心的距离,并将样本划分到离它最近的中心所对应的簇中。当所有样本的聚类归属都确定后,再计算每个簇中所有样本的算术平均数,将结果作为更新的聚类中心,并将所有样本按照$k$个新的中心重新聚类。这样,“取平均-重新计算中心-重新聚类”的过程将不断迭代,直到聚类结果不再变化为止。
<img src="https://static001.geekbang.org/resource/image/98/41/98397acc7d1f3b2c153130d15845f241.png" alt="" />
$k$均值算法的运行流程(图片来自维基百科)
下面的例子是利用$k$均值算法对英超球队的比赛风格进行分类。这里使用的数据集是20支英超球队在2017-18赛季的场均数据用来聚类的两个指标分别是长传数目与短传数目的比值以及不成功突破数目和成功突破数目的比值。
根据以往对英超球队的理解我将聚类的数目设为3类初始聚类中心设定为阿森纳Arsenal、埃弗顿Everton和斯托克城Stoke三支球队的指标。
阿尔塞纳·温格治下的阿森纳一直以来都是英超中一股细腻的技术清流,相比之下,号称“天空之城”的斯托克城崇尚高举高打,称得上是泥石流了。而埃弗顿作为中游球队的代表,可以看成是弱化版技术流和加强版身体流的组合。应该说,以这三只球队作为聚类参考是有足够的代表性的。
利用Scikit-learn库中的cluster模块的Kmeans类可以方便地计算出聚类的结果如下面左图所示。如果你经常看球就会发现聚类的结果差强人意近年崛起的托特纳姆热刺Tottenham Hotspurs走的也是传控路线却被划到了硬桥硬马的斯托克城一类类似的情形也发生在自作孽不可活的典型中游队斯旺西城Swansea City身上。
图中右侧显示的是让算法随机选择3个中心的聚类结果它和左侧的结果几乎完全一致只是在水晶宫Crystal Palace一队上存在不同这说明3个初始种子的选择比较准确。
<img src="https://static001.geekbang.org/resource/image/76/e3/7613bb64b29645ed41d1b474ce9d22e3.png" alt="" />
英超球队比赛风格的聚类结果,左图为预设初始中心的结果,右侧为随机选择初始中心的结果
从贝叶斯的角度看,$k$均值算法是**高斯混合模型**Gaussian mixture model的一个特例。
顾名思义混合模型将数据总体看作来自若干个高斯分布也就是若干个成分component的数据的集合$k$均值算法聚出来的每一个簇都对应着一个未知参数的高斯分布。所有单个高斯分布的概率密度线性组合在一起,就是整体分布的概率密度,可以表示为
$$ p({\bf x}) = \sum\limits_{k = 1}^K \pi_k N({\bf x} | {\boldsymbol \mu}_k, {\boldsymbol \Sigma}_k) $$
这个式子里的$\pi_k$是混合系数mixing coefficient表示的是每个单独的高斯分布在总体中的权重后面的$N({\bf x} | {\boldsymbol \mu}_k, {\boldsymbol \Sigma}_k)$则是在被选中的高斯分布中,数据$\bf x$取值的概率。
判断数据$\bf x$属于哪个簇实际上就是要找到它来自哪个高斯分布,而归属于第$k$个簇,也就是来自于第$k$个高斯分布的概率可以用贝叶斯定理表示为
$$ \gamma(z_k) = \dfrac{\pi_k N({\bf x} | {\boldsymbol \mu}_k, {\boldsymbol \Sigma}_k)}{\sum\limits_{j = 1}^K \pi_j N({\bf x} | {\boldsymbol \mu}_j, {\boldsymbol \Sigma}_j)} $$
这里的$\gamma(z_k)$可以形象地解释成第$k$个高斯分布在解释观测值$\bf x$时需要承担的“责任”,其中的$z_k$是个隐变量latent variable
不难发现,根据这个式子计算出的每个$\gamma_k$都不等于0这体现出高斯混合模型和$k$均值算法的一个区别:$k$均值输出的是非此即彼的聚类结果属于“硬”聚类hard assignment的方法高斯混合模型则会输出数据归属到每个聚类的概率得到的是“软”聚类soft assignment的结果。
如果假定高斯混合模型中,所有单个分布的协方差矩阵都等于$\epsilon {\bf I}$,那么每个分布对数据$\bf x$的“责任”就可以改写为
$$ \gamma(z_{nk}) = \dfrac{\pi_k \exp {- || {\bf x}_n - {\boldsymbol \mu}_k || ^ 2 / 2\epsilon }}{\sum_{j = 1}^K \pi_j \exp {- || {\bf x}_n - {\boldsymbol \mu}_j || ^ 2 / 2\epsilon }} $$
当描述方差的参数$\epsilon \rightarrow 0$时,高斯分布就会越来越窄,最终收缩成一个固定的数值。在$\epsilon$不断变小的过程中,上面这个式子里分子分母中所有$\exp(-k / \epsilon)$形式的项都会同样趋近于0但趋近的速度是不一样的。
既然如此,那衰减最慢的是哪一项呢?是$\exp(-k / \epsilon)$中系数$k$最小的那一项,也就是$|| {\bf x}_n - {\boldsymbol \mu}_j || ^ 2$最小的这一项。它就像我去参加奥运会百米赛跑在冲向终点0的跑道上被博尔特们远远地甩在后面当其它的求和项都等于无穷小时这一项仍然有非0的取值。
根据上面的分析,$|| {\bf x}_n - {\boldsymbol \mu}_j || ^ 2$最小同样意味着$\gamma_{nj} \rightarrow 1$。
这说明对观测值$\bf x$的解释全部被归因于第$j$个高斯分布。
这时软输出$\gamma_{nj}$就会退化为前文中$k$均值算法中的硬输出$r_{nk}$,数据$\bf x$也就被分配到离它最近的那个簇中心所对应的簇中。
在$k$均值算法中,扮演核心角色的是距离的概念。可是距离的求解只是手段,它的目的是衡量局部范围内的相似程度。将$k$近邻算法和$k$均值算法这些基于距离的方法推广一步,得到的就是**相似性学习**similarity learning和它的变种**度量学习**metric learning它们在信息检索、推荐系统、计算机视觉等领域发挥着重要作用。
度量学习的出现源于“数据”概念的扩展。倒推10年人们观念中的数据还只是狭义上的数字只有像年龄、身高、血压这样的数字指标才能被称为数据。可如今呢任何结构化的文本、图像、DNA序列甚至一些非结构化的对象都被纳入数据的范畴它们都需要利用学习算法进行有效的分析和处理。
这时,如何描述这些抽象数据的关系就成了一个大问题:作为普通读者,我可以不费吹灰之力地区分开金庸和古龙的小说,但这种区别如何在计算机中用数字指标来直观呈现呢?
**度量学习就是通过定义合适的距离度量或相似性度量来完成特定的分类或者回归任务**
好的距离度量固然取决于具体问题但它也要满足非负性nonnegativity、对称性symmetry和三角不等式triangle inequality等一些最基本的要求。**马氏距离**Mahalanobis distance就是这样的一种广义的距离它的表达式是
$$ {\rm dist}_{mah}({\bf x}_i, {\bf x}_j) = \sqrt{({\bf x}_i - {\bf x}_j) ^ T \Sigma ^ {-1} ({\bf x}_i - {\bf x}_j)} $$
其中$\Sigma$是${\bf x}_i$和${\bf x}_i$所属概率分布的协方差矩阵。马氏距离的好处在于引入了可调节的参数,从而使距离可以通过对数据的学习来加以改善。
因为矩阵$\Sigma ^ {-1}$是个半正定的矩阵,所以它可以写成${\bf G} ^T {\bf G}$的形式,利用这一变换可以将马氏距离改写成
$$ {\rm dist}_{mah}({\bf x}_i, {\bf x}_j) = || {\bf G}{\bf x}_i - {\bf G}{\bf x}_j ||_2 $$
对马氏距离的学习实际上就是对变换${\bf G}$的学习。一般来说,经过变换后的${\bf G}{\bf x}_i$的维度会比${\bf x}_i$的原始维度有所降低,因此马氏距离的学习可以看成是一类降维操作,将高维空间中的马氏距离转换为低维空间中的欧氏距离。
**马氏距离学习是一类线性的度量学习方法**。要实现非线性的度量学习,有两种主要的途径:一种是通过核函数引入非线性的作用,将学习的对象变成$|| {\bf G} \phi({\bf x}_i) - {\bf G} \phi({\bf x}_j) ||_2$,另一种则是直接定义出非线性的距离度量${\rm dist}({\bf x}_i, {\bf x}_j) = || \phi({\bf x}_i) - \phi({\bf x}_j) ||_2$,其作用范围既可以是全局也可以是局部。非线性度量学习的方法有很多,你可以根据自己的需要进一步深入了解。
今天我以$k$均值算法为例,和你分享了基于距离的学习方法,还简单地介绍了对基于距离的学习的扩展,也就是度量学习,包含以下四个要点:
<li>
聚类分析是一类描述模型,它将数据按照相似度分成不同的簇;
</li>
<li>
$k$均值算法根据距离来判定数据的聚类;
</li>
<li>
从概率角度看,$k$均值算法是高斯混合模型的一种特例;
</li>
<li>
度量学习的任务是构造出适合于给定问题的距离度量或相似度的度量。
</li>
度量学习一般求解的是全局性度量但必要的时候也可以将局部特性引入到度量学习中这种方法通常被应用在异质的数据集上。在特定的任务中局部度量学习local metric learning的效果会优于全局度量学习但相应的计算开销也会较大。
你可以查阅资料了解局部度量学习的特点,并在此分享你的看法。
<img src="https://static001.geekbang.org/resource/image/43/d8/43f139ad318a88f6718f6ff628fd2bd8.jpg" alt="" />

View File

@@ -0,0 +1,116 @@
<audio id="audio" title="21 | 基函数扩展:属性的非线性化" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/35/19/3598c107a38ce2c3134f00296549d219.mp3"></audio>
虽然线性回归是机器学习中最基础的模型,但它的表达能力会天然地受到线性函数的限制,用它来模拟多项式函数或者指数函数等非线性的关系时,不可避免地会出现误差。要获得更强的表达能力,必须要把非线性的元素纳入到学习模型之中。
以核技巧为代表的局部化模型就是一种有效的非线性的尝试。但它的非线性来源于非参数的处理方式,也就是将很多个规则的局部组合成一个不规则的整体。那么有没有可能在全局层面上添加非线性元素呢?
还记得线性回归的表达式吗?在这里我把它重写一遍
$$ y =\beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n $$
其中的$x_i$可以看成是和属性相关的基函数basis function。在最原始的线性回归中基函数的形式是恒等函数因此这样的模型无论对属性$x_i$还是对系数$\beta_i$都是线性的。
但在统计学中,线性模型名称中的“线性”描述的对象是未知的回归系数$\beta_i$,也就是回归结果和回归系数之间存在着线性关系。这说明回归式中的和属性相关的每一项对输出的贡献程度都是固定的,但这些贡献到底以什么样的形式来输出,是属性取值本身还是它的平方抑或开根号,线性模型并没有做出指定。
充分利用关于基函数的灵活性,就可以将线性回归的表达式推广成
$$ y =\beta_0 + \beta_1\phi(x_1) + \beta_2\phi(x_2) + \cdots + \beta_n\phi(x_n) $$
显然,当$\phi(\cdot)$是个非线性的函数时,回归结果实际上就是经过非线性变换的输入属性的线性组合,因变量和自变量之间也就建立起了非线性的关系。这种生成非线性的参数模型的方法就是**基函数扩展**basis expansion
如果你对高等数学还有印象的话就会发现基函数扩展并不是一个陌生的概念只不过没有以这样的名字出现。在信号分析中傅里叶变换Fourier transform是最基本最核心的工具它可以实现时域和频域的转换将时域信号表示成无数个频率成分的组合。这个表达的过程就是**傅里叶逆变换**inverse Fourier transform
$$ f(t) = \dfrac{1}{2\pi} \int_{-\infty}^{+\infty} F(\omega) e ^ {j\omega t}{\rm d}\omega $$
其中的$e ^ {j\omega t}$代表频率成分$\omega$,这个虚指数函数作为傅里叶变换中的基函数,显然是时间$t$的非线性函数。而$F(\omega)$表示这个频率成分的权重系数,需要通过**傅里叶变换**Fourier transform来计算
$$ F(\omega) = \int_{-\infty}^{+\infty} f(t)e ^ {-j\omega t}{\rm d}t $$
由于时间变量$t$在$F(\omega)$的积分中被消除,因此每个频率成分在信号中的比例,也就是每个权重系数都不会因时间的变化而变化,只和频率本身有关,这也是傅里叶变换属于线性变换的原因。
基扩展方法最简单的应用是多项式回归。**多项式回归**polynomial regression将自变量$x$和因变量$y$之间的关系定义为$x$的$n$阶多项式,从而使$x$和$y$之间呈现出非线性的关系。在只有一个自变量的情况下,多项式回归的表达式可以写成
$$ y =\beta_0 + \beta_1x + \beta_2x^2 + \cdots + \beta_nx^n $$
多项式回归可以看成是多元线性回归的一个特例,但它的可解释性却并不清晰。在傅里叶变换中,不同的虚指数函数$e ^ {j\omega t}$之间是相互正交的,因而它们可以看成是互不相关的一组自变量,共同定义出一个特征空间。
但是当自变量$x$在[0, 1]上均匀分布时,$x$和$x ^ 2$之间的相关系数可以达到0.97!在如此强的相关系数之下,很难将两者对回归结果的各自贡献准确地区分开来。
<img src="https://static001.geekbang.org/resource/image/13/09/13ef8ba4deea16d06b9d49d1b6e47a09.png" alt="" />
英超数据集的线性回归结果和10次多项式回归结果
除了难以解释之外,多项式回归还有较高的过拟合风险。还是以前文中的英超数据集为例,线性回归假设场均积分和平均评分之间存在$y = ax + b$的关系。从拟合结果来看,虽然存在异常点和误差,这种关系却把握住了自变量和因变量之间的主要趋势。
如果想要继续降低误差就可以应用更加复杂的多项式模型。显然用10次多项式来拟合英超数据集相当于用5倍于线性模型的参数换来均方误差近一半的下降。但训练集上的误差较小并不意味着测试集上的误差较小根据偏差方差分解的理论这么复杂的模型方差通常会比较大其泛化性能将不容乐观。
既然全局概念在基扩展中的表现差强人意,局部化处理就又成了自然而然的选择。其实,多项式回归和局部化的非参数方法可以说是殊途同归,两者的目的都是模拟自变量和因变量之间的非线性关系,因此用非参数模型来实现非线性化是水到渠成的方式。多元自适应回归样条就是一种典型的非参数回归方法。
**多元自适应回归样条**multivariate adaptive regression splines, MARS是线性回归的推广用于对自变量的非线性和不同自变量之间的相互作用进行建模。它和多项式回归的区别在于后者将非线性的来源看作全局模型的固有属性而前者则视非线性为不同参数的线性模型的组合。
如果将一个非线性函数的定义域划分成很多足够小的区域的组合那在每个小区域上函数都会近似地满足线性性质。将这个过程调转方向用很多条直线组合成一条曲线就是MARS方法的思路。
<img src="https://static001.geekbang.org/resource/image/df/87/df95ba0cecf5a300beb3808d29d82e87.png" alt="" />
简单线性回归与多元自适应回归样条的比较(图片来自维基百科)
上面这张图可以直观地体现出MARS的原理。图中左侧是原始的线性回归虽然它和大部分数据点有较高的符合度但右上角的离群点却与模型有明显的偏离。而MARS做出的改进就是在回归结果中建立一个分界点将原来的模型一分为二不同的区域用不同的参数来描述。这相当于通过增加参数的数目引入非线性的元素起到降低均方误差、提高拟合精度的作用。
看到这里你可能就一拍大腿虽然起了火星哥这么高大上的名字但MARS背后的原理不就是分段函数嘛没错这种**由不同的多项式函数在多个临界点上拼接而成的函数就叫回归样条**regression spline
在自变量的不同取值范围内样条的系数会有所不同系数发生变化的临界点就是分段的结点knot。在估计不同区间段内的系数时MARS采用的也是最小二乘法。
一般来说,拼接起来的样条在结点上需要满足连续性的条件:最简单的是函数本身的连续性,也就是临界点的左极限与右极限相等,都等于函数值。如果在此基础上进一步满足一阶导数连续和二阶导数连续,这样的样条就是**三次样条**cubic spline
三次样条由不同的三阶多项式拼接而成,它在结点处的不连续性已经不能被人眼所察觉。让三次样条进一步在边界区域满足附加的线性约束条件的话,得到的就是**自然三次样条**natural cubic spline
和预先确定分段结点、再产生基函数并拼接的回归样条相比,另一类名为平滑样条的方法可以动态地确定结点的位置和数目。**平滑样条**smoothing spline要在拟合数据的同时尽可能保证拟合结果具有平滑的特性这也是它名称的来源。平滑样条的任务是计算出让下面的误差函数最小化的拟合结果$g(\cdot)$
$$ E = \sum\limits_{i = 1}^N [y_i - g(x_i)] ^ 2 + \lambda\int g(t) ^ 2 {\rm d}t $$
可以看出,平滑样条的最小化对象具有“误差函数 + 正则化项”的形式这与岭回归和LASSO的思想不谋而合。
上面式子中的$\lambda \ge 0$是平滑系数smoothing parameter体现了算法对函数$g(\cdot)$的波动性的控制。二阶导数反映的是函数在某个点上变化的剧烈程度:直线$y = ax + b$的二阶导数为0说明其图形在整个定义域上都有平滑的形状而自由落体的表达式$y = gt ^ 2 / 2$的二阶导数约等于5说明其图形在每个点上都有剧烈的变化。
平滑系数的作用就是通过控制模型的平滑度来实现偏差和方差的折中。$\lambda = 0$意味着算法对模型的平滑度不做控制,将每个数据点都作为自然三次样条的结点,得到的拟合结果就会发生剧烈的抖动;$\lambda = +\infty$则意味着对抖动做出最大程度的抑制,其结果就是将平滑样条退化为普通线性回归。在实际应用中,平滑系数这个超参数的取值一般要通过交叉验证来确定。
前面讨论的几种非线性的处理方式针对的都是单变量的情形,可以看成是对简单线性回归的推广。如果将推广的对象扩展到多元线性回归,得到的就是广义可加模型。
**广义可加模型**generalized additive model将标准线性回归中的每个自变量以及可能存在的自变量之间的交互项都替换成一个非线性的平滑函数各个非线性函数之间则保持相加的关系其数学表达式可以写成
$$ y_i = \beta_0 + f_1(x_{i1}) + f_2(x_{i2}) + \cdots + f_p(x_{ip}) $$
广义可加模型可以和之前介绍过的广义线性模型相融合,通过链接函数将可加模型的结果转换为线性模型的输出,这使得广义可加模型也可以用于分类算法中。
要使用Python语言实现回归样条模型可以利用patsy库。patsy库脱胎于统计中的R语言可以看成是R语言的部分功能在Python中的实现。它使用简短的字符串“公式语法”描述统计模型因而适合和statsmodels配套使用。想要了解关于patsy工作方式的更多信息你可以查阅其官方文档。
利用patsy实现回归样条时主要应用它的cr函数来生成自然三次样条作为基函数。将回归样条应用到线性回归的英超数据集中当结点的数目为设定为场均评分的3个四等分点时样条回归的结果如下图所示。
可以看出,回归结果是一条平滑的曲线,但计算均方误差的话你会发现,样条回归的均方误差比线性回归的均方误差还要大。其原因可能在于数据本身已经具有良好的线性特性,因此强行使用非线性模型进行拟合不会带来良好的效果。
<img src="https://static001.geekbang.org/resource/image/e0/cd/e09bdf38d7447dfc81c3b67e88293ecd.png" alt="" />
三次样条回归与普通线性回归的结果比较
今天我和你分享了通过基函数扩展实现非线性模型的方法,包含以下四个要点:
<li>
基扩展将线性回归中的自变量替换为非线性的函数,使模型能够描述非线性关系;
</li>
<li>
多项式回归将回归结果表示为属性的多项式之和;
</li>
<li>
样条方法将回归结果表示为若干非线性函数的组合,可以分为回归样条和平滑样条;
</li>
<li>
广义可加模型是对多元线性回归的基扩展。
</li>
基函数的扩展主要出现在统计学的文献中,被看成是曲线拟合的有力工具,在机器学习中反而并不多见。那么你认为在以预测建模为主要目标的机器学习中,它能够发挥什么样的作用呢?
欢迎分享你的观点。
<img src="https://static001.geekbang.org/resource/image/f2/13/f2bb0f0fac876ee534b134b1ac067113.jpg" alt="" />

View File

@@ -0,0 +1,137 @@
<audio id="audio" title="22 | 自适应的基函数:神经网络" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/bc/ad/bca345f126ed2e450aa589d96f4dcfad.mp3"></audio>
回眸人工神经网络的前半生,不由得让人唏嘘造化弄人。出道即巅峰的它经历了短暂的辉煌之后便以惊人的速度陨落,几乎沦落到人人喊打的境地。可谁曾想三十年河东三十年河西,一位天才的出现让神经网络起死回生,众人的态度也迅速从避之不及变成趋之若鹜。如果人工神经网络果真有一天如人所愿实现了智能,不知它会对自己的命运作何评价。
**人工神经网络**artificial neural network是对生物神经网络的模拟意在通过结构的复制实现功能的复制。但人类神经系统在百万年进化中留下的智能密码并没有那么容易破解因而神经网络最终也难以跳出统计模型的窠臼成为**线性模型**大家族的又一位成员。
<img src="https://static001.geekbang.org/resource/image/47/b2/47476b2d5418ea0e3157655abe8e7fb2.png" alt="" />
感知器示意图图片来自Machine Learning: an Algorithmic Perspective, 图3.1
人工神经网络的祖师爷是**感知器**perceptron其作用是根据输入数据的属性对它进行二分类。当偏置$b = 0$时,感知器计算输入属性的线性组合$w_1x_1 + \cdots + w_nx_n$,所有参数$w_i$共通构成分类边界的法向量${\bf w}$。求出的线性组合接下来被送入**激活函数**activation function中计算结果。感知器的激活函数是**符号函数**,其输出的二元结果就表示了两种不同的类别。
<img src="https://static001.geekbang.org/resource/image/02/1e/02200fbc2a07d8644aae056ca6d6461e.png" alt="" />
图片来自https://www.willamette.edu/~gorr/classes/<br />
cs449/Classification/perceptron.html
上图给出了感知器的学习过程。训练数据集是个线性可分的数据集,数据点的星号和圆圈代表不同的类别。感知器的初始参数是随机生成的,用这组随机参数生成的分类边界是图中的红色虚线。显然,在分类边界两侧的两个类别中都有误分类的点。
直观来看,要让走错片场的星号和圆圈找到组织,唯一的办法就是调整分类边界,让新边界把原始边界上方不同颜色的点区分开来。
调整的方法一目了然:既然星号集中在左侧而圆圈集中在右侧,那就要让分类边界向右侧旋转,把右侧的星号包进来,把左侧的圆圈踢出去。右侧子图表示的就是将原始边界试探性地旋转一个角度所得的结果。虽然这个小角度的旋转还是没能完全正确分类,却对分类的准确率有所改善。只要在此基础上进一步旋转,新的分类边界就可以将两个类别的点完全分开了。
由于分类时无需使用数据的概率分布,因此**感知器是一种基于判别式的分类模型**。但它和前面提到的线性判别分析又有所不同,其算法不是利用所有数据的统计特性一鼓作气计算出最优的参数,而是通过不断试错为参数优化过程提供反馈,从而实现动态的参数调整。**具备自适应的学习能力是感知器和前面所有模型相比独有的优势**。
在感知器的动态学习过程中,作为优化目标出现的是**感知准则**perceptron criterion。之所以没有选择常见的误分类率作为指标是因为它并不适用于参数的动态学习过程。
在分类时,产生每一种分类结果的分类边界都不是唯一的,这就让误分类率变成了关于参数$\bf w$的分段常数函数。这不仅会使关于$\bf w$的误分类率存在间断点,在求解梯度时也无法给出关于参数移动方向的信息。
感知准则虽然也是建立在误分类率的基础上,但它完全回避了上面的那些缺点,其表达式可以写成
$$ E_P({\bf w}) = -\sum_{x \in X_M} {\bf w}^T x_n t_n $$
其中$X_M$是由所有误分类点组成的集合,这说明分类正确的点都具有零误差。感知准则的基本思路是让每个误分类点的贡献$-{\bf w}^T x_n t_n$都大于0这就保证了感知准则整体上的非负性。
二元变量$t_n$可以看成是数据点的真实类别和预测类别的差值,其作用在于控制每个误分类点的贡献。如果一个正类被判定为负类,那$t_n$就是个大于0的值可以取成+1反过来负类被判定成正类时$t_n$则取-1。当感知准则取得最小值0时所有的数据点都被正确分类感知器算法也就完全收敛。
对上面定义的感知准则求解梯度,可以得到每个轮次中参数的更新方式,也就是
$$ {\bf w}^{(\tau + 1)} = {\bf w}^{(\tau)} - \eta \nabla E_P({\bf w}) = {\bf w}^{(\tau)} + \eta x_n t_n $$
其中的超参数$\eta$是学习率learning rate$\tau$表示的是算法的轮次。这个表达式是感知器算法的**批处理更新原则**batch update principle
根据这个算法的角度回头看上面的示意图可以获得更清晰的解释。左侧子图中的p1点是个被误判为负类的正类点其系数$t_n = +1$。
要让这个点被正确分类,原始的系数向量$w$就要和向量p1与学习率的乘积相加其几何意义就是向p1接近移动的结果就是图中的$w_{new}$。
位于第三象限的p2同样是误分类点但是是被误判为正类。当负类被误判为正类时$t_n$的取值为-1此时原始的系数向量$w$要和向量p2与学习率的乘积相减这里的减法体现为右侧子图中两个天蓝色箭头的方向区别。相减的几何意义是让新系数$w_{new}$远离误分类点p2不难看出它和上面对p1的操作具有相同的效果。
感知器模型可以进一步推广为**多层感知器**multilayer perceptron也就是神经网络。最简单的神经网络是多个感知器的线性集成神经网络的总输出是对每个感知器单独输出的线性组合进行非线性变换。
放在线性模型的大框架下,具有单个隐藏层的神经网络的数学表达式可以写成
$$ f(x) = \sigma [\sum\limits_{j = 1}^M \beta_j h(\sum\limits_{i = 1}^N \alpha_ix_i + \alpha_0) + \beta_0] $$
其中$\sigma(\cdot)$是输出层的激活函数,其最常见的选择是**对数几率函数**,这时输出层实质上就是个逻辑回归分类器。
除了对数几率函数之外,**双曲正切函数**$tanh$hyperbolic tangent也是不错的选择$tanh$的值域是[-1, +1],这让它的特性和对数几率函数略有差别。
$h(\cdot)$表示的是隐藏层的激活函数,它既可以与$\sigma(\cdot)$相同,也可以选取其他的非线性函数。$\alpha_i$和$\beta_j$分别表示了隐藏层和输出层的权重系数与偏置。
从上面的公式中不难看出,**神经网络的每个神经元都可以看成是做了基函数扩展的线性模型**:非线性的激活函数不仅将输出变成了输入属性的非线性函数,也变成了权重系数的非线性函数,体现的是整体的非线性处理。
当所有的激活函数都取恒等函数时,神经网络就将退化成最基础的线性回归。但神经网络的动态学习能力可以自适应地调整模型的参数,也就是线性组合中的权重系数。
**神经网络的一个创新之处在于隐藏层的引入**。除了输入层和输出层之外所有无法直接观察的层都属于隐藏层hidden layer。**隐藏层的输出可以看成是某种导出特征derived feature它并不直接存在于输入之中却可以根据对输入特征的挖掘推导出来**。神经网络的强大之处就是能够自适应地提取并修正人造特征,从而适配到数据中潜在存在的模式,深度学习优异的性能便由此而来。
在解决分类问题时,对神经网络的参数优化依赖于对**交叉熵**cross-entropy的最小化。网络输出的分类结果$t$满足两点分布,它关于数据$\bf x$和参数$\bf w$的似然概率可以写成
$$ p(t | {\bf x}, {\bf w}) = y({\bf x}, {\bf w})^t [1 - y({\bf x}, {\bf w})] ^ {1 - t} $$
其中$y({\bf x}, {\bf w})$是输出层激活函数为对数几率函数时的输出,可以视为$\bf x$归属于正类的条件概率。求解上面式子的负对数似然,得到的就是交叉熵误差函数
$$ E({\bf w}) = -\sum\limits_{n = 1}^N [t_n \ln y_n + (1 - t_n) \ln (1 - y_n)] $$
交叉熵的最小化与似然概率的最大化是等效的。误差函数的最小值可以通过反向传播backpropagation方法来求解这在上一季的专栏中已经有过介绍这里就不重复了。
神经网络中隐藏神经元的数目决定着网络的泛化性能,足够多的神经元可以实现任意复杂的函数,却也会带来严重的过拟合倾向,因而通过正则化的手段来控制网络的复杂度和性能是非常必要的。
一种简单的策略是**权重衰减**weight decay它与前面介绍过的岭回归类似也是通过添加二次的正则化项来避免过拟合。权重衰减的误差函数可以写成
$$ \tilde E({\bf w}) = E({\bf w}) + \dfrac{\lambda}{2} {\bf w}^T {\bf w} $$
这里的$\lambda$是个超参数,控制着权重衰减的幅度。
另一种经常应用于神经网络中的正则化是**早停**early stopping。早停是建立在验证数据集上的正则化策略简单地说就是对每一轮次训练出的模型计算出其在验证集上的性能并将当前模型的参数和超参数存储下来。
在之后的每一轮训练中训练结果在验证集上的性能都被拿来和先前存储的模型性能进行比较之后保留两者中表现较好的模型的配置。这种策略和感知器训练中的口袋算法pocket algorithm类似。
如果从贝叶斯的角度去分析神经网络,模型训练的任务就变成了根据先验假设和训练数据来计算未知参数的后验分布,再对参数的分布积分来计算预测结果,写成数学表达式就是
$$ p(y ^ {new} | x ^ {new}, D) = \int p(y ^ {new} | x ^ {new}, {\bf w}) p({\bf w} | D) {\rm d} {\bf w} $$
其中的$D$表示数据集。积分式中的第一项在分类中就对应着对数几率函数的输出,第二项则是参数的后验概率。对神经网络的贝叶斯分析涉及大量的复杂运算,所以我在这里就只介绍一些基本的思路。
在用于分类的神经网络中,先验假设就是参数$\bf w$的概率分布,这个分布通常被处理成**零均值的高斯分布**。这个高斯分布的参数$\alpha$又可以用超先验来表示。由于分类结果是离散的随机变量,它不像连续变量一样存在估计值和真实值的偏差,也就不用对这部分误差定义先验了。
虽然参数本身的先验分布是高斯形式,但激活函数的非线性特性会导致给定数据时参数对于数据的后验概率不满足高斯分布,这时就需要使用**拉普拉斯近似**Laplace approximation生成一个高斯分布作为对未知后验的模拟。拉普拉斯近似的具体细节在这里暂且略过你只需要知道它的用处就可以了。
在生成高斯分布时,拉普拉斯近似需要找到后验概率的一个最大值,这等效于对添加正则化项的误差函数$\tilde E({\bf w})$进行最小化,其中的正则化项就是参数$\bf w$先验分布的体现。利用复杂的数值计算方法可以求出后验概率的最大值,进而确定后验概率的高斯近似。
处理完了参数$\bf w$,还要处理超参数$\alpha$。在后验概率的计算中,和参数$\bf w$相关的超参数被看成是已知的固定值。但在计算预测结果时,还需要考虑超参数$\alpha$的分布。
对参数$\bf w$进行积分可以得到数据关于超参数的似然分布,也就是**边际似然函数**marginal likelihood。对边际似然函数进行最优化可以得到关于超参数$\alpha$的点估计。由于非线性的激活函数让积分难以计算,通常会假设参数的后验概率非常窄,再利用使后验概率最大的参数来计算未知数据的输出。
神经网络是非参数模型的一种,它利用激活函数对线性模型做出了非线性的扩展,让每个输出变成了权重系数的非线性函数,从而在整体上拟合出非线性的效果。更重要的是,它引入了隐藏神经元与隐藏层,这种特殊的结构能够对原始的特征实现重构,从而给数据分析带来了更多的可能。
在Scikit-learn中实现感知器的类Perceptron属于线性模型模块linear_model这样设置的原因无疑在于感知器本身属于线性判别模型。由于前面使用的中锋-中卫数据集是个线性可分的数据集,因此可以用感知器来进行分类。
下图给出了感知器对数据集的分类结果从左到右的迭代次数分别为13和5。可以看出当初始分类结果有误时感知器的算法会不断将分类边界向误分类点的方向调整直到分类正确为止。
<img src="https://static001.geekbang.org/resource/image/22/9e/22597330211ee2005ac258dc8663f39e.png" alt="" />
之前使用过的另一个分类数据集——曼城-西布朗数据集是个线性不可分的数据集可以用它来验证多层感知器的性能。实现多层感知器的类叫做MLPClassifier在神经网络模块neural_network之中。但由于这个数据集是近似线性可分的即使使用多层感知器也不会生成明显的非线性判决边界你可以自己运行一下代码并观察结果。
今天我和你分享了感知器和神经网络的基本原理,包含以下四个要点:
<li>
神经网络是一类非线性模型,利用非线性的激活函数对输入的线性组合进行分类;
</li>
<li>
神经网络可以通过误差反向传播自适应地调整网络结构中的参数;
</li>
<li>
神经网络中隐藏层的作用是构造出新的导出特征;
</li>
<li>
用贝叶斯方法分析神经网络时,需要使用近似方法来应对非线性导致的计算问题。
</li>
2017年时神经网络的元老宿耆乔弗雷·辛顿Geoffrey Hinton提出了“胶囊网络”capsule的概念。胶囊由神经网络单个层中的若干神经元组合而成可以看成是层中的一个子层。胶囊可以执行大量的内部计算并输出一个矢量形式的结果获得更多的输出信息。
你可以查阅关于胶囊网络的资料,思考它对神经网络的发展有何意义,并在这里分享你的见解。
<img src="https://static001.geekbang.org/resource/image/d5/57/d567d00672f7c375143a2db783b38857.jpg" alt="" />

View File

@@ -0,0 +1,102 @@
<audio id="audio" title="23 | 层次化的神经网络:深度学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/e5/99/e596d39b8f2a96ca15032f641dbfdb99.mp3"></audio>
虽然只是对生物神经网络的低水平模仿,人工神经网络却给机器学习打开了一扇全新的大门。自适应的特性让它能够灵活地更新参数,非线性则赋予它具有更加强大的表达能力。曾经的阿喀琉斯之踵——异或问题也随着隐藏层的引入迎刃而解,由原始特征重构而成的导出特征使多层感知器摆脱了对数据集线性可分的限制,呈现在神经网络前方的是大有可为的广阔天地。
神经网络最重要的正名出现在1989年美国学者乔治·塞本科George Cybenko证明了神经网络以对数几率作为激活函数时的通用逼近定理。
简而言之,**通用逼近定理**universal approximation theorem说的是如果一个前馈神经网络feed-forwad neural network具有单个隐藏层隐藏层就可以利用有限个神经元来逼近定义在实数集上的任意连续函数。
1991年奥地利学者库尔特·霍尔尼克Kurt Hornik又证明了通用逼近特性并不取决于激活函数的选择而是由多层前馈网络自身的架构决定这就为神经网络的性能提供了坚实的理论依据。
每一个隐藏神经元都能够生成线性的分类边界,在不同的局部选取不同的线性边界,拼接起来的就是全局层面非规则的形状,这就是通用逼近定理说明的主要问题。
虽然给出了理论的良好性质,但通用逼近定理只是一个存在性定理,它没有说明拟合复杂形状的边界到底需要多少个隐藏神经元,也没有解释要如何才能学习出这样复杂的边界。
**当单个隐藏层在广度上难以实现时,一个自然的思路就是以网络结构的深度来换取广度,也就是通过增加隐藏层的数目来降低每个隐藏层中神经元的数目,这就是深度学习的起源**
准确地说深度学习deep learning是一类学习方法它应用的模型架构是深度神经网络deep neural network
深度神经网络是具有多个隐藏层的神经网络也可以说是浅层神经网络的层次化hierarchical组合其背后是多级的思想。如果把层次化的深度网络压扁成一个平面得到的就是全连接的单隐藏层神经网络反过来深度网络也可以看成是对满足通用逼近定理的单层网络的正则化通过削减多余的连接来提升网络的泛化性能。
**层次化**hierarchicalization其实是解决问题的一种固有思路大到政府架构小到快递配送都能看到层次化的身影。层次化的机器学习是将一个复杂的问题分解成若干个简单的问题再在不同的层面上对这些简单问题进行表示和学习。
从功能上看,深度神经网络通过多个隐藏层的级联实现对输入特征连续不断的非线性处理,提取和变换出了新的特征,每个层次都能够将它的输入数据转换成更加抽象一些的复合表示,这就相当于通过结构的层次化实现抽象特征的层次化。
在图像识别中特征层次化的作用体现得最为明显。下面的这个例子来自于约书亚·本吉奥Yoshua Bengio等人的大作《深度学习》Deep Learning在识别这张图片时理想的算法应该能够将由像素的灰度值所组成的数组输出“女人”这样的标签识别的过程就是逐层提取模式的过程。
算法的第一层可以根据灰度的空间分布提取出诸如边缘这类在较小的几何尺度上保持不变性的低层次特征,第二层进一步从边缘的组合中抽象出角度和弧度等高级的形状特征,第三层再根据形状的组合抽象出面部和身体等器官的轮廓,最后将这些器官的轮廓组合成关于“女人”的潜在模式。
<img src="https://static001.geekbang.org/resource/image/76/10/765a5fd5141215c75bf76cd072ee0b10.png" alt="" />
深度学习示意图图片来自Deep Learning图1.2
**除了层次化之外,深度学习的另一个主要特点是分布式**由本吉奥在深度学习的开山文献《人工智能中的深度结构学习》Learning Deep Architectures for AI中提出。
在前面的文章中我介绍过维度灾难:在构造局部模型时,数据维度的增加会让低维空间中数据点的近邻不再保持,新来的数据就可能找不到任何作为参考的近邻点;而在构造全局模型时,数据维度的增加又会增加模型中参数的数量,使不同自变量对因变量的贡献程度变得难以衡量,导致多元线性回归中的“罗生门”现象。
同是处理高维数据,深度学习采用了**分布式表示**distributed representation将作为整体的高维特征打散成若干个低维特征的组合。
比方说,在传统的学习框架下学习“高富帅”这个概念时,不管是全局模型还是局部模型都会把它看作一个整体,要么寻找它的近邻“白富美”,要么用一组诸如身高和财产之类的属性去拟合它。可是在分布式表示的框架下,“高富帅”这个概念被拆分成“高”、“富”、“帅”三个单独属性的组合,三个属性同时满足才能形成整体意义上的概念。
分布式表示体现了化整为零的思想,其优势是多重的。一方面,**它增强了神经网络的表达能力**。
在分布式表示下如果“高”、“富”、“帅”这3个属性各有两种取值那么“高”与“不高”就可以用两个神经元来表示另外两个属性也是如此所以要描述这3个属性形成的所有可能的组合需要6个神经元而在非分布式的局部表示localized representation3个属性的组合需要用$2 ^ 3 = 8$个神经元来刻画。显然,属性的数目越多,每个属性可能的取值越多,分布式表示的优势就越明显。下图是关于分布式表示的直观图示,可以用来帮助理解。
<img src="https://static001.geekbang.org/resource/image/6a/ef/6abc17f266f8b76b818c349b463ba1ef.png" alt="" />
非分布式表示(左)与分布式表示(右)的区别
图片来自https://www.oreilly.com/ideas/how-neural-networks-learn-distributed-representations
另一方面,**分布式表示在表达上的优势也会反作用于学习**。
局部表示秉持的是非此即彼的二元论,它对一个概念的学习结果只有“高富帅”和非“高富帅”这两种可能,并不存在类似于“矮富帅”或者“高穷帅”这样的推广。
在分布式表示中就不存在这样的限制,它既然能把不同的属性表达出来,也就能够通过基于近似的表达学习出单个的属性。给出“高富帅”和“矮富帅”的样本组合,深度学习能学到后面两个特征;给出“高富帅”和“白富美”的组合,深度学习也能够学到“富”的属性,这是局部表示框架下的传统学习难以做到的。
层次化和分布式相辅相成,让深度学习如虎添翼。**层次化为分布式提供了更丰富的特征选择,分布式又可以利用层次化构造出更加复杂的模式**。
通俗地说,层次化能够识别出眉毛、眼睛、嘴这些不同的器官,而分布式的表示能够确定只要这些器官组合在一块儿,十有八九是张人脸。柳叶眉加杏核眼加樱桃口是,八字眉加三角眼加香肠嘴也是,两者的区别只是视觉效果上的差距。
感知器的**自适应性**adaptivity在深度神经网络上也得以保持虽然其中的过程颇费周折。受梯度消失的限制传统的反向传播算法不能直接用来训练深度网络这使得训练的难度一度成为限制深度网络应用的掣肘。现在深度神经网络的训练采用的是逐层预训练结合整体微调的方法每一层的预训练通过自编码器实现整体的微调则使用反向传播其具体的细节在“人工智能基础课”中已经做过介绍你可以回忆一下。
和之前介绍的其他所有浅层模型shallow learner相比深度学习可说是上得厅堂下得厨房它既能够像主成分分析或者流形学习那样找到数据当中的隐含模式又能够像逻辑回归或者朴素贝叶斯那样对数据进行分类。这相当于把无监督学习和监督学习两手抓两手硬也**开辟了理解深度学习的两个角度**。
**从预测的角度看,深度神经网络可以看成是一组堆叠起来的广义线性模型**
在广义线性模型中,自变量的线性组合作为链接函数反函数的自变量出现,其结果等于因变量的数学期望。
在深度学习中,每个神经元其实都表示了一个广义线性模型,增加神经元的数目就是增加线性变换的复杂度。由于前一层中模型的输出会作为后一层模型的输入,不同层次之间的交互相当于对广义线性模型进行了参数的扩展,增加层数就是增加非线性变换的次数。**线性变换和非线性变换一轮又一轮的组合让深度网络具备了更强的拟合能力**。
而**从解释的角度看,深度学习起到的是降维的作用**,从高维数据中提取出隐藏的低维几何结构——没错,就是**流形**。
深度学习既要从高维空间中构造出低维流形也要找到高维数据在低维流形中的表示前者是对高维数据的参数化过程parameterization后者则是在流形上对数据的参数表示parametric representation
将高维数据映射到低维流形上能够简化进一步的回归或分类任务,使用浅层的支持向量机或者$k$近邻算法就能搞定。这种思路将深度生成模型解释为流形的展开,深度判别模型解释为流形的分离,数据变换则解释为计算样本在流形上的投影。
最后来看看**贝叶斯视角下的深度学习**。和前面提到的其他模型一样贝叶斯主义将深度神经网络的优化也看作后验概率最大化的问题参数的先验分布在这个过程中会以正则化项的形式出现。贝叶斯主义关于深度学习的一个有趣结论是将预训练pre-training过程看成正则化项这显然在暗示预训练的作用在于确定参数的先验分布。
在介绍神经网络时我曾提到权重衰减器就对应着参数的高斯先验。而在深度学习中用来抑制过拟合的dropout方法和具有伽马先验的贝叶斯岭回归Bayesian ridge regression是等效的。
今天我和你分享了深度神经网络一些主要的设计思想,以及看待深度神经网络的不同角度。但深度学习的原理至今尚未得到清晰的解释,阐释它的思路也是众说纷纭、莫衷一是。本文中的观点虽然都来自于这个领域的研究权威,但也仅仅作为一家之言供你参考。总结起来,今天的内容包含以下四个要点:
<li>
深度神经网络是具有层次化结构的多层神经网络;
</li>
<li>
深度神经网络采用分布式表示,提升了网络结构的表达能力和学习能力;
</li>
<li>
深度神经网络是一组堆叠起来的广义线性模型;
</li>
<li>
深度学习能够找到高维数据所对应的低维流形。
</li>
深度学习作为眼下关注度最高的机器学习概念,看好者公说公有理,看衰者婆说婆有理,那么你是如何看待深度学习的前景的呢?
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/13/87/13aa6b50996f04259de01df53394ac87.jpg" alt="" />

View File

@@ -0,0 +1,97 @@
<audio id="audio" title="24 | 深度编解码:表示学习" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b4/3d/b435a493ef49379d51b3c7707f0b4a3d.mp3"></audio>
在上一讲中我提到,深度学习既可以用于解释也可以用于预测。在实际中,这两个功能通常被组合使用,解释功能可以看作编码器,对高维信息进行低维重构;预测功能则可以看作解码器,将低维重构恢复成高维信息。
这样的两个深度网络级连起来,就形成了**编码-解码结构**encoder-decoder model。这种结构在诸如语音、文本、图像等高维数据的处理中应用广泛取得了良好的效果。
编解码的思想来源于信息论,是信息传输与处理的基础理论之一。但在通信中,编解码的对象是底层的语法结构,也就是对携带信息的符号进行编码,通过数据压缩实现信息的高效传输,但输出的符号本身与其所表达的含义并无关联。
在深度学习中,编解码的操作更多在语义层面完成,无论是文本还是图像,**编解码的目的都是重新构造数据的表示方式,简化学习任务的难度**。
在最初的尝试中,编码器和解码器并不是分开的,而是存在于单个的深度网络中,这种深度结构就是自编码器。
**自编码器**autoencoder属于生成模型它的作用是**以无监督的学习方式学到数据集的稀疏表示,从而给数据降维**。显然,它和前面介绍过的主成分分析殊途同归。可以证明,如果自编码器只有一个线性隐藏层,同时使用均方误差作为损失函数,那么$k$个隐藏神经元的权重系数就代表了输入数据的$k$个主成分。
从编解码的全过程来看,如果要构造出有效的表示,自编码器的输入和输出就应该是近似相等的,那它学习的对象是个恒等函数。看到这儿你可能就不理解了:恒等函数有什么好学的呢,原样输入原样输出不就完了吗?这话一点儿毛病没有,但成立的前提是原样输入原样输出的功能可以实现。
这就像学美术的学生需要临摹画作再高的临摹技术也比不过手机拍照来得像但你拿一张照片去跟老师交差肯定是要挨骂的。自编码器要研究的不光是如何近似恒等函数而是如何用50个中间变量构造出包含100个自变量的恒等函数这样的问题就没那么简单了。
需要说明的是,在结构上,自编码器隐藏神经元的数目未必会少于输入/输出神经元。但即使有200个隐藏的神经元自编码器通常也只会激活这些潜在中间变量里的一小部分达到的效果仍然是用50个中间变量拟合100维的恒等函数这种即使在过完备时依然得以保持的稀疏特性sparsity是自编码器实现降维的核心特性。
自编码器的稀疏特性可以从能量的角度来解释。在自编码器最初的设计中,编码器的任务是生成参数矩阵${\bf W}_C$,用来计算输入数据$\bf X$的码字向量,解码器的任务是生成参数矩阵${\bf W}_D$,用来重构的码字向量所对应的初始数据$\tilde{\bf X}$。
如果编码器和解码器直接级连的话这就是个主成分分析的系统。但自编码器和主成分分析的区别在于引入了稀疏逻辑模块sparsifying logistic将编码器输出的码字$\bf Z$非线性地映射成特征码字$\bar{\bf Z}$。特征码字大部分元素的取值为0非零元素值则落在[0, 1]这个区间内。
定义损失函数时,自编码器将非线性的编解码过程综合考虑,提出了**能量**energy的概念其数学表达式为
$$ E({\bf X}, {\bf Z}, {\bf W}_C, {\bf W}_D) = E_C({\bf X}, {\bf Z}, {\bf W}_C) + E_D({\bf X}, {\bf Z}, {\bf W}_D) = \dfrac{1}{2} || {\bf Z} - {\bf W}_C{\bf X} || ^ 2 + \dfrac{1}{2} || {\bf X} - {\bf W}_D\bar{\bf Z} || ^ 2 $$
其中的第一项表示编码器的**预测能量**prediction energy第二项表示译码器的**重构能量**reconstruction energy作为两者之间接口的稀疏逻辑则具有以下的非线性映射关系
$$ {\bar z}_i(k) = \dfrac{\eta e ^ {\beta z_i(k)}}{\xi_i(k)}, \xi_i(k) = \eta e ^ {\beta z_i(k)} + (1 - \eta)\xi_i (k - 1) $$
其中$k$表示第$k$个训练样本,$i$表示特征码字中的第$i$个元素。通过$\xi_i(k)$的递归表达式可以看出稀疏逻辑的本质就是计算所有训练样本中相同码字单元的加权softmax分类结果其中的参数$\eta$控制特征码字的稀疏程度,$\eta$越小非零元素越少;参数$\beta$则控制特征码字的平滑程度,$\beta$越大码字的输出就越接近两点分布。通过合理地增大$\beta$并减小$\eta$,自编码器就可以实现稀疏的表示。
将编码器和解码器整合到同一个结构之中的自编码器可以说是个特例,它的编码器和解码器都可以堆叠成层次化的结构,来实现更加复杂的非线性映射。在自编码器的基础上推广一步,将编码器和解码器各自作为一个独立的深度网络区分开来,可以实现更加强大的功能。
<img src="https://static001.geekbang.org/resource/image/bb/4d/bb0c87c3718f644292a92057696b474d.jpg" alt="" />
《红黄蓝之构成》Composition II in Red, Blue and Yellow1930图片来自维基百科
上面这张图片是荷兰大师皮埃·蒙德里安Piet Mondrian的名作《红蓝黄之构成》Composition II in Red, Blue and Yellow可不要小看这幅画这个看似简单的色块组合摆到拍卖行就是千万美元起步的价格。当然我的目的不是讨论几何抽象画派的艺术造诣而是要从稀疏表示的角度来看待这幅画。
显然,这张图像中的像素只有少数几种取值,而相同取值的像素又基本上集中在一起。如果将每一组聚合在一起的颜色相同的像素用一串编码来表示,就可以大大地压缩这幅《构成》的体积,这就是所谓的**游程编码**run length coding
同样的思路也可以应用到图像的语义处理之中。从语义上看,《构成》其实就是不同颜色的几何形状的组合,而每个形状的特征无外乎长度、宽度和颜色这样三个维度,对图像的学习实际上就是对这三个维度的学习。
在“人工智能基础课”中我介绍过卷积神经网络这是基于神经网络的图像处理使用的最主要的工具。卷积神经网络本身就可以看成是个庞大的编码器其中的卷积层用于提取特征不同的卷积核convolutional kernel代表不同的特征类型。
在图像的每个局部上和卷积核相似度最高的区域都被下采样操作subsampling筛选出来用于下一阶段的特征提取。在卷积层和下采样层的迭代过程中低层次的特征不断组合成高层次的特征数字图像的表示方式也从原始的像素集合变成卷积得到的特征组合这两个层也就构成了卷积神经网络的编码器。
对卷积出来的表示进行解码相当于反转编码的过程编码的输出经过上采样的处理之后再和卷积核进行卷积。上采样upsampling不仅可以补充缺失分辨率还能确定编码器学到的码字中每个元素的覆盖范围卷积操作则在覆盖范围上计算上采样结果和特征本身的匹配程度。
随着上采样和卷积的不断进行高层次的特征如庖丁解牛般一点点被拆解成低层次的特征这些特征在重构出的图像中又体现为像素的分类结果。如此这般一个完整的卷积网络编解码可以将原始图像重构成不同语义的组合来自斯坦福大学CS231n课程的下图就是个典型的例子。
<img src="https://static001.geekbang.org/resource/image/bc/95/bc40ddc12fd1da0b371a5e5c45558395.png" alt="" />
图片来自http://cs231n.stanford.edu/slides/2017/<br />
cs231n_2017_lecture11.pdf
和卷积网络相比,编解码结构更直观的应用是在循环神经网络中。**循环神经网络是增加了时间维度的神经网络,是自然语言处理、尤其是机器翻译的利器**。机器翻译需要将一种语言的句子映射成另一种语言的句子,这类**序列到序列的模型**sequence-to-sequence model正是编解码结构的用武之地。
不管使用循环神经网络还是长短期记忆网络,编解码结构在处理翻译问题时都是整体读取输入的语句,将输入语句编码成定长的向量码字表示。在带有时序的神经网络中,编码的码字会以隐藏状态的形式出现,并被编码器分字翻译成输出。在译码时,译码器会根据隐藏状态和之前时刻的输出来确定当前时刻输出的似然概率,并选择最优的结果。
在谷歌的招牌神经机器翻译系统Google neural machine translation编码器和译码器中不同的长短期记忆层以残差连接以提升反向传播中的梯度流加快深层网络训练的速度。编码器网络的最底层和解码器网络的最顶层通过注意力模块进行连接其作用在于使译码器网络在译码过程中分别关注输入语句的不同部分。其中具体的细节在这里就不做介绍了。
编码器和译码器并不一定非要具有相同的类型异构的神经网络一样可以用来构成编解码结构。在微软公司于2017年自然语言处理实证方法会议Conference on Empirical Methods in Natural Language Processing发表的论文《利用卷积神经网络学习语句的通用表示》Learning generic sentence representations using convolutional neural networks研究者就提出了一种学习文本分布式表示的架构。
这种架构以卷积神经网络作为编码器,将输入语句转化为连续取值的码字,译码器则采用长短期记忆网络。之所以选择卷积网络作为编码器,作者的解释是一是卷积网络可以达到稀疏的效果,降低参数的数目;二是卷积网络的层次化结构有助于识别语句中的语言模式,这是循环网络无法做到的。
除了文本处理外图像处理也可以应用到异构的编解码结构。在韩国研究者的论文《用于图像捕捉的文本导向注意力模型》Text-guided attention model for image caption作者使用一个卷积网络对待捕捉的图像编码用一个循环网络对包含捕捉对象的文本编码两者的输出用注意力机制处理后再对卷积网络的输出进行加权。译码器则利用长短期记忆网络将码字转换成语句。感兴趣的话你可以自己阅读文章了解细节。
编解码结构的核心是生成数据的表示因而属于表示学习的范畴。表示学习representation learning也叫特征学习feature learning其目标是让机器自动发现原始数据中与输出相关度较高的隐含特征因而能够自动生成新特征的技术都可以归纳到表示学习中。
今天介绍的**编解码结构则可以看成是表示学习的一类应用**。《表示学习综论与新视角》Representation Learning-A Review and New Perspectives是关于表示学习的一篇综述如果想深入了解表示学习可以阅读这篇文献。
今天我和你分享了由深度网络衍生出来的编解码结构,以及相关的表示学习概念,包含以下四个要点:
<li>
编解码结构可以重构数据的表示方式,提取出高层次的特征;
</li>
<li>
自编码器将编码器和解码器集成到同一个深度网络中,是一种无监督的生成模型;
</li>
<li>
卷积神经网络和循环神经网络都可以用来构造编解码结构;
</li>
<li>
表示学习也叫特征学习,是让机器自动提取数据特征的技术。
</li>
和特征学习相对应的概念是特征工程feature engineering也就是人工提取数据特征。这样做虽然能够充分利用垂直领域的先验知识却在效率上远远逊色。那么你是如何看待特征学习与特征工程的利弊与结合的呢
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/b4/e5/b472670030ffe23904c2b0e16d11d4e5.jpg" alt="" />

View File

@@ -0,0 +1,94 @@
<audio id="audio" title="25 | 基于特征的区域划分:树模型" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3f/74/3f28910985655145768aa87e0d231074.mp3"></audio>
不知道你是否留意过非洲的地图和其他大洲按照地理边界划分国界的方式不同很多非洲国家的国境线都是规则的直线条组合。这种非自然的划分背后隐藏着一段屈辱的历史19世纪起欧洲的资本主义新贵们开始了对非洲的掠夺。而在巧取豪夺资源之外他们也没有忘记抢占地盘这些横平竖直的国境线就是对当年殖民主义者瓜分非洲无声的控诉。
下图是主要殖民国家在非洲的势力范围划分图,图片里的非洲如俎上的鱼肉般被肆意切割,切下的每一块都像黑奴一样,被烫上宗主国的烙印。
<img src="https://static001.geekbang.org/resource/image/3c/04/3c362a8d983a7fa659758f764ae95d04.png" alt="" />
瓜分非洲Scramble for Africa图片来自维基百科
当然,我的目的不是探讨历史,举这个例子的原因是从非洲地图容易直观地联想到机器学习中基于树方法的分类结果。**树模型**tree-based model遵循“分而治之”的思路以递推方式将特征空间划分为若干个矩形的区间再在每个区间上拟合出一个简单的模型。在分类问题中这个简单模型就是类别的标签选择。在“人工智能基础课”中我曾以用于分类的决策树为例对树模型做了介绍你可以回忆一下。下图就是分类决策树对特征空间进行划分的一个实例。
<img src="https://static001.geekbang.org/resource/image/3a/9f/3ab09e437a5fcfb642b94f43f021a79f.png" alt="" />
决策树的生成与对特征空间的划分图片来自Pattern Recognition and Machine Learning, 图14.5 &amp; 14.6
这一次,我将换个角度,从线性回归模型出发来理解树模型,这种理解思路将从回归树开始。
顾名思义,**回归树**regression tree是用来完成回归任务的树模型。和全局的线性回归相比树模型是局部化的模型可以实现非线性的拟合。在从整体到局部的过渡中回归树的操作和之前介绍过的回归样条方法一脉相承采用的都是“分段函数”的思路但两者的区别在于回归树对特征空间执行的是**递归式划分**recursive partitioning。递归的划分不要求一步到位而是步步为营地对前一次划分的子区域继续做出细化直到满足预先设定的要求为止。这一点在上面的图示中也有所体现。
这样看来,回归树和原始线性回归的区别仅仅在于全局和局部的差异吗?非也!**回归树的表达能力强在对于特征之间相互作用interaction的刻画**。当用来预测输出的特征有多个时,不同的特征之间很可能存在着交互作用,共同对输出产生影响,而这种影响的作用就超出了线性的范畴。假设输入的特征有$x_1$和$x_2$两个,如果要考虑它们之间的相互作用,线性回归的模型就需要改写成
$$ y = a_0 + a_1x_1 + a_2x_2 + bx_1x_2 + \epsilon $$
当$x_1$和$x_2$各自产生一点微小的变化时,这种变化在交互项中的累积就是
$$ (x_1 + \delta_1)(x_2 + \delta_2) = x_1x_2 + \delta_2x_1 + \delta_1x_2 + \delta_1 \delta_2 $$
可以看出,原始的单个交互项在扰动之后变成了四项,其中的最后一项无疑会给线性模型的解释造成困扰。而当特征的数目增加时,特征之间交互项的数目会以指数速度增加,从而给这些非线性的描述带来严重的困难。
和线性回归“由因及果”的推理方式相比,回归树采用了更有弹性的“由果推因”的方式。它并不直接构造从自变量到因变量明确的数量关系,而是通过对因变量进行分组来确定自变量的影响方式。
分组的依据有两个:一个是作为输出的因变量的相似性,另一个是作为输入的单个自变量的相异性。因变量的相似性决定了被划分到同一组的数据在输出上的差别较小,自变量的相异性则决定了被划分到不同组的数据在某一个输入属性上的差别较大。对划分好的数据集继续迭代执行这个过程,就可以完成对特征空间的递归式划分。
由于回归树采用树状结构来建模,因此从树结构的角度看,对数据集的递归式划分就是对树模型的不断分枝,每个分枝点都是让因变量产生最大差异的那个自变量。在这个过程中,每个节点内样本的同质性会不断增强,当样本完全同质化或者数目过少时,回归树的构造就完成了。分枝点具体的选择原则在上一季的专栏中我已经做过介绍,你可以回忆一下。
回归树和分类树的区别在于将信息增益的指标替换成了方差,算法会选择分类后两个类别方差之和最小,也就是和原始方差相比下降最大的那个属性进行划分,这种划分方式被称为**方差下降**variance reduction
下面这个对回归树划分方式的说明来自中文文献《CART分类与回归树介绍》这篇文章发表在1997年《火山地质与矿产》的第18卷第1期上这从侧面反映出统计学习的应用范围有多么广泛。文章说明划分的优劣取决于生成的结点中因变量的离散程度划分之后因变量的取值越集中划分的效果就越好。树生成的算法就是一步一步找到每一个最优的划分。
假设训练集中总共有300个数据方差为51.5。有一种划分方式将数据集分为142和158两组两组的方差分别是46.7和49.3。这表明左右两个结点中因变量的离散程度和总体的离散程度相近显然这一划分的效果不佳。相比之下另一个划分可以让左结点中的方差为20.3右结点中的方差为26.0。这种划分减少了一半的方差,在每个结点里,因变量都更加接近它们的平均值,因而是个更好的划分。
这样的过程体现出**局部化模型典型的处理方式,也就是先将整体划分成局部,使每个局部都体现出一定的规律性,再对每个局部的规律做出拟合**。划分可以通过逐步选择具有最大信息增益或者最大方差下降的特征来完成,那么在划分出的局部上如何来拟合呢?回归树给出了一个非常简单的答案,那就是**每个局部上所有数据的取值都是常数,其数值等于这个局部内样本点输出的均值**。这样的决策树输出的就是像楼梯一样高低错落的超平面的组合。
为了测试回归树的效果我用它对一直应用于回归任务的英超数据集进行了拟合结果如下。实现回归树需要调用Scikit-learn库中tree模块的DecisionTreeRegressor类。在拟合时回归树的最大深度被设置为3这意味着对特征空间的划分次数为3次最多可以分成$2 ^ 3 = 8$个区域。可以看到,在一维的情形下,回归树其实是分段的常数函数,只不过不同分段之间的分界点并不是人为指定,而是通过方差下降的方法计算出来的。
<img src="https://static001.geekbang.org/resource/image/5e/6a/5e5718ccdb4a0f03ec81d0809ae92b6a.png" alt="" />
为了进一步考察回归树在多元回归问题中的表现,并观察回归树对特征之间的交互的处理方式,我们再来看看用回归树去拟合位置评分数据和场均积分的关系。出于便于可视化的考虑,在位置评分中我只选择了后卫评分和前锋评分两者作为输入的特征。选择这两者的考虑是在前面的多元回归分析中已经证明,这两个属性和积分之间存在较强的相关性,而两个属性所映射的二维平面也更容易观察。
从回归树的结果可以看出,在不同的数据点上,两个特征的交互方式是不同的。树算法首先根据防守球员的得分将数据集一分为二。在防守水平前三分之一的队伍中,进攻水平并没有产生太大的影响,一上一下两个傲然不群的数据点更像是数据集中的异常点。而在防守较差的三分之二里,进攻和防守之间的互动就复杂了许多,形成的区域划分也复杂了许多。
<img src="https://static001.geekbang.org/resource/image/26/d4/26ee20b6a5f29a6050515b72476191d4.png" alt="" />
无论是回归树还是分类树,在生成时都遵循相同的流程,就是先划分特征空间,再对每个特征空间去拟合。两者的区别主要在于选择划分特征时采用的指标不同。和线性回归相比,决策树更加符合人类做出决策、尤其是像医学诊断这类决策的思维流程,它的描述性还要更好一些。但是决策树对加性关系的表达能力不强,如果因变量真的是自变量的线性组合的话,使用决策树恐怕就要弄巧成拙了。
在可用于划分的自变量较多时,即使树结构的结点树已经预先设定,要穷举搜索到方差和最小的最优树依然是个费时费力的过程。**贪心策略是确定决策树的结构时通常采用的方法**。
贪心策略greedy strategy是活在当下的方法在生成树时每次只增加一个结点确定结点时采取在当前状态下最优的选择让每个子集都在当前条件下具有最正确的分类。但这种方式并不能确保找到全局的最优解因而容易造成过拟合。
贪心策略的另一个问题是终止条件,当树结构达到一定深度后,进一步的划分很可能不会让子集方差产生明显的下降,继续划分下去就会造成过拟合。应对这一现象的手段是先让贪心策略生成一棵比较复杂的树,当每个子集中样本的数目都达到下限时终止算法,再来对这棵树进行剪枝操作。
**剪枝**pruning是对决策树残余方差和复杂度之间的折中对回归树来说剪枝的目标函数可以写成
$$ C(T) = \sum\limits_{\tau = 1}^{| T |} \sum\limits_{{\bf x}_n \in R_{\tau}} (t_n - \dfrac{1}{N_{\tau}}\sum\limits_{{\bf x}_n \in R_{\tau}}t_n) ^ 2 + \lambda | T | $$
其中${\bf x}_n$表示样本的自变量,$t_n$表示样本的因变量,$R_{\tau}$表示决策树划分出的区域,其中包含$N_{\tau}$个样本,$T$表示划分区域的数目。显然,$T$的作用是对目标函数的正则化。
决策树一个主要的缺点是对数据点异常敏感,训练数据集一点不起眼的变动就足以生成一棵完全不同的决策树,而数据集中的异常点也会对决策树结果造成未知的影响。此外,在处理回归任务时,决策树得到的是不连续的结果。这样看来,回归样条就可以视为决策树的一个优化。
广义来看,**决策树可以视为对基本线性模型的层次化集成**,这里的基本模型就是数据在每个划分区域上的回归或分类规则,这些规则一般是线性的。决策树的作用是将这些固定的局部线性规则进行拼接式的组合,从而生成整体意义上的非线性模型。后面我们将发现,看似简单的集成策略却能在机器学习中发挥出出人意料的优异性能。
今天我以回归树为例,和你分享了决策树的基本原理,包含以下四个要点:
<li>
决策树是局部化的非参数模型;
</li>
<li>
决策树生成算法先将特征空间划分成若干区域,再在每个区域上拟合输出;
</li>
<li>
决策树能够更加灵活地刻画不同属性之间的相互作用;
</li>
<li>
决策树可以看成最简单的集成模型。
</li>
作为规则集合的决策树不仅仅是一类机器学习的模型,更是决策分析中常用的结构化方法。那么你能想到哪些决策树在机器学习之外的应用呢?
欢迎发表你的观点。
<img src="https://static001.geekbang.org/resource/image/16/e1/16bf61af9a4bc826f4c7693663c59ee1.jpg" alt="" />

View File

@@ -0,0 +1,114 @@
<audio id="audio" title="26 | 集成化处理Boosting与Bagging" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/d0/f3/d03979e6ad4b3eaa67c015e7b975f7f3.mp3"></audio>
伊壁鸠鲁Epicurus是古希腊一位伟大的哲学家其哲学思想自成一派。在认识论上伊壁鸠鲁最核心的观点就是“多重解释原则”Prinicple of Multiple Explanantions其内容是当多种理论都能符合观察到的现象时就要将它们全部保留。这在某种程度上可以看成是机器学习中集成方法的哲学基础。
<img src="https://static001.geekbang.org/resource/image/fe/f5/fe8297d1f5d3a7e43c0a73df4e121bf5.png" alt="" />
集成学习架构图图片来自Ensemble Methods: Foundations and Algorithms图1.9
集成学习的常用架构如上图所示。在统计学习中集成学习ensemble learning是将多个基学习器base learners进行集成以得到比每个单独基学习器更优预测性能的方法。每个用于集成的基学习器都是弱学习器weak learner其性能可以只比随机猜测稍微好一点点。
**集成学习的作用就是将这多个弱学习器提升成一个强学习器strong learner达到任意小的错误率**
在设计算法之前,集成学习先要解决的一个理论问题是集成方法到底有没有提升的效果。虽说三个臭皮匠赛过诸葛亮,但如果皮匠之间没法产生化学反应,别说诸葛亮了,连个蒋琬、费祎恐怕都凑不出来。
在计算学习的理论中,这个问题可以解释成**弱可学习问题**weakly learnable和**强可学习问题**strongly learnable的复杂性是否等价。幸运的是这个问题的答案是“是”而实现从弱到强的手段就是**提升方法**。
通俗来说,提升方法就是诸葛丞相手下这样的三个臭皮匠,啊不,裨将的组合:其中的第一位擅用步兵和骑兵,奈何对水战一窍不通,这样的将领用来对付曹操可以,对付孙权就有点儿吃亏了。为了补上第一位将军的短板,第二位裨将在选择时专门挑选了水战功力雄厚的。可惜人无完人,这位水军高手也有严重的偏科,骑在马上还可以,指挥步兵就是去送人头。这两位参谋放在一起,指挥骑兵一点儿问题都没有,但另外两个军种就差点儿意思。
为了查缺补漏,诸葛丞相在第三位裨将的选择上颇费了一番心思,找到了一位步战和水战兼通的将军。这样一来,这三位裨将组成的联席会议就能游刃有余地指挥各种战斗:无论在哪种战法上,专业的将领都能够占到了总体中的多数。虽然每一位将领单独拎出来都有严重的缺陷,可三个组合在一起就能让战斗力大大地提升。
<img src="https://static001.geekbang.org/resource/image/24/95/2453da1332254a0162f4c985bc46fd95.png" alt="" />
提升方法示意图图片来自Elements of Statistical Learning图10.1
上面的解释意在说明,**提升方法boosting通过改变训练数据的分布来训练不同的弱学习器再将它们组合成强学习器**。虽然不受具体训练方法的限制但大多数提升算法都会迭代生成与数据分布相关的弱分类器并将它们以加权组合的方式添加到最终的强分类器中。每当一个新的弱学习器加入后数据的权重都会被重新分配reweighting被错误分类的样本占据更大的权重被正确分类样本的权重则被相应地削减这保证了未来的弱学习器会更多地以前车之覆作为后车之鉴。
既然训练数据都是一样的,那么如何在每个轮次中选择不同的权重分配呢?
在**自适应提升**adaptive boosting, AdaBoost这个最成功的提升算法中权重分配的策略是这样的以二分类任务为例首先给每个样本赋予相同的权重$w_i = 1 / N$,再用它们来训练弱分类器$f_m(x)$并计算训练误差$\epsilon_m$,根据训练误差可以计算出权重调整的系数$\alpha_m = 0.5 \log [(1 - \epsilon_m) / \epsilon_m]$,并对每个样本的权重$w_i$做出调整
$$ w_i \leftarrow w_i \cdot \exp [\alpha_m I(x_i)]$$
对分类错误的样本$I(x_i) = 1$,分类正确的样本$I(x_i) = -1$,这样做的作用就是放大误分类样本的权重。新计算出的权重经过归一化处理后,就可以用来继续训练下一个弱分类器,直到集成出强分类器为止。强分类器的数学表达式为
$$ F(x) = {\rm sign} [\sum\limits_{m = 1}^M \alpha_m f_m(x)] $$
如果将二分类任务进行推广那么上面表达式中的符号函数sign$(\cdot)$就可以去掉,得到的就是一个进行了基函数扩展的线性回归模型。
和决策树类似,提升方法本质上是个广义可加模型,它的每个组成部分都是一个单独的弱学习器。随着弱学习器不断被添加到强学习器中,新的扩展基函数也被不断添加到广义可加模型中,但每一个添加的扩展基函数都预先经过优化,优化的过程是逐步来完成的。
在此基础上可以进一步推导得出,当使用指数函数$\exp [y_i \cdot f(x_i)]$作为损失函数时作为基扩展的AdaBoost模型计算的就是样本属于某个类别的对数几率。换言之**AdaBoost就是加强版的逻辑回归**。
提升方法的重点在于取新模型之长补旧模型之短来降低偏差,尽可能获得无偏的估计,模型之间是相互依赖的。如果去除对依赖性的限制,使用相互独立的模型来实现集成,典型的方法就是装袋法。
**装袋法bagging是自主聚合bootstrap aggregating的简称是模型均衡的一种手段**。我们都知道,如果对$N$个相互独立且方差相同的高斯分布取均值,新分布的方差就会变成原始方差的$1 / N$。
将同样的道理推广到统计学习上从训练数据集中利用重采样resampling抽取出若干个子集利用每个子集分别建立预测模型再对这多个预测值求平均就能够降低统计学习方法的方差。需要注意的是装袋法并没有降低偏差的效果也就没法提升预测的准确性因此在选择基学习器时应当以偏差较小的优先。
秉承平均主义观点的装袋法有个特点,就是在不稳定的弱学习器上效果尤为明显。假设用于平均的学习器是$h(\cdot)$,那么装袋法的结果就是$h(\cdot)$在自助采样法采出来的数据分布上的期望值。
利用方差不等式$(E[X]) ^ 2 \le E[X ^ 2]$可以计算出,经过装袋后模型的方差不会大于每个单独训练出来模型的方差在自助采样分布上的数学期望,也就是先求期望再求方差优于先求方差再求期望。
这样的性质说明装袋法对方差的降低实际上是一种平滑效应:**模型在不同的数据子集上波动越大,装袋法的效果就越好**。如果模型本身受数据的影响不大的话,那装袋也不会起到太好的提升效果。
这样的道理在生活中也有所体现:一个团队里总会有一些哪里需要哪里搬的“万金油”型成员,在必要的时候顶到缺人的岗位上,可一旦全是万金油成员的话,这对团队的帮助就非常有限了,甚至还会起到反作用。
装袋法之所以能够降低方差,最主要的原因在于它可以平滑高次项的方差。对于具有$x ^ n, n \ge 3$形式的高阶指数项来说,输入和输出之间存在着雪崩的效应,输入端一点微小的扰动都可能导致输出的大幅波动。如果输入输出关系的拟合结果中存在这样的高阶项,它就必然是不稳定的。
装袋法的好处在于能够降低高阶项的方差,同时又不会影响到线性项的输出。所以如果弱学习器是多项式这类高阶模型,或是决策树这类容易受样本扰动影响的模型,用装袋法来集成都是不错的选择。
从贝叶斯的角度看,装袋法的输出是近似于后验最优的预测,但这需要弱学习器满足次序正确的条件。还是以分类问题为例,如果给定的样本$\bf x$属于类别$y$的概率最大那么次序正确order-correct的分类器$h(\cdot)$就应该以最大的概率把$\bf x$划分到$y$中。
可以证明这种情况下装袋法能够达到的最高精度就是按照后验概率对样本进行划分此时模型的错误率就是贝叶斯错误率Bayes error rate
决策树是集成学习最青睐的基学习器,无论是提升法还是装袋法,其代表性的算法都是在决策树的基础上发展出来的。
接下来,我将原始决策树算法和集成化的决策树算法应用在线性不可分的曼城-西布朗数据集上,观察其分类的结果。
可以看到在使用单棵决策树的DecisionTreeClassifier类时深度为4时还会存在误分类点可再增加一层结点就可以实现完全正确的分类。但需要说明的是由于决策树的初始生成方式是随机的即使深度相同的树也不能保证每次都产生相同的边界。
<img src="https://static001.geekbang.org/resource/image/7b/1e/7b6d74d74b07f94e218b37c6afa5311e.png" alt="" />
单棵决策树对曼城-西布朗数据集的分类结果
采用决策树的集成可以得到不同的分类边界。在Scikit-learn中两种继承方法都在ensemble模块中类的名称分别是AdaBoostClassifier和BaggingClassifier。
在AdaBoost和装袋法中每个基学习器都被设置为深度为3的决策树。从结果中可以看出提升方法可以得到完全正确的结果但装袋方法的分类还会存在误差。其原因在于深度为3的决策树属于弱学习器本身存在着不小的偏差。提升方法可以同时控制偏差和方差将每个数据点都正确分类但装袋方法只能降低方差而没法改善偏差出现误分类点也就不奇怪了。
<img src="https://static001.geekbang.org/resource/image/a7/de/a7db6a0de3e5f24717ffce929fb189de.png" alt="" />
集成化决策树对曼城-西布朗数据集的分类结果
除了提升法和装袋法之外,另一种知名度较低的集成方法是堆叠法。**堆叠法**stacking也叫堆叠泛化stacked generalization是层次化的集成方法其思想和神经网络类似只不过神经网络堆叠的对象是神经元和隐藏层而集成方法堆叠的是同构或者异构的基学习器。
堆叠法先要用自助采样生成不同的数据子集用数据子集训练第一层中不同的基学习器。第一层基学习器的输出再被送到第二层的元分类器meta classifier中作为输入用来训练元分类器的参数。
堆叠法的思想和前两种方法有所不同。无论是提升法还是装袋法,其重点都落在单个模型的生成方式上,也就是如何训练出合适的基学习器,基学习器的形式一般是统一的。
而堆叠法的重点在于如何将不同的基学习器的结果组合起来研究的对象是让所有基学习器共同发挥出最大效果的组合策略。某种意义上说堆叠法的训练数据不是原始的训练数据集而是不同基学习器在训练数据集上的结果起到的是模型平均model averaging的作用提升法和装袋法都可以看成它的特例。正因如此堆叠法除了被视为集成方法外还可以看成是模型选择的一个手段。
**集成方法超出了简单的模型范畴是元学习meta learning的方法**。元学习还没有业界公认的标准解释,但通常被理解为“关于学习的学习”。在集成方法这个实例中,元学习体现在通过改变数据特征、数据集和算法构造方式,通过多算法的融合来实现更加灵活的学习。
今天我和你分享了集成学习的基本原理,以及典型的集成学习方法,包含以下四个要点:
<li>
集成学习可以将多个弱学习器组合成强学习器,是模型的融合方法;
</li>
<li>
提升方法通过重新分配数据的权重来改善弱学习器,可以提升模型的偏差性能;
</li>
<li>
装袋方法通过重新采样数据来改善弱学习器,可以提升模型的方差性能;
</li>
<li>
堆叠方法通过重新构造输出来改善弱学习器,可以看成广义的模型选择。
</li>
不同的集成方法也可以集成起来。如果将提升方法的输出作为装袋方法的基学习器得到的是MultiBoosting方法而如果将装袋方法的输出作为提升方法的基学习器得到的就是Iterativ Bagging方法。
对这两种关于集成的集成,你可以查阅资料,深入了解它们的原理与优缺点,并在这里留下你的见解。
<img src="https://static001.geekbang.org/resource/image/11/6e/118d5a95c813c3be33d8fec2d182346e.jpg" alt="" />

View File

@@ -0,0 +1,108 @@
<audio id="audio" title="27 | 万能模型:梯度提升与随机森林" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/4d/95/4df16d12abda49792e50d18f1ba26795.mp3"></audio>
上一篇文章中我和你分享了提升法和装袋法这两种典型的集成方法,它们都可以用在决策树模型上,对多棵不同的树进行组合。然而直接使用这两种集成方法只是初级的策略,将它们的强化版用在决策树上可以得到更加强大的万能模型,也就是梯度提升决策树和随机森林。
**梯度提升**gradient boosting的思想来源于对提升方法的推广。显式的提升方法本身可以解释为对一个合适的损失函数的优化如果将损失函数的选择扩展为任意的可微函数并将提升方法和最优化中的梯度下降gradient descent结合起来得到的就是梯度提升。
梯度提升将提升方法视为函数式的迭代梯度下降算法通过迭代地选择指向负梯度方向的函数也就是弱学习器来优化整个函数空间上的代价函数。在AdaBoost中每个弱学习器的短板通过权重的加强得以凸显而在梯度提升中凸显的方式被替换成了梯度。
要理解梯度提升方法的妙处,还是要先从回归问题说起。在解决回归问题时,模型的输出$f({\bf x})$和真实值$y$之间的差值$h({\bf x}) = y - f({\bf x})$被称为残差residual它表示了数据中模型所不能刻画的那些部分。
传统的单一模型对残差无能为力,可集成方法的引入给处理残差提供了新的思路,那就是用新的基学习器去拟合残差,作为对上一个模型的修正。将拟合真实值$y$和拟合残差$h$的模型集成起来,可以获得更加精确的拟合结果。
上面的过程类似于日常生活中的猜数字游戏。要猜测未知的数字,我先要随机地选择一个初始值进行猜测,再根据猜测值和真实值之间的大小关系来调整。随着一轮轮猜测的不断进行,猜测的结果就会越来越接近真实的未知数字,这个逼近真实值的过程就是不断拟合残差的过程。
思考一下回归问题中的梯度下降,你就会发现它和残差拟合实际上是等效的。如果以均方误差$[y - f({\bf x})] ^ 2 / 2$作为损失函数,那么对$f({\bf x})$计算出的梯度就等于$f({\bf x}) - y$。这意味着残差和负梯度是完全一致的,对残差的拟合就是对模型负梯度的拟合,而根据残差来更新集成后的模型实际上就是根据负梯度来进行更新。这样一来,梯度提升方法就变成了广义上的梯度下降。
这里我们不妨对原始梯度下降和梯度提升加以比较:**梯度下降算法中的负梯度和梯度提升方法中的残差在数学上是等价的,但意义却有所不同**。负梯度指向的是单个模型参数更新的方向,残差则表示了集成模型下一个模型的拟合目标。梯度的不断下降可以让模型的参数逐渐收敛到最优参数上,而残差的不断拟合则让集成之后的模型越来越接近真实的数据生成机制。
从这种等价关系出发,以梯度的角度构造提升方法会带来更多的便利,其中最重要的一点就是**损失函数的重新定义**。梯度提升方法本身是建立在负梯度和残差之间等价关系的基础上的,可是一旦有了这种等价关系,我们反过来又可以放弃狭义的残差,从广义的损失函数的负梯度角度去构造提升方法。这样的过程其实就是从特殊到一般,再从一般到特殊的认识思路。
以决策树作为基学习器,使用梯度提升方法进行集成,得到的就是**梯度提升决策树**gradient boosting decision tree, GBDT。在每一轮的提升过程中GBDT都会使用决策树来拟合计算出负梯度因此整个模型就是一大堆决策树的组合。
在解决分类问题时GBDT中的负梯度可以表示成样本归属于每个类别的真实概率和上一轮预测概率的差值这个差值会被回归树拟合拟合值与上一轮预测概率求和就是这一轮的输出。
**GBDT是利用提升方法生成的全能模型它在装袋方法上的对应是随机森林**
**随机森林**ramdom forest由若干个随机树random tree模型组成每一棵单独的随机树都采用自助采样作为数据重采样的手段但只会随机选择少量的特征用于生成树结构这样生成的随机树也无需进行剪枝的处理。
这个算法其实是两种随机化方法——**属性随机化**和**数据随机化**的组合,两种随机化方法就像是倚天剑和屠龙刀,刀剑互斫才生出随机森林这本旷世秘籍。
属性随机化的思想也叫**随机子空间方法**random subspace method由香港学者Ho Tin-Kam首先提出。
属性随机化的好处在于让每个单独的基学习器不会过分关注在训练集中具有高度预测性或者描述性的特征这样的特征虽然在训练数据中举足轻重却将对数据的解释限制在狭窄的范围之内未必能对测试数据进行精确预测。而随机抽取出的不同属性构成了不同的随机子空间应用不同的随机子空间去训练不同的单个决策树。其实就是集成学习中非常重要的多样性思想diversity的体现。
归根结底,**属性随机化的作用还是在于机器学习中老生常谈的问题,那就是提升泛化性能,抑制过拟合**。
对于每棵单独的决策树来说如果在训练集上能达到100%的正确率,那么它所生成的分类边界就适用于所有在所选择属性上和训练数据具有相同取值的新数据,即使这些新数据在没有用于这棵特定决策树分类的属性上有不同的取值也没关系。
这样一来,森林里的每棵树就在不同的随机子空间,也就是在不同的角度上进行泛化,从而给模型整体的泛化带来更多的可能性。相比之下,无论是预剪枝还是后剪枝,都是针对将所有属性视为整体的决策树的正则化,其效果就来得不如随机子空间好。
虽然Ho Tin-Kam在随机子空间的基础上进一步提出了随机森林的方法以及名称但她的工作侧重于生成随机化的分类判别式从头到尾都没有涉及对数据的自助重采样而这恰恰被视为随机森林的核心。
**数据随机化**是由从统计学半路出家的莱奥·布雷曼(之前的文章中也提到过这位老先生)提出,他在此基础上进一步发展出了我们今天所熟知的随机森林模型。
**数据随机化最主要的作用在于去除各独立模型之间的相关性,这个装袋方法的思想一脉相承**。单棵决策树会对它自己的训练集中潜在的噪声高度敏感,但只要不同的树之间有较好的独立性,这种敏感特性就不会扩散到整个森林里。
此外数据随机化的作用还体现在包外样本上。对于装袋法这种有放回的采样来说大概会有三分之一的数据在训练过程中不会被用到这部分未利用的数据就是包外样本out-of-bag sample。包外样本实际上起到了验证集的作用可以证明在包外样本计算出来的错误率是真实错误率的无偏估计这就给算法的评估提供了一个比较靠谱的参考。
随机森林是一种比较复杂的模型,从不同的角度去观察它,就可以和不同的其他模型建立联系。由于一个样本可以出现在森林里的不同决策树上,在不同的决策树上又会归属于不同的叶子结点,所有和这个样本归属于同一个叶子结点的其他样本都会对它产生影响。
这样看来,**随机森林就是局部化的近邻模型的拓展**,和传统的$k$近邻算法不同的是,不同近邻点的权重并不相等,而是取决于树的结构和训练数据的结构。将这一思路再延伸一步,还可以建立起随机森林和核方法之间的联系。
除了局部化之外,**随机森林又可以看成是对数据进行分布式建模的产物**。每一个样本本身是定义在高维空间之上的,但属性随机化起到了降维的作用,将样本映射到随机子空间中,再在不同的低维空间上从不同属性出发来定义同一个样本,这和深度学习的想法不谋而合。只不过随机森林并不具备深度学习的层次化结构,而是直接将分布式的表征赋予同等地位,进行扁平化的组合,这固然可以简化运算,却也限制了表达能力的提升。
在Scikit-learn中这两种万能模型都定义在ensemble模块中分别是GradientBoostingClassifier和RandomForestClassifier类。将这两种方法应用在前面使用的线性不可分的数据集上可以得到不同的正确分类边界。但这个轻量级的实例只是用来对模型产生直观的认识将这两种模型用在这样简单的数据集上有些杀鸡用牛刀的意味。
<img src="https://static001.geekbang.org/resource/image/fc/85/fc699b421ceb22167e673dafbd655885.png" alt="" />
GBDT和随机森林对曼城-西布朗数据集的分类结果
最后让我们来看一看集成学习中的一个理论问题,就是**误差-分歧分解**error-ambiguity decomposition。在集成方法中假定最终的输出结果$f(x)$是每个基学习器单独输出的线性组合$\sum_{i=1}^N w_if_i(x)$其中线性系数全部为正且和为1那么每个基学习器的分歧就可以表示为
$$ a_i(x) = [f(x) - f_i(x)] ^ 2 $$
集成模型的分歧是所有基学习器的分歧的线性组合
$$ a(x) = \sum\limits_{i = 1}^N w_ia_i(x) $$
这个表达式可以看成是所有独立输出对加权平均求出的加权方差。如果直接拿每个基学习器的结果和真实的输出$y(x)$做比较的话,每个基学习器和集成模型各自的均方误差就可以写成
$$ e_i(x) = [y(x) - f_i(x)] ^ 2, e(x) = [y(x) - f(x)] ^ 2 $$
对上面的表达式做一些数学处理,就可以得到集成模型分歧和均方误差之间的关系
$$ e(x) = {\bar e}(x) - a(x) = \sum\limits_{i = 1}^N w_ie_i(x) - a(x) $$
将每个基学习器的分歧$a_i(x)$和误差$e_i(x)$,以及集成模型的误差$e(x)$在数据的概率分布上积分,就可以得到它们在数据集上的数学期望$A_i$、$E_i$和$E$。再以加权系数$w_i$对$A_i$和$E_i$进行线性组合,又可以得到模型分歧的集成$\bar A$和误差的集成$\bar E$。这时,集成模型的泛化误差就可以表达为
$$ E = {\bar E} - {\bar A} $$
这个表达式就是泛化误差的误差-分歧分解,它解释了集成学习中强调多样性的原因。表达式的第一项是基学习器关于真实结果的加权平方误差,第二项则是基学习器关于集成结果的加权平方误差。各基学习器之间的相关性越小,它们和集成结果之间的差别就越大,计算出的分歧也就越大。通过增加个体的方差来减小集体的方差,这就是集成学习的奇妙之处。
误差-分歧分解表明,集成学习成功的关键在于每个基学习器的和而不同。“和”指的是每个基学习器都要有良好的性能,“不同”指的是基学习器的原理之间存在差别。但**在实际当中要想找到理想配置的话,除了大量尝试似乎别无他法**。
今天我和你分享了梯度提升决策树和随机森林这两种万能模型,包含以下四个要点:
<li>
梯度提升决策树和随机森林都是在各类问题上表现优异的通用模型;
</li>
<li>
梯度提升决策树是提升方法的推广,利用上一轮次的梯度信息构造决策树;
</li>
<li>
随机森林是装袋方法的推广,利用属性随机化和数据随机化构造决策树;
</li>
<li>
误差-分歧分解解释了集成学习强调基学习器多样性的原因。
</li>
在介绍线性回归时我曾提到,随机森林虽然可以取得较高的精度,但在可解释性上却不能让人满意。这意味着模型不能给出关于数据的一般性规律,模型的价值也就会大打折扣。
那么你是如何看待模型性能与可解释性之间的矛盾的呢?
欢迎分享你的观点。
<img src="https://static001.geekbang.org/resource/image/1b/e0/1bd4c02694303e95ae9499cb793d5ee0.jpg" alt="" />

View File

@@ -0,0 +1,97 @@
<audio id="audio" title="总结课 | 机器学习的模型体系" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/1d/8d/1d529617e7a9f90221c01e9b999e518d.mp3"></audio>
用17讲的篇幅我和你分享了目前机器学习中的大多数主流模型。可是除开了解了各自的原理这些模型背后的共性规律在哪里这些规律又将如何指导对于新模型的理解呢这就是今天这篇总结的主题。
要想在纷繁复杂的模型万花筒中梳理出一条清晰的脉络,还是要回到最原始的出发点——**线性回归**。线性回归是所有机器学习模型的鼻祖,其原因不仅源于它悠久的历史,还在于它三个最基本的特点。
<li>
**线性**(这不是废话么):除了常数之外最简单的函数关系。
</li>
<li>
**全局性**:一组线性系数适用于整个输入空间。
</li>
<li>
**数据不变性**:不对输入数据进行任何预处理。
</li>
这三个特点决定了线性回归简洁的数学形式、清晰的可解释性和受限的表达能力。要想从线性回归出发,得到更加复杂的模型,就要摆脱这三个基本假设的限制,从内部对模型加以改造。
线性是首当其冲的改造对象。要对复杂的客观世界进行建模,非线性是不可或缺的要素。但从线性到非线性的过渡并非一蹴而就,而是循序渐进地实现,其演进的过程大致遵循“**属性非线性——参数非线性——全局非线性**”的路线图。
首先是属性的非线性化,典型的处理手段就是基函数的扩展。基函数的引入本质上是对特征空间的重构。一般来说,所有基函数构成一组正交基,自变量和因变量之间的非线性关系就被限制在这组正交基展成的线性空间里。基函数的形式越复杂,模型刻画复杂关系的能力就会越强。从这个角度看,多项式模型和分段的样条模型都可以归入属性非线性化的范畴。
除了对作为自变量的属性进行非线性化处理之外,待估计的模型参数也可以非线性化。这里我用参数的非线性化来指代属性不变但参数改变的模型,但由于参数本身是常量而非变量,因此参数的非线性化是以自适应调整的方式体现的。这种演化的代表模型就是以感知器为代表的神经网络。而在神经网络中,激活函数的使用又可以看成是基函数扩展的一个实例。
如果在前两者的基础上,进一步对属性和参数实现全局的非线性化,得到的就是广义线性模型。广义线性模型的非线性化是通过非线性的链接函数实现的,将线性组合的整体作为非线性化的对象。这种处理方法从根本上改变了线性模型的结构,将线性模型的应用范围从回归推广到了分类。
处理完线性特性,接下来就轮到全局性了。一手遮天的全局特性限制了模型的灵活性,改进的方法在于将它改造成若干个局部模型的组合,其演进的过程可以描述为“**结构化局部——非结构化局部——分布式表示**”。
结构化局部模型的代表是核函数,虽然它原本的目的不在于此,却在事实上起到了局部化的作用。具有固定形式的核函数给每个样本都定义了归它管辖的一亩三分地,非样本点的取值则等于所有样本在这个点贡献的求和。如果说非线性化是重新定义了属性空间的话,那么局部化就是对属性空间进行了手术刀般精细的切割,它将线性回归拓展为核回归,还衍生出了基于距离的学习。
核函数是具有明确解析式的数学函数,这说明它还具备一定的结构特性。如果将局部的结构特性都不加保留地完全拆解,那就是以$k$近邻为代表的基于实例的学习。$k$近邻算法秉持少数服从多数的朴素观念,将学习的方法简化到了极致,它甚至不能被称为一个模型,因为支配它的不是参数,而是规则。在线性回归中应用$k$近邻方法的话,它就变成了局部加权回归。
将局部化的思想再推进一步,就是分布式表示。局部化是对数据样本所在的特征空间的切割,可分布式表示却是对特征空间的重组,将原来单个的数据点变出了多个分身,分别作为对数据不同角度的观察结果。分布式表示虽然没有对特征空间显式的局部化处理,但它却将数据点分散成局部的组合,这在朴素贝叶斯和深度学习中都有体现。
改造了线性回归本身之后,还要改造线性回归对数据的处理方式。过多的特征数会导致维数灾难的发生,因此稀疏化就成为改进线性回归的另一个角度。降维其实也是对特征空间的重建,但无监督的特性使它通常出现在数据预处理的步骤之中。根据手段的不同,数据的降维技术可以近似地划分成“**直接降维——线性降维——非线性降维**”这样几个类别。
直接降维的处理对象是未经处理原始的输入维度,典型的方法是特征选择。特征选择会把对结果贡献不大的特征直接剔除,这无疑会造成信息量的损失。此外,利用统计特性降维的线性判别分析也可以归入这一范畴。相比之下,以主成分分析为代表的特征提取方法就克服了这个缺点,通过特征的线性重组来实现数据的降维。对主成分进行筛选时虽然也会产生信息的损失,但会具有更好的可控性。
如果抛开线性的限制,从样本的结构属性而非信息属性出发实现降维,这样的方法就是非线性降维,它的另一个名字就是流形学习。所谓流形的含义是嵌入到高维空间内的低维结构,流形学习的任务就是在高维空间上把这个隐藏的低维结构提取出来,从而更好地观察和分析数据。
上面这三种途径都是作用在模型内部,通过修正模型自身的特性来达到演化。如果换个角度,从外部对模型进行拓展的话,常用的方法就包括**正则化、层次化和集成化**。
正则化意在通过添加对待求解参数额外的约束条件来提升模型的泛化性能,避免过拟合,通常体现为模型中的正则化项。贝叶斯主义对正则化的理解来得更加直截了当:所谓正则化其实就是给模型套上先验分布的紧箍咒。定义了先验分布就可以应用最大后验概率估计,让后验概率最大化的过程就是正则化的过程。
层次化和集成化都是对模型结构的外部改进。层次化是将模型串联起来,通过逐级地学习来追求由浅入深的效果;集成化则是将模型并联起来,让多个模型群策群力,充分发挥集体智慧。深度学习和随机森林的成功已经向世人证明,这两种手段都能让模型之间产生充分的互动,从而得到良好的学习效果。
说到这里,我们就从线性回归出发,构建起了如下图所示的(我个人理解的)**机器学习模型鸟瞰图**。无论是作用于模型内部的非线性化、局部化和稀疏化还是作用于模型外部的正则化、层次化和集成化这些技巧实际上都属于方法method的范畴。**实际问题的解决方案往往来源于一种或者多种方法和基本模型的组合**。
所以在我看来,在读完这个专栏之后,你可以把所有具体的模型全部忘掉,只要领会这些方法,任何见过没见过的模型你都不会觉得陌生。
<img src="https://static001.geekbang.org/resource/image/75/db/75c3743acd9cdf8e72d7c9ca18aa03db.png" alt="" />
从机器学习模型的体系架构出发,按照由浅入深的顺序,我向你推荐以下的机器学习参考书。
<li>
《机器学习》Machine Learning汤姆·米切尔Tom Mitchell
</li>
<li>
《机器学习》Machine Learning彼得·弗拉克Peter Flach
</li>
<li>
《机器学习导论》Introduction to Machine Learning埃塞姆·阿培丁Ethem Alpaydin
</li>
这三本书是入门读物,共同的特点是结构清晰,难度适中。第一本是历久弥新的经典教材,虽然内容较为久远,却仍不失为理想的入门读物;第二本遵循从任务到模型的顺序,将模型分为树模型、规则模型、线性模型、距离模型和概率模型几类;第三本则先后介绍了参数方法、非参数方法和局部模型,并将频率主义和贝叶斯主义的内容融合在一起。读这些书时可以思考作者们对内容的编排,将重点放在建立关于机器学习的知识框架与体系上面。
<li>
《统计学习基础》Elements of Statistical Learning特雷沃·哈斯蒂等Trevor Hastie, et. al.
</li>
<li>
《模式识别与机器学习》Pattern Recognition and Machine Learning克里斯托弗·毕晓普Christopher Bishop
</li>
<li>
《深度学习》Deep Learning伊恩·古德菲洛等Ian Goodfellow, et. al.
</li>
这三本书是进阶读物,对方法的原理分析具有一定的深度,也会涉及大量的数学运算。前两本书是机器学习领域的经典,分别从频率主义和贝叶斯主义的角度对机器学习做出了详尽的阐释。第三本书则是目前关于深度学习唯一的专著,覆盖范围较广,适合针对某个主题做选择性的阅读。
<li>
《机器学习概率视角》Machine Learning: A Probabilistic Perspective凯文·墨菲Kevin Murphy
</li>
<li>
《深入理解机器学习》Understanding Machine Learning沙伊·沙莱夫-施瓦茨等Shai Shalev-Shwartz, et. al.
</li>
<li>
《统计学习理论的本质》The Nature of Statistical Learning Theory弗拉基米尔·瓦普尼克Vladimir Vapnik
</li>
这三本书是专业读物。第一本堪称机器学习的百科全书,从贝叶斯角度对机器学习的几乎所有问题展开论述。这本书不太适合阅读,更适用于作为词典随时查阅。第二本则聚焦于机器学习的理论领域,虽然页数不多却充斥着各种定理与证明过程,和前面的所有书目都不是一个路数。如果想要深入理解机器学习的理论进展,这本书绝对不容错过。
最后一本是理论大师瓦普尼克毕生绝学的简化版。他的《统计学习理论》Statistical Learning Theory书如其名对通过样本推断总体规律的数学问题做了详尽的论证是统计学习思想的集大成者读起来自然艰深晦涩。《统计学习理论的本质》是《统计学习理论》的简化版在大幅度削减篇幅和数学细节的同时保留了核心结论。这本书的作用是“欲穷千里目更上一层楼”读通之后你将建立起看待机器学习高屋建瓴的视角。
常言道“授人以鱼不如授人以渔”,我希望今天的这篇总结中的思路能成为那个三点水的“渔”,帮你厘清每个孤立模型背后的联系和逻辑。
在这段时间的学习过程中,你遇到了哪些问题?又有哪些想法呢?欢迎你留言和我讨论。