构建新的云原生系统或是将遗留系统云原生化,如何少走弯路?点击查看 了解详情
写点什么

性能翻倍!斯坦福 Matei 团队推出机器学习模型优化新方法

  • 2019 年 3 月 19 日
  • 本文字数:3066 字

    阅读完需:约 10 分钟

性能翻倍!斯坦福Matei团队推出机器学习模型优化新方法

机器学习模型正在被越来越多地部署在任务关键型系统中,比如自动驾驶汽车。然而,这些模型可能会因为各种复杂的原因失效,应用程序开发人员必须找到调试这些模型的方法。我们建议在 ML 模型调试任务中使用软件断言。有了模型断言,ML 开发人员就可以为模型输出指定特定的约束。模型断言可以是确定性的或者“模糊的”,即概率性的。我们提出了几种在 ML 调试中使用模型断言的方法,包括运行时监控、执行纠正动作,或进行“硬采样”,通过人为标记和弱监督学习进一步训练模型。在视频分析任务中,我们发现简单的断言可以有效地发现错误,而且纠正规则可以有效地纠正模型输出(分别高达 100%和 90%的准确性)。另外,我们还收集和标记了部分会触发断言的视频,并发现这个过程可以将模型性能提高 2 倍。


机器学习在现实世界中已经得到了越来越广泛的应用,比如在自动驾驶汽车或医疗保健领域。然而,ML 模型可能会失败,而且失败的方式混乱而复杂。我们认为,开发可靠的工具来确保模型质量和不断改进模型是至关重要的,特别是当 ML 被部署在关键型任务系统中时。


机器学习质量保证的前期工作主要集中在训练数据验证和清理、训练数据可视化和形式验证等方面。


这篇文章将介绍如何通过软件断言来监控 ML 模型和收集数据,并以此来改进 ML 模型。与以前的工作相反,模型断言允许领域专家在不了解 ML 模型内部结构的情况下指定模型输出的结构约束。


与 ML 类似,传统软件也可能很复杂,它们可能已经被成功地部署在医疗设备和宇宙飞船等关键型任务系统中。这些成功的部署在一定程度上要归功于严格的质量保证工具——包括断言、单元测试、冒烟测试和回归测试。这篇文章将着重介绍如何在 ML 应用程序中使用模型断言,包括在部署阶段监控模型,以及在训练阶段改进模型。


什么是模型断言

模型断言将传统的程序断言应用在 ML 部署中。传统的程序断言(例如,assert(len(array) > 0))可以用来检查程序状态的不变性。它们是传统软件的第一道防线,可以显著减少 bug 的数量。相反,模型断言允许领域专家为机器学习模型指定输入和输出约束。与使用传统断言的方式类似,我们可以使用模型断言来监控模型。此外,还有一些用于在 ML 上下文中使用断言的方法,通过主动学习和弱监督来提高模型精度。


示例

在视频分析场景中,用户可能会运行预训练的对象检测模型(如 SSD)来识别实体(如汽车)。这些模型存在常见的闪烁问题,即模型可能会看到对象在连续帧之间消失了,导致结果不精确。下面的视频就演示了这个问题,汽车周围的边框在连续的帧之间忽明忽暗:



虽然模型的内部很复杂,但对模型的输出进行简单的断言可以很容易地检测出这个错误。对象检测模型会在每帧输出一个边框列表。如果在第 n 帧出现了一个边框,断言需要检查最近的帧中是否也出现了边框,以及预测中是否出现了空白。下面的 Python 伪代码展示了如何通过编程检查不正确的闪烁行为:


cur_boxes = boxes(cur_frame)for i in range(cur_frame - 1, cur_frame - 10):  similar_boxes = get_similar_cars(cur_boxes, boxes(i))  if len(similar_cars) == 0: # no similar boxes, check for flickering    for j in range(i-1, cur_frame - 10):      overlapping_boxes = get_similar_cars(cur_boxes, boxes(j))      if len(overlapping_boxes) == 0: # car doesn't appear in this frame either        continue      else: # car appeared in some, but not all of the previous frames        raise FlickerException  else:    cur_boxes = similar_boxes
复制代码


