(Course 3 of the Deep Learning Specialization)
https://www.youtube.com/playlist?list=PLkDaE6sCZn6E7jZ9sN_xHwSHOdjUxUW_b
开发深度学习模型时,如果初期模型效果不理想,我们有很多想法来改进,如收集更多数据、调整模型结构等。但如果选择不当,可能会花费大量时间在低效方向上。 面对可选择方案众多的情况,需要有效方法评估每个方案,快速识别效果好的方向。否则可能花6个月追一条死胡同。
本课程将介绍一些评估模型性能提升很有效的策略,如分析数据质量、模型表现等,以指导选择优先改进方向。同时也将借鉴作者实战经验,帮助学习者更有效地提升模型性能。
运用系统的机器学习策略可以提高开发效率,避免在低效方向上浪费时间,更快地解决问题。这也就是本课程想教授的内容。
机器学习系统的一个挑战是可以调试的东西很多,包括神经网络的参数、数据量大小等等。有效的机器学习工程师会明确哪些调参可以达到某个特定效果。这一过程称为正交化。
举例来说,老式电视机有很多调控钮,每个控制一个画面的一个方面,如高度、宽度等。电视设计人员设计了电路,使每个控制只影响一个方面,这样就容易把画面调整得好看。
另一个例子是汽车,方向盘控制转向,油门和刹车控制速度。这分开控制了两个维度,比如某控制同时影响转向和速度就难调试多了。
对机器学习系统来说,通常需要四个条件:1. 训练误差低。2. generalize到验证集。3. generalize到测试集。4. 在现实中效果好。
每个条件如果不满足,就需要找到对应的调参“控制钮”。例如训练误差高,可能用更大的网络或者优化算法;验证集效果差,可能增加正则化;测试集效果差,增加数据集大小等。每个“控制钮”都尽量只影响一个条件,不影响其他条件,这样调试起来更简单明了。
以上就是正交化的概念。它可以帮助有效地定位问题所在,并找到对应的参数来单独解决这个问题,不影响其他方面,这就像用不同控制调节电视不同参数一样。
当调整超参数或尝试不同的想法时,如果有一个单一的实数评估指标,可以更快判断新尝试是否优于旧想法。
对于机器学习项目来说,提前设定一个单一实数的评估指标是很重要的。以图像分类问题为例,之前训练出分类器A,现在训练出新的分类器B,需要评估两者的优劣。
常用的评估指标有准确率和召回率。准确率代表分类器识别为正例的图像中,实际是正例的比例。召回率代表所有实际正例图像中,分类器正确识别的比例。但是,这两个指标之间易出现权衡,无法直接判断哪个分类器优异。
所以machine learning领域常用F1得分来综合考虑准确率和召回率。F1得分定义为2/(1/准确率+1/召回率),可以看出A分类器的F1得分高于B,因此A优于B。
设定单一评估指标可以更快迭代改进算法。同样,如果项目涉及多个地理位置,可以同时跟踪各地表现,并采用平均值作为单一指标,也可以加快选择算法的效率。
有时不能只用一个指标来衡量多个关注要点。在这种情况下,可以设置满足指标和优化指标。
满足指标指需要达到的标准。只要达到标准就可以满足需求。优化指标则要尽可能地优化。
例如, cared 的分类准确率和运行时间。可以把准确率设为优化指标,最大限度提高准确率。运行时间设为满足指标,只要在100毫秒内就可以满足。那么准确率高且运行时间在标准内的就是最优分类器。
同理,如果关注点有n个,可以选择1个作为优化指标,其余n-1个作为满足指标。只要后者达到标准就可以,选择实现第一要点最优的作为最佳方案。
如此一来,就可以通过计算不同方案的指标值,选择实现优化指标最好且满足其他要求的作为最优方法,而不用人工进行杂乱评价。需要在训练集或验证集上计算各指标值进行判断。
训练集、验证集和测试集的数据分布会直接影响模型训练效率和效果。
验证集的作用是评估不同模型或算法,帮助选择最好的那个。测试集用于最后评估模型效果。
如果验证集和测试集来自不同分布,那么优化验证集效果后,测试效果可能降低。
例如,数据来源不同国家或地区,不应该随机分到验证集和测试集,这样它们就来自不同分布。
正确做法是将所有数据拼在一起随机分到验证集和测试集,这样它们来自同一个整体分布。
另一个例子,数据来自中低收入区和中收入区,也不应该分开优化,否则最后效果可能不好。
总的来说,验证集和测试集的数据分布应该一致,反映预计将来使用的数据特征。这样模型在验证集上的优化就能更好地体现测试集和实际应用中的效果。
分布一致可以有效提高模型训练效率,避免优化方向偏差导致测试效果差的情况。
在早期机器学习时代,使用70%的数据作为训练集,30%的数据作为验证集和测试集这种做法是合理的。但在深度学习时代,我们通常使用更大规模的数据集。
对于训练集,使用数据的98%或更多作为训练集是可以接受的。对于验证集,应该足以评估不同模型的大小,一般使用1%左右的数据。
测试集的目的是评估最终模型的表现,所以其规模不需要像验证集那样大。只要样本数可以提供对最终表现的可信度就可以,通常使用1%的数据也足够。
如果数据量非常大,过拟合可能不会是问题。这种情况下,也可以没有测试集,只有训练集和验证集。但一般不建议这样做,最好还是分离出测试集。
总的来说,深度学习时代不再适用旧的70/30分割规则。DATASET越大,训练集的比例越大,验证集和测试集的比例越小。验证集和测试集的大小应根据其评估模型和最终表现的目的来决定。
评估指标有如同设置目标一样,用于驾驶团队优化算法。但如果目标放错位置,应立即调整。
比如分类猫图时,算法A分类错误率3%,B为5%。但A经常误分类色情图片,用户体验很差。此时分类错误率评价指标失效,应改进给色情图片更大权重。
另外,如果当前评估标准无法准确判断算法品质,表明需要调整评估标准。例如训练数据为高质量图片,但用户上传低质量图片。此时直接使用当前评估会误导,应 matching 用户实际需求来调整评估。
总的来说,只要当前评估指标和测试集分布与实际需求不一致,无法好好体现算法表现,就需要调整评估指标和/或测试集,以匹配实际应用场景。
评估和测试集的目标是帮助团队更快找到更好的算法。因此一开始就设置一个临时的还比较随意,重要是能驱动迭代。将来发现问题再调整也无妨。但不宜长期没有明确的评估标准来驱动优化。
近年来,越来越多的机器学习团队开始将机器学习系统与人类水平进行比较。
主要原因有以下几点:
深度学习算法因为技术突破,工作效率大幅提高,使许多应用领域的机器学习算法首次具备达到人类水平的实用能力。
当试图复制人类可以完成的任务时,以人类水平为目标是机器学习工作流程的一种高效方式。
以视觉识别和语音识别等任务为例:
随着时间的推移,机器算法性能提升速度会在超越人类水平后放缓。
但超越人类水平前,可以通过请求人类对样本进行标注,获取更多训练数据来增强算法效果。
同时可以查看人类正确而算法错误的样本,探讨算法偏差原因,帮助改进。
人类水平提供一个参考,帮助评估是否需要进一步降低算法偏差或方差。
尽管长期来看,算法性能可能无法突破贝叶斯最优错误率上限,但人类水平仍是一个值得追求的中期目标。
总之,以人类水平为参考有助于评估任务难易程度,帮助设计和优化更实用的机器学习算法。
以分类任务为例,人类水平误差可以近似看作贝叶斯最优误差。
根据训练误差和测试误差值,可以判断是否存在可避免偏差:
如果训练误差远高于人类水平,则有减小偏差的空间。应采取减少偏差的策略,如更大网络、更长训练等。
如果训练误差仅略高于人类水平,则其余差异主要来源于方差。应采取减少方差的策略,如正则化等。
此外,定义:
可避免偏差:训练误差与贝叶斯最优误差之间的误差。
方差:训练误差与测试误差之间的误差。
通过人类水平误差,可以评估贝叶斯最优误差大小,进而判断当前是否存在可避免偏差,决定采取何种策略来降低错误率。
总之,人类水平误差可以反映任务难度大小,有助于选择合适的算法调优策略,从而避免过拟合或过于偏差。
这段视频讨论了如何定义和理解人类水平(human-level performance)的表现。
人类水平表现通常可以用来近似估计贝叶斯错误(Bayes error),即任何算法在当前或者未来都无法达到的最佳错误率。
视频举了一个医学影像分类例子,不同程度的医生具有1%到0.5%的错误率。这里以医生小组通过讨论达成0.5%错误率作为估计贝叶斯错误的标准。
algorithem的训练错误率和DEV set错误率的差值可以近似衡量算法的可避免偏差和方差问题。如果训练错误率高于估计的贝叶斯错误率,则表明算法存在可减少的偏差;如果训练错误率低但DEV set错误率高,则表明算法存在方差问题。
只要算法超过单独医生的水平,也可能认为已经达到人类水平。但如果要作为贝叶斯错误的近似,最好以医生小组达成的0.5%标准。
随着算法水平不断提高,如达到0.7%的错误率,此时评估偏差和方差就变得更难,需要更准确地定义人类水平作为贝叶斯错误估计标准。
当一个机器学习模型在某项具体识别或分类任务上超过人类水平时,团队常常会感到兴奋。
在试图完成这一目标时需要注意以下几点:
随着机器学习水平逼近或超过人类水平,进步变得更加困难。
一个例子中,小组讨论后人类错误率为0.5%,单个人类错误率为1%。若模型训练误差为0.6%,评估误差为0.8%,那么避免偏差量大于0.5%但小于1%,模型还需减少方差。
若模型训练误差为0.3%,评估误差为0.4%,则无法判断是否应更注重减少偏差还是方差。
模型超过小组讨论水平后,如何进一步优化模型就不再那么明确。
人类擅长自然语音和图像等任务,所以相比结构化数据更难让机器超越人类。
大数据量对模型性能提升有利。
改进后的深度学习已在某些医学和视觉任务上超越人类。
给定足够数据,深度学习模型也可能在单个监督学习问题上超越人类。
可以通过以下几个步骤来提高深度学习模型的性能:
将训练误差与Bayes错误率的近似值进行对比,估计当前模型的可减少偏差。
通过训练误差和验证集误差的差异来判断模型的方差问题。
如果存在偏差问题,采用更大的模型、更长的训练时间或优化算法等手段来更好地拟合训练数据。
如果存在方差问题,可以采取正则化、数据增强或获取更多数据等策略来提高泛化能力。
可尝试使用更好的神经网络结构或超参数,如RNN、CNN等。
可通过网络结构搜索等方法来找到适合当前问题的网络。
可结合以上各项措施,系统地优化模型来提升性能。
错误分析是一种对机器学习算法进行性能分析和优化的方法。
从验证集样本中取出100个预测错误的实例,手动查看它们。
将错误样本分归类,比如狗图像、猫图像等。
对每个类别统计其数量,计算每个类别错误量的比例。
根据各类别错误比例,评估改进每个类别的潜在效果。比例高的类别优先考虑。
在分类过程中可以发现新的错误来源,添加分类项目。
错误分析只需要几小时,可以有效帮助确定优化方向。
通过比较训练误差和验证误差,可以定位是模型偏差还是方差问题。
错误来源多样时,可以平行优化多个方面,或分工协作。
错误分析结果不给出方案,但是可以提供优化各类错误后可能取得的成效上限,评估每个方案。
在改进过程中也可以不断重复错误分析,评估效果和调整优化方向。
深度学习算法对随机错误标记的训练数据具有很强的鲁棒性。只要错误标记数量不太多,算法性能不会受到太大影响。但是,系统性错误会对算法产生影响,比如如果白色狗常被错误标记为猫,分类器就可能会将白色狗分错类。
在训练数据集、验证数据集和测试数据集中都可能存在错误标记样本。对训练数据集,可以选择检查样本标签而不一定修正,因为算法对随机错误很鲁棒。但是,为了更准确评估算法,检查和修正验证集和测试集中的错误标签是重要的。
检查错误样本时,最好同时检查算法判断正确的样本,避免误导性地只检查错误样本。
是否值得花时间修正错误标签,需要考虑以下几点:
整体验证集误差率
错误率中由于错误标签占的比例
除错误标签外其他原因导致的错误率
如果错误标签所占的比例较高,可能需要修正。如果误差主要来源于其他原因,优先处理其他原因可能更有效。
另外,如果算法性能进一步提高,同样数量的错误标签可能会对评估影响更大,这时修正也更重要。
验证集和测试集应使用相同的流程进行检查和修正,使他们来源于相同的分布。
考虑同时检查算法判断正确的样本。
训练数据集可能不一定需要修正,但验证测试集最好修正。
修正过程应保持独立性和一致性。
人工检查样本有助于了解模型的错误原因,同时给出下一步优化方向,是提升系统性能的重要手段。
当开始新的机器学习应用时,应该快速建立第一个系统,然后进行迭代。
如果想建立语音识别系统,有很多方向可以选择,如提高噪音环境下的识别能力、处理本地口音、远离话筒的语音识别等。对新问题来说,选择优先方向会很困难。
建议快速建立第一个系统,包括设置目标和评估指标。然后训练模型,使用偏差与方差分析和错误分析来优先定下一步工作。
比如通过错误分析发现很多错误来自远离话筒,那么可以优先研究远距离语音识别技术。
第一个系统可以简单粗暴,值得的是可以进行分析来指导优化方向。这种方法在新的应用场景下更有效,但如果有充分相关经验或学术文献支持,也可以从一开始就建更复杂的系统。
总之,对新问题应快速搭建第一个系统,进行分析,再进行迭代优化,而不是一开始就过于复杂。这种方法通常效率更高。
深度学习算法需要大量的训练数据。许多团队会将找到的所有数据放入训练数据集,即使这些数据来源不同于测试数据分布。
训练和测试数据来源不同分布可能会带来一些问题。比如要识别手机上传的猫照,可以下载来自网络的高质量猫照作为训练数据,但测试数据应来自手机上传照片。
一种方法是将所有数据合并洗牌后分为训练、验证和测试集。问题是验证和测试集中的大部分数据可能来源于网络图片分布。
更好的方法是:训练数据集使用网络图片加部分手机上传图片;验证和测试集只使用手机上传图片。这可以使验证过程针对我们真正关心的分布。
另一个例子是为车载后视镜开发语音命令识别。可以从其他语音项目数据集中获取大量训练数据,验证和测试数据集使用后视镜实际语料。
总之,训练数据集可以来源于不同分布,以获取更多数据。但验证和测试数据集应只来源于我们真正关心的分布,以指导模型优化方向。
原则是:训练集和验证集来自于同一分布,测试集也来自于同一分布,但训练集与验证集/测试集可能来自不同分布。
主要量化:
通过比较这些错误率,可以粗略评估:
定义训练验证集,其分布同训练集,但模型没有在上面训练。这样可以区分:
举几个错误率组合,判断问题类型:
如果训练数据与验证集和测试集来自不同分布,通过错误分析可以发现数据不匹配的问题,可以采取以下措施:
手动检查错误样本,了解训练数据与验证集之间的差异,避免过拟合。
通过错误样本分析,找出验证集中的错误类型,如语音环境嘈杂等。
收集更多与验证集分布相似的数据。如语音环境有噪音,可以对现有语音数据进行合成,模拟车内环境。
数据合成时需注意,如果只使用少量原始数据进行复制和组合,可能导致学习算法过拟合这部分数据。更好的方法是收集不同环境下的真实数据。
对语音数据进行环境音合成时,需使用足够多样的环境音,而不是简单重复使用少量音频。
对计算机视觉数据合成也同理,需要覆盖对象的足够广泛类型,而不是使用少量类型进行过多复制。
使用合成数据前需评估是否可能只模拟问题一个小分支,容易导致过拟合。
总之,通过错误分析深入了解数据差异,收集更多真实数据或以理智态度进行数据合成,可以有效解决训练数据与验证集分布不匹配的问题。
转移学习是一种深度学习技术。它允许我们把一个网络在一个任务上学习到的知识,转移到另一个任务上。
具体来说,我们可以训练一个网络来识别图片中的对象,如猫狗等。然后我们可以删除该网络输出层,添加一个新的输出层来预测X光扫描中的诊断结果。我们也可能只重新训练最后一层,这被称为微调。
转移学习的关键思想是,低级特征比如边缘检测对不同任务都有用。通过在大数据集上预训练识别图片,网络可以学习这些通用特征。这些特征也可以帮助网络在小数据集上学习另一个任务,如放射识别。
转移学习常用于源任务的数据集比目标任务大很多的情况。例如我们可能有100万张图片用于训练,但只有100张X光片。这时利用在图片任务上学习到的知识可以改善放射识别效果。
相反,如果两者数据集规模相当,转移学习效果不明显。因为每个目标任务实例比源任务更有价值。
总体来说,当源目标任务输入相同,源任务数据量大目标任务数据量小,低级特征可能通用时,转移学习效果最明显。它可以利用大量数据帮助解决小数据问题。
多任务学习的概念与传统学习不同,多任务学习同时训练出多个任务的模型,而不是将一个任务训练完毕后再用于下一个任务。
多任务学习的目的是建立一个神经网络来同时预测多个任务。不同于传统学习分别训练多个模型,多任务学习可以让多个任务共享特征,从而提高效率。
以自驾车为例,自驾车需要同时识别多个对象,如行人、车辆、停车标志和交通信号灯。多任务学习可以用一个神经网络进行所有这四个任务的预测。
输入一张图片,输出会有四个预测结果,对应是否有行人、是否有车辆、是否有停车标志和是否有交通灯。与单任务学习不同,一张图片可能同时包含多个对象标签。
多任务学习需要定义整体损失函数。损失函数计算每个样本每个预测任务的损失,然后求平均。
公式为:L = 1/m * ∑(i=1)^m ∑(j=1)^J L(y_ij, y_ijhat)
其中L为逻辑损失函数,m为样本数量,J为任务数量,y_ij为真实标签,y_ijhat为预测标签。
多任务学习的数据集中,可能有些样本只注明部分任务标签,其他标签为空值。这时候损失函数只计算有标签的任务损失。
此外,多任务学习效果好时,每个任务的数据量应该相近。如果一个任务数据量少,其他任务的数据就可以弥补。
任务特征相关性强,可以共享低层特征。
每个任务的数据量相近。
可以训练出各任务表现都不错的神经网络模型。
多任务学习常见于计算机视觉多个目标检测任务。通常效果比分开训练多个单任务模型好。
端到端深度学习是一种机器学习方法。它可以直接将输入映射到输出,而无需经过多个中间步骤。
传统上,许多系统需要分步进行:首先提取手工设计的特征,然后进行分类或回归等。端到端深度学习使用单个神经网络来替代这些步骤,直接学习输入到输出的映射。
端到端深度学习在语音识别、机器翻译等领域取得很好的效果。它可以使用大量语音或文本对的数据集进行训练,而无需设计中间步骤。
但是,端到端方法并不适用于所有问题。如果数据量不够,分步方法可能效果更好。例如,面部识别通常采用两步法:先进行面部检测,然后识别面部 ID。因为每一步的数据都足够多,而端到端数据较少。
同时,端到端方法需要大量数据才能很好地学习。如果数据量小,分步方法可能工作性能更佳。总的来说,必须考虑问题本身特点和可用数据量,选择最合适的方法。
在未来,随着数据量的增加,端到端方法范围可能越来越广。但它并不是一劳永逸的解决方案,仍需根据实际情况定制算法。
端到端深度学习有其优点也有不足,是否使用需综合考虑数据量和问题复杂程度。
优点:
让数据直接表现,避免人为假设将会得到更好结果。
省去设计中间步骤,简化工作流程。
不足:
需要大量数据来学习复杂的x到y映射。
排除了人工设计成分,对数据量小问题无助。
难以学习极为复杂的函数映射。
是否使用端到端学习需考虑以下因素:
数据量是否足够学习问题的复杂程度。
问题的困难程度,如识别面部vs驾驶汽车等。
是否可以将问题分解成多个可以单独学习的子问题。
人工设计知识是否能提高学习效果。
总体来说,对于数据量大、问题相对简单的情况,端到端学习效果较好;而对于数据量小或问题复杂程度高的,分步学习会是更保险的选择。