吴恩达的《机器学习》总结

版权声明:本文为博主原创文章,转载私信或邮箱[email protected]备注用途,通过后方可转载,否则必究!!! https://blog.csdn.net/BlackButton_CC/article/details/81297357

课程是在Coursera上学习的,足足花了3个月才弄完。能看出来效率是不高,第一次完完整整学习一门网课,笔记几十页,Octave代码一大堆,一开始就没有好好地估算到,开篇吧。

一、有监督学习(Supervised learning)

什么是有监督学习,听过一个有意思的故事,一个人拿着写着28的纸询问电脑:这是什么数字?电脑:42。人:胡说,这明明是28,这到底是多少?电脑:28。由此,就完成了有监督学习的过程。

线性回归

  线性回归指的是定义“假设(hypothesis)”为多项式,例如 h θ ( x ) = θ 0 + θ 1 x h_θ(x)=θ_0+θ_1x 。紧接的是代价函数(cost function) J ( θ 0 , θ 1 ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(θ_0,θ_1)=\frac{1}{2m}\sum_{i=1}^m(h_θ(x^{(i)})-y^{(i)})^2 (注:这里的m指的是样本数量)。最后利用最简单的梯度下降(gradient descent)——批量(batch)梯度下降重复计算参数直到收敛 θ j : = θ j α J ( θ 0 , θ 1 ) θ j θ_j:=θ_j-α\frac{\partial J(θ_0,θ_1)}{\partial θ_j} (注:这里的α是学习速率参数,很大就会收敛很快)。

逻辑回归(Logistic regression)

  逻辑回归指的是定义的“假设”为逻辑函数(或称S型函数、Sigmod函数),该函数为 g ( z ) = 1 1 + e z g(z)=\frac{1}{1+e^{-z}} ,该函数具有的图像特性如下,对于大于0的x,则y的值大于0.5。
Sigmod函数图像
  所以假设函数 h θ ( x ) h_θ(x) 变为了 h θ ( x ) = g ( θ 0 + θ 1 x 1 + θ 2 x 2 ) h_θ(x)=g(θ_0+θ_1x_1+θ_2x_2) ,对应的意义是“对应于新输入的x,y=1的概率”,如输出 h θ ( x ) = 0.7 h_θ(x)=0.7 ,表示预测患者的肿瘤概率为70%。
  对于逻辑回归的代价函数全然不同,代价函数 J ( θ ) = 1 m ( y log ( h θ ( x ) ( 1 y ) log ( 1 h θ ( x ) ) ) J(θ)=-\frac{1}{m}(y\log(h_θ(x)-(1-y)\log(1-h_θ(x))) (注:这里省略了推导过程,该公式用极大似然法推导出)。接下来,就是利用批量梯度下降收敛参数 θ j : = θ j α J ( θ 0 , θ 1 ) θ j = α m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) x j ( i ) θ_j:=θ_j-α\frac{\partial J(θ_0,θ_1)}{\partial θ_j}=\frac{α}{m}\sum_{i=1}^m(h_θ(x^{(i)})-y^{(i)})x_j^{(i)} (注:之所以与线性回归不一样,是因为这里的 h θ ( x ) h_θ(x) 不一样了)。
  其实还有很多除批量梯度下降的参数收敛算法,初级的如随机梯度下降、mini-batch梯度下降,稍微高级的算法如共轭梯度法(conjugate gradient)、BFGS、L-BFGS,这些算法需要大量的时间去理解。
  总的来说,流程就是对于给定的x,利用 h θ ( x ) h_θ(x) 计算 J ( θ ) J(θ) ,接着利用梯度下降算法对参数θ进行收敛训练。

神经网络

  神经网络最初的背景就是为了找到一个通用的类似大脑的算法,把算法应用于各种各样的事物来模拟大脑。吴老师用了一个3层的神经网络来举例,3层分别为“输入层”、“隐藏层”和“输出层”,每一次神经网络的更新都是意味着”向前传播(forward propagation)“和”反向传播(back propagation)“的算法过程完成,“向前传播”是对输出的x完成预测,“反向传播”是根据预测的值对网络的神经元权重进行更新,具体的算法细节太过复杂,在此省略,在此写出吴老师推荐的神经网络训练的步骤:
1)随机初始化权重。2)实现向前传播,得出每个 x ( i ) x^{(i)} h θ ( x ( i ) ) h_θ(x^{(i)}) 。3)计算代价 J ( θ ) J(θ) .4)实现反向传播,计算偏导数 J ( θ ) θ j k ( l ) \frac{\partial J(θ)}{\partial θ_{jk}^{(l)}} 。4)利用梯度检测法,对比“反向传播”与“数值估计”的 J ( θ ) θ \frac{\partial J(θ)}{\partial θ} 。通过后关闭梯度检测。5)使用“梯度下降”或者更高级的算法,计算合适的θ。

