Structuring Machine Learning Projects

正交化 (orthogonalization)过程

最高效的机器学习人员 都非常清楚需要调整什么 来实习一个预期效果 我们称这一过程为正交化 (orthogonalization)

 

为保证有监督机制的的学习系统良好地运行 通常你需要 调整系统旋钮 保证四件事准确无误 

第一 通常确保至少训练组,因此 训练组的运行情况需要进行一些可行性评估 ,对于一些应用 ,这个能需要与人类的一些性能进行比较

第二,如果训练组表现良好 ,你将希望这能使开发组运行良好 ,

第三,同时 你也会希望测试组运行良好

第四,最终 你希望能在成本函数的测试组里运行良好 ,结果会影响系统在实际情况中的表现 ,因此 希望这能顺利地实现

推荐不提前停止训练 ,这不是一个不好的技巧, 有很多人都在用这个技巧 ,但我个人发现提前停止训练很难不理想

因为如果你提前停止训练,你就不是能很好的拟合训练集 ,它也同时经常被用来提高你的开发集的执行效果 ,所以这是一个更少正交化的旋钮 ,因为它同时影响了两件事情 。这不意味着这不好,不能用,如果你想的话你可以用它 ,但你有更多正则化控制时 ,像是我写在这里的其他的这些(正则化控制) ,然后, 它只是使调整您的网络的过程更容易。

正交化过程:

首先,你要确定一个合理的单一量化评估指标

其次,建立合适的dev数据集(development data/Cross-validation)/test数据集(test data)

再次,进行手动的方差分析

最后,不同情况下采取的调整模型参数的策略

具体步骤如下:

首先,你要确定一个合理的单一量化评估指标,然后你就可以选择一个算法并且不断的对它进行迭代,这样可以很好的提高你的效率 ,让你的团队可以更快速的做决策(例如使用F1score指标,来表示recall和precision的信息);同时要确定评价结果的标准,例如关注的因素较多,关注训练时间和训练结果,可以采用一定时间内训练的结果的优劣或者建立一个回归方程,综合判断

其次,建立dev数据集(development data/Cross-validation)/test数据集(test data)推荐的设置开发集和测试集的方法是 ,选择的开发集和测试集能够反映出将来预计得到的数据和你认为重要的数据,特别地这里的开发和测试集应该来自相同的分布。

划分数据集的大小方法

在早起机器学习中通常使用的经验法则是

训练集:测试集=7:3

训练集:开发集:测试集=6:2:2

在数据集比较小的情况下,这样的划分方法是非常合理的。

但是现代的处理的数据集通常较大,训练集通常远远大于70%,测试集的大小只要足够能保证对系统整体性能评估的高置信度即可 ,因此 除非你需要对最终系统性能有非常精确的测量 ,否则你的测试集并不需要上百万个样本。这取决于你所拥有的总数据量 ,在某些应用场景中可能你并不需要对最终系统 整体性能的评估具有很高的置信度。

如果我们只关心有用于训练的数据 和用于调优的数据 ,然后直接上线最终的系统 而不太关心它的实际性能,也可以只使用训练集和开发集。如果你有一个很大的开发集 ,你相信不会对开发集过拟合得太厉害 ,那么只使用训练集和开发集 也不是完全不合理 ,不过一般不建议这样做。

再次进行手动的方差分析。

与人相比,机器学习算法,超过人的表现达到一定程度,就会进步缓慢,趋近于贝叶斯最佳误差。可以与人类表现对比,估计贝叶斯最佳误差

 

机器学习算法与人类表现比较,如果你的算法性能不如人类表现,你可以通过对比得到以下三点信息去优化算法:

1、得到手工标记的标签数据

2、手动分析误差,看看算法判断错误的原因,为什么人处理的误差更小

3、更好的方差分析

 

一般我们会假设贝叶斯最佳误差非常小,实际上不一定满足假设。与人类表现结果对比,可以粗略评价算法的性能以及改进方向,是采用降低方差策略还是采用方差侧率

如下:

如何定义人类表现水平呢,根据目的的不同,可以有不同的结果。如果想判断是否有必要开发这个系统,可以使用typical doctor(1%)的错误水平,如果是判断贝叶斯误差的最小值,可以判断是不大于team of experienced doctor(0.5%)。具体怎么定义,根据目的不同,进行选择。

方差分析是通过人类表现水平与训练水平之间的差距判断可避免误差,训练水平与开发集之间方差,判断改进算法的方向。

算法超越人类表现之后,工具就不在那么有用了,

最后,不同情况下采取的调整模型参数的策略:

可避免误差太大,可以采用

1)训练更复杂的模型

2)添加更多的参数或者训练更长的时间(如动量梯度下降,Adam下降法)

3)尝试其他的神经网络方法

方差太大,可采用

1)更多的训练集

2)正则化

3)尝试其他的神经网络方法

进行错误分析:

首先,选择一定错误数量的样本

其次,对不同错误原因结果进行标记

再次,统计不同原因导致的错误的比例,判断改进算法的方向的上限,改进算法

例如:

 

如果在检查数据过程中发现标记标签错误,处理如下:

深度学习对于处理随机错误是很稳健的,但是对于系统误差不那么明显

1、如果标记标签错误在错误中占比很少,且是随机产生的,没有必要去专门修改标签。

2、如果标记标签错误在错误中占比较大,则有必要去修改标签

 

更正错误标签的原则

