(吴恩达机器学习)6.模型优化

1模型

1.1模型评估

还记得正则化和过拟合吗,模型很适合训练集的数据,但是并不适配新加入的训练集数据,而正则话就可以很好的解决过拟合

可以将训练集中70%的数据用作训练数据,剩余的作为测试数据

在训练得到模型时我们的成本函数是添加了正则化函数的,但在测试数据上并不需要,我们只需要计算总共的测试数据的损失即可。

以上是对于线性回归的模型评估,对于逻辑回归的模型评估实际上是一样的。获取70%作为训练数据剩余的作为测试数据,然后测试的成本函数也是训练模型的成本函数去掉正则化的那一部分进行计算。

但存在一定的区别,逻辑回归训练集的成本函数可能要求计算的是具体的概率,但测试集的计算只要求0or1

1.2模型选择

        接着上一节的模型评估,我们可以通过像一次多项式的模型,二次多项式的模型等各类模型进行评估,选择其中测试值最小的哪一个模型。但这样去做有一个小的缺陷,就是这样所获得的最小泛化的模型可能只是一个乐观估计,它可能还是低于实际的拟合,通俗的说就是所有模型的泛化都很高,但是总能矮个里面拔高个。 

        那么我们在选择模型上就需要更加高级先进的程序和算法来进行模型的选择,于是就有了交叉验证测试集

        对训练数据进行三分,如上,60%是训练集,20%是交叉验证集,20%是测试集。同样的集合的验证错误函数都是不带正则化的,只有平法差的和(逻辑回归除外)。

        那么通过交叉验证集就可以选择出来一个合适的模型,用它来拟合你的训练集 

        同样的,对于整个神经网络模型也可以这样去进行验证然后模型选择 。然后最后在用测试集的数据来评估整个神经网络的好坏。

2评估以及问题解决

2.1方差偏差评估

        还记得在线性回归时所提到的欠拟合、过拟合问题吗,偏差和方差这两个问题时一样的。高偏差意味着欠拟合,高方差意味着过拟合。

        结合上一小节的训练集成本(J_train)交叉验证集成本(J_cv)。J_train和J_cv的高低决定了模型的偏差和方差

        如上图所示d的值也就是多项式的次方值是对偏差和方差有影响的,具体如下

2.2正则化、方差、偏差

        在解决过拟合问题时,我们使用的就是正则化的方法。从上一小节中我们知道拟合问题和方差偏差问题一样,所有也可以通过正则化来解决,那么我们来详细看看正则化的影响。

        lamade的值对线性回归的影响如下图:

        当lamada的值过大时如左图为1000,那么就会导致特征的参数非常小,甚至为0。此时方程的图像会无限的接进常数直线。

        当lamada的值过小时如右图,那么就会导致正则化的影响非常小,近乎没有。那么如果方程本身是过拟合/高方差的化,那么就不会有任何改变。

        中间的图代表lamada适中

        以不同lamada的值来计算J_cv值,选择方差最小的那个,如下图:

那么由此我们可以得出J_train和J_cv和lamada之间的关系

        将其和右边多项式次数和 J_train和J_cv和lamada之间的关系作对比不难发现,两者之间几乎是颠倒的关系

2.3性能评估的基准

        以语言识别为例子 :

        如果单看J_train和J_cv来说,10.8%和14.8%是偏高的,但是实际上因为噪音等各方面的干扰,哪怕是人脑识别的水平都会有10.6%的错误率,所以相比之下,J_train的10.8%只高0.2%就完全可以接受了。

        事实上,现有的性能评估基准有三条:1.如果这个智能评判是可以用人脑进行评判的,那么人脑的评判水平。2.竞争对手的算法性能。3.基于经验进行猜测 

        所以在实际的性能评估中,要先定好性能基准。具体的基准一般就以上三种,以最开始提到的语言识别为例子:

