0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机器学习模型切实可行的优化步骤

汽车玩家 来源:AI公园 作者:Cecelia Shao 2020-05-04 12:08 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

导读

这篇文章提供了可以采取的切实可行的步骤来识别和修复机器学习模型的训练、泛化和优化问题。

众所周知,调试机器学习代码非常困难。即使对于简单的前馈神经网络也是这样,你经常会在网络体系结构做出一些决定,重初始化和网络优化——所有这些会都导致在你的机器学习代码中出现bug。

正如Chase Roberts在一篇关于“How to unit test machine learning code”的优秀文章中所写的,他遇到的麻烦来自于常见的陷阱:

代码不会崩溃,不会引发异常,甚至不会变慢。

训练网络仍在运行,损失仍将下降。

几个小时后,数值收敛了,但结果很差

那么我们该怎么做呢?

本文将提供一个框架来帮助你调试神经网络:

从最简单的开始

确认你的损失

检查中间输出和连接

对参数进行诊断

跟踪你的工作

请随意跳转到特定的部分或通读下面的内容!请注意:我们不包括数据预处理或特定的模型算法选择。对于这些主题,网上有很多很好的资源。

1. 从最简单的开始

一个具有复杂结构和正则化以及学习率调度程序的神经网络将比一个简单的网络更难调试。我们在第一点上有点欺骗性,因为它与调试你已经构建的网络没有什么关系,但是它仍然是一个重要的建议!

从最简单的开始:

首先建立一个更简单的模型

在单个数据点上训练模型

首先,构建一个更简单的模型

首先,构建一个只有一个隐藏层的小型网络,并验证一切正常。然后逐步增加模型的复杂性,同时检查模型结构的每个方面(附加层、参数等),然后再继续。

在单个数据点上训练模型

作为一个快速的完整性检查,你可以使用一两个训练数据点来确认你的模型是否能够过拟合。神经网络应该立即过拟合,训练精度为100%,验证精度与你的模型随机猜测相匹配。如果你的模型不能对这些数据点进行过拟合,那么要么是它太小,要么就是存在bug。

即使你已经验证了模型是有效的,在继续之前也可以尝试训练一个(或几个)epochs。

2. 确认你的损失

你的模型的损失是评估你的模型性能的主要方法,也是模型评估的重要参数,所以你要确保:

损失适合于任务(对于多分类问题使用类别交叉熵损失或使用focal loss来解决类不平衡)

你的损失函数在以正确的尺度进行测量。如果你的网络中使用了不止一种类型的损失,例如MSE、adversarial、L1、feature loss,那么请确保所有损失都按正确的顺序进行了缩放

注意,你最初的损失也很重要。如果模型一开始就随机猜测,检查初始损失是否接近预期损失。在Stanford CS231n coursework中,Andrej Karpathy提出了以下建议:

在随机表现上寻找正确的损失。确保在初始化小参数时得到预期的损失。最好先单独检查数据的loss(将正则化强度设置为零)。例如,对于使用Softmax分类器的CIFAR-10,我们期望初始损失为2.302,因为我们期望每个类的随机概率为0.1(因为有10个类),而Softmax损失是正确类的负对数概率,因此:-ln(0.1) = 2.302。

对于二分类的例子,只需对每个类执行类似的计算。假设数据是20%的0和80%的1。预期的初始损失是- 0.2ln(0.5) - 0.8ln(0.5) = 0.693147。如果你的初始损失比1大得多,这可能表明你的神经网络权重不平衡(即初始化很差)或者你的数据没有标准化。

3. 检查内部的输出和连接

要调试神经网络,通常了解神经网络内部的动态以及各个中间层所起的作用以及这些中间层之间如何连接是很有用的。你可能会遇到以下错误:

梯度更新的表达式不正确

权重更新没有应用

梯度消失或爆炸

如果梯度值为零,这可能意味着优化器中的学习率可能太小,或者你遇到了上面的错误#1,其中包含梯度更新的不正确的表达式。

除了查看梯度更新的绝对值之外,还要确保监视激活的大小、权重的大小和每个层的更新相匹配。例如,参数更新的大小(权重和偏差)应该是1-e3。

