写在前面
本文是在自己的理解上总结了Coursera网站上吴恩达机器学习的课程内容,目录章节与课程有所出入。
线性回归
首先提出一个问题,如何用线性函数去预测房价。
解决这个问题的思路是可以采用简单的一维函数$ y=kx+b $去拟合训练数据,通过一个学习算法去学习最优的参数,使得通过这个函数所得到的结果与预想的结果相差无几,之后使用这个函数去预测新的值,即
那么如何去得到最优的参数呢?可以使用一个代价函数去评价当前参数是否是最优的,即
式中:$m$是训练数据的数量。
最终的目标就是使得这个代价函数越小,这时得到的参数就是最优的。
为了学习到更好的参数,从而使得代价函数最小,这里可以使用梯度下降法使得每次迭代后通过改变参数取值,使得代价函数下降,即
梯度优化的过程:
- 从设定的初始值开始
- 不断的改变每个参数,使得代价函数的值有所降低
- 直到得到最低的代价函数值,从而得到最优的参数
在迭代优化的过程中,需要计算完所有参数的优化值之后,再更新参数。否则如果每次计算完一个参数的梯度值就将更新参数的话,那么下一次计算代价函数的时候所得的值会跟之前不一样,导致不同步的参数更新。如下图
当梯度是正值时,说明函数曲线相对于最优点在上升,所以参数需要减去其值,向最优点靠近。
当梯度是负值时,说明函数曲线相对于最优点在下降,所以参数需要增加其值,向最优点靠近。
从图中可以看出,当学习率$ \alpha $特别小时,优化速度非常慢;当学习率$\alpha$特别大时,优化速度很快,但可能越过最优点,导致不收敛。
当每个特征值的范围相差过大时,可能会导致优化过程抖动不平缓,使得优化过程过慢。这时需要将每个特征归一化到同一尺度范围下,也就是特征缩放,将每个特征缩放到-1和1之间。即
式中:$ S_i $可以为标准差,也可以为$\max(x_i)-\min(x_i)$。
如何选取学习率
在梯度优化的过程中,可以随着迭代次数的增加,适当降低学习率。因为当损失快要达到最优点时,需要减少步长来达到此最优点。
如果每次迭代之后,损失值的降低程度小于$10^{-3}$,那么可以认为当前函数已经收敛,可以停止训练。
一个有效的学习率可以使得代价函数每次迭代后,损失都可以下降一些。
但如果学习率特别小的话,梯度下降的速度会变得非常慢。
这时就需要另一种代价函数,因为结果值无非是0和1,所以针对这两种情况可以建立一个代价函数。
当预测结果和真实结果一致时,我们希望损失为零;当不一致时,我们希望损失变得很大。
因为$y$仅可能为1或者0,所以可以将上式变为:
使用梯度下降法去降低损失函数,从而优化参数。
通过上述优化方法可能会产生两个不好的结果,一个是过拟合,造成低偏差、高方差的现象,一个是欠拟合,造成高偏差、低方差的现象。
解决过拟合有以下几种方法:
- 降低特征的数量(可以手动或者通过算法选择一些特征,抛弃一些特征)
- 正则化(保留所有特征,但降低每个特征对结果的影响程度)
正则化就是在损失函数的最后加入一些惩罚项,比如加入$100\times\theta_3$,这时如果$\theta_3$变的大就会严重增大损失函数的值,通过优化手段就可以让函数自己去减少此参数的值,从而降低此参数的影响力,完成优化的效果。
这里正则项是不包含$\theta_0$参数的,可以把它理解成一个偏置。
如果$\lambda$过大,会造成抑制参数的效果变得很强,产生欠拟合的效应。
如果$\lambda$过小,会造成抑制参数的效果变得很弱,产生过拟合的效应。
那么,之后的梯度下降过程就变成了:
由于$ 1-\alpha\frac{\lambda}{m}<1 $,所以梯度下降的过程中参数会一直减小。
神经网络
上图是一个简单神经网络的实例,图中有输入单元、隐藏单元和输出单元,而网络的输出即为:
如果网络中的第$j$层有$s_j$个单元,第$j+1$层有$s_{j+1}$个单元,那么第$j$层的参数$\theta_j$就会有$s_{j+1}\times(s_j+1)$个单元。
神经网络可以完成一种非线性的计算——异或:
神经网络可以完成多类别的表达:
上式中第一个矢量代表第一类,第二个矢量代表第二类,以此类推,最后一个矢量代表最后一类,类别的个数和矢量中元素的个数一致。
神经网络的代价函数如下:
式中:$ (h_\theta(x))_i $表示第$i$层的输出,$m$表示特征的个数,$L$表示神经网络的层数,输出代表第1层,$s_l$表示第$l$层不包含偏置之后的单元数。
那么,接下来输出结果的大概计算过程如下:
假设$\delta_j^{(l)}$表示第$l$层第$j$个单元的损失,那么首先最后一层中某个单元的损失为
因为输出结果与最后一层之间没有激活函数,那么接下来每一层的传播如下
具体过程如下
在梯度优化的过程中可能由于编程错误而导致一些不好的结果,可能导致最终函数无法收敛。如果在训练的过程中能够检查梯度下降是否正确,可以在训练的时候避免这些错误。
所以在求解多个参数最优解的过程中,可以分别对每个参数进行梯度检查工作,检查某个参数的梯度下降过程是否正确,确保反向传播的结果和梯度检查的结果一致。不过此项工作仅在训练过程中使用,测试过程需要去掉这一部分。
参数初始化
如果将参数初始化为零向量,则会导致$ a_1^{(2)}=a_2^{(2)} $,那么$ \delta_1^{(2)}=\delta_2^{(2)} $,所以会造成没有更新参数的结果,传回的梯度会零。
所以参数初始化有一个原则,就是切忌将参数初始化成对称的结构。
小结
训练神经网络的主要过程如下:
- 随机初始化参数权重
- 计算前向传播并得到结果
- 将结果带入代价函数计算其损失值
- 通过对损失值求导来反向传播参数的损失
- 使用梯度检查方法检查反向传播的结果和梯度估计的结果是否一致
- 利用梯度下降和优化方法对反向传播进行操作,从而通过调整参数来最小化代价函数
应用机器学习过程中的一些建议
当你应用正则化线性回归到实际任务中时,如果在预测时产生了很大的错误,可以尝试以下措施:
- 增加训练数据——处理高方差问题
- 降低特征冗余——处理高方差问题
- 增加额外的特征——处理高偏差问题
- 加入一下多项式特征——处理高偏差问题
- 增加正则化系数的值——处理高方差问题
- 减小正则化系数的值——处理高偏差问题
数据集设置建议
将数据集分为三个部分:训练集、评估集、测试集,并通过交叉验证去得到最好的参数。
上图是训练集大小和模型好坏的比较趋势,随着训练集的增加,模型的偏差会慢慢增加,而方差会慢慢减小,最终两个误差会趋于平和,达到较好的效果。
神经网络复杂度问题
当训练一个小型神经网络的时候,参数会比较少,计算效率比较高,但可能会有欠拟合的问题。
当训练一个大型神经网络的时候,参数会比较多,计算效率比较低,而且会有过拟合的问题,可以采用正则化去降低过拟合的影响。
误差分析
评估一个模型的好坏时可以采用准确率和召回率指标。
准确率表示所有模型预测结果为1时,预测正确的比例,即
召回率表示所有实际结果为1时,预测正确的比例,即
如何去综合上述两个评估指标?
如何设计一个具有高准确率的学习系统?
It’s not who has the best algorithm that wins. It’s who has the most data.
支持向量机
逻辑回归代价函数的形式为:$ A+\lambda B $,我们更加关注第二项$B$
SVM代价函数的形式为:$C\cdot A+B$,我们更加关注第一项$A$,即
支持向量机为了解决上述一个边界区间的问题,将代价函数进行了修改。从上图可以看出,当$z$小于等于1时,$cost$函数严格大于0。所以SVM与逻辑回归最大的区别就在于
当$C$很大时,希望$A$这部分函数值趋于0,也就是可以让$cost$函数这部分趋于0,从而控制参数$\theta$的选取。下图可以看出$C$的选取对于边界的影响。
最大边界理论
SVM的决策边界为$\min\limits_\theta\frac{1}{2}\sum^n_{j=1}\theta^2_j=\frac{1}{2}||\theta||^2$,约束条件为$ \begin{cases}\theta^Tx\ge0\ \ \ \ if\ y=1\\ \theta^Tx\le-1\ if\ y=0\end{cases} $
式中:$p^{(i)}$是$x$在$\theta$上的投影。
若想$||\theta||$的值越小,就应该使得$p^{(i)}$的值越大,当向量$\theta$的长度等于$p$时,也就得到了最大间隔,即最大边界。
以上仅可以解决线性可分的情况,当遇到线性不可分的情况,就需要加入核函数。
核函数
举个例子讲解一下什么是核函数:
例如当进行kNN分类时,输入一个数据x,必须计算它与每个聚类中心数据点的相似度来决定它被分到哪一类别中,而这个计算相似度的函数就是核函数。
其中聚类中心也称landmarks。
当加入核函数$f(x)$之后,预测值为正样本的情况为$\theta^Tf\ge0(\theta_0f_0+\theta_1f_1+\theta_2f_2+…+\theta_mf_m)$,SVM的代价函数可以写为
式中:$C=\frac{1}{\lambda}$,越大导致高偏差,越小导致高方差。
SVM与逻辑回归的区别
- 当特征数远远大于训练样本数时,选择逻辑回归或者不加核函数的SVM方法
- 当特征数远远小于训练样本数时,需要增加一些特征,并选择逻辑回归或者不加核函数的SVM方法
- 当特征数非常少,训练样本数适当时,选择加核函数的SVM方法
非监督学习
非监督学习是一个聚类算法,事前并不需要知道数据的标签,只是根据数据的特征和分布进行类别聚类。
K-means
输入:聚类中心个数k和训练数据
步骤:
1 | 随机初始化聚类中心 |
此算法需要优化的目标函数为
式中:$c^{(i)}$为当前数据$x^{(i)}$当前所从属的聚类中心,$\mu_k$表示聚类中心,$\mu_{c^{(i)}}$表示当前数据$x^{(i)}$所属类别的聚类中心点。
在选取k值方面,可以选取多个k值,并分别计算代价函数的结果值,如上图。图中有一个肘点,即k=3的情况,可以认为是最优的选择。
PCA
上图是一些数据降维的实例,从2维到1维,从3维到2维。每次降维的过程都会寻找一个基本线或者基本面,大部分数据都从属于这个基本空间上。
在线学习
输入一对样本,更新一次参数,在线更新网络。
应用实例:OCR
Pipeline:
- 寻找图片上的文字
- 文字分割
- 文字分类
总结
监督学习
线性回归、逻辑回归、神经网络、SVM
非监督学习
K-means、PCA、异常检测
特殊应用
推荐系统、大规模机器学习
建立机器学习系统的建议
方差/偏差、正则化、评估算法、学习曲线、错误分析等
\varepsilon$时,即小于某个阈值时,该特征为异常值。>