吴恩达机器学习2011版本学习笔记

这是看完视频后,按自己的理解做了笔记。监督学习学的比较认真,33之后的无监督学习心态已经浮躁了,以后要再学一遍2022最新版视频课。
1,有正确答案是有监督学习,反之是无监督学习
2,模型就是把训练数据拟合为一个公式(严格来说是个函数,关系)。入门的拟合的方法是最小二乘法,先假设一个公式,代入不同系数,然后再把训练数据的x 依次代入求y,然后看y与训练数据的正确答案的方差。这样假设的系数作z,与结果方差y,组成了新函数,称为代价函数,只要找到代价函数y的最小值,就找到了拟合误差最小的系数,就找到模型了。
3,怎么找代价函数最小值,一个特征时是曲线,两个特征是曲面,怎么找他们的最小值呢?一点点试!关键是由于不知道初始点位置在哪,所以试的步长不好定。有个算法叫梯度下降,他让试的步长越来越小,核心还是最小二乘法,最小二乘法用偏导求的写法(高数下课本里有),但有个阿尔法参数(学习率)控制步长,如果步长太大,会导致代价函数取值左右横跳越跳越高,呈现出递增曲线,所以如果出现递增或波浪曲线,说明学习率太大了,改小,但太小会导致找最小值的过程太慢,所以最好画图判断,学习率可以三倍三倍的试,比如1,0.3,0.1,0.03,0.01这样
另外,代价函数的最小值不一定存在,极限也行,例如无限函数收敛于x轴过程中随便挑个小的也行。
4,知道用梯度下降算法求代价函数最小值了,现在有个问题,之前都是一个,两个特征,对应二,三维坐标系,那多个特征咋办?
这里引入了向量,矩阵。几维对应向量或矩阵有几行,几列对应有多少条数据(可以转置,列看成维数也无所谓),要拟合的函数的系数西塔,也搞成向量,这样矩阵相乘,或矩阵与向量相乘,结果就放到了新的矩阵和向量里。
5,多个特征解决了,特征的数据大小差距太大咋办?用特征缩放改改,方便计算。
6,除了梯度下降法,还可以用正规方程法,X*西塔向量=y
X是训练数据矩阵,列是维数,西塔是系数组成的向量,y是训练数据的实际结果,经过矩阵运算后,算出的西塔就是拟合最准的一组参数,也就是能使代价函数最小的参数,与梯度下降法相比,正规方程省去了引入代价函数的过程。
正规方程法求西塔时,会求逆矩阵,如果矩阵不可逆,要么删除特征中线性相关的几个特征,要么删除多余的特征,或者删些不重要的特征。不过编程语言的工具包里也有通过数学方法使不可逆矩阵可以求逆的函数,具体就不深入讲了。
7,无论梯度下降还是正规方程,用编程语言的向量运算函数库比自己写循环高效。
8,回到2,通过代价函数最小值找到了模型需要的系数西塔,如何假设模型(模型就是个多项式)?(呼应26)只用线性回归么?可线性回归的方式只适用于部分场景,假设的函数最高项是几次是试出来的,比如特征值只有一两个时,训练数据的图像像什么函数,就假设什么函数,
但对于分类,要用逻辑回归方式(在讲如何假设模型时,插入讲解了逻辑回归),先假设个跟训练集图像相近的函数作为公式(把这个函数代入梯度下降算法的式子,就得到了逻辑回归的梯度下降算法),然后自己定这个函数的值域对应逻辑0,1,然后看定义域的范围边界,若定义域代入西塔后,这个边界正好能划分训练集,他就是决策边界,决策边界是由代入的系数西塔决定的,有西塔,才有决策边界。
9,如果代价函数是凸函数(小波浪不断),那就需要再引入新函数去优化代价函数。同时遇到预测错误,要惩罚。
10,目前分别对线性回归,逻辑回归,用了梯度下降算法,现在讲更优化的算法。至于更多假设模型的方法,以后再说。
更优化的算法就是运用编程语言库里写好的函数。
11,逻辑回归把多类别转换成了两类
12,公式里高阶项越多,曲线越弯曲,过度拟合就是特别弯曲,训练集得到的代价函数为0了,但公式却无法拟合新的样本。过度拟合产生的原因可能是样本少特征多,通过正则减小系数的值,使每个系数只影响一点点,来解决过度拟合问题
13,正则减小系数的方法,就是惩罚系数,具体实现就是在代价函数里,加一个正则化参数
我认为这个参数的加入,使求代价函数最小值,系数在原来基础上变得更小了,而且这个参数越大,相应的与这个参数相乘的系数之和就得越小,所以达到了惩罚系数的效果。
若正则化参数太大,会导致只剩西塔0,这样就欠拟合了
14,把解决过度拟合的正则化参数,加到之前线性回归的求代价函数最小值的梯度下降正规方程里。
另外,除了6里解决矩阵不可逆的方法,正则化参数自带的矩阵与正规方程里的矩阵相加,一定是可逆矩阵
15,正则化参数加到逻辑回归的梯度下降算法里。在其他高级算法(编程语言库里封装好的)里加入正则化参数,需要自己定义一个代价函数
16,线性的,就两个特征值,用线性回归和逻辑回归合适,但如果特征值特别多,同时所有特征值彼此组合,这么大的数量,用线性回归计算量就太大了。所以这种多特征值的非线性的情况,用神经网络
17,神经网络是,一层输入,多个中间层,一层输出。两层之间有多个系数向量,多个系数向量组成矩阵,这个矩阵的行是右边层的元素个数,矩阵的列是左边层的元素个数加1,加1是因为每次计算右边新一层的值时,要在左边输入层加一个系数x0。
18,神经网络如果只看最后一层输入,一个输出,他跟逻辑回归的公式是一样的,在神经网络里叫正向传播
19,神经网络越高层,计算的越复杂
20,神经网络除了能有一个输出,还能有多个输出,这就是多类别分类。三种及以上,才用多类别。
神经网络的代价函数,也是用的逻辑回归的函数写法,但函数里的输出变量由一个改成了多个。
21,求神经网络的代价函数最小值,可以用梯度下降或其他高级算法来做,但前提是先用反向传播算法求偏导项,它的目的就是找梯度下降的方向。
这个算法的名字由来是:因为要得到神经网络公式的结果与训练样本实际答案的误差德尔塔(多类别分类有多个结果,所以这个也是个向量),就要从结果倒着计算上一层的德尔塔,以此类推,直到第二层(第一层是训练集的输入x,它不算德尔塔,因为输入层没有引入误差项a0)。
名字由来知道了,反向传播具体怎么做?他会循环整个训练集,用正向传播(就是18里逻辑回归公式)算出每层的激活值a,然后用最后一层的a和训练集结果y计算最后一层的误差德尔塔,倒着算直到第二层,并把每一层的误差德尔塔和偏导项累加(偏导项就是梯度下降算法里那个代价函数j关于每个系数西塔的偏导数,在反向传播算法里通过化简就是激活值a与每层误差德尔塔乘积的形式)。
最后跳出循环,我们就通过反向传播算法,得到了这个代价函数j关于每个系数西塔的偏导数。
有了这个偏导数,代价函数最小值就好求了,求出最小值,那系数西塔就都定了,西塔定了,模型公式也就定了。
22,函数库能把矩阵变成长长的向量。
23,反向传播算法如果实现的有问题,会导致求出偏导并回到梯度下降算法后,算出的答案误差很大,为了避免误差,要进行梯度检测,检测方式就是通过两侧差分求出偏导,和反向传播算法求出的偏导对比,看是否约等(只有几位小数的差距)。
注意,梯度检验用一次验证验证就行了,训练模型时要把它关了,因为它计算量太大,而反向传播算法是高性能计算方法。
24,系数西塔要初始化为随机的接近0的值。
25,神经网络实现步骤总结
随机初始化西塔,通过正向传播算法求出y,实现代价函数,通过反向传播算法求出偏导项,用梯度检验验证求出的偏导项,然后就可以用梯度下降或其他高级算法求代价函数最小值了。
虽然这些算法求出的不一定是全局最小值,但也会是很不错的局部最小值。
 