2.4学习曲线

        在之前的我们了解了多项式次数和错误率的关系,正则化lamada的值和错误率的关系。学习曲线则是训练集的数量和错误率之间的关系,具体如下

        我们来看看学习曲线和高偏差模型的关系。如果模型本身存在高偏差问题,如右边的高偏差直线,无论你怎么增添数据,高偏差的直线就是直线

        但相对的,模型本身没有高偏差问题,当训练集到一定程度时, 错误率会无限的接近一个值

        同样的,高方差的模型和学习曲线之间的关系呢。相较于高偏差的的模型,高偏差的模型中J_cv和J_train之间的差别会更大。但最终都会逐渐趋近。

2.5简测

        如上图,6中对模型的改变分别会产生什么样的效果呢。

        1.获取更多的训练数据。这样可以修正高方差的问题。

        2.尝试减少特征数量。正如房价预测中所提到的,减少不需要的或者影响较小的特折可以很好的减少过拟合问题也就是高方差问题。

        3.尝试增添特征数量。与减少相反,当模型出现高偏差问题时,增加特征的数量可以很好的解决高偏差问题。

        4.尝试增加多项式的次数。与增添特征数量一样,当模型出现高偏差问题时,可以很好的解决高偏差问题。

        5.尝试减小lamada的值。减小lamada的值,说明特征参数的影响会加大,那么可以修正高偏差问题

        6.尝试增加lamada的值。与5相反,增加lamada的值会使得特征参数的影响减小,就可以修正高方差。

2.5扩大模型大小解决高方差高偏差问题

        简单模型可能存在高偏差问题,复杂模型可能存在高方差问题。所以平衡方差和偏差问题在神经网络出来之前,一直是一个需要不停考虑的问题。当神经网络出来之后,可以针对神经网络模型来平衡方差和偏差问题。

        如上图,如果神经网络存在高偏差,则可以扩大网络模型的大小,然后继续测试,直至模型不存在高偏差问题。然后用交叉验证集进行训练,如果存在高方差问题,则增加训练集的数据,然后继续测试,直至模型不存在高方差问题。

        这时,有人会质疑,大的神经网络的高方差问题真的能解决吗。事实上,正则化的大神经网络模型在数据足够的情况下和小的神经网络模型在方差上没有太大差别甚至表现的更好。更大正则化网络模型唯一的缺点可能在于训练所花费的时间和资源要更大,但实际上在如今这个时代,cpu的计算能力非常足够支持大的神经网络模型。这也是为什么人工智能要和计算机硬件的发展挂钩的原因之一。

3.机器学习的开发

3.1机器学习开发的迭代

        选择你的模型结构,然后训练模型,通常情况下第一次的训练模型不会符合你的预期要求,所以要进行诊断,对方差和偏差进行修正,然后再选择模型的结构

        以检查一个邮件是否为垃圾邮件为例,通过设置某些单词为特征来构建详细的特征向量。如下图没出现a就是0,出现了andrew就是1,从而获得具体邮件的具体特征向量,然后再进一步通过神经网络判断是不是垃圾邮件,通过此来训练你的神经网络。

        那么在这个案例中,如何减少垃圾邮件的分类错误呢。大致有如下的方法:1.收集更多的数据。2.尝试产生基于邮件惯例的更成熟的特征。3.从邮件体中定以类似表达的特征。4.设计一个算法来判别相似拼写,例如o和0.

3.2误差分析

        以垃圾邮件分类为例,假设在500个交叉验证集中出现了100个有错误的,错误分别如下

         通过具体的错误邮件的误判,可以让你进一步修改你的算法,增加更多的特征等,从而可以使你的算法更加有效。