支持向量机

  支持向量机(Support Vector Machine,SVM)又称为“大间隔分类器”,大间隔指的是SVM的决策边界最终会迭代到尽可能地用最大间距去分离样本,这让SVM有很好的鲁棒性。其次,SVM的优化目标或者代价函数也有些许不同,为 J ( θ ) = C i = 1 m ( y ( i ) c o s t 1 ( θ T x ( i ) ) + ( 1 y ( i ) ) c o s t 0 ( θ T x ( i ) ) ) J(θ)=C\sum_{i=1}^m(y^{(i)}cost_1(θ^Tx^{(i)})+(1-y^{(i)})cost_0(θ^Tx^{(i)})) ,其中, c o s t 1 ( θ T x ( i ) ) = log ( 1 1 + e z ) cost_1(θ^Tx^{(i)})=-\log(\frac{1}{1+e^{-z}}) c o s t 0 ( θ T x ( i ) ) = log ( 1 1 1 + e z ) cost_0(θ^Tx^{(i)})=-\log(1-\frac{1}{1+e^{-z}})
  在这一节中,吴老师也给我们介绍了如何利用核函数,特别是高斯核函数对 h θ ( x ) h_θ(x) 进行优化。

二、无监督学习(Unsupervised learning)

什么是无监督学习?简单点说就是上述的例子中没有“人”的角色,复杂点说就是每一项数据没有分类标签,所以无法完成利用数据进行训练以对数据进行分类(Classification)。例如,对FaceBook的用户群体进行分类,很难提前就对这些用户群体有一个详细的分类规则。

K-means算法

  K-means算法是一种聚类算法,可把数据集分为任意设定的K类(该处的“K”指的是人为设定的簇数量),该算法十分简单:

随机初始化K个簇中心u1,u2,...,uk
多次重复{
	#簇分配步骤
	for i = 1 to m
		c^(i):=每个样本与簇中心的距离,并取最近的中心记录下来。
	#移动聚类中心
	for K = 1 to K
		uk:=该簇中心所分配的点的距离均值。
	}

注:(1)例如, c ( 1 ) = 2 c^{(1)}=2 c ( 5 ) = 2 c^{(5)}=2 c ( 6 ) = 2 c^{(6)}=2 c ( 10 ) = 2 c^{(10)}=2 ,表明 u 2 u_2 中包含了数据集中的 x ( 1 ) x^{(1)} x ( 5 ) x^{(5)} x ( 6 ) x^{(6)} x ( 10 ) x^{(10)} ,则 u ( 2 ) = x ( 1 ) + x ( 5 ) + x ( 6 ) + x ( 10 ) 4 u^{(2)}=\frac{x^{(1)}+x^{(5)}+x^{(6)}+x^{(10)}}{4}
(2)当没有点分配到簇中心 u i u_i 怎么办?没有分点的簇中心, u i = 0 u_i=0 ,最好的办法就是除去该簇中心,但会导致分类少一类。如一定需要K个分了,则可尝试重写初始化簇中心。

PCA主成分分析

  主成分分析(Principal component analysis,PCA)算法主要用于数据的降维和数据的可视化。数据的降维通俗点讲就是减少数据集的特征数量,但是又不减少训练的精度,如果把数据能够降维到3维或者2维,那么就可以通过画图的方式把数据集可视化。
  但是需要特别注意的是,并不是能随意对数据集进行降维,PCA有一个评估的办法叫做“保留差异性”,一般来说,利用PCA算法,应该尽量保留99%以上的差异性,否则可视为PCA改变了数据集。“保留差异性”计算及推导过程略显繁杂,在此省略。另外需要注意的是,PCA不可用于防止数据过拟合,防止数据过拟合可用“正则化”,“正则化”是考虑了 y ( i ) y^{(i)} 的值的,而PCA是直接丢掉数据进行降维。