有一种现象叫做“死亡的ReLU”或“梯度消失问题”,ReLU神经元在学习了一个表示权重的大的负偏置项后,会输出一个零。这些神经元再也不会在任何数据点上被激活。

你可以使用梯度检查来检查这些错误,通过使用数值方法来近似梯度。如果它接近计算的梯度,则正确地实现了反向传播。

Faizan Shaikh描述了可视化神经网络的三种主要方法:

初步方法- 向我们展示训练模型整体结构的简单方法。这些方法包括打印出神经网络各层的形状或滤波器以及各层的参数。

基于激活的方法- 在这些方法中,我们解码单个神经元或一组神经元的激活情况,以直观地了解它们在做什么

基于梯度的方法- 这些方法倾向于在训练模型时操作由前向和后向传递形成的梯度(包括显著性映射和类激活映射)。

有许多有用的工具可以可视化单个层的激活和连接,比如ConX和Tensorboard。

使用ConX生成的动态呈现可视化示例

4. 参数诊断

神经网络有大量的参数相互作用,使得优化变得困难。请注意,这是一个活跃的研究领域,所以下面的建议只是简单的出发点。

Batch size- 你希望batch size足够大,能够准确地估计错误梯度,但又足够小,以便小批随机梯度下降(SGD)能够使你的网络归一化。小的batch size将导致学习过程以训练过程中的噪声为代价快速收敛,并可能导致优化困难。论文On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima描述了:

在实践中已经观察到,当使用一个较大的batch size时,模型的质量会下降,这可以通过它的泛化能力来衡量。我们研究了在大批量情况下泛化下降的原因,并给出了支持large-batch方法趋向于收敛于训练和测试函数的sharp的极小值这一观点的数值证据——众所周知,sharp的极小值导致较差的泛化。相比之下,小batch size的方法始终收敛于平坦的最小值,我们的实验支持一个普遍的观点,即这是由于梯度估计中的固有噪声造成的。

学习速率- 学习率过低将导致收敛速度慢或陷入局部最小值的风险,而学习速率过大导致优化分歧,因为你有跳过损失函数的更深但是更窄部分的风险。考虑将学习率策略也纳入其中,以随着训练的进展降低学习率。CS231n课程有一大部分是关于实现退火学习率的不同技术。

梯度裁剪- 在反向传播期间的通过最大值或最大范数对梯度进行裁剪。对于处理可能在上面的步骤3中遇到的任何梯度爆炸非常有用。

Batch normalization- Batch normalization用于对每一层的输入进行归一化,以解决内部协变量移位问题。如果你同时使用Dropout和Batch Norm,请确保在Dropout上阅读下面的要点。

本文来自Dishank Bansal的”TensorFlow中batch norm的陷阱和训练网络的健康检查“,里面包括了很多使用batch norm的常见错误。

随机梯度下降(SGD)- 有几种使用动量,自适应学习率的SGD,和Nesterov相比并没有训练和泛化性能上的优胜者。一个推荐的起点是Adam或使用Nesterov动量的纯SGD。

正则化- 正则化对于构建可泛化模型至关重要,因为它增加了模型复杂度或极端参数值的代价。它显著降低了模型的方差,而没有显著增加其偏差。如CS231n课程所述:

通常情况下,损失函数是数据损失和正则化损失的总和(例如L2对权重的惩罚)。需要注意的一个危险是正则化损失可能会超过数据损失,在这种情况下,梯度将主要来自正则化项(它通常有一个简单得多的梯度表达式)。这可能会掩盖数据损失的梯度的不正确实现。

为了检查这个问题,应该关闭正则化并独立检查数据损失的梯度。

Dropout- Dropout是另一种正则化你的网络,防止过拟合的技术。在训练过程中,只有保持神经元以一定的概率p(超参数)活动,否则将其设置为零。因此,网络必须在每个训练批中使用不同的参数子集,这减少了特定参数的变化成为主导。

这里需要注意的是:如果您同时使用dropout和批处理规范化(batch norm),那么要注意这些操作的顺序,甚至要同时使用它们。这仍然是一个活跃的研究领域,但你可以看到最新的讨论:

来自Stackoverflow的用户MiloMinderBinder:Dropout是为了完全阻断某些神经元的信息,以确保神经元不相互适应。因此,batch norm必须在dropout之后进行,否则你将通过标准化统计之后的数据传递信息。”