26,怎样评估机器学习算法的性能(或表现,performance),如果模型误差很大,如何使用机器学习诊断法来决定优化方向。
  评估的方法:把训练集的前70%拿来训练出西塔,再用后30%代入测试函数(训练结果与实际结果的方差之和),看误差有多少。
诊断前,先讲下模型怎么选(呼应了2,8,10):不知道模型的公式选几次函数,就把一次到多次函数挨个试,试之前要先把训练集分成3部分,60%是训练集,20%是交叉验证集,20%是测试集。然后用训练集挨个试各次的函数,得到不同的西塔及公式,再用交叉验证集代入上面评估方法里的测试函数算误差,误差最小的就是要选择的函数公式。最后用测试集再代入测试函数算误差,来评估这个公式。之所以分成三个集,是因为如果用同样的集算出西塔,再用同样的集去验证,肯定验不出来。(总结成一句话,用训练集得到了多个系数和公式模型,用交叉验证集选出其中最好的一个,最后用测试集验证这个最好的误差有多少。如果只有两个集,那进行完第二步,就没法进行第三步的验证了)
  现在开始诊断:验证用了训练集和交叉验证集,随着多项式次数的增加,训练集得到的J(代价函数的值,本文的j与J与J-train一样都是代价函数的值),它的错误数越来越少,因为次数越高,对训练数据拟合的就越好,可是它对新数据拟合就会拟合的很差,因此用交叉验证集得到的j(它就在验证新数据)会随多项式次数增加,先是有很多错(欠拟合),然后错误减少,最后错误又增多(过拟合)。所以就直接对比训练集的j与交叉验证集的j,如果训练集的J-train高,交叉集J-cross约等于训练集的J,说明我的算法有高偏差问题(bias,就是欠拟合),如果训练集的J-train低,交叉集的J远高于训练集的J,说明有高方差问题(variance,就是过拟合)。
