当前位置: 首页 > 编程日记 > 正文

Debug神经网络的五项基本原则

640?wx_fmt=jpeg


整理 | 琥珀

出品 | AI科技大本营(公众号id:rgznai100)


很多情况下,研究人员会遇到一个问题:使用机器学习框架实现的神经网络可能与理论模型相去甚远。验证这款模型是否可靠,直接方式就是不断修正和调参。例如,在 2018 年 8 月,谷歌大脑的 Ian Goodfellow 等人,通过引入由覆盖性引导的模糊方法(coverage-guided fuzzing,CGF),推出了一款自动为神经网络 debug 的开源库 TensorFuzz。


想要调试机器学习模型其实并不容易,因为找 bug 这个过程需要付出的代价实在太高了。即便是对于相对简单的前馈神经网络,研究人员也需要经常讨论网络架构、权重初始化和网络优化等问题。


正如 Chase Robert 此前在 “如何最小化测试机器学习代码” 的一篇文章中曾描述了这类问题:“神经网络会继续训练,损失会持续减少;训练几小时后会收敛,但效果却很差……”


对此,在单一的工具之外,Cecelia Shao 通过提供一种思路以表达她对调试神经网络所遵循的五项原则:


  1. 从繁就简

  2. 确认模型损失

  3. 检查中间输出和连接

  4. 诊断参数

  5. 追踪工作


1. 从繁就简


具有正规化和学习率(learning rate)调度器的复杂架构的神经网络,将单一神经网络更难调试。


首先,构建一个相对简单的模型:构建一个具有单个隐藏层的小模型,并进行验证;然后逐渐添加模型的复杂性,同时检验模型结构的每个层面(附加层、参数等)是否有效。


其次,在单个数据节点上训练模型:可以使用一两个训练数据点(data point)以确认模型是否过度拟合。神经网络应立即过度拟合,训练准确率为 100%,这表明模型符合;如果模型无法过度拟合这些数据点,就证明太小或存在 bug。


2. 确认模型损失


模型损失是评估模型性能的主要方式,也是模型设置重要参数以进行评估的依据,因此需要确保:


模型损失适用于任务(使用分类交叉熵损失(cross-entropy los)进行多分类问题或使用 focal loss 以解决不平衡问题);

正确衡量损失函数的重要性。如果你使用多种类型的损失函数,如 MSE、对抗性、L1、feature loss,,那么请确保所有损失以正确的方式排序。


3. 检查中间输出和连接


为了调试神经网络,你需要理解神经网络内部的动态、不同中间层所起的作用,以及层与层之间是如何连接起来的。不过,你可能遇到以下问题:


  • 不正确的梯度更新表达式

  • 权重未得到应用

  • 梯度消失或爆发


如果梯度值为 0,则意味着优化器中的学习率可能太小,且梯度更新的表达式不正确。


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


需要指出的是,一种称为 “Dying ReLU” 或“梯度消失”的现象中,ReLU 神经元在学习其权重的负偏差项后将输出为 0。这些神经元不会在任何数据点上得到激活。


你可以采用梯度检验(gradient checking)通过数值方法逼近梯度以检验这些错误。如果它接近计算梯度,则正确实施反向传播。

关于可视化神经网络的主要方法,Faizan Shaikh 举出了三个例子:


初始方法:展现训练模型的整体结构,这些方法包括展示神经网络各个层的形状或过滤器(filters)以及每个层中的参数;

基于激活的方法:破译单个神经元或一组神经元的激活函数;

基于梯度的方法:在训练模型时,操作由前向或后向通道形成的梯度。


还有有许多可用的工具可用于可视化各个层的激活和连接,例如 ConX 和 Tensorboard。


4. 诊断参数


神经网络具有大量彼此相互作用的参数,使得优化也变得非常困难。


Batch size:你希望 batch size 可大到足以准确评估误差梯度,小到足以使随机梯度下降(SGD)可以规范网络。batch size 将导致学习过程在训练过程中以噪声成本快速瘦脸,并可能导致优化困难。


学习率(Learning rate):太低会导致收敛缓慢或陷入局部最小值的风险,太高则会导致优化发散。


机器学习框架,如 Keras、Tensorflow、PyTorch、MXNet 现在都有关于使用学习率收敛缓慢文档或示例:


  • Keras

    https://keras.io/callbacks/#learningratescheduler

  • Tensorflow - https://www.tensorflow.org/api_docs/python/tf/train/exponential_decay

  • PyTorch - https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html

  • MXNet - https://mxnet.incubator.apache.org/versions/master/tutorials/gluon/learning_rate_schedules.html


梯度剪切(Gradient clipping ):在反向传播中,用于剪切参数梯度的最大值或最大范数。


Batch 标准化(normalization ):用于标准化每层的输入,以对抗内部协变量移位问题。