来自arXiv:Understanding the Disharmony between Dropout and Batch Normalization by Variance Shift — 从理论上讲,我们发现,当我们将网络状态从训练状态转移到测试状态时,Dropout会改变特定神经单元的方差。但是BN在测试阶段会保持其统计方差,这是在整个学习过程中积累的。当在BN之前的使用Dropout时,该方差的不一致性(我们将此方案命名为“方差漂移”)导致不稳定的推断数值行为,最终导致更多的错误预测。

5. 跟踪你的网络

你很容易忽视记录实验的重要性,直到你忘记你使用的学习率或分类权重。通过更好的跟踪,你可以轻松地回顾和重现以前的实验,以减少重复的工作(也就是说,遇到相同的错误)。

然而,手工记录信息对于多个实验来说是很困难的。工具如Comet.ml可以帮助自动跟踪数据集、代码更改、实验历史和生产模型(这包括关于模型的关键信息,如超参数、模型性能指标和环境细节)。

你的神经网络对数据、参数甚至版本中的细微变化都非常敏感,这会导致模型性能的下降。跟踪你的工作是开始标准化你的环境和建模工作流的第一步。

机器学习模型切实可行的优化步骤

快速回顾

我们希望这篇文章为调试神经网络提供了一个坚实的起点。要总结要点,你应该:

从简单的开始— 先建立一个更简单的模型,然后通过对几个数据点的训练进行测试

确认您的损失— 检查是否使用正确的损失,并检查初始损失

检查中间输出和连接— 使用梯度检查和可视化检查看图层是否正确连接,以及梯度是否如预期的那样更新

诊断参数— 从SGD到学习率,确定正确的组合(或找出错误的)

