第四十六课:分类
要预测的变量y是一个离散情况下的分类问题
logistic回归算法:最广发使用的算法之一
如果之前的线性回归是一个预测问题,那么现在就是一个判断问题:是与不是
是或者不是/0或1/正类或负类是完全任意的,且没有什么区别
但往往负类表示没有某样东西
正类表示具有我们要寻找的东西
先讨论0/1问题(二分类问题),在讨论多分类问题
我们如何开发一个分类算法?
线性回归问题看似可以合理的通过阈值进行分类,但是尝试改变一下问题,如果延长横坐标轴,就会发现,额外的样本会将这个假设变得很糟糕。
所以把线性回归应用于分类问题,通常不是一个好主意。
因为线性回归问题得到的值有可能会大于1或者小于0,这不符合分类问题的结果预测。
第四十七课:假设陈述
当有一个分类问题的时候,我们要使用哪个方程来表示我们的假设?
假设形式(sigmoid函数/logistic函数):
解释:
在给定x的条件下y = 1的概率θ。
看到了假设函数的数学公式,接下来看假设函数是什么样子,被称为决定边界的东西是什么?可视化也可以帮助我们更好地理解。
第四十九课:决策界限
决策边界的概念可以让我们理解logistic回归假设函数到底在计算什么?
结合图像可知,我们要决定预测y = 1还是y = 0,取决于估值概率是大于等于0.5还是小于0.5
假设我们已经拟合除了特征参数值:
决策边界上对应一系列的点h(x)正好是概率等于0.5的区域,将整个平面分成了两部分,其中一片区域假设函数预测y = 1,而另一片区域假设函数预测y = 0。
决策边界是假设函数的一个属性,决定于其参数,它不是数据集的属性,并不需要通过绘制训练集来确定决策边界。
一个更复杂的例子:
在线性回归中,我们可以在特征中通过添加额外的高阶多项式,在logistic回归中,可以使用相同的方法。
通过在特征中增加这些复杂的多项式,可以得到更复杂的决定边界。
什么样的假设函数,我们可以使用logistic回归来表示?
如何自动选择参数θ,使我们能在给定一个训练集时,根据数据自动拟合参数?
第四十九课:代价函数
如何拟合logistic回归模型的参数θ,要定义用来拟合参数的优化目标或者叫代价函数?
代价函数的理解:它是在输出的预测值是h(x),而实际标签是y的情况下,学习算法所付出的代价。
在线性回归中,最小化的带价值被定义为1/2乘以预测值h和实际观测值y的差的平方,实际上,在logistic回归中,它会变成参数θ的非凸函数,如果用梯度下降法可能就不会收敛到局部最优值。
所以我们需要另外找一个不同的代价函数,使它变成凸函数,从而可以使用梯度下降法找到局部最优值。
为了使代价函数在代入h(θ)后会变得很简单,构造函数如下:
它有一些有趣而且很好的性质:
对于y = 1时:
有趣在哪里呢?
当实际情况为1,而代价函数预测也为1的时候,这个代价等于0符合预测
当实际情况为0,而代价函数预测为0的时候,这个算法计算出的代价值为无穷大
当y = 0时:
可以证明我们所选的代价函数会给我们一个凸优化问题,整体的代价函数J(θ)会变成一个凸函数,并且没有局部最优值。
对于整个训练集的代价函数的定义?找到一种比我们目前使用的方法更简单的写法?基于以上,使用梯度下降法就可以得到logistic回归算法。
第五十课:简化代价函数与梯度下降法
一种稍微简单一点的方法来写代价函数,如何运用梯度下降法来拟合处logistic回归的参数,如何实现一个完整的logistic回归算法。
合并两种情况下的式子:
为什么我们要选择这个代价函数?似乎我们也可以选择别的代价函数?
这个式子是从统计学中的极大似然法得来的,它是统计学中为不同的模型快速寻找参数的方法。同时它还有一个很好的性质,它是凸的。
接下来就是弄清楚:如何最小化θ的代价函数J(θ),这样我们才能为训练集拟合出参数θ。
最小化代价函数θ的方法是使用梯度下降法。
通过求解微积分,就可以将梯度下降法写作如下形式:
这个θj的等式和之前线性回归的等式相同,那么线性回归和logistic回归是同一个算法么?
虽然规则看起来相同,但是由于假设的定义发生了变化,所以它跟线性回归的梯度下降实际上是两个完全不同的东西。
在之前线性回归的梯度下降法中,讨论了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在logistic回归中,来监测梯度下降,以确保它正常收敛。
for循环以及向量化的方法求解最小值?
现在你知道如何实现logistic回归的梯度下降,最后还有一个之前在谈线性回归时讲到的特征缩放,特征缩放可以提高梯度下降的收敛速度,特征缩放也适用于logistic回归,如果你的特征范围差距很大的话,应用特征缩放同样也可以让logistic回归中的梯度下降收敛更快。
第五十一课:高级优化
高级优化算法和一些高级的优化概念,这些算法和梯度下降相比能大大提高logistic回归运行的速度,而这也会使算法更加适合解决大型的机器学习问题。比如,我们有数目庞大的特征。
现在我们换个角度来看什么是梯度下降?
我们有个代价函数J(θ),我们想要使它最小化,那么我们需要做的就是编写代码,当输入参数θ时,它们会计算出两样东西,J(θ)以及J等于0,1..直到n的偏导数项,假设我们已经完成了可以实现这两件事的代码,那么梯度下降所做的就是反复执行更新,给出我们用于计算这些偏导数的代码,梯度下降法就把它代入θj中,从而来更新参数θ。因此另一种分析梯度下降的思路是我们需要写出代码来计算J(θ)和偏导数,然后把这些代入到梯度下降中,然后它就可以为我们最小化这个函数。从技术上讲,你实际并不需要编写代码,来计算代价函数J(θ),你只需要编写代码计算导数项,但是如果你希望能够监控这些J(θ)的收敛性,那么我们就需要自己编写代码来计算代价函数和偏导数项:
但梯度下降并不是我们使用的唯一算法,还有一些其他更高级更复杂的算法,如果我们能用这些方法来计算J(θ)和偏导数项,那么这些算法就是为我们优化代价函数的不同方法。
这些算法很难懂,但是他们有一些性质:
1.使用其中任何一个算法,都不需要手动选择学习率α(你可以认为这些算法有一个智能内循环,称为线搜索算法,它可以自动尝试不同的学习速率α并自动选择一个好的学习速率α,它甚至可以为每次迭代选择不同的学习速率,那么你就不需要自己选择,所以它们往往收敛的远远快于梯度下降)不需要理解原理,但是要会用。
2.缺点就是复杂,最好不要自己去实现,除非你是数值计算方面的专家,还是建议直接使用软件库和函数。
Octave有一个非常理想的库,用于实现这些高级的优化算法,如果你直接调用它自带的库,你就能得到不错的结果。如果用其他编程语言,可能需要多使用几个库,才能找到能很好实现这些算法的库。
举个例子:
首先运行costFunction函数以后,就可以调用高级的优化函数,这个函数叫做fminunc(),它在Octave中表示无约束最小化函数,调用它时,需要设置几个options,这个option变量是可以存储你想要的options的数据结构,设置梯度目标参数为打开,意味着你现在需要给这个算法提供一个梯度,然后设置最大迭代次数,比如100,我们给出一个θ的猜测初始值,它是一个2X1的向量,那么这个命令就调用fminunc,@指向我们刚刚定义的costFunction函数的指针,如果你调用它,它就会使用高级优化算法中的一个,自动选择学习率α,算法将会使用加强版的梯度下降自动为你找到最佳的θ值。
function [jVal, gradient] = costFunction(theta)
jVal = (theta(1) - 5)^2 + (theta(2) - 5)^2;
gradient = zeros(2, 1);
gradient(1) = 2 * (theta(1) - 5)
gradient(2) = 2 * (theta(2) - 5)
注意:在Octave中运行的时候,参数向量θ必须是d维的,d大于等于2,θ仅仅是一个实数,如果他不是一个至少二维的向量,fminunc就可能无法运算。
Octave中的向量下标是从1开始的,而不是从0开始的。
即写一个函数,它能返回代价函数值以及梯度值。
当然,你也可以把这些优化算法应用于线性回归,你需要做的就是输入合适的代码来计算图中红圈中的值。
因为高级算法复杂,但是运算速度是比梯度下降法更快的,所以当我有一个大的机器学习问题,我会选择使用高级优化算法,而不是梯度下降。
如何修改你已经直到的logistic回归算法,使它在多类别分类问题中也能正常运行。
第五十二课:多元分类:一对多
“一对多”的分类算法
对于多元分类问题,如何得到一个学习算法来进行分类呢?
创建一个新的“伪”训练集:
即在比如三个分类器中运行输入x,然后选择h最大的类别,也就是要选择分类器(选择三个中可信度最高、效果最好的)无论i值是多少,我们都能得到一个最高的概率值,我们的预测y就是那个值
第五十五课:过拟合问题
你已经见识了几种不同的学习算法,包括线性回归和逻辑回归,但将它们应用到某些特定的机器学习应用时,会遇到过度拟合问题,导致它们表现欠佳。
什么是过度拟合?
正则化是什么?他可以改善或者减少过度拟合问题,以使算法更好的起作用。
算法没有很好的拟合训练集,称这个问题为欠拟合,另一种说法是这个算法具有高偏差,说明算法没有很好的训练数据。
过度拟合,另一种说法是这个算法就有高方差,假设我们拟合一个高阶多项式,这个假设函数能拟合几乎所有的数据,这就面临可能的函数太过庞大,变量太多的问题,我们没有足够的数据来约束它获得一个好的假设函数。即你的代价函数实际上可能非常接近于0,但它千方百计的拟合训练集,导致它无法泛化到新的样本中,无法预测新样本的价格。
泛化:一个假设模型应用到新样本的能力。
在逻辑回归中过度拟合问题同样存在:
过度拟合发生以后,我们如何解决:
可以通过绘制模型来选择合适的多项式阶次,绘制假设模型曲线,可以作为决定多项式阶次的一种方法,但这并不总是有用的。很多变量的时候,画图就变得很难了...
两种方法解决过度拟合问题:
1.要尽量减少选取变量的数量(人工筛选以保留和舍弃变量,但其缺点是你舍弃了一定特征变量的同时,也舍弃了关于问题的一些信息)
2.正则化(保留所有变量,但是减少量级或参数θj的大小,这个方法非常有效)
如何应用正则化?正则化的确切含义?怎么使用正则化来使学习算法正常工作并避免过拟合?
第五十六课:代价函数
正则化是怎么样运行的?
加入惩罚,增大两个参数所带来的效果:
如果把每一项都加上惩罚项,这就相当于尽量去简化这个假设模型,因为当这些参数都接近0的时候,这些参数越小,我们得到的函数就会越平滑,也越简单。
在参数后面加上一个正则化项?
这里的λ被称为正则化参数,它的作用是控制两个不同目标之间的取舍
第一个目标与目标函数的第一项有关,即想去更好的训练和拟合数据
第二个目标是我们要保持参数尽量的小,与目标函数的第二项有关,与正则化项有关
正则化参数的作用是控制这两个目标之间的平衡关系,即更好地拟合训练集的目标和将参数控制得更小的目标,从而保持假设模型的相对简单,避免出现过拟合的情况。
如果正则参数λ的值设置过大,就代表对θ1,θ2,θ3,θ4的惩罚程度太大,那么最后这些参数都会接近于0,这就相当于把假设函数的全部项都忽略掉了,就相当于房屋价格就等于θ0,相当于用平行于x轴的直线去拟合数据(欠拟合)。换句话说,这个假设模型的偏见性太强,或者说偏差过高。
为了让正则化起到应有的效果,我们应该注意去选择一个合适的正则化参数λ。
把这种正则化思想如何运用到线性回归和逻辑回归中去以避免过拟合问题?
第五十七课:线性回归的正则化
线性回归的两种算法:一种基于梯度下降,一种基于正规方程
将这两种方法如何推广到正则化线性回归中去?
注意:分离θ0,因为对于正则化线性回归,我们惩罚的对象是参数θ1,θ2...一直到θn,我们没有惩罚θ0。
θj更新的结果就是θj变成了θj*0.99,也就是把θj向0的方向缩小了一点点,说的正式一点,就是θj的平方范数变小了,第二项和没有添加正则化保持不变。
即当我们进行正则化线性回归时,我们要做的就是每次迭代时,都将θj乘以一个比1小的数,即每次都把参数缩小一点,然后进行和之前一样的更新操作,从数学的角度来看,我们要做的就是对代价函数J(θ)进行梯度下降。
用正规方程来解决(不含证明):
不可逆问题:
如果你用不同的语言来运行,如果你只是求它的常规逆矩阵,也就是对应Octave的inv函数,也就是对X的转置乘X取逆矩阵,这种情况下(m<n),你会发现X的转置乘X是个奇异矩阵,是不可逆的。其他编程语言或者线性代数库,可能得不到输出结果。
在正则化中已经考虑到了这个问题:
如果λ>0,那么X的转置乘X再加上λ乘以这个有趣的矩阵,就可以确定这个矩阵一定不是奇异矩阵,即一定是可逆矩阵。
因此使用正则化,也可以解决一些X的转置乘X出现不可逆的问题。
实现正则化线性回归可以避免出现过拟合问题,及时你在一个很小的训练集中拥有大量的特征,也能让你更好地使用线性回归来解决问题。
正则化问题应用到逻辑回归中?
第六十一课:logistic回归的正则化
对于逻辑回归问题,我们谈到过两种优化方法,一种是用梯度下降来优化代价函数J(θ),另一种是用更高级的优化算法。这些算法都需要你去想办法计算函数的导数,如何改进这两种算法?
逻辑回归中也存在过拟合问题:
如何实现?
对于梯度下降法(和线性回归非常像,不同之处是代价函数的表达式不同):
如何在更高级的优化算法中使用正则化:
对于参数jVal,在后面和线性回归一样添加了一项
对于参数梯度,θ0保持不变,但是θ1,θ2,...θn需要在后面加上一项表示正则化目标的梯度
恭喜你,你已经拥有了很多机器学习知识来解决实际中的许多问题?超过硅谷工程师?不过你要走的路还远远不止于此?对于线性回归或者是逻辑回归都能通过构造多项式来解决,强大的非线性分类器可以解决多项式回归的问题!
第六十二课:非线性假设
神经网络机器学习算法
神经网络的表示?神经网络的算法?
为什么要选择神经网络?
看几个例子,为什么需要学习复杂的非线性假设?
如果n是原始特征的个数,事实上二次项的个数大约是(n2)/2!三次项个数大约是n3!
因此要包含所有的二次项,不是很好实现,而且由于项数过多,最后的结果很可能是过拟合的,也存在运算量过大的问题。
因此当初始特征个数n个数很大时,将高阶多项式项数包括到特征里,会使特征空间急剧膨胀,当特征个数n很大时,建立非线性分类器并不是好做法。
对很多实际机器学习问题,特征个数n是很大的!
对于计算机视觉,计算机看到的是一个数据矩阵,或者说表示像素强度值的网格。告诉我们图像中每个像素的亮度值,因此计算机视觉问题就是根据这个像素点亮度矩阵来告诉我们这些数值代表一个汽车车把手。
具体而言,当我们用机器学习算法构造一个汽车识别器时,我们要做的就是提供一个带有标签的样本集,其中一些样本是各类汽车,另一部分样本不是车,将这个样本集输入给学习算法,以训练一个分类器。然后输入一张新的图片,让分类器辨别是不是汽车?
为了理解引入非线性假设的必要性:
从学习算法的训练样本中,找到一些汽车图片和一些非汽车图片,从图片中选择一组像素点位,像素点1的位置和像素点2的位置。在坐标系中标出这幅汽车的位置,车的位置取决于像素点1和像素点2的强度,用同样的方法处理其他图片。
我们需要一个非线性假设来尽量分开这两类样本,这里特征空间的维数是多少?假设我们用50*50像素的图片,特征向量的元素数量N = 2500,特征向量X就是包含了所有像素强度的列表,所有像素点的亮度。对于典型的计算机图片表示方法,如果存储的是每个像素点的灰度值,那么每个元素的值应该在0到255之间,因此这个问题中,n = 2500,但是这只是使用灰度图片的情况,如果我们用的是RGB彩色图像,每个像素点包含红、绿、蓝三个值,那么n = 7500,因此,如果我们需要通过包含所有的二次项特征来学习得到非线性假设,那么这就是式子中的所有条件:xi * xj,由于有2500像素,总共就有约300万个特征。对于每个样本都要找到并表示所有这300万个特征,计算成本就太高了。
因此,只包括平方项或者立方项特征,简单的logistic回归算法并不是一个在n很大时学习复杂的非线性假设的好办法。因为特征过多,使用神经网络,它在学习复杂的非线性假设上被证明是一种好的多的算法。及时输入特征空间或n很大,也能轻松搞定。
第六十三课:神经元与大脑
神经网络最初产生的目的是制造能模拟大脑的机器,而它能解决不同的机器学习问题,不只因为它受到生物学的启发。
可以用它们做什么?不仅包括将其应用到现代的机器学习问题上,而且包括对制造真正的智能机器这一伟大的人工智能梦想感兴趣的人!
再次兴起的原因是神经网络的计算量较大,计算机的速度变快才足以运行大规模的神经网络。
大脑什么都可以做五花八门各种各样的事?怎么模仿它?
能不能假设大脑做这些不同事情的方法不需要上千个不同的程序去实现,相反的,大脑处理的方法,只需要一个学习算法就可以了?
神经重接实验:
其引申出的理念就是:
如果有一块脑组织可以处理光,声或者触觉信号,那么也许存在一种学习算法,可以同时处理视觉、听觉和触觉,而不是运行上千个不同的程序或上千个算法。我们要找出的就是近似的实际的大脑学习算法,然后实现它,让大脑自己学习如何处理这些不同类型的数据。
我们几乎可以把任何一种传感器接到大脑的几乎任何一个部位,大脑就会学会处理它。
如果我们能找到大脑的学习算法,然后再计算机上执行,大脑学习算法或者与之相近的算法,我们也许就会向人工智能之梦迈进,制造出真正的智能机器做出的最好的尝试。
对现代机器学习问题,神经网络是最先进的一种算法。
第六十四课:模型展示
神经网络模仿了大脑中的神经元或者神经网络,为了解释如何表示假设模型,先看哈单个神经元在大脑中是什么样的?
两点需要注意:
1.神经元有像这样的细胞体
2.神经元有很多输入通道(树突),可以把它们想象成输入电线,它们接收来自其他神经元的信息。
神经元有一条输出通道,叫做轴突。这条输出通道给其他神经元传递信号。简而言之,神经元是一个计算单元,它从输入通道接受一定数目的信息,并做一些计算,然后将结果通过它的轴突传送到其他节点,或者大脑中的其他神经元。
神经元之间通过微弱的电流进行沟通,也称为动作电位,其实就是一些微弱的电流,如果神经元想要传递信息,它就会通过它的轴突发送一段微弱电流给其他神经元,轴突连接到另一个神经元的树突,接下来这个神经元接受这些信息做一些计算,然后它有可能会将自己的信息通过轴突传递给其他的神经元。感官和肌肉控制是一个道理。
在一个神经网络中,或者说我们在电脑上实现的人工神经网络里,我们将使用一个很简单的模型来模拟神经元的工作:
我们把神经元模拟成一个逻辑单元(黄色圆圈),用输入输出信息模仿树突和轴突,来控制参数变量。
有必要的时候,增加一个额外的节点x0,这个x0节点有时也被称作偏置单元或者偏置神经元。x0 = 1,所以取决于具体的例子加上x0是不是表示起来更方便。
术语:有时我们会说:带有sigmoid或者logistic激活函数的人工神经元。激活函数:非线性函数g(z)
θ一直被称为模型的参数,在关于神经网络的文献里,人们有时会称θ为模型的权重,它和模型参数其实是一样的东西。
以上是单神经元,神经网络其实是一组神经元连接在一起的集合。
网络中的第一层被称为输入层,因为我们在这一层输入特征
最后一层被称为输出层,因为这一层的神经元输出假设的最终计算结果
中间第二层被称为隐藏层,隐藏层的值在训练集中是看不到的,一个神经网络中可能不仅有一个隐藏层
神经网络究竟在做什么?让我们逐步分析这个图表所呈现的计算步骤:
激活项是指由一个具体神经元计算并输出的值,此外我们的神经网络被这些矩阵参数化,θj就是权重矩阵,它控制从某一层比方说第一层到第二层,第二层到第三层的映射:
第六十五课:模型展示II
用数学来定义或计算神经网络的假设函数,如何高效进行计算?向量化的实现方法?为什么这样是表示神经网络的好的方法?它是如何帮助我们学习复杂的非线性假设函数的?
注意:上标表示这些值与第二层(隐藏层)相关,下标表示输出层。
神经网络的计算向量化(前向传播):
这个神经网络所做的事就像是逻辑回归,但是它不是使用原本的x1,x2,x3作为特征,而是用a1,a2,a3作为新的特征,同时特征项a1,a2,a3也是学习得到的函数输入值,由输入层到隐藏层的映射,是由另一个函数决定的,这个函数由其他参数决定。
因此在神经网络中,它没有用输入特征x1,x2,x3来训练逻辑回归,而是自己训练逻辑回归的a1,a2,a3,可以想象,根据为θ1选择不同的参数,有时可以学习到很有趣和复杂的特征,就可以得到一个更好的假设函数,比用原始输入得到的假设更好。你也可以选择多项式x1,x2,x3等作为输入项,但这个算法可以尝试快速学习任意的特征项,把这西a1,a2,a3作为特征输入到最后的单元,这部分实际上是逻辑回归算法。
能不能理解隐藏层这个具有更复杂特征项的神经网络!
神经网络是如何利用隐藏层计算更复杂的特征并输入到最后的输出层?
为什么这样就可以学习更复杂的假设函数?
在接下来的两个视频里面找答案。
架构:不同的神经元的连接方式。
下图会计算出输入层的复杂功能,然后第三层可以将第二层训练出的特征项作为输入,然后在第三层计算出更复杂的特征,在达到第四层时,就可以利用在第三层训练出的更复杂的特征作为输入,以此得到非常有趣的非线性假设函数。
具体怎么用神经网络来计算输入的非线性函数?通过例子理解从神经网络中得到复杂的非线性假设函数!
第六十八课:例子与直觉理解I
为什么神经网络可以用来学习复杂的非线性假设模型?
这里我们选择用x1 XNOR x2来进行计算,XNOR表示当输入相同时得到1,输入不同时得到0,首先从一个简单的能够拟合AND运算的网络入手:
通过图中的正值表,我们就能弄清楚:神经网络所计算的逻辑函数的取值是怎样的!
而对于逻辑或:
可以看出神经网络中的单个神经元是如何被用来计算逻辑函数,比如AND函数和OR函数的。
那么拥有一个多层神经元的神经网络是如何被用来计算更复杂的函数的呢?
第七十课:例子与直觉理解II
NOT逻辑符:
即若要实现逻辑非运算,大体思想就是在预期得到非结果的变量前面,放一个很大的负权重,比如-20,这就是对x1做逻辑非运算的主要思路!
思考题:
把三个单独的逻辑关系部分组合到一起:
很明显我们需要一个非线性的决策边界来分开正样本和负样本:
通俗的解释就是:我们的输入都放在输入层,然后在中间放一个隐藏层,用来计算一些关于输入的略微复杂的功能,然后再增加一层,用于计算一个更复杂的非线性函数。
这就是为什么神经网络可以计算这种复杂的函数!
当网络拥有很多层,在第二层中有一些关于输入的相对简单的函数,第三层又在此基础上计算更复杂的方程,再往后一层,计算的函数越来越复杂!
实例视频(神经网络识别手写字体):
你所输入的图像,原始的像素点,通过第一个隐藏层计算出一系列特征,再通过下一个隐藏层,计算出更复杂的特征,然后再往下再复杂,最后这些特征被用于逻辑回归分类器的最后一层来准确的预测处神经网络所看到的数字。
第七十一课:多元分类
解决多类别分类问题,因为我们可能需要去区分不止一个类别,0-9
多类别分类算法的实现方法本质上是一对多法的拓展,输出变成了四维向量,用第一个输出单元来判断图中是否有一个行人,再用第二个输出单元判断图中是否有一辆汽车,...摩托车...货车...就像是逻辑回归中的一对多法,有四个逻辑分类器,它们每一个都要识别图中的物体是否是四种物体中的一种。
重新排版后:
这就是神经网络解决多类别分类问题的方法!
如何构建训练?如何让神经网络自动学习这些参数,
网友评论