随机梯度下降(Stochastic Gradient Descent ,SGD):使用动量、自适应学习率、Nesterov 更新。


正则化:对于构建可推广模型至关重要,因为它增加了对模型复杂性或极端参数值的惩罚。同时,它显著降低了模型的方差,并且不显著增加偏差。


Dropout:是另一种规范网络以防止过度拟合的技术。在训练时,以某个概率 p(超参数)保持神经元活动来实现丢失,否则将其设置为 0。结果,网络必须在每个训练 batch 中使用不同的参数子集,这减少了特定参数的变化而变得优于其他参数。


5. 全程跟踪工作


通过对工作更好地跟踪,可以轻松查看和重现之前的试验,以减少重复工作。


不过,手动记录信息可能很难做到且进行多次实验,像 comet.ml 这样的工具可以帮助自动追踪数据集、更改代码、实验历史和生产模型,包括关于模型的关键信息,如超参数、模型性能指标和环境细节。


神经网络对数据、参数,甚至 packages 的微小变化都非常敏感,这导致了模型的性能下降。工作跟踪是标准化环境和建模工作流程的第一步。


(本文为 AI科技大本营转载文章,转载请微信联系原作者)


精彩推荐

4月13-14日,CSDN将在北京主办“Python开发者日(2019)”,汇聚十余位来自阿里巴巴、IBM、英伟达等国内外一线科技公司的Python技术专家,还有数百位来自各行业领域的Python开发者,共同探讨Python在不同场景下的的应用优势和实战经验。扫描海报二维码,即刻购票!


640?wx_fmt=png

推荐阅读:


  • 确认!贾扬清加盟阿里,任技术副总裁

  • 心中无码,自然高清 | 联合去马赛克与超分辨率研究论文Pytorch复现

  • Python开源精选,来自近万个项目!平均Star为3293

  • 简说Python生态系统的14年演变

  • 好莱坞大片! 为躲避死亡威胁, 只用15步, 这个密码朋克大叔就从世界"消失"了...

  • 都道业务提升坑大事儿多,但英特尔云方案却说“简单”

  • 小米回应“海量备货致亏损”;美团饿了么“偷听”?苹果发布新 iPad | 极客头条

  • 套路贷+套路培训,IT 培训机构造假术大公开 | 程序员有话说

  • 教训!学 Python 没找对路到底有多惨?

640?wx_fmt=png

❤点击“阅读原文”,查看历史精彩文章。

相关文章:

iOS获取手机型号

2019独角兽企业重金招聘Python工程师标准>>> //不同iPhone设备屏幕比例 iPhone5,4寸,比例16:9 iPhone5c,4寸,比例16:9 iPhone5s,4寸,比例16:9 iPhone6&#x…

【Qt】通过QtCreator源码学习Qt(二):跨平台编程

1、Qt对当前平台的判断 在qsystemdetection.h中根据宏定义来判断当前的操作系统,常用的操作系统如下: Q_OS_WIN、Q_OS_LINUX、Q_OS_MAC、Q_OS_UNIX qsystemdetection.h源码如下 #ifndef QGLOBAL_H # include <QtCore/qglobal.h> #endif#ifndef QSYSTEMDETECTION_H

能说明你的Javascript技术很烂的五个原因

Javascript 在互联网上名声很臭&#xff0c;但你又很难再找到一个像它这样如此动态、如此被广泛使用、如此根植于我们的生活中的另外一种语言。它的低学习门槛让很多人都称它为学 前脚本语言&#xff0c;它另外一个让人嘲笑的东西是动态语言的概念是偏偏使用了高标准的静态数据…

FPGA在人工智能时代的独特优势

来源 | 老石谈芯作者 | 老石&#xff0c;博士毕业于伦敦帝国理工大学电子工程系&#xff0c;现任某知名半导体公司高级FPGA研发工程师&#xff0c;深耕于FPGA的数据中心网络加速、网络功能虚拟化、高速有线网络通信等领域的研发和创新工作。曾经针对FPGA、高性能与可重构计算等…

【Qt】通过QtCreator源码学习Qt(三):linux平台的信号、程序崩溃处理