正则化对偏差方差的影响:(呼应13)正则化参数过大会造成高偏差,过小会造成高方差。在选择正则化参数时,从0,0.01,0.02,0.04,一直到10.24,依次代入训练集的j,得到对应的西塔,再把西塔依次代入交叉验证集的j,看哪个最小,就选对应的正则化参数。也就是说,随着正则化参数逐渐增大,是过拟合到欠拟合的过程,那交叉验证集在此过程中也会有一个最小值(跟上面诊断时一样)。最小值就是我们要找的。
在高偏差(特征少,西塔也少,多项式最高项次数低,欠拟合)且模型不变的情况下,随着训练集内样本数量增加,训练集的j错误数递增然后趋于稳定,交叉验证集的j错误数递减然后趋于稳定。高方差情况下,训练集j错误数一直增加(拟合太好,新数据越多拟合不符的也越多),交叉验证集j错误也很高,但随着样本数量增加,错误数会不会减少呢?这就需要自己画曲线观察了,这个曲线就叫学习曲线,可以帮助我们判断有没有必要增加样本数量。
  决定优化方向:
收集更多训练数据。对修正高方差有用,但还是要画学习曲线看一下。
用更少的特征。对高方差有用。
用更多的特征。对高偏差有用。
增加多项式特征,如x,x平方等。对高偏差有用。
减小正则化参数。对高偏差有用。
增大正则化参数。对高方差有用。
对于神经网络:层少参数不多的,容易欠拟合,反之容易过拟合。过拟合的大型神经网络用正则化参数修正比较合适。一般一个隐藏层比较合适,但可以用训练集,交叉验证集,测试集对比试试两个层,三个层,看哪个的交叉验证集j最小。
27,机器学习系统设计
面对新项目,首先一天之内写个简单的版本,然后用交叉验证画出学习曲线,并检验是否有高偏差高方差问题,再决定是否要用更多数据或特征,最后错误检验,通过测试效果(交叉验证集)调整模型。具体可以抽样100个样本,人工分类,再让模型去分类,看哪种类型做的不好,专注优化它。还可以通过简单的规则,比如,用这个规则错误率有多少,不用有多少,这能快速验证想法对算法的影响。
28,偏斜类:一个类(比如逻辑回归的结果有2类,A类和B类)的样本比另一个类多很多。这种情况看查准率(数量少的样本预测成功的数量除以这个数量与预测成功数量多的样本之和)和召回率(数量少的样本预测成功的数量除以这个数量与预测失败数量少的样本之和),如果都很高,说明模型没问题。
临界值的设定可以调整查准率(p)和召回率(r)。如何评估哪个算法的p,r合适?用f值,f值等于pr之积除以pr之和再乘2,f值高的就是合适的,最合适的情况是p等于1,r等于1,f值算出来是1。
29,从26开始的评估算法的方法终于讲完了,接下来讲机器学习的数据问题。不要盲目地以为获取大量数据有用,它在什么条件下有用?2个条件:
有很多特征,这能降低算法偏差(高偏差是欠拟合),导致训练集的代价函数j会很小。
训练集的规模大,这样训练集结果会接近测试集结果,这能降低方差(高方差是过拟合)。
总之就是,在特征多的前提下,再数据多。所以可以先判断:人根据这些特征,能不能预测到期望的结果,如果能,再给大量数据。
 
