通俗易懂的讲解让人停不下来,与国内对于机器学习的讲解来说,少了一堆严格定义的特有名词充斥课堂,而是更多的不断用例子来说其核心概念。
还有神经网络、支持向量机、无监督学习等模块还没有写,有空了再写
机器学习的定义
最常见的两类机器学习算法
有监督学习:我们教会计算机做某件事情
无监督学习:我们让计算机自己学习
其他类型算法:强化学习、推荐系统
举例预测房价和推测乳腺癌良性与否的例子,来说明的有监督学习的定义
同时对于在处理数据时想用大量的特征怎么办?引出了支持向量机的概念,里面有一个巧妙的数学技巧,能让计算机处理无限多个特征。
没有提前告诉算法一些信息,只是给了算法一堆数据,我们并不知道数据里面有什么,也不知道里面有什么类型,但是算法会自动根据数据本身的结构进行聚类,从而得到从数据本身出发的分类类型
举例了鸡尾酒宴问题来介绍聚类算法的应用,从两个麦克风中中,分离出不同人声,就应用到了聚类算法,聚类算法根据数据的结构从而实现了分离
回归问题:预测连续值输出
分类问题:预测离散值输出(每个类别单独编号即为离散)
将监督学习算法的工作方式表示如下,这里形象的把训练过程表示成把训练数据“喂”给特定算法,从而得到一个假设hypothesis,这里的hypothesis就是如下的 h θ ( x ) = θ 0 + θ 1 x h_\theta \left( x \right)=\theta_{0} + \theta_{1}x hθ(x)=θ0+θ1x,也就是我们训练出来的模型
如何选择出合适的参数来表示模型呢?在线性回归回归问题中,模型预测出来的值与训练集中实际值之间的差距越小说明模型越准确,即这就是建模误差。
我们的目标就是时建模误差的平方和最小(对所有点的误差同时进行衡量,同时避免了负数的问题),这就是代价函数(求得参数使得平方五误差最小)
** J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J \left( \theta_0, \theta_1 \right) = \frac{1}{2m}\sum\limits_{i=1}^m \left( h_{\theta}(x^{(i)})-y^{(i)} \right)^{2} J(θ0,θ1)=2m1i=1∑m(hθ(x(i))−y(i))2 **
等高线图
举例下山的例子来说明梯度下降法。每走一小步路后,先看看从哪个方向下山最快,再接着走,这样每一走一步路看一下,直到收敛至局部最低点。但是这样容易陷入局部最优解。若是在这个例子中稍微移动一下原本的出发点位置 ,就可能得到的是另一个最低点了。
这个公式中最重要的两个部分就是学习率和导数部分
因为这里是梯度下降,也就说沿着与该点的梯度方向相反的方向移动,也就说某点正处于下降趋势,偏导部分就是负的,那么就会加快该点朝着最低点走去;若某点正处于上升趋势,偏导部分就是正数,那么就会使该点减缓上升趋势,朝着最低点走去
学习率是一个正的常数,它影响着参数的变化幅度大小。如果学习率太小,将会导致收敛速度太慢;如果学习率太大,将会导致无法收敛或者发散(跨度过大,可能导致一次又一次越过最低点,最后离最低点越来越远 )
上面只是单独把梯度下降拎出来讲了,现在把梯度下降和线性回归中的代价函数结合在一起看。
结合过程就是把代价函数对不同参数求偏导同步更新直至收敛为止。
梯度下降与线性回归的代价函数结合在一起之后
线性回归的代价函数一般是没有局部最优解的,它的代价函数图像一般是弓形函数(凸函数),这样的函数没有局部最优,只有一个全局最优。所以说当我们对线性回归使用递归下降时,得到的都是全局最优解,因为没有其他局部最优解
因为上述的梯度下降法其实应用到了整个训练集,在每一次下降的过程中,我们都会遍历整个训练集,所以也成为批量梯度下降法。当然还存在其他梯度下降法,只应用了训练集的子集来更新参数,后面还会继续学到相关内容。
多了输入数据的特征值,也就多了参数。当多了参数后,线性回归的模型也就变复杂了变长了,此时我们将模型的数学表达式用向量内积的方式来简化表达。
和之前单变量线性回归中的梯度下降操作是一样的,只是这里的问题模型变了,参数变多了,所以我们需要更新的参数也就变多了,但本质算法思想都是一样的。
在多元回归问题中当我们面对多维特征时,可以对这些多维特征进行特征缩放,让这些特征的取值范围都具有相近的尺度,这能够帮助梯度下降更快地收敛。
以房价问题为例,假设我们使用两个特征,房屋的尺寸和房间的数量,尺寸的值为 0-2000,而房间数量的值则是0-5,以两个参数分别为横纵坐标,绘制代价函数的等高线图能,看出图像会显得很扁很长,这将会导致梯度下降算法需要非常多次的迭代才能收敛。
而尝试将所有特征的尺度都缩放到0-1之间之后,在进行梯度下降就会发现收敛的非常快
一般来说,都是把特征缩放到 (-1,1)之间,当然大一点或者小一点都是可以接受的,并不需要要求所有特征的缩放范围都需要完全一致,只要它们都足够接近就行了,梯度下降都会正常地工作,
但是也不能太大或者过于小了,如下图所示。
上面的特征缩放是用变量取值范围中的最大值作为分母来除与每一个数,除此之外还有一种叫做均值归一化的特征缩放。
比如可以用 x i − μ i x_i - \mu_i xi−μi来替代 x i x_i xi,这样就可以特征的平均值为0了,然后把特征值最大值与最小值之间的差值作为分母除去,或者把分母换成特征值的标准差也可以,就能把特征值的取值范围缩放到 (-0.5,0.5)。
实际真实取值范围也可能会多一点或者少一点,上面只是一个大概范围,但这都不重要,只要我们把特征值的取值范围都缩放到一个相似的范围就可以了,并不需要太精确,这样做只是为了梯度下降更快一点而已。
我们并不能提前得知梯度下降收敛所需要的迭代次数,所以我们需要不断尝试,绘制出迭代次数和代价函数之间的变化关系的图表,来观测算法在何时收敛。其实也就是不断去迭代。然后找到一段变化趋于停止的曲线。
通过曲线找到收敛迭代次数,我们也可以发现梯度下降的性能如何,学习率的取值是否合适。从理论上来说,在线性回归问题上只要学习率足够小,代价函数的值一定是越来越小的。 如果我们发现随着迭代次数的增加,代价函数却并不会在每次迭代后下降,那就有可能是因为学习率过大了,此时我们就可以尝试降低学习率参数。
在实际使用梯度下降过程中,我们需要不断尝试学习率的值,直到找到一个可以曲线快速下降的学习率
线性回归并适用于所有情况,所以有时候我们需要使用曲线来适应我们的数据,也就是使用多项式模型来拟合数据。在多项式回归中,需要对同一变量进行次方运算,此时特征缩放就十分重要,因为做幂运算会导致不同特征之间的取值差距非常大,不做好特征缩放就会导致梯度下降收敛非常慢。
对于特征值的选择并不是固定的,我们可以根据对训练数据形状的观察以及对于一些常见函数图像的了解,来选择合适的特征,这有助于我们得到更好的模型。我们先观察数据然后再决定尝试使用什么样的模型。
对于现有的特征,我们也可以根据情况去改造设计它们,从而得到更简洁的模型。
h θ ( x ) = θ 0 + θ 1 × f r o n t a g e + θ 2 × d e p t h h_{\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}\times{frontage}+{\theta_{2}}\times{depth} hθ(x)=θ0+θ1×frontage+θ2×depth
x 1 = f r o n t a g e {x_{1}}=frontage x1=frontage(临街宽度), x 2 = d e p t h {x_{2}}=depth x2=depth(纵向深度),
我们在这里将这两个特征结合起来, x = f r o n t a g e ∗ d e p t h = a r e a x=frontage*depth=area x=frontage∗depth=area(面积),
那么模型就变成了: h θ ( x ) = θ 0 + θ 1 x {h_{\theta}}\left( x \right)={\theta_{0}}+{\theta_{1}}x hθ(x)=θ0+θ1x。
正规方程也一种用于求解使得代价函数最小化参数的算法,在求解线性回归的某些时候它会比梯度下降法更好用。它是一次性求解出来 θ \theta θ参数向量的,不像梯度下降需要靠迭代一个个求解参数,但是两者各有明显的优缺点,后面再接着细说。
从图中我们可以看到,正规方程求解参数的过程,就是利用训练数据设计特定矩阵,完成转置求逆矩阵乘法等操作,从而得到一个参数向量。
下图是更详细的过程。我们将每一个特征向量转置展平作为 X X X矩阵的每一行,然后 X X X矩阵中的每一行特征向量对应的实际结果 y y y作为 Y Y Y矩阵中的每一行,然后得到了这两个矩阵之后就可以根据正规方程的参数向量求解公式得到最终参数了。
梯度下降法缺点
正规方程优点:
梯度下降优点和正规方程缺点:
总结:只要特征变量的数量不是很多(小于一万),使用正规方程是比梯度下降更好的选择
正规方程中的需要对矩阵进行逆运算,那么要是 ( X T X ) \left( {X^{T}}X \right) (XTX)是不可逆矩阵怎么办?虽然说存在这种情况,但我们还是很少有可能会遇到这样的情况。
导致矩阵不可逆一般是有两个原因:
想解决这个问题,只要我们把多余的特征变量去掉就行了
可以考虑删去一些影响不大的特征变量,又或者使用正则化(使用很多的特征来配置很多的参数 )
这里同样也是求解一条曲线,也用到了回归算法,但是回归模型输出的结果要经过概阈值判定变成离散值,而且这里用到的回归模型与之前的直线或曲线模型不一样,为了能够把输出结果都缩放到(0,1)之间,这里使用了sigmoid函数(logistic函数)对曲线进行复合,最终形成的就是逻辑回归假设函数了。
得到参数模型 h θ ( x ) h_{\theta}(x) hθ(x)后,我们就可以通过对离散值判定的阈值,进行函数转化从而得到决策边界。决策边界位于不同离散值区域的夹缝上
在逻辑回归中,再继续用之前的平方误差代价函数显然不合适,因为这时候的假设函数已经变成sigmoid函数了,此时就很难找到参数的全局最优解,我们更希望代价函数的曲线是一个单弓形函数的图像。
这里引入了一个很巧妙的代价函数,十分贴切逻辑回归问题。根据对数函数性质和分段函数的处理
当预测值与实际值相等时,将会得到 0 的代价,而当预测值与实际值是完全相反的两个极端时,就会得到无限大的代价,这将会给算法训练过程中带来很大的惩罚。
如果预测值 h θ ( x ) = 0 h_{\theta}(x)=0 hθ(x)=0且 y = 0 y=0 y=0,那么根据函数我们可以得到为0 的代价,而当预测值接近1而实际值为0时,预测和实际两者处于两个取值极端时
实际上,我们可以通过一种更为简洁的方式来表达代价函数,就是将两种情况用同一个式子结合起来。当我们取其中一种情况时,另一种情况就会被乘上 0 。这样就可以很巧妙的把两种情况结合在一起了。
有了逻辑回归的代价函数后,我们同样可以可以通过梯度下降法来逐步迭代出参数最优解,这和线性回归中做的工作是一样的。
我们可以使用一些高级优化算法,来大大加快梯度下降的计算速度,这能使得梯度下降更适应于大型的机器学习问题中。
首先我们来分解梯度下降过程中,我们所需要计算的两个变量: J ( θ ) J\left( \theta \right) J(θ) 以及 下标索引 j _j j等于 0、1直到 n n n 时的代价函数偏导数项 ∂ ∂ θ j J ( θ ) \frac{\partial }{\partial {\theta_j}}J\left( \theta \right) ∂θj∂J(θ)。我们用求得的偏导数项不断去更新参数,直至优化出最终参数去计算模型代价 J ( θ ) J\left( \theta \right) J(θ)。只要我们把这两项都算出来,就可以让梯度下降反复执行更新操作,为我们最小化代价函数。
但是实际上运用这两个重要参数,进行代价函数优化的并不是只有梯度下降法一种算法,还有更高级、更复杂的其他算法,如 共轭梯度法 、BFGS (变尺度法) 和L-BFGS (限制变尺度法) 等更高级的优化算法。我们写好了实现了这两个参数的代码,然后交给这些高级算法,它们会按各自的算法逻辑实现更高效率的最小化代价函数求解。
之前是用逻辑回归来处理二元分类问题,那么当种类有多种我们该怎么处理呢?
很简单,继续用之前的二元分类思想来处理问题,我们先把想让分类器识别的一个类别归为一类,把剩下的所有类别都归为另一类,这样就又变成了二元分类问题,就又可以继续使用之前的逻辑回归方法了。然后以此类推,依次去这样去对每一个类别进行分类处理。
有几种类别,我们就训练几个分类器,每一个分类器都针对其中一种情况进行训练。
最终,当我们输入新的数据想要预测类别时,就将输入依次输入每一个分类器中,最后在所有分类器中,选择一个最大值,其所对应的类别就是最终结果。
第一个模型没有很好地拟合训练数据,后面的数据明显趋于平缓,而预测模型却依旧陡峭,这就是欠拟合,也称为高偏差;第三个模型使用了四阶多项式,特别切合训练数据,其代价函数几乎为0,但是它千方百计地拟合训练数据,导致它无法泛化到新的样本中,失去了预测新数据的能力,这就是过拟合,也成为高方差
当我们有过多的特征变量,而又有相对比较少的训练数据时,就会出现过拟合问题。这里有两个解决过拟合的办法。
我们可以通过在代价函数中对影响大的参数施加正则化项(惩罚),从而使得参数对于假设模型的影响变小,从而使得模型更加简单,当模型变简单了,假设模型就不会那么完全贴合原始数据了,这样我们就算解决了过拟合问题
以一个实际问题举例子:
修改后的代价模型: J ( θ ) = min θ 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + 1000 θ 3 2 + 10000 θ 4 2 ] J\left( \theta \right)=\underset{\theta }{\mathop{\min }}\,\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}+1000\theta _{3}^{2}+10000\theta _{4}^{2}]} J(θ)=θmin2m1[i=1∑m(hθ(x(i))−y(i))2+1000θ32+10000θ42]
但是在一般情况(特征变量过多,训练数据相对较少的情况)下,我们并不能该选择哪些参数去缩小它们的值,于是我们可以对每一个参数都进行缩小,谁都不放过。
修改后的代价函数为: J ( θ ) = 1 2 m [ ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ ∑ j = 1 n θ j 2 ] J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})}^{2}}+\lambda \sum\limits_{j=1}^{n}{\theta_{j}^{2}}]} J(θ)=2m1[i=1∑m(hθ(x(i))−y(i))2+λj=1∑nθj2]
在使用了正则化之后,我们依旧可以保留假设模型中的所有特征的高阶项,同时我们能够使原本曲折复杂的蓝色曲线,变为上图中的相对更平滑、更简单的粉色曲线
如果正则化参数过小,那么对参数大小的削弱也就很小;如果正则化参数过大,那么对于所有参数的惩罚效果就会太强,这样将导致除了 θ 0 \theta_0 θ0以外的参数几乎都接近于0,这样将导致最后的假设模型差不多就是一条 y = θ 0 y =\theta_0 y=θ0的直线,这样的假设模型就变成欠拟合,高偏差了,偏见性过于强。
当然,也有存在着一些算法可以自动帮我们选择合适的正则化参数,后面的课程还会继续涉及到这些。
把正则化结合到线性回归中,我们可以更好地理解正则化具体干了什么。
下面对线性回归中的梯度下降进行正则化,然后因为不对 θ 0 \theta_0 θ0进行正则化,于是我们就把表达式分成了两种情况。
θ j : = θ j ( 1 − a λ m ) − a 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) {\theta_j}:={\theta_j}(1-a\frac{\lambda }{m})-a\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}} θj:=θj(1−amλ)−am1i=1∑m(hθ(x(i))−y(i))xj(i)
很明显式子中的第二个部分和没有正则化之前的第二项是一样的,发生变化的只是参数前面的系数 ( 1 − a λ m ) (1-a\frac{\lambda }{m}) (1−amλ),我们可以认为这就是正则化所干的事。
我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示:
图中的矩阵尺寸为 ( n + 1 ) ∗ ( n + 1 ) (n+1)*(n+1) (n+1)∗(n+1)。
正则化的做法就是对参数进行惩罚,从而使模型更平滑、简单,所以正则化要做的就是在算法优化出全局最优参数解的过程中,施加一定的干扰,减小参数迭代出来的最终值。正则化项设置的思想就是这样的。