崩溃处理设置:CrashHandlerSetup 1、原理 在堆中为信号处理函数分配一块区域,作为该函数的栈使用,当系统默认的栈空间用尽时,调用信号处理函数使用的栈是在堆中分配的空间,而不是系统默认的栈中,所以它仍旧可以继续工作,执行崩溃处理程序。 崩溃处理使用的LSM(Linux…

WebGL 3D 工业隧道监控实战

2019独角兽企业重金招聘Python工程师标准>>> 前言 监控隧道内的车道堵塞情况、隧道内的车祸现场&#xff0c;在隧道中显示当前车祸位置并在隧道口给与提示等等功能都是非常有必要的。这个隧道 Demo 的主要内容包括&#xff1a;照明、风机、车道指示灯、交通信号灯、…

设计模式(4)-序列生成器之单例模式

场景&#xff1a;序列生成器 系统中统一的序列生成程序&#xff0c;整个系统统一一套&#xff01;那么就用单例模式吧&#xff01; 首先看看单例模式 1&#xff09;类持有一个自己的实例&#xff0c;而且还是个静态实例。 2&#xff09;类的构造函数为私有属性。 3&#xff09;…

【Qt】通过QtCreator源码学习Qt(四):插件管理PluginManager

1、简介 QtCreator使用插件架构,方便扩展。它的核心是插件管理,主类是PluginManager。 下面是翻译src\libs\extensionsystem\pluginmanager.cpp中关于插件的一些说明,后续会详细分析插件管理的代码。 2、名字空间、主要类介绍 插件使用的名字空间是namespace:ExtensionS…

云从科技3D人体重建技术刷新3项纪录!仅凭照片即可生成精细模型

3 月 19 日&#xff0c;根据官方消息&#xff0c;云从科技基于单帧图像的 3D 人体重建技术同时在 Human3.6M、Surreal 和 UP-3D 三大数据集上创造了最新的世界纪录&#xff0c;将原有最低误差记录大幅降低 30%。Human3.6M 数据集上对比Surreal 数据集上对比UP-3D 数据集上对比3…

windows7/8 安装mysql5.7

简单记录下安装步骤&#xff1a; 网上下载了安装包&#xff0c;一路next默认即可&#xff0c;中间会出现 选择安装x64或 x86版本&#xff0c;这边科普下 x86代表32位操作系统&#xff0c;x64代表64位操作系统。 如果提示3306端口被占用&#xff0c;执行下netstat -aon|findst…

FGMap学习之--三维地图

你是否想让自己的地图以三维的形式展示出来呢&#xff1f;在三维下查看QQ地图、Bing地图、MapABC地图或者自己的地图是否有不一样的感觉呢&#xff1f;今天我们就来看看如果使用FGMap API来实现这个功能。 上次我们做了一个天气预报的示例&#xff0c;今天我们在三维地图上查看…

NLP实践:对话系统技术原理和应用

本文节选自电子工业出版社《自然语言处理实践&#xff1a;聊天机器人技术原理与应用》作者&#xff1a;王昊奋&邵浩&李方圆&张凯&宋亚楠以下是节选内容按照技术实现&#xff0c;我们可将任务驱动的对话系统划分为如下两类&#xff1a;模块化的对话系统分模块串…

沃尔沃加入英伟达阵营 2021年开卖自动驾驶汽车

随着研发的深入&#xff0c;自动驾驶行业越来越显现出合纵连横的趋势。本周&#xff0c;英伟达阵营再次迎来新的合作伙伴——沃尔沃和瑞典汽车零部件供应商Autoliv。其实此前沃尔沃的自动驾驶项目“DriveMe”所用的测试车辆就搭载了英伟达DrivePX平台&#xff0c;该公司的自动驾…

【Qt】通过QtCreator源码学习Qt(五):QLoggingCategory管理、分类、过滤打印信息

1、QLoggingCategory简介 在QtCreator源码中新学到一个类QLoggingCategory。 QLoggingCategory可以控制打印输出类别和区域。方便在调试时,过滤掉不关心的打印信息。 2、使用方法 声明 在头文件中声明,供其它文件使用 #include <QLoggingCategory> Q_DECLARE_LOGG…

个人随笔——衰人自叙卷壹

为什么80%的码农都做不了架构师&#xff1f;>>> 臣本菜鸟&#xff0c;求学于锦江&#xff0c;致力就职于专业&#xff0c;不求闻达于外企。HR不以臣级低&#xff0c;BOSS亲点&#xff0c;后召臣入研发部门&#xff0c;晓臣以编码之事&#xff0c;由是感激&#xff…

【Qt】通过QtCreator源码学习Qt(六):命令行参数解析实现

参考下大神的命令行参数解析是如何是实现的 //使用const char []代替宏定义字符串,我以前都是用const QString,想想好傻 const char SETTINGS_OPTION[] = "-settingspath"; const char INSTALL_SETTINGS_OPTION[] = "-installsettingspath"; const char…

【黑客浅析】像黑客一样思考

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 作者&#xff1a;由云鼎实验室发表在云社区 网络安全里经常说的一句话是未知攻焉知防&#xff0c;基本所有的安全人员也是一名黑客&#xff0c;在黑客攻击愈发普遍的今天&#xff0c;如何更好的防御黑客攻击…

Python的最佳学习方式

作者 | GENEVIEVE CARLTON译者 | 姜松浩责编 | 屠敏转载自 CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;以下为译文&#xff1a;如今想要学习 Python 的人拥有比以往更多的资源。但是&#xff0c;这也可能使筛选书籍、课程和其他 Python 资源变得相对困难。并不是每个人…

Android 系统启动过程

文章来源于网络&#xff0c;心得来源于整理。请尊重作者&#xff1a;http://hi.baidu.com/guoxiaoming/blog/item/24e9e9f8c9628f1fd9f9fd89.html/cmtid/7525d63fb437a6cd7c1e713bAndroid 系统启动过程Android 从系统启动有4个步骤: 1, init进程启动 2. Native服务启动 3.Syste…

【Qt】通过QtCreator源码学习Qt(七):插件管理类简介

一、名字空间:ExtensionSystem ExtensionSystem命名空间提供了属于核心插件系统的类。 ExtensionSystem包含插件管理器及其支持类,以及必须由插件提供者实现的IPlugin接口。 二、ExtensionSystem::PluginManager:插件主类 ExtensionSystem::PluginManager简介 三、Exten…

视频直播常见问题与解决办法汇总【系列二—直播截图】

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; 使用场景 用户常需要对视频直播的内容进行分析。例如&#xff0c;需要对直播中的某一帧的内容作为封面图片或者对于直播内容进行鉴黄以查看内容合法性等需求。因此&#xff0c;视频直播提供了实时截图功…

智能猫窝是如何诞生的?详解百度大脑的开放生态

3 月 20 日下午&#xff0c;首场百度大脑开放日在北京中关村创业大街百度大脑创新体验中心举行。百度 AI 技术生态部总经理喻友平&#xff0c;就百度大脑平台与生态进行了全面的详解&#xff0c;同时展示了百度大脑开放平台 Q1 核心升级内容&#xff0c;包括语音技术、视觉技术…

我都陪你坐了一天了,你好歹说句话啊!吖的,谱也忒大了。。。

我都陪你坐了一天了&#xff0c;你好歹说句话啊&#xff01;吖的&#xff0c;谱也忒大了。。。 查看图片 转载于:https://blog.51cto.com/guohongzhi521/552922

【linux】Linux下LCD自动熄屏解决方法

1、原因分析 参考博客&#xff1a; https://blog.csdn.net/BOJUE01/article/details/53468026?locationNum5&fps1 https://blog.csdn.net/mao0514/article/details/46562057 正常情况下Linux会在一段时间后默认关闭屏幕&#xff0c;默认为10分钟。开始一直认为是Gnome或K…

翻译机之后,搜狗再推智能硬件产品录音笔

去年 10 月&#xff0c;搜狗 AI 事业部总经理张博告诉 AI科技大本营&#xff08;ID:rgznai100&#xff09;&#xff0c;翻译机只是搜狗做智能硬件的开始&#xff0c;接下里半年里&#xff0c;他们还将发布数款集成了搜狗 AI 技术的硬件产品。 3 月 18 日&#xff0c;搜狗举办了…

小米正用时序数据库,解决这个“硬核”问题

参加 2019 Python开发者日&#xff0c;请扫码咨询 ↑↑↑作者 | 许俊红来源 | 小米云技术&#xff08;id&#xff1a;mi-cloud-tech&#xff09;时序数据根据维基百科的定义[1]&#xff0c;时间序列是一组按照时间发生先后顺序进行排列的数据点序列。时序数据库&#xff08;Tim…

【Qt】通过QtCreator源码学习Qt(八):插件生命周期及对应状态(代码走读)

1、简介 PluginManager管理插件IPlugin的生命周期,从初始化插件到删除插件共八个状态。插件状态表——PluginSpec::enum State { Invalid, Read, Resolved, Loaded, Initialized, Running, Stopped, Deleted}; 插件IPlugin的状态记录在与插件对应的插件说明PluginSpec中,状态…

第七课 环境变量PATH,cp、mv及查看文档cat/more/less/head/tail命令

一、环境变量&#xff08;PATH&#xff09;echo $PATH 查看环境变量的目录PATH$PATH:/tmp/ &#xff08;目录&#xff09;给一个目录赋值环境变量&#xff1b; 让以上环境变量永久生效&#xff1a; 编辑 vi /etc/profile/ 把以上参数加入到文本的最后&#xff0c;退出&#x…

asp.net获取页面url参数值的实现代码实例

asp.net获取页面url参数值的实现代码实例 file: default.aspx.cs using system; using system.data; using system.configuration; using system.collections; using system.web; using system.web.security; using system.web.ui; using system.web.ui.webcontrols; using sys…

【Qt】编译QtCreator

一、Ubuntu14.04编译QtCreator 4.0.3 1、准备工作 编译工具要求 Qt >= 5.5.0; g++ >= 4.7; 2、编译步骤 cd <QtCreator源码目录> qmake -r make 3、安装 make install INSTALL_ROOT=<指定目录> 二、Win10编译QtCreator 4.7.1 1、准备工作 编译工具…