3.3添加更多数据

        这里的增添数据讲的并不是常规意义上的增加数据的数量。事实上,直接增加实例数量的成本太大,所以采用在原有训练集的基础上创造新的训练集数据,这种技术被称为数据增强。

        1.数据增强

        举个例子,如果你想要识别a-z的字母图像,可以通过各种变化来增加实例,比如旋转图片中的字母,将字母放大缩小等。

        此外,图片还有数据增强的更高级例子。可以将图片进行网格化,通过对字母所在网格进行任意的扭曲,就可以获得不同的增强例子。

        除了图片,音频数据也可以进行数据增强。假设你现在一个这样的正常音频像今天是什么样的天气,这时候我们可以给音频增加一个嘈杂的背景音频,例如人群背景,汽车背景。或者加上一个手机不好的电流背景。可以将这样的数据增强实例返回的训练集中。

        不难发现,数据增强实际上就是对数据的扭曲,这样的扭曲并不代表是意思上的扭曲,只是在表现形式上进行了扭曲,如果你的算法可以很少的识别出来,或者训练之后能很好的识别出来。那么恭喜你,你获得了一个更加有效的算法

        2.数据合成

        除了数据增强,还有一种增加数据的方法是数据合成。数据增强是通过已有数据进行修改,而数据合成则是创造一个新的数据。以下面的图片文本读取为例子,计算机自动读取图片OCR中显示的文本内容。

        如下是OCR的读取的真实数据,不难发现这些文字有着各式各样的字体颜色和排列等,然后采用不同的文字、字体、颜色合成新的数据。然后你会得到和右图一样的数据

        数据合成多用于计算机视觉,较少用于其他应用程序。

        ai = code+data,在传统的机器学习中,模型开发的中心还是在学习算法的代码上的。但是在现在,花一些时间在寻来算法的数据上可能会使模型更加有效。

3.4迁徙学习

        实际上就是通过开源的模型和代码简化你自己的模型。以下图为例,你想识别手写数字0-9。这时你发现了一个神经网络模型,是用来区分1000个物种的模型,它经过了100万个图片的训练。这时你可以将该神经网络的网络层拿过来,然后对其输出层进行改写。因为原本的输出层是有一千个神经元组成,但你只是要区分0-9的数字,只需要10个神经元,输出的也只是一个10阶向量而已。

        实际上迁移学习就是建立在现在庞大的开源ai代码上,使用类似的神经网络进行微调,然后训练出满足自身要求的神经网络。具体的步骤如下:1.获取一个和你的神经网络输出数据一样的模型。2.进一步训练该模型以符合你的自身的数据

3.5机器学习项目的完整周期

        当你在构建一个机器学习项目的时候,你不同的时间段应该做什么,整个周期是什么样的,以下我们以语言识别为例:

1.第一步是进行项目确定,换句话来说决定你项目是要做什么。例如我们要研究语音搜索的语音识别,那么就是使用手机进行语音输入搜索。

2.收集数据,确定本项目训练所需要的数据并收集。

3.收集完数据后,你就可以开始训练模型了。在训练中,你将你的代码变得更有效。同时也会进行错误分析,这时候需要根据结果再收集数据然后进行训练,围绕着这个进行循环。直到你的模型足够好,你就可以开始部署到系统上。

4.部署到系统上,在部署到系统上之后,你还要进行监控,以确保项目性能不会变差来恢复性能。

        前三步就是我们在之前的学习中一直学习的内容,现在我们详细的看一看第四步部署系统。部署到系统上常用的就是将你的模型在服务器中实现,我们称其为推理服务器。实际上就是服务器实现了你的模型,然后服务器将接口给移动程序端,移动程序调用api接口将语音输入发给服务器然后服务器识别之后将文字返回

4.倾斜数据处理

4.1倾斜数据集的误差指标

        以一个例子来说明,假设你正在训练一个二元分类器,根据实验测试或者患者的其他数据来判断患者是否有重大疾病,存在则为1否则为0。算法预测的y一直为0,但是实际上并不全是0,有99.5%的正确率。而另一个算法同样输出一直为0,而其正确率为99%。此时,你并无法判断那个算法是更加优秀的,因为在非常小的误差预测无法进行准确的判断,y=0说明永远不会诊断你们的算法有任何问题。这时就引出了这种明显倾斜一边的数据的指标-召回率和精确率。

        如果你修习过概率论,可以很容易的发现,这其实就是假设检验的内容

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值