30,目前学了线性回归算法,逻辑回归算法,神经网络算法,现在学个新的,支持向量机(support vector machine),它也很适合复杂的非线性方程。它的代价函数写法,就是:带有正则化参数拉米达的逻辑回归的代价函数,去掉其中的拉米达,换成常数C,(忘了什么看前面 8、15、13、14)。SVM不像逻辑回归一样输出概率,而是我们通过优化SVM的代价函数得到的系数西塔,然后SVM直接输出结果的预测。
31,svm也被称为大间距分类器(large margin classifier),这是在C非常大的前提下,C类似于正则化参数(拉米达的倒数)。图像上看就svm能得到一条划分逻辑样本(就是只有两个结果,要么A要么B)的直线,这条直线距离各自的样本有很大的距离(margin)。
通过核函数(kernel)改造svm算法实现非线性分类器——就是通过定义标记点和核函数,训练出非线性的决策边界前面8,比如当接近那个标记点时预测为结果A,远离那个标记点预测为B。具体做法就是把每个训练集的每个数据当作标记点,引入相似度函数(它是核函数的一部分)。
SVM重要的参数有两个,一个是C,它对应正则化参数拉米达的倒数,C越大,相当于正则化参数小,过拟合(呼应13、26),C小则欠拟合。另一个参数是高斯核函数(核函数的一种,还有线性核函数,这两个是最常用的核函数)的参数西格玛的平方,如果它偏大,那么对应的相似度函数会使高斯核函数的变化更平缓,最终导致模型高偏差低方差,如果它偏小,那相应核函数变化更剧烈,最终导致模型低偏差高方差。
调用函数包里的svm,有些需要自己给出相似函数或核函数,相似函数或核函数的入参就是训练样本的特征向量x1,x2,x3等等,标记点也作为特征向量传入。
32,如何决定用不用svm算法呢?
n代表特征的数量,m代表训练样本的数量。
如果n远大于m——特征多于样本,用逻辑回归,或线性核函数的svm。
如果n小,m大小适中(比如特征是1~1000,样本是10~1万),用高斯核函数的svm。
如果n小,m很大(比如特征是1~1000,样本大于5万),多找点特征,用逻辑回归,或线性核函数的svm,而高斯核函数的svm会很慢。
 
