training set 训练集 validation set 验证集 test set测试集 这些与衡量你作的怎么样有关算法
当你知道怎么衡量你在一个问题的表现,问题就解决了一半。(衡量表现的重要性)网络
每一个你将创建的分类器都会尝试记住训练集,而且它一般在这方面会作的很好很好机器学习
你的工做 是帮助它泛化到新的数据上函数
因此咱们怎么用测量泛化能力代替测量分类其记住数据的能力工具
最简单的方法就是从训练集中取出一个小的子集性能
如今用它训练和测量测试数据上的错误,问题解决了,你的分类器如今不能欺骗你了学习
由于它从未见过测试数据,因此它不可能记住数据测试
但仍然有一个我呢提,由于训练一个分类器一般是一个反复试错的过程优化
你尝试一个分类器 测量它的性能,你尝试另外一个,再测量,再另外一个,再另外一个spa
你调整这个模型,探索参数,测量
最终 你获得了你认为完美的分类器,最后你当心的把测试数据从训练数据中分离
而且只测量在测试数据上的性能
如今你在一个真实的生产环境中部署你的系统,你获得了更多的数据,你在新数据上给性能打分
它几乎作很差,可能发生了什么呢?
发生的是: 你的分类器已经经过你的眼睛,间接地看到了测试数据
每次你决定用哪一个分类器时, 调整哪一个参数时,你确实给了分类器测试集的信息
只有一点点,但它加起来,因此随着时间的流逝 随着你进行不少次不少次实验
你的测试数据渗透进你的训练数据
因此咱们能作什么? 有不少方法能够解决这个问题,这里给一个最简单的
从你的训练集里再取出一部分,把它藏起来,不要看它直到你作出了最后的决定
你能够用你的验证集去测量实际偏差,可能验证集会渗透进训练集,可是那没有关系
由于你最老是有这个测试集的,你能够依靠它去实际测量真正的性能
在这里不讨论交叉验证,可是若是在你的课程中从未遇到,强烈建议你去学习它,交叉验证是深度学习的关键
深度学习有不少旋钮你能够调节,你将会一遍又一遍的调整他们,
你要当心在你的测试集上过拟合,用验证集,你的验证集和测试集须要多大呢?
视状况而定,你的验证集越大,你的数会越精确
想像一下你的验证集只有六个实例 精确度为66%
如今你调整你的模型,性能从66%提高到83%,这些可信吗?
固然不能,这只是一个实例的标签改变了,它可能只是噪声
你的测试集越大 噪声越少 测量越准确
这是个颇有用的经验法则
在你的验证集上影响了30个实例的改变,这样或那样的方式
一般是有统计学意义的,一般是能够信任的
想象你的验证集里有3000个实例,假定你信任30的规则,你能够相信哪一个水平的准确性的提高?
当你获得从80%到81%这1%的提高,更有说服力 有30个实例从不正确到正确
这是个很强大的信号 不论你在作的是什么 确实提高了你的准确率
这是为何对大多数分类器任务,人们倾向于用超过3000个实例作验证集,
这使得准确率的第一个小数位是有效数字,给你足够的分辨率去看到小的改进
若是你的类是不平衡的 例如
若是一些重要的类别很罕见 它的启发式就再也不是好的
坏消息 你只须要更多的数据
如今 若是你的训练集很小 分出3000个实例也是不少的数据,咱们以前提过的交叉验证
是一个可能的方法来缓解这个问题,可是交叉验证多是一个漫长的过程
所以得到更多的数据每每是正确的解决方法
回到训练模型上来,利用梯度降低法训练逻辑回归很是有效
一方面 你是直接优化你所关心的偏差 这是个很是棒的主意
这就是为何在应用时 许多机器学习的研究工做 都是关于设计好的损失函数,用于作最优化。
但正如你在做业中运行模型时可能遇到的那样,它存在最大的问题是它很是难以规模化
解决梯度降低算法 难以 规模化的问题很简单,你要计算这个梯度
这里有一个经验法则:若是计算这个操做须要n次浮点运算,那么计算这个梯度则须要三倍计算量
正如以前那样,损失函数很是巨大,它取决于你数据集的没一个元素
若是你的数据集较大 那会是很是打的计算量,但咱们指望能训练大量的数据,由于实际问题中
有更多的数据总会有更多的收获 由于梯度降低比较直接,要实现它须要不少步
这意味着你要遍历的整个数据集上百次,这并很差,所以咱们打算偷个懒
与其计算损失 还不如直接计算它的估计值,一个很是差的估计,其实是差的惨不忍睹
这个估计差到你会怀疑为啥它还能有效,但这样就是可行,
由于咱们又花了时间让它没那么差。咱们将要使用的估计值是随机从数据集中抽取的很小一部分的平均损失
通常在1到1000个样本左右,说到 随机 由于这很是重要,若是你选样本时不够随机
那它就彻底再也不有效,所以咱们将取出数据集中很是小的一片,计算那些样本的损失和导数
并假设那个导数就是进行梯度降低正确的方向。
它并非每次都是正确的方向,实际上它偶尔还会增长实际的损失,而不是减小它,
但咱们经过每次执行很是很是小的步幅,屡次执行这个过程来补偿它
所以每一步变得更容易计算,但咱们也付出了代价,相比于一大步,咱们须要走不少小步
总的来讲咱们仍是赢了好多。事实上,相比于梯度降低,这样作异常有效
这种技术便叫作随机梯度降低,这是深度学习的核心
由于随机梯度降低在数据和模型尺寸方面扩展性很好,咱们指望同时有大量的数据和大模型
随机梯度降低 简称 SGD 则很是棒且容易规模化
但因为它本质上是一个很是差的优化器,碰巧它又是惟一足够快的
实际中能解决不少问题
以前让输入零均值同方差,这对SGD很重要,用方差较小的随机权重来进行初始化。
下面学习更多重要的技巧,这应该包括了实现SGD所须要的全部技巧
第一个是动量(momentum)
回忆一下 在SGD里,虽然咱们每次只是往随机方向走一小步
但积累起来,就能带咱们来到损失函数的极小值处
其实,先前走过的步子还积累了关于前进方向的知识,咱们也能够把这方面知识利用起来
一个省事的方式是保持梯度的移动平均,用移动平均代替当前一批数据的方向
这种动量技术颇有效 经常会有更好的收敛性
第二个是学习率衰减
回忆一下 用SGD代替梯度降低时,在接近目标的时候 咱们的步子要走的更小和更有噪声,多小的步子呢?
这其实也是个研究领域,不过 步子随着不断训练而愈来愈小,这样作老是有好处的
有些人喜欢用学习率的指标衰减 有些人喜欢每当损失到达停滞时变小 方法不少
但要记住的关键一点,是随着时间流逝而减少它的值
调整学习率经常让人以为奇怪,好比 你可能认为更高的学习率表明你能学习更多,或者学得更快
但这并非真的。事实上 若是你在训练模型的时候下降学习率,可以更快地获得一个更好的模型
它也可能变得更糟,你也许会但愿经过观察损失曲线,得知模型的训练速度
越高的学习率在开始的时候学的很快,可是过了一会就会放缓了
而较低的学习率能让模型继续训练并变得更好
这张图对于每个训练神经网络的人来讲都很是熟悉,永远不要相信模型的训练速度
这和你的模型训练的有多好基本没有关系
这也是为何人们认为SGD是黑魔法
你还有不少超参数能够调节:
初始化权重(initialization parameters)
学习率(learning rate parameters)
衰减比(decay)
动量(momentum)
而且你要确保他们 是正确的
在实际训练的时候 状况会好不少
可是仍是要记住一件事情,当训练出现问题的时候,首先应该想到 下降学习率
对于小模型来讲还有不少好的解决办法,遗憾的是 目前尚未一个让人彻底满意的很是大的模型。
咱们将会介绍一个AdaGrad模型 可以让事情变得简单一点。
AdaGrad是SGD的优化版本,它使用了动量来防止过拟合,并且学习率可以自动衰减
使用AdaGrad可以下降训练过程对超参数的敏感度,可是它的准确率比使用动量的SGD低一些
若是你只是但愿它可以使用,AdaGrad仍然是一个很是好的选择
归纳一下:
咱们有一个很是简单的线性模型 它能够计算几率,咱们也能够用它来进行分类
咱们如今知道该如何在大量的数据之上,使用SGD之类的算法优化它的参数
尽管它只是一个简单的线性模型,如今咱们已经有了咱们须要的全部的工具,是时候去进行更深刻的学习了