这里使用了一个原型断言系统实现了闪烁检查。除了识别闪烁之外,还有检查其他不正确行为的断言,比如多个对象的重叠或嵌套。


如何使用模型断言

以下是在运行阶段和训练阶段使用模型断言的四种方法。


  • 运行时监控:模型断言可以被用在分析管道中,用来收集与不正确行为相关的统计信息,以便确定模型可能会出现哪些类别的错误。

  • 纠正动作:在运行时,如果发生模型断言,就会触发纠正动作,例如将控制权返回给人类操作员。

  • 主动学习:可以通过断言找到导致模型失败的输入。分析人员可以找出触发闪烁断言的帧,对它们进行人工重新标记,然后使用这些帧重新训练模型。

  • 弱监督:如果进行人工标记的成本很高,可以将断言与简单的自动纠正规则关联起来,这些规则会自动重新标记不正确的模型输出。对于闪烁问题,纠正规则可以通过在相邻帧之间插入边框来填充缺少的边框,如下图所示。这些被自动标记的帧可以用来重新训练模型。



通过断言来改进模型质量

上面的内容已经评估了使用断言来改进对象检测模型的有效性。要对结果进行更全面的评估,还需要断言的准确性,具体请参阅研讨会论文(https://ddkang.github.io/papers/2018/omg-nips-ws.pdf)。


数据集包含了怀俄明州一个十字路口安全摄像头拍摄的数天视频数据。为了评估模型断言,我们使用断言来训练 SSD,并对 MS-COCO 进行预训练。通过与 Mask-RCNN(https://arxiv.org/pdf/1703.06870.pdf)进行比较,我们获得了再训练模型相对于基线预训练模型的准确性。


我们基于第一天的视频数据运行预训练模型,并将其作为基线。然后,我们针对这些输出运行断言,以便捕获触发这些错误的帧。在主动学习实验中,我们使用事实数据重新标记了这些帧。在弱监督实验中,我们构造了一个纠正规则,在缺失边框的相邻帧中插入边框,并基于该规则对不正确帧进行重新标记。然后,我们使用这些重新标记的帧对基线模型进行再训练,以此来改进基线模型。


定量改进

下图显示了主动学习和弱监督对提高模型精度的作用。基线模型达到了 0.4 mAP,这是用来判断目标检测模型精度度的一个常用指标。


主动学习:对于主动学习,我们还将随机采样帧作为简单基线与再训练进行比较。我们发现,使用触发每个断言的帧进行再训练,并结合使用两个断言,可以在 mAP 方面获得比预训练模型和随机基线更大的改进。


弱监督:如果使用事实标签的成本非常高,可以使用闪烁断言和相关的纠正规则对模型进行再训练,这样也可以改进 mAP。



为了了解使用模型断言作为主动学习或弱监督的形式是否可以改进模型性能,我们收集了 9 小时视频中每个触发断言的帧和随机帧作为训练数据。我们精挑细选了以下的 SSD 变种,在 MS-COCO 上使用 2000 帧进行预训练:


  • 使用 1000 个触发闪烁断言的帧和 1000 个随机帧训练 SSD,并通过弱监督进行标记。

  • 使用 2000 个随机帧训练 SSD,并通过主动学习进行标记,作为基线。

  • 使用 1000 个触发闪烁断言的帧和 1000 个随机帧训练 SSD,并通过主动学习进行标记。

  • 使用 600 个触发多边框断言的帧和 1400 个随机帧训练 SSD,并通过主动学习进行标记。

  • 使用 1000 个触发闪烁断言的帧、600 个触发多边框闪烁断言的帧和 1000 个随机帧训练 SSD,并通过主动学习进行标记。



各种 SSD 的性能比较。可以看到,弱监督和主动学习都可以提高 SSD 的性能,而基于断言的主动学习要优于随机标记。



各种 SSD 出现的闪烁帧数。可以看到,经过重新训练,闪烁的帧数减少了,而且基于断言的主动学习要优于随机标记。


定性改进

下面的两个视频分别展示了基线预训练模型(上)和最佳再训练模型(下)。再训练模型使用了两个断言进行主动学习再训练,并标记了视频的一个片段。我们可以看到,再训练的模型错误更少,它不会产生闪烁或者不会包含不正确的重叠边框。




如果你也遇到了模型质量问题或希望尝试用模型断言方法改进模型,可以发送电子邮件至 modelassertions@cs.stanford.edu 与研究团队联系!


研究论文链接:


https://ddkang.github.io/papers/2018/omg-nips-ws.pdf


英文原文:


https://dawn.cs.stanford.edu//2019/03/11/modelassertions/


2019 年 3 月 19 日 08:002574
用户头像

发布了 38 篇内容, 共 28.6 次阅读, 收获喜欢 201 次。

关注

评论 1 条评论

发布
用户头像
niubility
2019 年 03 月 19 日 18:40
回复
没有更多了
发现更多内容

HTTPS协议

IT视界

软件研发团队如何做好项目进度管理?

万事ONES

项目管理 研发管理 需求 ONES

代码写的烂才是原罪?字节三面+微信四面+PayPal四面,大厂面经分享

Java 程序员 架构 面试

阿里都会问些什么?4面阿里余额宝Java高级技术岗

Java架构师迁哥

即时通讯系列-WorkPlus简介

WorkPlus Lite

开源 即时通讯 IM 办公自动化

深度剖析:Redis分布式锁到底安全吗?看完这篇文章彻底懂了!

Kaito

redis zookeeper 分布式 后端

给你一直尝试和创新的机会!走进亚马逊云科技MRC团队

亚马逊云科技 (Amazon Web Services)

别乱打日志了,这才是正确的打日志姿势!

xcbeyond

日志 规范 6月日更

加快技术应用规模化 建设世界先进水平区块链产业生态

CECBC

@成都的Coder

蚂蚁集团移动开发平台 mPaaS

flutter 移动开发 mPaaS

🏆【声网 Agora】「PC端实现实时语音通讯4.x」

浩宇天尚

WebRTC RTC征文大赛 声网 6月日更

全过程智慧教育,看北京四中网校和亚马逊云科技如何实现?| 精选案例

亚马逊云科技 (Amazon Web Services)

《原则》(八)

Changing Lin

6月日更

不管是三胎还是App!指望“拉新”太难了,还是要靠老用户!

友盟全域数据

APP开发

iOS开发-Objective-C 中的 MVVM 模式介绍

iOSer

ios objective-c MVVM ios开发

本科毕业六年,备战一个月,四面阿里巴巴定级P7

Java架构师迁哥

聚焦机器同传前沿进展,第二届机器同传研讨会将在NAACL举办

百度大脑

人工智能 机器

从底层原理出发,了解Linux内核之内存管理

Linux服务器开发

后端 操作系统 内存管理 Linux内核 底层原理

限流篇,欣赏阿里开源Sentinel

下雨喽

设计 sentinel 限流 架构·

国内低代码产品是如何定位的?这3类,企业可自行对号入座

优秀

低代码

探讨AI人才培养新思路,2021北京智源大会百度AI人才培养论坛召开

百度大脑

AI 人才培养

JavaScript 中数组 sort() 方法的基本使用

编程三昧

JavaScript 大前端 数组 排序 js

人人视频被迫下架:打击盗版视频网站任重道远

石头IT视角

项目管理与项目集管理、项目组合管理的区别?

万事ONES

项目管理 项目 PMO ONES

不愧是清华大佬,一个联机对战游戏就把23种设计模式给抽丝剥茧了

Java架构师迁哥

pyFBI让Python运行的性能可视化

IT蜗壳-Tango

IT蜗壳 IT蜗壳教学 6月日更

上云就上百度智能云,百度智能计算峰会召开,AI原生云全新升级

百度大脑

AI 智能云 峰会

大陆集团携手亚马逊云科技打造创新的汽车软件平台

亚马逊云科技 (Amazon Web Services)

为什么说产品经理也要学点技术?

LigaAI

产品经理 研发管理 技术团队 产品设计与思考

5W1H聊开源之What——开源协议有哪些?

禅道项目管理

开源

性能翻倍!斯坦福Matei团队推出机器学习模型优化新方法_AI_Daniel Kang_InfoQ精选文章