不管在什么情况下,我都会鼓励你去同时应用开发集和测试集 ,开发集和测试集服从同样的分布 。其中开发集是你优化的目标 当你的模型在开发集上表现良好时 ,你会希望这个良好的性质能推广到测试集 。所以当开发集和测试集服从相同分布时 ,你的团队就能工作得更有效率

第二,我强烈建议你考虑检查 ,你的算法准确预测和错误预测的例子,去检查你的算法错误预测的例子很简单 ,只要看那些需要被纠正的 ,不过有时可能即使你预测对了 ,但它却是需要被修正的 。如果你只纠正那些预测错的样本 ,那么当你评估算法错误率时,就会有更大的偏差,这给你的算法带来一点不公平的优势 。我们只是尽量仔细检查它错的部分 ,不过对于模型预测对的样本,也要进行检查 。因为模型可能仅仅因为运气好而预测对了 此时纠正一些标签的话,就去除运气成分 ,并导致本来(因运气)预测对的 变成预测错误 

第二个原则不总那么容易执行 ,所以也不常做

如果你探究开发集和数据集,去纠正一些标签 ,你可能应用同样的方法到训练集上,也可能不。实际上 

纠正训练集中的标签不那么重要 ,很可能你决定纠正开发集和 测试集中的标签,这部分数据更小 。比起训练集,你可能不会把额外工作都用来纠正那些在训练集中的标签 。实际上这是可以的 。本周我们会谈到一些方法 来处理训练集 和开发集、测试集服从不同分布的问题 ,学习算法对这个问题是非常稳健的 ,你的开发集和测试集服从相同的分布,这一点非常重要

推荐的建立一个搭建机器学习算法的过程

1、首先先确定评估错误的指标

2、建立简单的机器学习系统

3、定位出不同的方差,进一步去改进方差,对系统进行迭代优化

 

 

来自不同来源的数据的情况下的训练集划分:

举例,来自网页端200000个样本,来自手机端10000个样本,最终希望建立一个系统,监测手机端的图片

方法1:网页端的样本和手机端样本全部混合,然后随机划分出来训练集,开发集,测试集

方法2:网页端的样本全部放入训练集中,手机端划分出来一部分样本放入训练集中,一部分划分为开发集,一部分划分为测试集

第一个方法更容易管理,但是最终的开发集和测试集,并不是最终系统要实现的目的,这个方法并不好。但是如果不使用网页端样本,训练样本会比较小。第二个方法相对就更好些,给训练集更多的样本去学习数据特征,最终的目标也是手机端的图片,与目标实现的监测数据是一致的。

 

 

如果有不同数据来源在训练集中,错误分析中不同数据集的误差进行分析如下:

 

引入不同数据集的数据进行训练,可以提升算法的性能和表现,但是也会带来新的误差来源,数据失配

更为一般的格式如下:

 

如果你设计一个图像识别的神经网络,已经完成了对网络的训练。另外一个不同的任务中,例如放射扫描结果的诊断过程 ,真实地读取X光扫描图像,你可以做的就是取出这个神经网络的最后一层 并移除掉这一层以及其相关的权重 ,然后为最后一层神经网络创建一个新的随机初始化的权重 ,使用新建的这个输出层来进行放射结果的诊断。

当你在你的被迁移的模型中拥有大量的数据, 而你在你需要解决的问题上拥有相对较少的数据时, 迁移学习是适用的,适用条件如下:

当被迁移模型(task a)任务的样本量小于迁移任务(task b)的样本量,这样的情况下迁移学习不会有更多的增益

多任务训练适用场景如下:

1、在低纬度特征上共享一部分特征,训练一系列效果要好于每个任务建立单独建立神经网络分别训练

2、每个任务单独训练神经网络数量相对较少

3、能够训练一个足够大的神经网络来满足训练任务的要求。

端到端深度学习:

语音转换系统传统的方法

输入音频资料,用MFCC方法提取特征,使用机器学习从剪辑中查找音素,把音素串联起来形成单词,再讲这些单词串联起来形成脚本

端到端学习,只需输入音频片段, 然后直接输出脚本。

端到端的深度学习只是 从最新的训练数据集中,直接学习从x到y的映射,真的绕过了很多中间步骤, 对于一些领域来说 ,接受这种构建人工智能系统的替代方法是一个挑战。

研究结果表明,端到端深度学习的一个挑战是它需要大量的数据才能取得很好的结果 

 

端到端深度学习的优点:

第一点就是端到端学习真正地让数据发挥主导作用 。

如果你有足够的(X, Y)的数据 ,那么不论那个能最好地将X映射到Y的函数是什么样子 ,只要你有足够大的神经网络 ,顺利的话,神经网络都能拟合出来 。通过单纯的使用机器学习方法 ,你的神经网络能够更好从输入的X->Y中 ,学习到数据内在的统计学特性 而不是被迫去反映人的先见 

第二个好处就是所需的人类动手设计的组件变的更少了 。

这可以简化你的设计工作流程 ,意味着你不需要话大量的时间去动手设计特征 

端到端学习的缺点:

第一,端到端学习需要大量的数据 。

为了使用机器学习直接得出X到Y的映射 ,你或许需要大量的(X,Y)数据 ,就像我们在前面视频中看到的,可以为你的子任务获得大量数据的例子

另一个缺点就是它排除了一些具有潜在用途的手工设计组件。 

机器学习研究人员往往会轻视手工设计的组件,但是如果你没有足够的数据 ,那么你的学习算法就不能够洞悉你数据中的规律 ,如果你的训练集很小 ,所以手工设计的组件的确是一条可行之路 

发布了25 篇原创文章 · 获赞 4 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览