跟踪您的工作— 作为基线,跟踪你的实验过程和关键的建模组件

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4845

    浏览量

    108341
  • 机器学习
    +关注

    关注

    67

    文章

    8570

    浏览量

    137390
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Nordic定制Neuton模型集成到nRF Connect SDK应用中的完整流程

    过去,极小尺寸、电池供电的物联网设备几乎无法实现边缘人工智能,但如今情况已彻底改变。随着面向 CPU 运行的边缘 AI、由用户生成的超微型机器学习模型 —— 定制 Neuton 模型
    的头像 发表于 05-06 15:42 177次阅读
    Nordic定制Neuton<b class='flag-5'>模型</b>集成到nRF Connect SDK应用中的完整流程

    微电网经济调度理论:成本最小化与效益最大化的优化模型

    与效益最大化的具体量化指标;约束条件是模型的运行底线,确保调度方案的可行性与安全性;优化变量是模型的调控对象,决定了调度方案的实施路径。
    的头像 发表于 03-12 11:05 309次阅读
    微电网经济调度理论:成本最小化与效益最大化的<b class='flag-5'>优化</b><b class='flag-5'>模型</b>

    数据就绪型智能机器助力制造商释放潜在价值

    在全球制造业加速向智能化转型的背景下,企业普遍面临提升运营效率、增强生产敏捷性的挑战。为此,亚太地区已有约 93% 的制造商开始应用或正在评估需要应用的智能制造技术。然而,仅仅采集数据已不足以应对动态的市场需求,如何将数据转化为切实可行的洞察成为关键。
    的头像 发表于 03-02 11:44 576次阅读

    强化学习会让自动驾驶模型学习更快吗?

    是一种让机器通过“试错”学会决策的办法。与监督学习不同,监督学习是有人提供示范答案,让模型去模仿;而强化学习不会把每一步的“正确答案”都告诉
    的头像 发表于 01-31 09:34 931次阅读
    强化<b class='flag-5'>学习</b>会让自动驾驶<b class='flag-5'>模型</b><b class='flag-5'>学习</b>更快吗?

    机器学习和深度学习中需避免的 7 个常见错误与局限性

    无论你是刚入门还是已经从事人工智能模型相关工作一段时间,机器学习和深度学习中都存在一些我们需要时刻关注并铭记的常见错误。如果对这些错误置之不理,日后可能会引发诸多麻烦!只要我们密切关注
    的头像 发表于 01-07 15:37 394次阅读
    <b class='flag-5'>机器</b><b class='flag-5'>学习</b>和深度<b class='flag-5'>学习</b>中需避免的 7 个常见错误与局限性

    基于ETAS嵌入式AI工具链将机器学习模型部署到量产ECU

    AI在汽车行业的应用日益深化,如何将机器学习领域的先进模型(如虚拟传感器)集成到ECU软件中,已成为业界面临的核心挑战。
    的头像 发表于 12-24 10:55 6488次阅读
    基于ETAS嵌入式AI工具链将<b class='flag-5'>机器</b><b class='flag-5'>学习</b><b class='flag-5'>模型</b>部署到量产ECU

    芯行纪机器学习优化工具AmazeME-Place简介

    布局(Placement)是芯片后端设计中最需要全局视角的步骤,它前置约束所有后续环节,直接决定了PPAC(Performance、Power、Area、Congestion)各项指标趋势和设计目标实现的可行性。
    的头像 发表于 08-13 14:11 3379次阅读
    芯行纪<b class='flag-5'>机器</b><b class='flag-5'>学习</b><b class='flag-5'>优化</b>工具AmazeME-Place简介

    超小型Neuton机器学习模型, 在任何系统级芯片(SoC)上解锁边缘人工智能应用.

    Neuton 是一家边缘AI 公司,致力于让机器 学习模型更易于使用。它创建的模型比竞争对手的框架小10 倍,速度也快10 倍,甚至可以在最先进的边缘设备上进行人工智能处理。在这篇博文
    发表于 07-31 11:38

    FPGA在机器学习中的具体应用

    随着机器学习和人工智能技术的迅猛发展,传统的中央处理单元(CPU)和图形处理单元(GPU)已经无法满足高效处理大规模数据和复杂模型的需求。FPGA(现场可编程门阵列)作为一种灵活且高效的硬件加速平台
    的头像 发表于 07-16 15:34 3175次阅读

    通过NVIDIA Cosmos模型增强机器人学习

    通用机器人的时代已经到来,这得益于机械电子技术和机器人 AI 基础模型的进步。但目前机器人技术的发展仍面临一个关键挑战:机器人需要大量的训练
    的头像 发表于 07-14 11:49 1389次阅读
    通过NVIDIA Cosmos<b class='flag-5'>模型</b>增强<b class='flag-5'>机器人学习</b>

    无法在NPU上推理OpenVINO™优化的 TinyLlama 模型怎么解决?

    在 NPU 上推断 OpenVINO™优化的 TinyLlama 模型。 遇到的错误: get_shape was called on a descriptor::Tensor with dynamic shape
    发表于 07-11 06:58

    无刷直流电机的保护电路

    ,以免对电路和电机造成损害,并且做了相应的欠压、过压,过流测试实验。实践应用表明,该设计的几种方案切实可行,能够在异常情况下及时对电机做出保护动作。 纯分享帖,点击下方附件免费获取完整资料~~~ *附件
    发表于 06-26 13:38

    模型在半导体行业的应用可行性分析

    的应用,比如使用机器学习分析数据,提升良率。 这一些大模型是否真的有帮助 能够在解决工程师的知识断层问题 本人纯小白,不知道如何涉足这方面 应该问什么大模型比较好,或者是看什么视频能够
    发表于 06-24 15:10

    边缘计算中的机器学习:基于 Linux 系统的实时推理模型部署与工业集成!

    你好,旅行者!欢迎来到Medium的这一角落。在本文中,我们将把一个机器学习模型(神经网络)部署到边缘设备上,利用从ModbusTCP寄存器获取的实时数据来预测一台复古音频放大器的当前健康状况。你将
    的头像 发表于 06-11 17:22 1199次阅读
    边缘计算中的<b class='flag-5'>机器</b><b class='flag-5'>学习</b>:基于 Linux 系统的实时推理<b class='flag-5'>模型</b>部署与工业集成!

    知识分享 | 评估模型架构——如何实现?

    确保良好的模型架构对于开发安全和可靠的软件非常重要。本文为您介绍MES Model Examiner® (MXAM)如何优化模型架构,简化复杂度管理步骤,并最终提升软件质量。
    的头像 发表于 06-05 11:46 794次阅读
    知识分享 | 评估<b class='flag-5'>模型</b>架构——如何实现?