异常检测(Anomaly detection)

  异常检测往往用于鉴定无标签数据集的异常,比如异常的飞机引擎、恶意网站客户、数据中心的机器监控,而且最明显的特征是异常数据极少,比如飞机引擎一般每一万台只有几台有异常,这也造成了数据集的倾斜(skewed)。
  异常检测简单定义为给定无标签数据集 { x ( 1 ) , x ( 2 ) , . . . , x ( m ) } \{x^{(1)},x^{(2)},...,x^{(m)}\} ,建立模型 p ( x ) p(x) 对新数据 x t e s t x_{test} 判断其是否异常,且 p ( x t e s t ) < ε p(x_{test})<ε 判定为异常, p ( x t e s t ) ε p(x_{test})≥ε 判定为正常。模型的建立过程大体为利用正态分布模型和现成样本对未知参数进行估计并建立初始模型,下面简单地介绍同样使用了标签y,有监督学习和异常检测的区别。

异常检测 有监督学习
1.很少的阳性样本(y=1)(一般为0-20个)。 1.大量的阳性、阴性样本。
2.大量的阴性样本。 2.拥有足够的阳性样本能够让算法明白阳性样本的特点。
3.许多不同的“种类的异常。根据现有的阳性样本,任何算法很难去学习出异常像什么样子 3.未来的阳性样本跟训练集中的样本相似。
4.未来的异常可能不像任何地我们迄今为止见过的异常。 4.应用:垃圾邮件分类、天气预测、癌症预测。
5.应用:欺骗检测、产品检测、数据中心机器监控。

三、具体应用

这一节吴老师列举了一些简单的机器学习应用,让我们对机器学习的用途有一个基本的认识。

推荐系统

  推荐系统的研究往往在学术界没有商界这么火热,因为在商界中,一个推荐系统的好坏直接跟公司的收入有关,所以很多公司投入了大量人力物力去研发。这一节中,吴老师例举了一个简单的预测电影评分的例子,5个人,5部电影(3部浪漫片,2部动作片),利用有些人已做出的评价对未评价的电影进行评分预测,这里涉及到建模且其中涉及太多变量,所以在此省略。
  其次,吴老师阐述了“协同过滤(collaborative filtering)”算法思想,在上面的例子中,我们使用了各个电影的特征和已有的客户评分进行评分预测,然而电影的特征往往很难获取。本来我们需要得到的是用户的评价参数矩阵,所以在协同过滤中,我们利用随机初始化的用户参数矩阵来预测电影评价,再利用电影评价更新参数矩阵,通过类似”参照矩阵“——>”电影评价“——>”参数矩阵”——>“电影评价”——>…的过程来进行协同训练。

大规模机器学习

  大规模机器学习这一节吴老师没有很详细地讲解什么具体的算法,但是主要是给我们为以后面对大规模的数据集进行了概念性的铺垫。首先给我们讲了收敛参数θ并不是只有批量梯度下降这一种效率较低的算法,随机梯度下降、mini-batch梯度下降都能很好地提高参数收敛的速率。另外,给我们举例讲解了MapRuduce的基本原理及优越性。

图片OCR

  OCR,Optical Character Recognition指的是光学字符识别,图片OCR系统能够自动识别图片中的文字,具体的流程如下:
图片OCR的流水线

四、建立机器学习系统的建议

我个人认为这一节是吴老师课程的精髓所在,听过一句话“所有的机器学习问题到了后期都是优化问题”,如何决定优化策略以优化机器学习系统参数、架构,这是关键中的关键。

偏差(bias)与方差(variance)的识别

  “高偏差”指的是“欠拟合”,而“高方差”指的是“过拟合”,两者均指的是无法很好的泛化(generalize)新样本。假如算法没有想象中的的好( J C V ( θ ) J_{CV}(θ) 或者 J t e s t ( θ ) J_{test}(θ) 很高),该如何确定是偏差还是方差问题?
  在这里, J t r a i n ( θ ) J_{train}(θ) 指的是训练集的误差,而 J C V ( θ ) J_{CV}(θ) 指的是交叉验证集的误差, J t e s t ( θ ) J_{test}(θ) 为测试集误差。在高偏差(欠拟合)状态下, J t r a i n ( θ ) J_{train}(θ) 会很高,同时 J C V ( θ ) J t e s t ( θ ) J_{CV}(θ)≈J_{test}(θ) 。在高方差(过拟合)状态下, J t r a i n ( θ ) J_{train}(θ) 会很低,而且 J C V ( θ ) J t e s t ( θ ) J_{CV}(θ)>>J_{test}(θ)