33,目前学到的都是监督学习算法(样本带标签,通过假设函数找到决策边界),接下来学个无监督学习算法(把样本自动分类)——聚类算法(clustering,就是把样本自动分成很多簇,簇集的簇)。
聚类算法之一:k均值算法(k means)。k代表簇的个数,随机初始化k个聚类中心,迭代计算每个样本与它最近的聚类中心的距离的方差,和的最小值就是代价函数j的最小值,这就是优化目标。
如何选k值?如何避免局部最优?多试k值,比如k从1到100循环,每次循环计算代价函数j,在100个结果里挑出j最小的,就是最优的k。一般情况k在2~10。
34,又一个无监督算法——降维。用途是数据压缩、可视化数据。
降维采用主流算法叫 主成分分析算法(principal components analysis 简称PCA),它的核心理念——把原始样本数据舍弃掉一部分,用剩余部分去近似表示原数据。具体做法就是找到一个方向(方向用向量表示,直线可以在这个向量上延申,在图上就个直线,这是2维降成1维的做法),使样本投影在这个直线上时,投影误差最小。我们也会找多个方向,比如3维降到2维要找2个方向(向量),这2个向量组成一个平面,3维中所有的点投影在这个平面上。所以一般假设找k个向量,把n维降到k维
pca算法的实现步骤:先初始化数据——均值标准化——算出所有样本均值,用每个样本与均值的差,成为新样本。然后计算协方差矩阵得到的n*n方阵用西格玛表示,再对西格玛使用奇异值分解函数svd得到三个矩阵u,s,v,然后得到要降维矩阵u的前k列,最终得到从x转为它的降维表示z上。
pca算法的用途除了数据压缩可视化数据,还能对监督学习算法加速:把原始的样本数据通过pca降维表示,比如有1万个样本数据,降维表示成1000个。然后把降维后的数据放入监督学习算法。
怎么选出合适的k(要降到k维)?计算出方差保留的百分比(计算过程通过三个矩阵中的s矩阵得到),满足它>99%的k都合适。方差越高说明用pca近似的越好(他的理念就是舍弃部分数据用剩余的去近似表示原始数据)。
不正确的用法:用pca去方式过拟合。(想防止过拟合用正则化)。
最好用原始数据,尽量别用pca,除非运算太慢,内存或磁盘空间不足(需要压缩数据),或者原始数据得不到想要的结果而你有证据证明用pca一定能得到想要的效果。
35,异常检测——主要应用于非监督学习问题。做法就是用数据集建立概率模型(比如选择高斯分布,也就是正态分布的计算公式),训练模型(训练集的数据如果符合高斯分布,会算的更好,如果不符合也能算,但最好通过取对数等方式将训练集数据专为高斯分布的,再代入异常检测算法),然后设置一个值艾普西隆,如果新的样本代入概率模型后求出的值小于艾普西隆,说明不是异常样本,大于则是异常。用图表示就相当于用艾普西隆把正常样本的范围圈了起来,新样本在圈外就是异常。最后用查准率和召回率评估模型,选艾普西隆的值是一个个试,看哪个能使f值(前面28)最大,就选哪个。
如果异常样本出现在正常样本的圈里,可以通过增加特征值的方式把他识别出来。(针对这个异常样本增加特征)
36,什么时候用异常检测算法,什么时候用监督学习算法?
当正样本很少,负样本很多时,用异常检测算法,此时只用负样本就是训练出很好的概率模型。
异常种类太多,总有没见过的出现,用异常检测算法。
当正样本和负样本数量都很多时,用监督学习算法。
37,如果高斯分布的输入有多个变量,那异常检测怎么做?多变量高斯模型有两个参数,mu(是n维向量)和sigma(是协方差矩阵,n*n的),概率模型公式也有变化。原始的概率模型(前面35)面对组合异常,只能新建个特征去关联组合异常的多个特征,而多变量高斯模型能自动捕捉多个特征的关联。
但原始的概率模型在训练集样本很少时也能工作,而多变量高斯模型要求样本数量必须多于特征数量。
 
38,基于内容的推荐算法:代价函数还是方差加正则化参数的形式。它是有所有电影的评分,根据不同电影的特征,学习出系数西塔(观众对不同特征电影的打分)
协同过滤算法:它能自动学习要使用的特征。观众给它系数西塔(就是观众对电影特征的喜爱程度,比如爱看动作片的观众给这电影打了几分),它就能分辨出电影是什么类型的。
39,处理海量数据计算有两个提高性能的方法:
随机梯度下降。
Mapreduce和并行计算
40,在线学习就是用不断用新的x,y更新系数西塔。
41,一个可靠的得到高性能机器学习系统的方法是:使用一个低偏差机器学习算法,用庞大的训练集去训练它。怎么获取大量数据呢?可以自己造。
 
 
posted @ 2023-08-18 17:01  zhaot1993  阅读(49)  评论(0编辑  收藏  举报