正则化(Regularization)

  正则化指的是在代价函数中加入有关θ的惩罚项,使θ变小。这样的话,会是抑制某些特征的作用,纠正过拟合。举个例子吧,在线性回归中,原本的代价函数是 J ( θ 0 , θ 1 ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(θ_0,θ_1)=\frac{1}{2m}\sum_{i=1}^m(h_θ(x^{(i)})-y^{(i)})^2 ,加入正则项后,变为了 J ( θ ) = 1 2 m i = 1 m ( h θ ( x ( i ) ) y ( i ) ) 2 J(θ)=\frac{1}{2m}\sum_{i=1}^m(h_θ(x^{(i)})-y^{(i)})^2 + λ j = 1 n θ j 2 λ\sum_{j=1}^nθ_j^2 ,其中n为特征数目,λ为正则化参数,且这里的j一定要从1开始,代表了不对 θ 0 θ_0 这个 x = 1 x=1 常数项进行正则化。

决定下一步做什么

  当一个机器学习系统建立后,我们接下来该如何进行优化,有哪些可以简单而有效地提高算法精度?首先,我们需要检测出算法是处于高偏差还是高方差状态。接着,可以按照以下的方法进行优化:

高偏差 高方差
1.尝试更多的特征。 1.尝试更少的特征(人工或者PCA之类的算法)
2.尝试增加 h θ ( x ) h_θ(x) 的特征多项式。 2.获得更多样本来训练。(请结合学习曲线来确定)
3.尝试减少正则项的λ 3.尝试正则化或者增加正则项的λ(注意均值归一化(mean normalization)和特征缩放(feature scaling))

学习算法的评估

  首先介绍的是4个数据分类的概念,在 y = 1 y=1 代表了预测患者有癌症的情况下,①真阳性(true positive)指的是患者有癌症,算法也确实预测出了癌症、②真阴性(true negative)、③假阳性(false positive)指的是患者没有癌症,算法却预测除了癌症、④假阴性(false negative)。
  接下来就是评估算法的2大标准,查准率(precision)表示了对于所有有癌症的患者,算法预测出了多少, P = = + P=\frac{真阳性}{算法预测为阳性}=\frac{①}{①+③} ,可以想象,在判断一个人是否有癌症的算法中,大多数人都是没有癌症的,毕竟得癌症的几率非常低,所以算法的精度十分之高,在按照判定方面参考意义不大。所以,召回率(recall)指的是对于确实有癌症的病人,有多少是算法正确预测出的, R = = + R=\frac{真阳性}{患者确实有癌症}=\frac{①}{①+④}
  综合上述2大标准,我们可以计算出 F 1 F_1 值(F score)来综合评估一个算法的好坏, F 1 = 2 P R P + R F_1=2\frac{PR}{P+R} ,当然, F 1 F_1 值越高越好。

学习曲线

  学习曲线十分容易理解,以不同的样本数目 m m 为自变量,分为训练集和交叉验证集(cross validation)以绘制出误差的图像。再次指出, J t r a i n ( θ ) J_{train}(θ) 指的是训练集的误差,而 J C V ( θ ) J_{CV}(θ) 指的是交叉验证集的误差
  下图为正常的学习曲线,可以看出 J t r a i n ( θ ) J_{train}(θ) J C V ( θ ) J_{CV}(θ) 离得似乎不远也不近。
学习曲线-正常
  下图为高偏差的学习曲线,可以看出 J t r a i n ( θ ) J_{train}(θ) J C V ( θ ) J_{CV}(θ) 几乎相接,这表明训练集和交叉验证集的误差几乎相同。
学习曲线-高偏差
  下图为高方差的学习曲线,可以看出 J t r a i n ( θ ) J_{train}(θ) J C V ( θ ) J_{CV}(θ) 相离很远,而且在更多的样本帮助下,可以相互靠拢,这表明可以采用更多的训练样本来缓解过拟合。
学习曲线-高方差

误差分析

  误差分析在吴老师这节课中指的是,在建立一个机器学习系统过程中,我们利用CV集对算法进行调参、优化,然而总有些样本会是算法出错,这时,我们应该找出这类样本,并统一地分析它们,看能够有什么新的特征能够帮助算法正确运行。

上限分析(Ceiling analysis)

  上限分析指的是在一个机器学习系统流水线(pipeline)中,例如图片OCR的流水线如下,针对流水线的每个模块进行分析,找出这个系统中的短板进行优化。

猜你喜欢

转载自blog.csdn.net/BlackButton_CC/article/details/81297357