通过机器学习实现流量分析自动化
总结
数据科学和机器学习为改善公共空间提供了新的机遇。将这些技术用于智能城市可以使我们的社区更宜居、更可持续,并有利于当地经济。他们可以帮助理解城市规划和城市设计中的关键问题,如公共空间如何使用,有多少用户,用户是谁。
在本帖中,我们将查看一个概念验证系统,我们实现该系统是为了使用机器学习进行视频分析来回答这些问题。这是一种易于部署且经济高效的方法。我们将特别关注十字路口,那里的设计会影响交通拥堵、当地商业和行人安全。我们自身的经历、零事故目标(消除道路上的严重事故)和智慧城市计划推动了我们的工作。
要了解更多关于我们的技术,请给我们发一条消息。
“规划闹市区最好的方法,就是看看今天人们是怎么使用它的;寻找它的优势,并加以利用和加强。”—简·雅各布斯
简介
Automated traffic detection and tracking, showing bounding boxes of tracked objects and lane counter on West Cordova at Abbot Street in Vancouver.
城市规划者的任务是建设实用、宜居和支持经济增长的城市。此外,他们还必须考虑环境影响、未来增长和不同用户群的需求。我们能否利用数据科学和机器学习,通过增加他们做出决策所需的信息来支持他们完成这些任务?**我们开发了一个基于自动视频分析的原型系统,该系统可以提供关于如何改善公共空间的关键信息。**在本帖中,我们将特别关注交通路口,因为不列颠哥伦比亚省正在追求零视力的目标,即没有交通事故造成的死亡或严重伤害。
温哥华最糟糕的十字路口有哪些?根据 2013 年至 2017 年的工商银行数据,在主要街道和终端十字路口发生了 692 起交通事故,其中 256 起导致了伤亡。对于行人来说,东黑斯廷斯和主街以 35 起事故高居榜首。在城市的另一边,伯拉德街&太平洋区是对骑车人最危险的地方,发生了 34 起撞车事故。这些事故对相关人员及其家人来说是一场悲剧,通过增加城市和工行的成本来影响我们所有人。如果某个地方经常发生事故,那么对街道设计的干预可以拯救生命。
视频分析可以支持在危险路口的敏捷干预。它可以帮助识别哪些行为会导致事故,以及交通模式是如何形成的。城市可以利用这些知识来实施适当的设计变更。之后,视频可以用来了解任何变化的影响。一项干预措施的成功是可以衡量的,而不必等待数年才能看到统计数据是否有所改善。这意味着,如果设计干预没有产生预期的影响,市政当局可以快速迭代。它还允许特定于位置的知识。骑自行车的人在伯拉德街和太平洋街需要的干预与在主街和东黑斯廷斯街需要的干预不同。
Traces of one minute of traffic at the Homer Street and West Georgia intersection in Vancouver.
拍摄十字路口的视频成本低、设置快且易于处理。它不需要永久的基础设施,只需要访问合适的视点。这意味着摄像机可以快速安装,并且可以临时安装一段时间。我们使用的视频质量可以被当前一代的移动设备复制。视频分析可以有效地取代或补充当前的方法,如气动管、感应线圈和手动计数。视频分析的优势包括能够区分不同车道的交通、检测交叉路口转弯模式以及监控未遂事件等。此外,它可以独特地提供可靠的行人计数和运动模式,量化诸如行走速度、粘性、行人密度等信息。
流量分析
让我们来看看如何将机器学习应用于街道交叉口的视频,以及我们可以提取出来支持市政当局的数据。我们已经构建了一个概念验证系统,结合了深度学习(神经网络)和对象跟踪算法,可以自动处理视频。
我们将应用我们的系统来分析温哥华市区两个十字路口的视频。第一个是霍默街和西乔治亚,第二个是阿博特街和西科尔多瓦。这些位置提供了不同的街道景观和不同的交通流量。从西乔治亚的 Homer Street 的视频中,我们可以看到该系统可以处理大量的流量。在对**西科尔多瓦十字路口的分析中,我们还将看到如何自动发现意外的人行横道。**在对我们的代码库和系统进行初始设置后,分析进一步的交集是一项简单的任务。
Traffic Analysis at the Homer Street and West Georgia intersection in downtown Vancouver shown at 2x normal speed. The Traffic Information panel displays a count of the different types of traffic. The colours in the panel correspond to the bounding boxes in the video. The Plan View panel shows a top-down view of traffic at the intersection. A larger view of the Plan View panel is shown in the next video.
我们的仪表板上覆盖了我们计算机视觉算法的结果。已经被识别的交通流中的对象具有边界框,并且在场景中被分配了唯一的标识符。边界框的颜色与交通信息面板中的条目相对应。在那里,我们显示不同类型用户的数量。在这个场景**中,我们计算交通的种类:行人、骑自行车的人、汽车、卡车和公共汽车。**左下角是我们从视频数据中推断出的交通平面图(自上而下)。顶部的标题显示了视频的位置和时间。
Plan View of traffic at the Homer Street and West Georgia intersection in downtown Vancouver played at 2x normal speed. The Traffic Information panel displays a count of the different types of traffic, with colours corresponding to those in the Plan View Panel.
使用算法计数的一个优点是它可以很好地适应流量。我们的系统在视频中记录了 50 多辆汽车和 100 多名行人。即使是在一个短视频剪辑中,手动计算这一流量也是一项挑战和时间密集型任务。我们不仅统计了用户的数量,还统计了他们通过十字路口的路径。第二张图片显示了部分视频的交通轨迹。我们可以比较通过十字路口和转弯的车辆数量。我们还可以注意到一些行人开始在人行横道线外过马路。
我们的系统将交通流重新投影到自上而下的视图中。虽然我们目前对此操作采取简单的方法,但是更健壮的系统将实现几个特征。这些包括测量车辆的速度,以及不同用户之间的距离。这将允许我们量化未遂事件,例如当一辆行驶中的汽车与骑自行车的人或行人相距一定距离时。目前,我们有发生事故的数据,但没有可能导致用户选择不同路线或改变交通方式的千钧一发事件的数据。
Traffic going East on West Cordova at Abbot Street in downtown Vancouver.
自动化分析使我们能够识别和量化感兴趣的事件。我们在 Abbot 街的 West Cordova 的视频中定义了两个计数器,以确定每条车道上有多少辆车。如果该市想要取消街头停车,安装专用自行车道,或者考虑引入公交优先车道的影响,这些信息将非常有用。此外,我们可以将交通灯的时间整合到我们的视频中。我们这样做是为了在行人意外横穿马路时发出警报。我们可以调查这种情况是否经常发生,以及行人是否没有得到足够的机会在预定时间过马路。
由于我们的系统是一个概念验证,我们的功能可以改进,并开发新的功能。在交通识别方面存在失误——自行车可能会被误归类为人,汽车、卡车和公共汽车的标签有时会被混淆。我们还看到,当有一大群行人时,系统很难区分人们并跟踪他们,因为他们在人群中变得模糊。可以实现更严格的算法来处理这些情况。我们的概念验证依赖于单个摄像头。我们可以进一步扩展我们的系统,在多个视点加入相机,添加红外相机,并使用双镜头系统进行深度感知。
我们还能在哪里应用这项技术?温哥华市最近花了 500 万美元翻新罗布森广场。空间被充分利用了吗?我们可以使用自动视频分析来研究一天中空间的使用情况。这包括量化人们使用这个空间旅行、聚会和娱乐的模式。著名城市学家威廉·h·威特在七十年代研究公共空间时使用的延时相机的现代升级版。同样,格兰维尔岛也在发生重大变化。这将影响行人的活动,以及行人/自行车/汽车的相互作用。可靠的交通信息让我们能够最大限度地提高空间投资和收益。
结论
利用机器学习,我们已经建立了一个概念验证系统,可以从视频数据中自动提供交通信息。我们已经将它应用于两个十字路口,表明它可以跟踪否则禁止手动计数的交通量,并且可以捕捉像意外行人穿越这样的事件。市政当局可以利用这些信息来改进不安全十字路口的设计,并测试干预措施的有效性,从而挽救生命和节省资金。这一简单高效的系统可以为实现零事故目标做出积极贡献,消除道路上的严重事故。
您是对这项技术感兴趣的组织吗?联系我们了解更多信息。
最初发表于T5【https://inletlabs.com】。
用 Python 实现病毒式文本到语音转换 YouTube 内容的自动化
turning a reddit thread into a video 😃
最近有一种特定风格的 YouTube 视频涌入,其中使用文本到语音转换来读出 Reddit 上的帖子,并以某种幻灯片的形式显示评论的截图。不管这些视频有多原始,都无关紧要,因为它们已经有了成千上万的浏览量。
look at the views on these tts videos!
我很确定这些视频大部分是手动编辑的,因为它们的裁剪和截图对齐不一致。当然有可能从 Reddit 线程 URL 自动生成这些视频吗?
答案是肯定的!
下面是一个视频示例,大约在 2 分钟 内完全自动生成
这是在大约 250 行代码中使用多种技术实现的。行数通常不是什么值得夸耀的东西,但对我来说,这展示了 Python 编程及其充满活力的活跃社区的力量。
我的方法
首先,我们应该把问题分解成一堆更小的问题。
- 拍摄 Reddit 帖子的“截图”
- 宣读帖子的内容
- 将截图+语音+背景音乐排序在一起
- 上传到 YouTube!(带缩略图和音乐)
问题一:截图
我们不仅要为帖子创建一个截图,还要在帖子被读出时创建一个不同的图像。这使视频更有“讲故事”的感觉,并有助于观众跟随文本到语音的转换。
这个问题通过使用 PRAW 从 Reddit 获取帖子,并使用 wkhtmltoimage 呈现模板得到了解决。我创建了自己的 HTML 模板,看起来有点像 Reddit 帖子,其中填充了帖子的详细信息(包括点数、奖项和用户名),然后进行渲染。
这些评论被标点符号分开,给人一种“被读出”的感觉,并帮助它与文本到语音同步。
问题 2:文本到语音
source: giphy
我使用谷歌云的语音 API 免费层来驱动 TTS。采用了新的 Wavenet 语音,它使用深度学习来产生更真实的音调和重音。每个部分(由标点符号分隔)都被读出并保存到一个 mp3 文件中,确保我们审查帖子中的不良词语,并用家庭友好的替代词替换它们:)。
问题 3:排序
我发现了一个惊人的 Python 库,可以编程地创建视频内容: MoviePy **。**这是一个真正令人敬畏的库,它将 ffmpeg 包装成一个高级 API,用于排序、过滤器、音频和视觉特效等等。对于每个评论图片,我添加了相关的文本到语音转换 API 和一些我在 YouTube 上找到的免版税的 lofi 音乐。
背景音乐是从一个免版税的频道下载的,曲目下载后会随机播放。
问题 4: YouTube 和缩略图
每一个好的视频都应该有一个漂亮的缩略图,在尽可能短的时间内将观众吸引到所述视频的内容。我使用 Canva 和 Pillow 一起将视频的标题渲染到图像上。2000 个最常用英语单词中的 而非 的单词以灰绿色突出显示,以强调标题中最重要的单词。
the template before and after rendering
An example YouTube description.
生成的. mp4 和缩略图然后通过 YouTube API 上传。创建了一个简单的描述,对视频中包含的帖子的 Reddit 用户进行表扬。
总之,这是一个复杂但令人满意的项目,它集成了许多很酷的 Python 库。从 Reddit 网址到完全上传 YouTube 视频大约需要 5 分钟。我打算将来在脸书和 Instagram 上自动发布帖子。
订阅我的时事通讯,以便在我下次写作时得到通知:)
数据科学中的自动化
为什么我工作中技术含量最高的部分一直变得越来越容易,而最难的部分与 AI 完全无关。
A database enters an automated Data Science Factory. Actionable Insights are extracted and produced at the other end of the assembly line (not shown).
在我作为数据科学家的工作中,我注意到许多过去很难的任务因为自动化而变得越来越容易。
例如,AutoML 承诺将整个建模过程自动化。
虽然这很神奇,但数据科学家的工作不仅仅是实现机器学习模型。
事实证明,数据科学中听起来最性感的方面将首先被自动化,而最难自动化的方面是你最意想不到的。
概观
当你谈论数据科学时,大多数人关注的是人工智能和机器学习。但是数据科学家实际上把他们大部分时间花在非常不同的工作上。
本文将尝试列出一名优秀的数据科学家应该能够完成的所有类型的工作。对于它们中的每一个,我将研究它的自动化程度。在适当的地方,我会列出一些有助于自动化的工具。
如果你认为有一个(非商业)产品可以很好地自动化一些东西,或者如果你认为我错过了数据科学工作的一个重要方面,那么只要给我发消息,我就会把它包括在列表中。
1.与客户交谈
自动化状态:不可能
数据科学家工作的第一步,也可以说是最重要的一步是与客户交谈。
这不仅仅意味着“问客户问题是什么”。业务人员和数据科学家之间的理解存在巨大的鸿沟。
客户一般不知道数据科学家能做什么,数据科学家一般也不知道客户想要什么。
能够弥合这种理解上的差距是极其重要的。
许多公司实际上雇用经理来充当数据科学家和客户之间的中间人。这比让一个纯粹的技术数据科学家试图找出客户的需求要好。但是,了解客户业务环境的数据科学家更好,因为这省去了中间人,降低了重要信息在翻译过程中丢失的风险。
与客户交谈不会提高机器学习模型的性能(就像这样,本文大约一半的技术读者已经失去了兴趣)。相反,理解客户的痛点可以确保您首先构建正确的模型。如果客户不能真正利用这个模型来推动自己的利润,那么世界上最准确、表现最好的模型也是无用的。
与客户进行一个小时的讨论可以完全重新定义项目,并将项目的货币价值增加十倍。
我永远不会忘记当我告诉我的一个客户,我可以很容易地扩展我的模型,将数据分成十几个不同的类别,分析所有的类别,然后只报告有异常的类别时,他脸上的表情。事实证明,这位客户多年来一直手动执行这项任务,这耗费了他大量的时间。他没有要求我们自动化这一点,因为他根本不知道这是可能的,直到我提出来。如果没有那次讨论,我们会在利润较低的任务上浪费几个月的时间。
在很大程度上,与客户交谈可以确保你建立了正确的模型,这对于确保项目最终盈利是至关重要的。
在较小的范围内,与客户交谈也有一些同样重要的直接好处。例如,选择最有用的指标来训练您的模型。许多数据科学家根本不考虑这一点,只是简单地使用准确性,或 L2 损失,或他们在大学里被教导使用的任何东西。与客户进行五分钟的讨论可能会显示他们的利润实际上只来自前 5 名的结果,或者类似的东西。如果你不通过改变你使用的度量标准来解决这个问题,你就在错误的方向上优化了你的模型。
现在是可怕的消息:
几乎所有这些都不能有效地自动化。
和人说话的是 AI-complete 。如果有人真的能弄清楚如何实现这项任务的自动化,那么机器人的反叛将会在几天后到来。
换句话说:
数据科学家工作中技术性最低的部分是最难自动化的。
事实上,这是一个技术进步实际上可能让事情变得更难的领域:在家工作,只通过短信沟通,这真的不太可能让你发现客户真正想要的是什么。
我所见过的帮助解决这个问题的最有用的东西不是一个程序,也不是一个公司政策,而只是一台放在办公室中心位置的咖啡机。客户和数据科学家偶尔会在一起喝杯咖啡,这比我们做的任何事情都更能达成目标一致。
2.数据准备和数据清理
**自动化状态:**部分自动化。太主观,太多边缘情况,无法完全自动化。
数据科学家大约 80%的时间花在数据准备和清理上。
这包括:
- 获取数据。
- 将数据放入正确的格式中。
- 连接数据。
- 识别和修复数据中的错误和/或异常。
所有这些都非常耗时,而且非常无聊。
这能自动化到什么程度?
看情况。
这其中的一些部分根本不能自动化,因为它们依赖于客户端的交互。有时,清理有错误数据的表需要打电话给数据所有者并要求澄清。
但是大部分的 T2 可以自动化。
数据准备和清理中的大多数任务都可以通过对数据应用少量简单的启发式方法来解决,直到所有问题都得到解决。
启发式示例有:
- 如果一个表有日期,那么检查它们的分布是否受到周末、假日或其他可能相关的常规事件的显著影响。
- 如果一个表有手工输入的分类列,那么检查它们是否包含任何输入错误并纠正它们。
- 如果一列是数值型的,检查它是否有超出合理范围的值。
这些试探法往往非常简单,但问题是有成千上万的试探法,而且大多数都非常主观。
据我所知,不存在应该检查的所有试探法的现有综合列表,也不存在建议如何以有用的方式参数化主观试探法的综合方法。
数据科学家不是要有一个清单来完成工作,而是要观察情况,根据经验和直觉,想出最相关的启发式方法来自己测试。
更糟糕的是,数据中的一些工件是特定于客户端的。例如,数据库中的一个项目可能在一年前被重新分类,但是较旧的条目仍然使用旧的分类系统。只有了解了业务背景,并和客户谈过,你才能认识到这个问题。这不能完全自动化。在这种情况下,您能做的最好的事情就是自动指出数据中的异常,以节省数据科学家运行初始测试的时间。
总结一下:
- 原则上自动化数据准备和数据清理是可能的。许多简单的事情已经被流行的图书馆自动化了,或者至少变得非常容易。
- 有数以千计的边缘情况,你不能用一个单一的自动化系统有效地覆盖。
- 有些任务不能有效地自动化,因为它们依赖于与客户的交互。
- 尽管如此,这里仍有唾手可得的果实。我希望在未来的几年里,我们会看到这方面的进展。
自动化数据清理的工具
有很多很多小工具和库可以用来清理你的数据。它们中的每一个通常只为你节省一点点时间,但它确实会累积起来。你可以通过谷歌搜索找到最常见的数据清理工具。
您还可以找到许多数据清理程序的列表,这可以让您很好地了解哪些类型的清理任务已经解决。查看列表这里,这里这里,这里这里,这里这里。
使用这样的工具时要小心。如果您只是天真地运行自动清理工具并依赖默认设置,很容易意外损坏您的数据。在一个数据集中需要清理的错误在另一个数据集中可能是故意的选择。
还有 elody.com 的。它还处于初级阶段,但一旦发展起来,它应该对数据清理非常有用。参见此处的交互示例。(注:Elody 是我自己的网站。我专门构建它来帮助自动化数据科学。它还不是非常强大,但有望随着时间的推移变得越来越大。网站免费使用。)
3.数据探索和特征工程
**自动化现状:**部分自动化,前景看好
在准备和清理完数据之后,终于到了开始研究数据科学的有趣部分的时候了。
数据探索和特征工程都是关于在显微镜下检查数据并从中提取洞察力。
这个阶段有两个方面:
- 数据探索是关于理解数据。
- 特征工程是关于理解问题,并将数据与问题联系起来。
数据探索可以很好地自动化。仅仅少量的基本可视化就足以快速获得大多数类型数据的概览。有许多工具可以帮助我们做到这一点。
然而,这仍然需要数据科学家花时间查看图形。就像数据准备一样,您应该寻找一千种不同的异常。
还没有一个系统试图总结它们。虽然我们可以自动创建图形,使数据探索更容易,但实际的探索本身仍然需要由数据科学家来完成。
请注意,您在数据探索过程中的一些发现可能需要您与客户交谈以获得澄清,甚至可能迫使您返回到数据准备和清理阶段。例如,您可能会注意到数据分布在特定日期突然发生变化。当你向客户询问此事时,他们解释说这是因为他们改变了当天生成数据的方式,并且忘记告诉你了。突然之间,你不得不回过头来调整你的所有数据,以考虑到这一点。
像这样的情况不能自动处理,但是自动化系统仍然可以帮助您更快地识别这些异常。
最后,您在数据探索期间收集的所有见解需要与您对任务的理解相结合,以执行有效的特征工程。
令人惊讶的是,由于两个简单的观察结果,很多事情实际上是可以自动化的:
- 大多数(如果不是全部)通常在特征工程中创建的特征只是将基本功能应用于现有特征的结果。
- 可以测量某个特性的有用程度,并丢弃那些被证明无用的特性,这使得数据足够小,可以处理。
因此,几乎完全自动化特征工程实际上是可能的。
总之,理论上是这样的。
我还没有听说过自动化特征工程胜过专家手工特征工程的例子。看起来,至少在目前,专家知识仍然胜过这些自动算法。
(如果你正在阅读这篇文章,并且知道一个自动化特征工程成功击败专家的例子,请告诉我。)
尽管有目前的缺点,我期望自动化特征工程很快会变得有竞争力。
请注意,自动化特征工程意味着数据探索的一半原因已经消失,但无论如何,数据探索仍然很重要:
数据探索对于其他任务仍然有用,比如发现数据中的异常。找到这些有时非常有价值。
一个异常点十有八九是无关紧要的。第九次,这将意味着你的整个数据集是有缺陷的,你通过及早意识到它躲过了一劫。第十次,它将引发一个惊人的新见解,启动一个完整的衍生用例来解决一个完全不同的问题,并赚到原来项目五倍的钱。
自动化数据探索和特征工程的工具
对于数据探索,如果您使用 python,使用 numpy 和 pandas 进行分析,使用 matplotlib、seaborn 和/或 plotly 进行可视化。
这些软件包可以让你轻松地过滤、分组和可视化任何你想要的东西。唯一的问题是,你仍然需要手动写你想要的。
使用镜头自动完成你应该经常做的所有基本探索,从而为你节省更多的时间。
请注意,这不会自动完成所有工作。仍然有很多常见的情况需要记住自己检查,因为它们不容易从默认的可视化中读取。比如:日期受工作日、节假日等影响吗?如果你有地点日期,地点在哪个国家或城市?如果有多个表,它们是如何连接的?
对于特征工程,使用 featuretools 自动生成新特征。
请注意,使用功能工具时应该小心。这对于从数据中生成大量要素非常有用,但它仍有缺陷:
- 它显然没有从语义上理解数据,因此无法创建对人类来说显而易见的功能,但需要不同寻常的功能组合才能通过算法产生。例如,它可以很容易地从原始数据中生成“客户总共看了多少部电影”这样的特征,但是像“客户在电影发行的第一周内看了多长时间”这样复杂的特征就很难生成了。您可以告诉 featuretools 更深入并创建更多的功能,但这样您就会遇到第二个问题:
- Featuretools 可以轻松创建大量的要素。这可能会导致过度拟合,因此您应该调查经过训练的模型,并检查它是否有意义。您可以使用 shap 来简化这一过程。
我自己的前述项目elody.com一旦成熟,也将能够处理数据探索和特征工程。
附录 2019–10–25:我最近了解到 getML 库,它解决了 featuretools 的一些缺点。
- 与 featuretools 不同,它不使用暴力方法。相反,它将特征工程的过程理解为另一种形式的机器学习。因此,它不会只是创建大量的要素,然后进行要素选择。相反,将使用有点类似于随机森林或梯度增强的机器学习算法来生成这些特征。
- 它拥有高效迭代阈值的算法,因此对于前面提到的“在电影发行的前 X 周内,客户观看电影的频率”这样的特性特别有用。
- 该工具不是开源的,但是有一个免费版本。更多信息,请参见此处。
4.系统模型化
**自动化现状:**全自动化,与专家数据科学家竞争
建模是数据科学家工作的核心部分。
在这里,我们将所有宝贵的数据转化为结果,然后我们的客户将这些结果转化为利润。
这是数据科学家在大学里花最多时间学习的部分,因此自然这也是数据科学中第一个完全自动化的部分。
建模是一个极其困难的过程,有许多不同的参数。然而,这也是一个非常严格的过程,所有参数都有数学上的明确定义,并且与现实世界的模糊性无关。这使得自动化建模比数据科学的任何其他方面都更有效。
建模可以进一步分解成不同的子任务。
- 模型构建
- 模型验证
- 超参数优化
(你也可以把特征工程算作建模的一部分。有些人这样做,但我选择把它作为一个独立的部分,因为特征工程仍然有一些非数学的方面,需要理解业务环境,而建模纯粹是一个数学问题。)
自动化这些子任务的特定部分的库已经存在很多年了,但是仍然需要专业知识来正确地使用它们。
现在,有一些库可以自动化整个建模过程。这些库只是按原样获取您的数据,并一次性从中构建一个完整的模型,不需要任何人工交互。
2019 年 5 月,谷歌的 AutoML 在一场 KaggleDays 黑客马拉松中获得第二名。根据卡格尔的等级系统,许多参赛者都达到了大师或特级大师的水平。
一个完全自动化的系统击败了几个人类专家,这些专家聚集在一场比赛中,专门证明他们的技能。如果这个系统能够赢得这样的比赛,那么与不参加比赛的普通数据科学家相比,它的表现能好多少?
诚然,这个系统还不完善。比赛只持续了 8.5 个小时。这对一个自动化系统的运行来说已经足够了,但对人类竞争者来说,这还不足以启动。如果竞争持续更长时间,AutoML 也不太可能有同样的表现。
但是自动化模型构建工具每天都在改进。他们不断赢得足球比赛只是时间问题。
我完全期待数据科学家在 10 年内不再需要建立他们自己的模型。
自动化模型构建的工具
建模过程的自动化部分
这篇文章列出了自动化建模过程不同部分的工具。
即使你不想自动化你的整个建模过程,我也强烈推荐看看这些工具。他们可以节省你很多时间。
请注意,本文将特征工程视为建模的一部分,因此它还列出了一些可以简化特征工程的库。
自动化整个建模过程
运行 AutoML 要花钱。
开源社区已经创建了 Auto-Keras 来取代它。
Auto-Keras 和谷歌的 AutoML 都使用神经网络作为他们建立的模型的基础。
还有其他使用不同类型模型的自动化机器学习库:
本文对比了四个自动机器学习库 auto_ml 、 auto-sklearn 、 TPOT 和 H2O 的 AutoML 解决方案的性能。
结果:Auto-sklearn 在分类数据集上表现最好,TPOT 在回归数据集上表现最好。
但是,请注意,这篇文章是半年多前发表的,不包括 AutoML 或 Auto-Keras。所有这些库都在持续开发中。当你研究完哪一个是最好的,其中一半可能已经有了重大的更新。
5.客户演示和文档
**自动化状态:**不可能
一旦建模完成,我们有了结果,我们需要将这些结果呈现给我们的客户。这是一门独立的科学。
正如我之前提到的,数据科学家和他们的客户说着完全不同的语言。对一个人来说显而易见的东西,对另一个人来说可能是混乱的。
你需要把你花了几个月的时间处理的所有数据浓缩成一个单一的图形,让打字时需要看着键盘的人能够理解。这是一个不小的壮举。
让客户认同你的结果很容易,但如果你想让他们真正理解,你需要非常清楚,你的文档必须既简洁又全面。
这是一个小任务,但非常重要。
如果客户不明白应该如何使用它,那么即使是最好的项目也会变得毫无价值。没有什么比完美地解决一个问题更糟糕的了,只是看到它被扔掉,因为它的预期用户不明白如何使用它。
就像在项目开始时澄清需求所需要的最初的客户交互一样,这个任务是不可能自动化的。
6.部署到生产
**自动化状态:**取决于公司。可能完全自动化,也可能不可能。
一些数据科学项目只是关于构建原型。
其他项目要求我们将完成的项目转化为完全自动化的端到端解决方案,可以部署到生产中。
这是否可以自动化很大程度上不在数据科学家的掌握之中。
这几乎完全取决于客户使用的技术堆栈,以及他们设定的需求。
我有一个项目,我可以把我的项目包装在一个脚本中,它被接受用于生产。但是我也有一个项目,其中整个代码库需要重写,因为负责的经理想要使用另一种编程语言,并且没有提前告诉我们。
较小的公司可能会照原样接受您的代码,因为他们还没有针对生产部署的指导方针。
刚接触数据科学的大公司会让你费尽周折来部署你的代码。
与数据科学家合作得足够多的大公司将会建立一个系统(云、数据仓库、数据湖等)。).在这种情况下,该过程在很大程度上是自动化的。
摘要
总结一下:
- 与客户交谈和向客户解释结果是您最不愿意与数据科学联系在一起的两个工作方面,但它们也是最难自动化的方面。
- 数据准备和清理是部分自动化的,但很难完全自动化,因为有成千上万的特殊情况需要考虑。
- 数据探索和特征工程是部分自动化的,看起来特征工程将很快变得更加自动化。
- 模型建立已经完全自动化,并与专家竞争。
- 生产部署可以自动化,但这取决于客户。
结论
我们能从中学到什么?
如果你是一名数据科学家,你想确保你的技能在未来几十年仍然有需求,那么你应该而不是专注于机器学习方面(除非你实际上是该领域的研究人员)。
相反,你应该专注于学习如何理解业务,这样你才能更有效地与客户沟通。
一旦我们工作的技术方面实现了自动化,产生影响的最佳方式就是弥合技术和非技术之间的差距。
具有用户偏好管理的家用电器自动化
继我上一篇关于强化学习在作业调度中的应用的文章之后,我决定进一步寻找机会,寻找另一个未开发的领域,在那里自动化可以成为系统的一个重要和必要的部分。过去,许多研究人员提出了许多解决节能问题的方法,而另一方面,在微控制器、处理器甚至智能电表等物联网系统的帮助下,已经开展了独立的研究来将这些电器转换为智能设备,这些智能设备可以持续跟踪能源消耗,并为用户提供各种使用统计数据。但是,智能家居环境的每个用户都能够理解和解释这些信息并从中获益吗?
Example of an Home Energy Management System
在我们深入这个领域的技术方面之前,我认为我们有必要了解家庭能源管理系统(HEMS)到底是什么。我进一步请求您仔细阅读这篇文章,以获得更精确的解释。
正如您所理解的,HEMS 为用户提供了一个门户或界面,用户可以用它来控制和监视系统数据。这一点让我们思考这样一个问题:为什么人类有必要执行这些管理和监控设备使用数据的任务?从读取和分析使用数据到规划和采取适当的行动,并牢记用户偏好,怎样做才能取代人工干预来自动化整个端到端系统?
物联网在自动化这一过程的目标中发挥着非常重要的作用,其中需要满足两个目标-节能和用户偏好。用户对智能设备的监控可以帮助他或她实现防止全天任何形式的能量浪费的首要目标。然而另一方面,我相信强化学习可以使我们有可能提出一个解决方案来满足管理用户偏好的第二个目标。
Internet of Things can connect devices embedded in various systems to the internet. When devices/objects can represent themselves digitally, they can be controlled from anywhere. The connectivity then helps us capture more data from more places, ensuring more ways of increasing efficiency and improving safety and IoT security.
像环境保护基金、绿色和平组织和气候与能源解决方案中心这样的组织已经投入了大量的资金来制定尽可能有效利用能源的策略。这篇关于分析消耗能量的日常活动的文章的作者提出了一种分为三个部分的聚类方法。第一步是记录和维护用户在一天中的运动,然后显示每个活动进行了多长时间。最后,他们对一组用户的活动模式进行聚类,以分析他们之间的相似性和差异。另一篇有趣的研究文章谈到考虑电器制造商提供的信息,这些信息谈到这些设备可以工作的状态。然后,智能环境服务提供商开始发挥作用,在本文中,他们通常被作者称为 SESPs,他们执行手动评估设备状态的功能,以向用户推荐一组他们可以遵循的可行措施,从而降低他们的总能耗。这篇文章的作者首次提出了一种基于马尔可夫模型的智能方法,该方法考虑了一种奖励策略,并输出一种用户可以遵循的策略。这是一种强化学习方法,旨在找到问题的合理解决方案。然而,该过程仍然涉及通过人工干预进行一定程度的分析和监控,这不符合我们的主要目标。
其中一项研究考虑了用户的偏好以及节能的座右铭。考虑的变量是发光二极管(led)的最小和最大光强度、光强度的上升和下降周期以及无运动检测和光强度开始下降之间的周期。用户的存在和移动决定了一天中不同时间点的光强度。基于无线物联网的技术已被用于实施该系统,可通过简单的手机应用程序进行控制。
The authors present this middleware architecture in their research for the functioning of their proposed algorithm.
- 第一部分,即 LED 控制模块组,执行应用层上的功能,以控制系统中存在的所有 LED 的光强度。
- 第二部分由自适应中间件组组成,它可以根据系统管理员的命令对系统进行修改。
- 最后,第三部分是关于数据处理,以保持系统对 LED 控制的感知。
实验装置在一个 8 位微处理器上工作,该微处理器连接到各种传感器上,这些传感器主要分为运动检测传感器和光照明传感器,它们一起执行研究用户所处的外部环境的任务,从而为系统提供针对该环境中存在的 led 采取特定行动所需的必要参数。研究人员展示了三个案例——住宅和办公楼、仓库和停车场,解释了每一个案例中的用户满意度需求。
这项研究的唯一缺点也提供了一个非常可利用的研究机会,那就是提出一个考虑到两个重要因素的系统-
- 外部环境不仅需要在用户存在时考虑设置中存在的设备的使用,还需要在不管用户的物理存在与否都需要打开该设备时考虑。因此,这可以确保外部环境的动态行为适应。
- 该系统应该可以扩展到家庭中的其他设备,例如洗衣机、烘干机、加热管道等。因此,正如第一点所提到的,不管用户是否在现场,了解他们的使用模式都很重要。
研究人员早些时候也采用了其他方法,但几乎所有的方法都主要集中在节约能源的目标上。他们中很少有人提出了处理用户偏好的策略,但只有一定程度的人工干预。最后,我添加了一些我浏览过的出版物的链接,以理解这个特定问题陈述的上下文和细节。此外,我想请你给他们一个阅读和讨论的想法,可以带来和实施到动态的现实生活场景。
关于这篇文章的任何反馈或想法,以及研究出版物,都是最受欢迎的。如果有人愿意伸出手来分享他们对这一特定问题陈述的看法,我将不胜感激。
进一步阅读:
- https://pdfs . semantic scholar . org/98 F4/a1ee 457304 e 793 a1 b 178 B4 d 61 cf 7 e 5d 3 a 7 cc . pdf
- https://www . tandfonline . com/doi/full/10.1080/09613218 . 2017 . 1356164
- 【https://ieeexplore.ieee.org/document/5482712
- https://ieeexplore.ieee.org/document/5172913
- https://www . research gate . net/publication/260523361 _ Autonomous _ Appliance _ Scheduling _ for _ home _ Energy _ Management
自动化、风险和强大的人工智能
托马斯·迪特里希教授关于涉及人工智能的社会技术系统需要高可靠性的访谈。
Photo by Laurent Perren on Unsplash
人工智能(AI)融入我们日常生活的方式怎么说都不为过。强大的深度机器学习算法越来越多地预测我们想看什么电影,我们会回复哪些广告,我们有多大资格获得贷款,以及我们有多大可能犯罪或在工作中表现出色。人工智能也正在彻底改变工厂、发电厂和自动驾驶汽车等物理系统的自动化,部署步伐正在迅速加快。然而,最近由特斯拉、优步和波音制造的自动驾驶系统的致命故障凸显了在危险情况下依赖不透明和高度复杂的软件的相关风险。减轻此类系统带来的危险是一个被称为弹性工程的活跃研究领域,但人工智能的快速采用,加上其众所周知的算法透明度的缺乏,使得研究难以跟上步伐。
机器学习的先驱之一,Thomas Dietterich 教授在过去几年里一直在研究如何让人工智能变得更强大,特别是当它嵌入到一个复杂的社会技术系统中时,在这个系统中,人和软件的错误可能会传播到未经测试的政权中。保罗·沙尔(Paul Scharre)的新书《一个没有人的军队》(An Army of None)启发迪特里希教授深入研究高可靠性组织的文献,寻找潜在的解决方案。它让我明白,仅仅让技术可靠是不够的,你还需要让围绕它的整个人类组织变得可靠;理解这意味着什么已经占用了我很多时间。【Dietterich 教授抽出一些时间与我讨论了他对人工智能伦理、人工智能安全的看法,以及他最近的文章 健壮的人工智能和健壮的人类组织 。
伦理人工智能社区通常分为两组,一方是专注于公平或算法透明度的具体概念的工程师,另一方是对整个社会的伦理影响更感兴趣的社会科学家。你最近的文章似乎介于这两类人之间。
总的来说,人工智能社区已经意识到社会科学的重要性。我真的追溯到社交媒体出现的时候,人们意识到社会科学家可以用它来研究关于人的事情。然而,他们需要计算机科学家的帮助来处理来自社交媒体的大量数据,所以我们开始看到计算社会科学的兴起。那是最初的开场。
然后,人们开始思考社交网络中的影响力和思想传播问题,并出于广告目的最大化社交网络中的影响力,再次导致与社会科学家和经济学家的更多接触。然后,人们意识到,通过这些系统的工作方式,可能存在对不同亚群体造成伤害的偏见。我刚从 AIES 会议回来,那里举行了他们的第二次会议,几乎同时还有 FAT*会议,我认为这个领域的大部分人都意识到我们需要考虑更广泛的社会技术系统,而不仅仅是技术部分。它体现在所有这些不同的方面,我追求一个特定的方面,因为我关心这些高风险,高风险的决定。我现在也参与了这个由 CCC(计算社区联盟)协调的人工智能研究 20 年路线图的团队。我们已经举办了三次研讨会,人们说我们可以做 X,Y 和 Z,比如让计算机跟踪会议中或建筑物中的人,并理解他们的情绪。20 年前,人们会说:“太酷了”。现在每个人都在说,“但这可能被滥用得如此严重”,所以我们真的对这些事情的所有负面影响都很敏感。现在我们意识到,我们希望在未来 20 年看到的如此多的技术进步可能会产生可怕的后果,也可能会产生真正好的后果,所以这非常令人清醒。
你认为需要监管来避免这些后果,还是公司可以有效地自我监管?
我不是法律、法规和行业实践方面的专家,但在我看来,我们似乎看到了技术使用不当和围绕技术的不适当的组织结构。我们先来关注一下面部识别。我不知道你是否一直在关注麻省理工学院的 Joy Buolamwini 的工作,但我认为她一直在做非常有趣的工作,审计这些(商业)人脸识别系统的质量。在技术方面,我们没有任何标准来规定一家公司应该对这些系统做出什么声明,以及他们应该如何做出声明。例如,我认为所有这些公司系统,如果他们要销售这些产品,需要为他们所做的产出陈述给出精确的概率。看起来这些系统中的一些并没有给你一个置信度值,那些给你的也没有告诉你它意味着什么。如果当它说这两张照片有 90%的可能性是同一个人的照片时,那么它说的时间有 90%是正确的,那么这个概率将会被很好地校准。那将是某个特定人群的 90%。她的[Buolamwini 的]实验表明,有一些亚群的数量必须达到 60%左右,因为系统在某些亚群上表现不佳。
美国公民自由联盟做了一个类似的实验,但不清楚他们是如何设置他们的门槛的。正如我在论文中所描述的,你会想到,在想要抓住所有坏人的警务情况下,你必须将检测的灵敏度设置得非常高,并且你会得到大量的假警报。事实上,这就是我们在南威尔士治安数字上看到的,这与我在欺诈检测或网络安全方面的经验非常一致。这里你有一个类似的问题,主要的挑战是大量的假警报。我的观点是,即使你是这些工具的非常有知识的用户,而且似乎大多数警察部门都不具备这样的资格,即使你有机器学习的博士学位,也不清楚在实践中应该如何设置这些系统的阈值,以及应该如何应用它们的最佳实践是什么。
然后你必须对假警报造成的危害进行某种分析。这就是你需要审计人力组织和软件的地方。如果你是一个警察部门,你已经把它提高到 99%,并得到了大量的假警报,这不仅仅是多少人被拉进由于假警报。你可以想象,有人在这些系统上反复发出错误警报,所以这不是一个在人口中平均分布的随机税收。你被随机选中的时间的一部分,但它也可能总是发生在你身上!不知何故,您想审核这些组织,并问:您的误报率是多少,由此产生了哪些危害,您如何减少这些危害,什么是可接受的水平,谁在承担负担?
你提议的似乎是简单的黑盒式测试,可以在不侵犯供应商知识产权的情况下完成?
你需要说明这是通过什么样的图像数据库收集的。把它作为一个通用的应用程序来营销是不合适的,所以你真的需要为每个应用程序定制它。我非常怀疑目前正在市场上销售的这些东西在实践中是否真的能很好地实现它们的预期目的,因为它们不是在每个应用程序的基础上定制的。我不知道你是否需要监管,或者我们是否只需要教育市场。对我来说,供应商站在这个问题的前面,把它做好是明智的。
像谷歌这样的大型组织开始雇佣专业伦理学家来调查人工智能的潜在风险;对于没有大量资源来抵消风险的小型团队,您有什么建议吗?
我觉得我们现在还没有标准化的工具来支持这些。R&D 社区需要建立工具来支持这一点。
有些工具是存在的,比如 IBM 的“公平 360 ”,但一个更大的问题是是否有人在关注系统的含义,比如什么可能出错,它会影响谁。在这些领域,资源较少的小型团队可能很难获得这种更广泛的思考。
它需要成为我们标准方法的一部分。也许我们需要开发某种概念分析框架,人们可以通过它,比如一个清单,来思考他们正在营销的系统的更广泛的背景。例如,我们可以问一个简单的问题:“重复使用这个系统会发生什么?”。我们通常表述问题的方式是,我们关注它的单步使用。有一个 YouTube 视频推荐的例子,在机器学习中,我们将它表述为一个上下文多臂土匪问题。随着时间的推移,系统将逐步推荐越来越多的极端视频,所以你可以开始搜索清真菜,最后观看圣战招募视频!构建系统的人可能没有想到要查看迭代效果。所以这似乎是我们应该教每个人思考的事情。
在你的论文中,你提到了人工智能监控人类组织的可能性。AI 目前是否具备识别人类机构问题的能力?
这更多的是一个研究问题。我一直在努力调查现在谁在这个领域工作。我会说,现在,很少有能力来监控人类组织中团队的运作。在这种情况下,监控团队崩溃是很好的,但这很容易被管理层滥用,所以我不清楚具体如何做。一种情况是帮助团队训练,或者在有限的时间内。俄亥俄州立大学的大卫·伍兹致力于研究如何让团队更有弹性,他正在研究在极端条件下保持大型云计算服务器运行的开发人员。我认为我们需要在这一领域进行更多的研究,我主张国家科学基金会和国防部在更好地进行团队合作的研究上投入更多的资金。这是很自然的下一步。
我们是在谈论对人类团队合作的实时监控吗?
它目前更关注培训情况。然而,你可以看到我在担心自主武器系统方面的进展,这可能是我们可能为人工智能考虑的最高风险的应用。我们会非常关注团队的运作,你会希望对这些团队进行极端的监控,因为系统的可靠性取决于其最薄弱的环节。那可能不是软件,可能是人类组织。
[1]:我将机器学习(ML)与人工智能互换使用,尽管 ML 只是用于实现人工智能的一种技术。
[2]:请注意,波音 737 MAX 坠毁可能是由于非冗余传感器故障混淆了自动驾驶系统。
AutoML —改进您工作流程的工具(已更新)
Photo by Alex Knight on Unsplash
二进制分类中 H2O 自动机的改进
在发表了我关于这个话题的原始文章后, 艾琳·莱戴尔——H2O . ai 的首席机器学习科学家,为我提供了一些关于文章的很好的反馈。作为对此的回应,我决定在这篇文章中加入她的评论,以展示使用 AutoML 特性是多么容易。
我在整篇文章中用粗体显示了反馈部分以及她在文章结尾提供的要点。
最近,对数据科学技能的需求激增,其增长速度超过了当前技能供应的速度。今天,很难想象一家企业不会受益于科学家和机器学习算法执行的详细分析数据。随着人工智能进入工业的每个角落,很难在每个可能的用例中满足数据科学家的需求。为了缓解这种短缺带来的压力,一些公司已经开始开发能够部分自动化通常由数据科学家执行的流程的框架。
AutoML 是一种将机器学习技术应用于数据的过程自动化的方法。通常,数据科学家会花大量时间进行预处理、选择功能、选择和调整模型,然后评估结果。AutoML 能够通过提供基线结果来自动执行这些任务,但也可以针对某些问题提供高性能的结果,并深入了解进一步探索的方向。
本文将介绍 Python 模块 H2O 及其 AutoML 特性。H2O 是一个基于 Java 的数据建模和通用计算软件。根据 H2O.ai:
H2O 的主要用途是作为分布式(许多机器)、并行(许多 CPU)、内存(数百 GBs Xmx)处理引擎
AutoML 是 H2O 的一个功能,它可以自动构建大量模型,目标是在没有任何先验知识的情况下找到“最佳”模型。AutoML 不会为您赢得任何竞争,但它可以提供大量信息来帮助您构建更好的模型,并减少探索和测试不同模型所花费的时间。
他们 AutoML 功能的当前版本可以训练和交叉验证随机森林、极度随机森林、梯度增强机器的随机网格、深度神经网络的随机网格,然后使用所有模型训练堆叠集合。
堆叠(也称为元集成)是一种模型集成技术,用于组合来自多个预测模型的信息以生成新模型。通常情况下,堆叠模型(也称为第二层模型)的表现会优于每个单独的模型,因为它具有平滑的特性,能够突出表现最佳的每个基础模型,并贬低表现较差的每个基础模型。因此,当基本模型明显不同时,堆叠是最有效的。
Stacking visualized — Image from http://supunsetunga.blogspot.com/
堆叠方法是通过混合或组合多个机器学习模型的预测来提高预测性能的程序。有多种集成或堆叠方法,从简单的投票或平均预测,到使用预测作为特征构建复杂的学习模型(逻辑回归、k-最近邻、提升树)。
机器学习模型预测的堆叠经常击败最先进的学术基准,并被广泛用于赢得 Kaggle 比赛。不利的一面是,它们通常在计算上很昂贵,但是如果时间和资源不成问题,那么预测性能的最小百分比改进可以帮助公司节省大量资金。AutoML 特性还可以大大减少运行这些堆栈方法所需的时间。
数据探索
本文将研究蘑菇分类数据集,该数据集可以在 Kaggle 上找到,由 UCI 机器学习公司提供。该数据集包含 23 个分类特征和 8000 多个观察值。数据分为两类,可食用的和有毒的。这些类分布相当均匀,52%的观察值在可食用类中。数据中没有遗漏的观察值。这是一个流行的数据集,Kaggle 上有超过 570 个内核,我们可以使用它来查看 AutoML 相对于传统工作流的性能。
运行 H2O
首先,您需要安装并导入 H2O Python 模块和 H2OAutoML 类,就像任何其他库一样,并初始化一个本地 H2O 集群。(这篇文章我用的是 Google Colab。)
然后我们需要加载数据,这既可以直接加载到“H2OFrame”中,也可以加载到 panda DataFrame 中(就像我对这个数据集所做的那样),这样我们就可以对数据进行标签编码,然后将其转换为 H2OFrame。与 H2O 的许多东西一样,H2OFrame 的工作方式与 Pandas DataFrame 非常相似,但在语法上略有不同——H2O 汽车公司可以直接处理分类列,因此这一步是不必要的。
尽管 AutoML 将在初始阶段为我们完成大部分工作,但重要的是,我们仍然要对我们试图分析的数据有一个很好的理解,以便我们可以在它的工作基础上更进一步。
df.describe()
H2OFrame from df.describe()
类似于 sklearn 中的函数,我们可以创建一个训练测试分割,以便可以在一个看不见的数据集上检查模型的性能,以帮助防止过度拟合。值得注意的是,当分割帧时,H2O 没有给出精确的分割。它旨在有效处理大数据,使用概率分割方法而不是精确分割。例如,当指定 0.70/0.15 分割时,H2O 将产生期望值为 0.70/0.15 的测试/训练分割,而不是精确的 0.70/0.15。在小数据集上,结果分割的大小将比大数据更偏离预期值,在大数据上,它们将非常接近精确值 —注意这里没有必要包括验证集,因为我稍后不会使用它,但如果需要的话可以使用它。
然后,我们需要获取数据集的列名,以便将它们传递给函数。对于 AutoML,有几个参数需要指定x
、y
、training_frame
、validation frame
,其中y
和training_frame
为必需参数,其余为可选参数。您也可以在此配置max_runtime_sec
和max_models
的值。max_runtime_sec
参数是必需的,max_model
是可选的,如果不传递任何参数,默认为 NULL。x
参数是来自training_frame
的预测值向量。如果您不想使用您传递的帧的所有预测值,您可以通过将其传递给x
来设置。
对于这个问题,我们将把数据帧中的所有参数发送到x
(除了目标)并将max_runtime_sec
设置为 10 分钟(其中一些模型需要很长时间)。现在该运行 AutoML 了:
在这里,该功能被指定为运行 10 分钟,但是可以指定模型的最大数量。如果您希望调整 AutoML 运行的过程,也可以传递大量可选参数来实现这一点。以下是 h2o 文档中的描述:
x
:预测值列名或索引的列表/向量。只有当用户希望从预测值集中排除列时,才需要指定该参数。如果所有列(除响应之外)都应在预测中使用,则不需要进行设置。validation_frame
:该参数被忽略,除非nfolds == 0
,其中可以指定一个验证框架,用于提前停止单个模型和网格搜索(除非max_models
或max_runtime_secs
覆盖基于度量的提前停止)。默认情况下,当nfolds > 1
时,交叉验证指标将用于提前停止,因此validation_frame
将被忽略。leaderboard_frame
:该参数允许用户指定一个特定的数据框,用于对排行榜上的模型进行评分和排名。除了排行榜评分之外,此框架不会用于任何其他用途。如果用户没有指定排行榜框架,那么排行榜将使用交叉验证指标,或者如果通过设置nfolds = 0
关闭了交叉验证,那么将从训练框架自动生成排行榜框架。blending_frame
:指定用于计算预测的帧,该预测用作堆叠集合模型金属载体的训练帧。如果提供,AutoML 生成的所有堆叠系综将使用混合(也称为保持堆叠)而不是基于交叉验证的默认堆叠方法进行定型。fold_column
:为每个观察指定交叉验证折叠索引分配的列。这用于在 AutoML 运行中覆盖单个模型的默认、随机、5 重交叉验证方案。weights_column
:指定带有观察权重的列。将某个观察值的权重设置为零相当于将其从数据集中排除;给一个观察值一个相对权重 2 相当于重复该行两次。不允许负权重。ignored_columns:
(可选,仅 Python)指定要从模型中排除的一列或多列(作为列表/向量)。这是x
论证的逆命题。
模型运行后,您可以查看哪些模型的性能最好,并考虑这些模型进行进一步的研究。
lb = aml.leaderboard
lb.head()
Leaderboard of best models from H2O AutoML
为了检查模型是否过度拟合,我们现在对测试数据运行它:
preds = aml.predict(test)
结果
AutoML 在测试数据上给出了 1.0 的准确度和 F1 分数,表明该模型没有过拟合。
Results for best model from AutoML on test data
很明显,这是 AutoML 的一个特例,因为如果不测试更多的数据,我们就无法在测试集上提高 100%的准确率。查看为这个数据集提交给 Kaggle 的许多内核,似乎许多人(甚至 Kaggle 内核机器人)也能够使用传统的机器学习方法产生相同的结果。
以下是艾琳·莱德尔提供的要点:
未来的工作
下一步是保存训练好的模型。有两种方法保存领导者模型——二进制格式和 MOJO 格式。如果你要把你的模型投入生产,那么建议使用 MOJO 格式,因为它是为生产使用而优化的。
现在,您已经找到了数据的最佳模型,可以进一步探索提高模型性能的步骤。也许训练数据上的最佳模型过拟合,而另一个顶级模型是优选的。也许可以为某些模型准备更好的数据,或者只选择最重要的特征。H2O 汽车公司的许多最好的模型使用集成方法,也许集成使用的模型可以进一步调整。
虽然 AutoML 本身不会让你在机器学习竞赛中获得冠军,但它绝对值得考虑作为混合和堆叠模型的补充。
AutoML 可以处理各种不同的数据集类型,包括二元分类(如此处所示)、多类分类以及回归问题。
结论
AutoML 是帮助(而不是取代)数据科学家工作的伟大工具。我期待看到 AutoML 框架的进步,以及它们如何让我们这些数据科学家和他们所服务的组织受益。当谈到特征工程时,一个单独的自动混合器当然不能胜过人类的创造性思维,但是 AutoML 是一个值得在你的下一个数据项目中探索的工具。
再次感谢艾琳·莱戴尔的反馈,请务必关注她的 推特 。
Image from TechRadar
关键词汇
- AutoML —一个自动化一些通常由数据科学家执行的任务的框架。
- H2 of frame——H2O 版的熊猫数据帧。
- 堆叠——一种采用多个不同模型并根据这些“子模型”的结果创建预测的模型。
进一步阅读
- 关于 H20 的教程,包括 AutoML 和其他功能—http://docs . H2O . ai/H2O-tutorials/latest-stable/H2O-world-2017/AutoML/index . html
- 了解更多关于堆叠模型的信息—http://blog . ka ggle . com/2016/12/27/a-ka gglers-guide-to-model-stacking-in-practice/
AutoML 和 AutoDL:简化
看看机器学习新阶段的开始
什么是 AutoML?
作为数据科学研究工程师,任何问题陈述中最耗时的任务是数据分析、试验和选择正确的算法和参数调整。所有这些都需要人类的专业知识,这也是数据科学家如今如此重要的原因。
*但是,如果这种人为干预能够被消除,那会怎么样呢?*如果这种模型能够自行选择正确的算法、进行数据分析和微调以获得完美的模型,那会怎么样?这就是 AutoML 的意义所在,也绝对是迈向完全自主系统的下一步。
其他类似的术语包括 AutoDL、AutoCV 和 AutoNLP,用于表示深度学习、计算机视觉和自然语言处理领域的模型。通俗地说,例如,AutoCV 旨在创建一个单一的系统,它可以处理任何计算机视觉问题,理解数据并选择正确的方法来处理数据,所有这些都无需任何人工干预。
为什么选择 AutoML?
机器学习和人工智能现在很热门,近年来有很多研究方向被称为该领域的未来。AutoML,或者有些人喜欢称之为元学习,粗略地说,是一种关于学习的学习形式。
从一开始,对 ML 的研究就一直在上升,我们已经创建了各种各样的模型和系统,每一个都是针对特定的问题陈述的。然而,我们现在正处于一个阶段,我们可以结合这些模型,并在某种意义上,在层次结构上向上移动。因为我们的最终目标是达到层次的顶端并创建一个自治系统,所以我认为这些元模型的宣传绝对值得。
Google Cloud based AutoML services
AutoML 和 ML 有什么不同?
在 ML 中,数据科学家首先从问题陈述和数据集开始。对数据进行分析和清理,确定一个性能指标,然后根据人类的直觉,对一些可能适用于数据集的模型进行实验。在我们最终得到一个可接受的模型之前,需要进行大量的功能工程和微调。
AutoML 试图尽可能多地自动化这个管道。虽然这些步骤中有一些比较容易自动化,比如模型微调,但是有一些非常困难,比如选择正确的架构/模型等等。总而言之,AutoML 就是要尝试创建一个单一的系统,可以在建模和训练过程的每一步都不需要人工干预。
它有多成功?
最近在 AutoML 和 AutoDL 领域做了很多工作。我认为这很大一部分功劳应该归功于 AutoML 最近的多个竞赛,试图改善这个领域并邀请创新的想法。
Google 已经创建了他们自己的基于云的 AutoML 平台,保证帮助那些对 ML 一无所知的人使用 ML。然而,使用他们的模型是非常昂贵的,而且只适合愿意花同样多钱的企业。
[## Cloud AutoML -定制机器学习模型|谷歌云
Cloud AutoML 帮助您利用有限的机器学习专业知识轻松构建高质量的定制机器学习模型…
cloud.google.com](https://cloud.google.com/automl/)
也有很多成功的开源平台,如 Auto-Sklearn 和 Auto-keras,它们成功地为每个人提供了 AutoML 领域的最新进展…免费!!
[## 弗赖堡汽车公司
BOHB 结合了贝叶斯优化和超波段的优点,以达到两全其美…
www.automl.org](https://www.automl.org/)
下一步是什么?
AutoML 已经看到了几年前不可能实现的成功,像谷歌这样的平台已经能够建立这样的系统,可以将数据科学家从通用机器学习管道的等式中移除。但是我们离真正的自治系统还很远。
这个博客是努力创建机器学习领域简化介绍的一部分。点击此处查看完整系列
在你一头扎进去之前就知道了
towardsdatascience.com](/machine-learning-simplified-1fe22fec0fac)
或者干脆阅读系列的下一篇博客
看看自然语言处理的“你好世界”
towardsdatascience.com](/sentiment-analysis-simplified-ac30720a5827)
参考文献
[1] Guyon,Isabelle 等,“2015–2018 年 AutoML 挑战赛系列分析。”(2017).
【2】何,,等,“Amc:面向移动设备的模型压缩与加速的 Automl”欧洲计算机视觉会议录(ECCV)。2018.
3佐夫、巴雷特和阔克诉勒。"强化学习的神经架构搜索."arXiv 预印本 arXiv:1611.01578(2016)。
AutoML:来自 OptiWisdom 的端到端介绍
机器学习是人工智能研究的一个分支,也是计算机科学的一个分支。不断增长的数据量和处理能力也增加了对处理数据和通过挖掘数据之间的关系产生有用结果的需求。这种新趋势通常被称为数据科学或分析。有时,根据应用程序的不同,它可能被运行的平台称为大数据分析。另一方面,数据科学有两大支柱,即机器学习和统计学。
数据科学的趋势也吸引了对机器学习的研究,这是两个主要学科之一,另一个是统计学。机器学习是一个比较老的话题。一些研究者甚至可能在古希腊找到它的根源,那里的人们试图从早期犹太教或假人教中找到解决所有问题的通用公式,这与我们现代理解中的机器人非常相似。今天,机器学习也是一种形式的基础,我们每年都在使它们更加自动化。
在这个中级系列中,我们试图找到一个自动化机器学习(AutoML)过程的实践经验,我们通过理解机器学习的经典流程来开始这个概念。我们将看看什么是自动机器学习,什么不是自动机器学习。我们会明白为什么自动机器学习很重要,它通常会面临哪些问题。最后,我们将通过端到端的系统方法来实现自动机器学习过程。
写作将涵盖以下主题:
了解什么是 AutoML
知道为什么汽车很重要
理解什么不是自动的
理解 AutoML 的问题
学习自动化过程的端到端系统方法
了解什么是 AutoML
在最简单的定义中,AutoML 是机器学习过程的自动化。那么,我们从机器学习过程中了解了什么,我们如何使它自动化?
从数据科学项目管理技术可以很容易地理解文献中的机器学习过程,我们有三种主要的数据科学项目管理技术:
塞姆马
KDD
CRISP-DM
取样、探索、修改、建模和评估
SEMMA 代表取样、探索、修改、建模和评估,是最早的项目管理技术,在 KDD 和 CRISP-DM 中也包含了这种技术,所以对其进行详细描述并不重要。但是理解它很重要,因为它从采样数据开始,继续探索数据,修改模型或数据类型,然后为此目的创建模型,最后评估结果。这也是 AutoML 的一个非常初始的流程,我们将在后面介绍。
数据库中的知识发现
KDD 代表数据库中的知识发现,它是从数据中提取知识的最著名的方法之一。
KDD ( Knowledge Discovery on Databases)
它从任何系统中的数据开始,如数据库、大数据平台,甚至是来自物联网设备或社交媒体的流数据,经过 5 个步骤后,它会带来知识。在进入 KDD 步骤的细节之前,定义如下所示的数据和知识的概念可能是有用的:
DIKW Pyramid
上图展示了众所周知的 DIWK(数据、信息、知识和智慧金字塔)。
1.它从数字或字符开始,如在基线,数据级别。
2.它们没有意义,信息层带来了意义。例如,50 只是一个数字,但像“50 是约翰的年龄”这样的信息对我们来说有着特殊的意义。
3.从数据到信息的升级是另一本书的另一个故事,这一级别的大多数问题由数据库系统、数据仓库处理,并创建报告、仪表板或记分卡。
4.另一方面,从信息到知识层面的步骤是人工智能、机器学习或统计的问题,我们无法在大多数知识层面的问题中获得 100%的成功。例如,从约翰的照片中了解他的年龄可能是一个知识水平问题,我们在大多数情况下无法确定。
KDD 是一种利用数据解决知识水平问题的技术,如收集所有员工的照片和训练机器来预测人的年龄。
AutoML 的目标是在没有任何交互或至少最小化交互的情况下,自动完成从数据到知识级别的过程。在这篇文章中,你可以找到一步一步的方法,每一步的 KDD 和我们如何自动化的步骤。
KDD 从选择数据开始,这对于减少数据集和理解最重要的特征是很重要的。稍后,在 AutoML 中,我们将把这一层划分为数据连接层和特征选择,因为 AutoML 需要连接、选择和刷新这一过程,因为数据在大多数情况下是动态的,我们需要检查数据的更新。
数据预处理处理数据上的问题,如缺失值、异常值、噪声或脏数据等。因此,我们既要处理数据质量,同时又要尝试做一些预处理,以提高机器学习模型的成功率。同样,在 AutoML 中,目的是自动提高成功率,理解预处理策略,或尝试一些可能性,以优化机器学习模型的性能。由于我们正在以自动化的方式处理性能优化,我们不能将 AutoML 的步骤分成两个,像数据预处理或转换,我们一起处理这两个步骤。例如,在 AutoML 过程中的大多数时间,日期字段被自动检测(数据预处理的一个步骤),缺失值或异常值被自动处理(数据预处理的另一个步骤),一些特征如日、月、年、星期几或一年中的某一天被自动提取(数据转换的一个步骤),有用的特征被选择,无用的被考虑(数据选择的一个步骤)。因此,AutoML 是整个过程的自动化,其中 KDD 处理几个步骤。
最后,数据挖掘步骤由 AutoML 中的模型选择步骤处理,AutoML 还处理模型的优化,稍后我们称之为超参数优化(HPO)。
在数据挖掘或建模步骤之后,第一个机器学习模型就可以使用了,但还有最后一个问题需要解决:我们如何才能理解模型的成功?怎么评价呢?满意标准是什么?
AutoML 和 KDD 方法的一个主要区别是评估步骤。解释/评估在数据科学中非常重要,它强烈要求数据科学家处理案例并开展工作。但是,在 AutoML 中,这个过程大多数时候是从评估标准开始的。
跨行业标准处理—数据挖掘
CRISP-DM : CRISP-DM 代表跨行业标准处理——数据挖掘,是业界使用最多、最广泛的数据科学工具。CRISP-DM 的步骤如下图所示:
CRISP-DM : Cross Industry Standard Processing — Data Mining
CRISP-DM 有 6 个步骤,从业务和数据理解开始,这对于任何数据科学项目都是必不可少的,并且大多数时候是业务分析师或数据分析师的工作,按照给定的顺序。
CRISP-DM 的其余步骤与 KDD 步骤非常相似,KDD 的数据选择、数据预处理和数据转换步骤被合并到 CRISP-DM 的数据准备步骤中。
从这个角度来看,CRISP-DM 非常类似于 AutoML 方法,其中整个 AutoML 过程可以总结为两个主要循环:数据准备循环和机器学习循环。
CRISP-DM 强调业务分析和数据分析的重要性。
AutoML 步骤和模块
在涵盖和比较了经典的机器学习/数据科学项目管理步骤和流程之后,有可能给出 AutoML 的系统图;
AutoML Approach from OptiWisdom
尽管有许多可供选择的方法来实现 AutoML 过程,但上述方法是 OptiWisdom 针对 SaaS 方法提出的端到端解决方案。用户能够加载/连接数据源,其余的问题,如预处理或模型选择和部署,都在 OptiWisdom 平台上解决。AutoML 图表,演示:
从原始数据源到部署自动生成的机器学习算法的流程。
该流程非常类似于 KDD 和 CRISP-DM 流程,并且具有两个主要循环,预处理循环和机器学习循环,类似于 CRISP-DM 步骤。
除了整个过程的自动化之外,AutoML 背后的基本思想是上图中每个步骤的自动化。
上图也给出了整个系统的一般视图,在某些情况下,AutoML 解决方案可能会考虑上述场景的一小部分。
例如,删除上述所有步骤,仅将单个机器学习算法直接添加到数据源并应用超参数优化,甚至可以被认为是 AutoML 解决方案。
在这篇文章中,更大的画面将被每个步骤的实践经验所覆盖,并且 AutoML 的每个步骤都通过实践方法在单独的章节中处理。它从数据层面开始,向上到知识层面。
数据连接层
原子化从数据连接层开始。除了连接到数据源的必要性,自动化系统还需要检查数据源上的更新和刷新。数据源中的更新可以是:
新记录发送到数据源,AutoML 方法通过推送通知检查更新,或根据时间刷新更新检查
流数据源,其中更新是问题本质的一部分,或者有时更新是结构更新,自动数据连接层需要检测这些变化并自我更新。
这一层的所有更新和刷新都与数据的形状直接相关。例如,向系统添加新标签是另一个问题,它在特征选择或特征工程阶段处理。
功能选择/工程
在这一层,AutoML 方法解决了具有冗余特征的问题。例如,在某些系统中,添加一个人的出生日期和年龄可能会有问题。特征选择试图找到多余的特征并消除它们。此外,降维或转换数据是特征选择和工程的一部分。系统在这一步可以考虑一些特征工程库。例如,从日期字段中自动提取一周中的某一天、一年中的某一天或一季是这一步骤中特征工程的重要部分。
AutoML 的所有步骤都在一个循环中,并且每一步都通过每次迭代中其他步骤的反馈来更新自己。例如,特征消除从数据预处理或选择的算法中获得反馈,并且可以根据来自这些步骤的反馈来更新选择的特征。
特性工程的细节和实例将在另一篇文章“数据源和数据选择的自动化”中讨论。
数据预处理
数据预处理是一个重要的阶段,也被认为是 KDD 或 CRISP-DM 方法中的一个重要步骤。有时,数据预处理是 ETL(数据仓库术语中的提取、转换和加载步骤)的一部分,或者称为数据质量、数据操作或数据混合,但它是所有数据相关研究的关键步骤。数据预处理步骤的目的是处理有关数据的问题,如脏/有噪声的数据或异常值的缺失值。
与 AutoML 的其他步骤类似,数据预处理也是循环中的一个步骤,某些操作可能会受到来自其他步骤的反馈的影响。例如,在一些 AutoML 解决方案中,离群值可能会被清除,而在其他一些解决方案中,离群值对于解决方案来说极其重要。
此外,传统的特征提取、消除或工程技术需要基于时间序列的分析方法。可选地,在一些特征工程方法中,应用时间序列解决方案。
数据预处理的输出是预处理的数据源,也是 AutoML 机器学习循环的第一步。在 AutoML 的机器学习循环的每次迭代中,预处理的数据将会发生变化,并且所需的更新将会反馈到 AutoML 的预处理循环。
数据预处理将在以后的文章中处理。
组合/选择并应用算法/超参数优化
将机器学习算法应用于预处理数据是 AutoML 中机器学习循环的第一步。在此步骤中,将应用从算法库中挑选的算法,并自动判断第一个结果。例如,根据目标字段的数据类型,如果有目标字段,问题可能是分类或回归。AutoML 方法检测问题类型,并且只关注与问题相关的算法。在优先应用与问题相关的算法之后,AutoML 方法可以反馈到 AutoML 的预处理循环,以及应用拥有算法的超参数优化(HPO)技术。
这一步有许多不同的优化技术,每一种都有一些优点和缺点。选择算法的细节将在第 8 章“正确算法的自动选择”中解释,结合多种算法求解将在第 9 章处理,最后超参数优化技术将在第 10 章解释。
评估和部署
AutoML 的最后一步是将解决方案,候选模型,部署到业务案例中。根据业务案例的不同,评估需要实地测试,实地测试也会提供一些有用的反馈。
整体评估和 AutoML 系统详细信息的目的,如商业案例和 AutoML 在现实生活中的应用,将在第 11 章中考虑,但在介绍性步骤中,记住下图所示的分析成熟度可能会有所帮助:
Types of Analytics
大多数时候,描述性分析不需要机器学习方法。对于并非在所有情况下都需要但对理解原因有用的诊断,数据科学家寻找原因并试图回答“是什么导致了这些结果?”。虽然在诊断分析中,数据科学有一些优势,但 AutoML 的优势始于预测分析,但 AutoML 在规定分析中更为重要,自动操作是规定分析的一部分。因此,一个设计良好的 AutoML 方法既可以自动采取行动,也可以从商业案例或现实生活的反馈中学习。
AutoML 方法是机器学习过程的端到端原子化,因此机器可以像在强化学习中一样从现实生活中学习。除了学习和提高系统的整体性能,AutoML 还可以提高动作的性能。
AutoML 的目的
AutoML 的目的可以列举如下:
经典数据科学管道中最大数量步骤的自动化
最少的人类互动
取得良好和令人满意的结果
低时间计算
上面列表中的第三和第四项也是经典数据科学的主要目标,但上面列表中的前两项对数据科学和机器学习有独特的新方法。
了解 AutoML 的重要性
AutoML 是机器学习研究中一个相对较新且不断增长的趋势。这种方法也吸引了像脸书这样的科技巨头,或者像 Gartner 这样的全球商业研究和咨询公司。脸书每月生成超过 30 万个机器学习模型,他们还有一个名为 Asimov 的项目,用于优化这些模型。另一方面,Gartner 声称,到 2020 年,超过 40%的数据科学将实现自动化。
Twitter 在 2015 年收购了一家机器学习初创公司 WhetLab,该公司为机器学习问题创建了更简单和自动化的解决方案。
AutoML 的三个核心目标可以列举如下:
性能优化:在理想情况下,AutoML 性能与问题或数据的复杂性无关。因此,AutoML 试图为各种输入和学习任务建立一个通用的性能
在过程中最少或没有人工干预:在理想情况下,AutoML 处理所有问题,并以自动化的方式解决问题
计算效率:在理想情况下,AutoML 在给定的有限资源或预算内产生最佳算法。
以上所有案例表明,行业内关于 AutoML 解决方案的趋势越来越明显。AutoML 的主要优势是:
AutoML 减少了例行程序,同时为数据科学过程中的创造性工作留下了巨大的空白
AutoML 是机器学习的一种民主化方式,它提出了一个新的术语,称为“公民数据科学家”,因此每个人都可以处理数据科学,并在他们的领域专业知识中使用机器学习算法。
AutoML 提供了一个标准化的机器学习解决方案,无论项目中数据科学家的资历如何。
AutoML 对行业有雪崩效应,因为它增加了员工、经理或所有利益相关者对机器学习相关解决方案的参与度。
公民数据科学家和机器学习民主化
AutoML 是一个重要的趋势,因为它提供了机器学习解决方案的民主化。一个相对较新的趋势叫做“公民数据科学家”,它也不是一个新的工作或组织中的一个职位。Gartner 将该术语定义为一个人,他处理预测性或规范性分析的开发,他不是来自统计或分析背景,并且他的主要工作不是开发模型。
下图所示的公民数据科学家形象全面参与并致力于业务流程和数据科学。
公民数据科学家也是数据科学世界和他拥有专业知识的领域之间的桥梁。
他收集信息,创建社交网络或梦想数据科学及其领域的未来项目。
此外,大多数公民数据科学家都在他们的背景中加入了新的技能,如对统计、数据处理、分析或数学的更广泛的理解。
他们还对组织的决策承担责任。
因此,在数据科学的新时代,数据科学是民主化的,任何背景的人都可以使用,而且他们在工作中处理什么并不重要,数据科学无处不在,每个人都必须了解并进行一些分析。
关于公民数据科学家的一个大问题是,不可能将所有专家都送回学校,教他们数据分析或机器学习模型。相反,趋势表明工具变得不那么复杂,并提供简单和可解释的解决方案。因此,经验丰富的数据科学家或机器学习专家正在致力于创造新的工具、系统或算法,这些工具受到更广泛的大众的更多需求。
机器学习模型的标准化
关于 AutoML 趋势的另一个重要问题是生产的机器学习模型的质量标准化。在行业中,总是要求有经验丰富的数据科学家或机器学习专家。“有经验”这个关键词对于大多数招聘广告来说都是至关重要的,甚至有时招聘广告的标语中会出现“资深”数据科学家。工业界已经意识到机器学习模型的质量。解决问题的模型在大多数时候并不是最佳解决方案,只有经验才能带来机器学习模型的质量,这可以质疑机器学习模型的工作情况、商业案例相关的成功率或未来风险。
AutoML 有解决问题的方案,并且独立于数据科学家的经验或资历,AutoML 生产部署就绪的模型。
除了业务案例或数据问题模型的标准化,标准化还带来了执行性能的标准。选择或组合的模型会受到资源或性能要求的限制。
AutoML 在行业中的雪崩效应和学习转移
AutoML 使机器学习项目易于访问和简单理解。此外,为来自任何领域或背景的专家提供了许多新的自动化工具。因此,新时代的机器学习变得更加容易实现。
AutoML 也可以将一个经验从一个案例转移到另一个案例。例如,一个专门从事人力资源的 AutoML 应用程序也可能为人力资源领域的特定应用程序带来一个标准的机器学习过程。零售业也有类似的情况。Amazon 是 web 上早期的推荐引擎实现者之一,它创建了一个基于 web 的零售商店,当时编写推荐引擎的最简单方式是一个简单的数据库查询,显示“谁买了这个项目,也买了这个项目”,这是一个非常原始的协同过滤版本。现在,这种方法适用于任何基于网络的零售商店,也是许多基于网络的零售商店现在必须的。很容易看出,即使是最简单最基础的机器学习系统,也能在短时间内成为行业标准。
数据是新的石油,新的数据驱动型公司正在几乎所有行业崛起。从第一个原始的亚马逊推荐系统开始不到几十年,现在机器学习系统几乎取代了一些行业的顶级管理。例如,网飞超过 75%的收入来自后台运行的推荐算法,公司的成功主要建立在他们部署的算法上。网飞基于用户行为准备电影推荐,这被称为协同过滤或用户是谁,也被称为基于内容的过滤,此外,它还根据用户的历史数据创建电影海报。因此,每次向用户推荐一部电影,用户都会得到一张为自己制作的独特的电影海报。
了解什么不是 AutoML
AutoML 不是神奇的盒子,自动解决所有问题。例如,AutoML 无法发明新的机器学习算法,或者无法保证某些情况下的最佳调整。
AutoML 不是一种扼杀所有数据科学工作并取代数据科学家的技术。恰恰相反,在数据科学的新时代,它是数据科学家的必备工具。AutoML 不会重复数据科学中的例行程序,如数据分析、数据清洗、特征提取或用几个问题测试多个机器学习算法,而是自动执行所有必要的例行程序,并将明智的决策留给数据科学家。
如下图所示,AutoML 可以被认为是一个管道,在一端,AutoML 获得创造性的想法作为输入,如业务问题或数据。另一方面,AutoML 为数据科学家的判断提供了必要的输出,并为数据工程师提供了部署就绪的模型。
AutoML BlackBox Approach
AutoML 也是人工智能和数据科学方法的游戏规则改变者。
例如,为深度学习系统提供更多 CPU、GPU 或 TPU 是一个非常常见的陷阱,它是一种面向抽象的机器学习自动化。
另一方面,AutoML 是研究社区的一个新视角和转变,它提供了自动化和机器学习的可解释性和可解释性。
在大多数情况下,AutoML 的结果是简单和可解释的,如生成决策树和显示关键决策节点以及算法上的数据流,而不是产生突触权重或神经网络中的激活函数参数。
了解 AutoML 的问题
AutoML 从最初的文献中就有一些明确定义的问题。例如,AutoML 最早的一个出现是由 Auto-Weka 推出的,最早定义的问题,现在仍然是一个重要的问题,就是 CASH(组合选择和超参数优化)。
另一个众所周知的问题正在从经典的机器学习理论中回归:没有免费的午餐定理。基本上,它说没有机器学习算法可以击败所有其他可能的算法。
AutoML 在参数优化方面有一个焦点问题。在选择了适合问题或数据的机器学习算法,或者甚至组合了算法可能性之后,现在的问题是超参数的优化。
现金问题
现金问题是文献中非常著名的早期问题之一。该问题简单地强调了在所有可能的算法中选择所有可能的好的机器学习算法,并组合它们以解决该问题。AutoML 主要解决监督学习问题。例如,分类和回归算法受到监督,并且更容易衡量算法的成功。在监督学习问题中,通过使用集成技术,如打包、提升、堆叠等,算法的组合是可能的并且相对容易。此外,可以通过使用共识学习来组合无监督学习算法,如聚类算法。在这两种情况下,AutoML 方法都试图为问题找到最佳的机器学习算法选择和组合。
没有免费的午餐
没有免费的午餐(NFL)定理是比 AutoML 方法相对更老的理论,并且表明在机器学习或优化中没有适合所有解决方案的尺寸。
这个术语从两个方面触及 AutoML,NFL 的第一个意义是关于选择机器学习算法。例如,有许多可供选择的机器学习算法,每种算法都有其原因,每种算法都有一些优点和缺点。如果有一个单一的算法,从各个方面支配所有其他可能的算法,那么生活会容易得多。不幸的是,这是不可能的,也没有这样的算法或捷径。AutoML 中 NFL 的第二个含义是机器学习算法的优化阶段,或者更具体地说是超参数优化。这个问题再次类似于机器学习算法的选择,这一次优化过程没有自由解。
这个类比来自于餐馆和菜单的隐喻。所以,菜单上列出了可能的解决方案,每一个餐盘都有价格。此外,根据你的饮食,餐馆的选择也很重要。例如,一个素食者在一家牛排店吃午餐会比午餐的平均价格高。所以从菜单上选择合适的餐馆和合适的项目是很重要的。最后,你午餐时间的朋友,也就是和你一起吃午餐的人,对你的选择范围也很重要。例如,如果你是一个素食主义者,如果你和一个肉食者共进午餐,那么午餐再次变得高于平均水平。
类似地,从菜单中选择菜单项——候选解决方案或可用算法列表中的算法——会产生一些外部影响,如哪些算法正在一起工作,或者您在哪个问题域中使用该算法。因此,算法的搜索本身是一个优化问题,同时优化所选算法的参数会使问题变得更加复杂,并带来多准则优化问题。
超参数优化(HPO)
在最一般的形式中,超参数优化是机器学习算法的超参数的优化。几乎所有的算法都有直接影响结果的超参数,除了为问题选择最佳算法外,为算法选择最佳参数也是一个重要的问题。
有许多方法可以解决这个问题和可能的解决方案,这个问题和可选的解决方案将在以后的文章中讨论。但是为了引入这个概念,一个非常原始的搜索过程可能是网格搜索,其中在一次迭代中搜索预定范围内的所有可能的参数。
HPO 实际上是一个稍微复杂一点的问题。超参数在大多数时候不是 2 或 3 维搜索空间,并且同时有超过 10 个参数需要优化。不幸的是,当需要优化的参数数量增加时,问题的复杂性也以指数方式增加。
没有一种算法能保证比网格搜索更好的解决方案,但是通过使用一些优化算法,一种更快的算法是可能的。
学习端到端的系统化 AutoML 方法
在传统的数据科学项目中,有三个基本步骤
1.数据科学项目从理解和分析问题和数据开始,
2.继续创建和实施模型和
3.在最后一步,项目被提升到可持续和可维护的阶段。
下图展示了大多数情况下数据科学流程的通用方法。该图解释了参与者的主要贡献,但是当然,参与者的参与并不限于图中所示的交互。例如,利益相关者和业务团队与产品和部署非常相关,但是图中只展示了关键的和主要的交互。
Productization of AutoML in OptiWisdom
这三个步骤还需要一些子步骤和参与者。
在构思阶段,利益相关者、业务团队和数据科学家一起工作。这里的理念是理解和定义问题,并创造性地提出解决方案。
在数据科学阶段,数据科学家致力于找到问题的解决方案,最后在生产或部署阶段,开发人员、系统管理员或数据工程师致力于实现最佳的可持续系统。
AutoML 旨在自动化数据科学,主要是生产/编码阶段。
AutoML 取代了人工操作,用优化和自动化的解决方案取代了常规工作,并为数据科学家和开发人员提供了更多从事更具创造性工作的机会。
Role of AutoML in Productization
上图展示了 AutoML 在整个系统中的主要部署。这个想法是数据科学和生产阶段的自动化,并最小化数据科学家和开发人员团队在这个过程中的贡献。
面向数据爱好者的 AutoML
AutoML(自动化机器学习)会是允许任何有愿望的人(数据爱好者)创建机器学习模型的答案吗?
谁是数据爱好者?
- 想尝试机器学习的软件开发者
- 渴望成为数据科学家的大学生
- 希望提升自己水平的中层企业经理
- 希望区分其技能组合的分析师
- 许多其他人…
AutoML 通过自动化数据准备、特征提取、模型选择和模型调整,节省了数据科学家的大量时间。但是,它能让数据爱好者轻松地使用机器学习吗?
答案是它确实依赖于 AutoML 工具,其中有大量用户友好的和工具。
挑战
如果你不是数据科学家,只是想尝试机器学习(嘿,你甚至可能不会写代码),我称你为数据爱好者。看下面的图表,数据爱好者比实际的数据科学家多得多(比例为 20 比 1)。
现实是,在 400 万数据爱好者中,有些人还拥有令人敬畏的领域知识,如果配备了正确的工具,可以加速一个组织的机器学习工作。
潜在解决方案
AutoML 工具通常适用于以下情况之一(本文重点关注第二点):
- 通过自动化部分模型构建流程,帮助当前的数据科学家提高工作效率
- 让数据爱好者能够创建机器学习模型
并不是每个 AutoML 工具都能解决问题,因为大多数工具都集中在第一或第二点上。在下面的 8 个 AutoML 工具的比较中,你可以看到一半的工具在易用性方面被评为“红色”,这对于数据爱好者来说不是一个好的选择。
面向数据爱好者的 AutoML 工具对比
有许多方法可以分割 AutoML 包的过多工具(包括 MLaaS 服务),但是我想把重点放在数据爱好者的三个重要考虑事项上。
- 易用性(你能不写代码就创建吗)
- 预算(有免费和高级版本)。免费试用<>。
- 定制(例如,交互式数据操作工具、模型交付选项)
这八个 AutoML 工具的比较实际上是当今可用的越来越多的 AutoML & MLaaS 解决方案的组合。包括一些大型企业玩家,如 AWS ML 、 H2O 和 DataRobot 。还包括你的开源强手,比如 Auto-Weka 、 Auto-Sklearn 和 TPOT 。这个团队被为数据爱好者开发的有前途的工具 PredictiveData 和 MLJar 所充实。
当比较所评估的 8 个 AutoML 工具中的 4 个工具的性能时,下面是它们在大型数据集上的表现。
Results sourced from https://hackernoon.com/a-brief-overview-of-automatic-machine-learning-solutions-automl-2826c7807a2a
总结
AutoML 在让机器学习变得更容易方面展示了巨大的进步,工具也在迅速改进。只要你能找到易用性、预算和定制的正确平衡,这些应该会让我们更接近挖掘 400 万数据爱好者的力量。
用于预测建模的 AutoML
随着第一批成果在实践中得到应用,自动化机器学习成为越来越重要的话题,带来了显著的成本降低。我在 ML 布拉格会议上的演讲描绘了主要在预测建模领域的最新技术和开源 AutoML 框架。
我还展示了我们的研究,该研究部分由 Showmax 资助,在我们位于布拉格捷克技术大学信息技术学院的联合实验室进行。
我还要感谢 Showmax 提供的计算资源,这使得我们的大量实验成为可能。
让我们从最近的谷歌营销视频开始,解释谷歌人工智能如何在 Waymo 中应用他们的 AutoML。
深度学习自动化
谷歌人工智能应用 AutoML 寻找更好的卷积网络替代架构,对自动驾驶汽车中的图像进行分类。
营销部门报告说速度提高了 30%,准确率提高了 8%,令人印象深刻。
当你仔细看的时候,你发现 is 其实不是 AND 而是 OR。您可以在不牺牲精度的情况下获得高达 30%的加速,并在相同的速度下获得 8%的精度提升。无论如何,这些仍然是好数字,因此 AutoML 是值得努力的。图中的每个点代表一个卷积神经网络,目标是找到一个具有允许以最小延迟实现最佳分类性能的架构的网络(左上角)。
CNN 架构在一个简单的代理任务上进行评估,以减少计算成本,并评估不同的搜索策略。蓝点是由本文稍后描述的神经架构搜索策略评估的 CNN。
这些实验类似于更早的研究CNN的大规模进化,也需要大量的计算资源。
但与正在优化 3d 卷积神经网络的视频分类器的架构搜索相比,它仍然便宜且容易。
进化搜索也用于优化转换器的编码器和解码器部分,表明在选择文本处理网络的架构时,神经翻译模型也可以得到很好的优化。
自动深度模型压缩
为了加快召回和简化深度 convnet 模型,可以使用 AutoMC 开源框架 PocketFlow。
在向移动设备或嵌入式系统部署精确模型时,AutoMC 或 AMC 变得越来越有用。报道加速效果相当可观。
深度 AutoML 框架
Auto Keras 使用网络态射使贝叶斯优化更加高效。架构空间中的编辑距离(在架构之间遍历所需的更改数量)被用作相似性代理。正如您所看到的,用法非常简单,显然不需要手动指定参数。
AdaNet 开源 AutoML 框架工作在 tensorflow 之上。关于用于搜索架构空间的进化技术的详细描述,你可以参考谷歌人工智能博客。
通用自动语言
我们已经调查了 AutoML 深度学习方法,但这只是你可以在预测建模中找到的 AutoML 技术的一个类别。一般来说,AutoML 方法在以下领域最有效,优化预测模型的性能和/或速度。也有许多其他标准可以考虑,如预测模型的可解释性,但 AutoML 优化这些标准的能力仍处于起步阶段。
预测建模的数据预处理通常需要以更传统和过时的方式来执行,因为 convnets 只适用于某些数据源(图像、文本、语音…).除了神经网络之外,还有许多预测建模方法。这些方法通常有很多超参数。下面讨论为这个领域开发的 AutoML 技术。
首先,看看可以在 AutoML 搜索中使用的一些通用工具。随机搜索的效率惊人地高,因此非常受欢迎。这主要是因为很难搜索建筑空间,因为它通常由相互依赖的连续和离散维度组成。
更有趣的技术之一是使用高斯过程的贝叶斯优化。让我们假设你只有一个连续的超参数。你探索潜力最大的区域(上限)。
另一个有趣的技术是超高频带。这是土匪启发的方法,同时学习和评估几个架构,并杀死其中一半的时间。它有助于将计算资源以指数方式分配给最有前途的架构。缺点是你可能会扼杀那些需要更多时间来优化的伟大架构。
数据挖掘的 AutoML 框架
在这里,我们介绍一些最流行的 AutoML 框架,用于更传统的预测模型,通常包括数据预处理。
ATM 开源框架使用贝叶斯优化、GP 和土匪来优化预测模型的超参数进行数据挖掘。
TransmogrifAI 还优化了数据准备阶段(如数据预测)。
类似的工具还有很多,既有开源的(auto sklearn,hyperopt sklearn,auto weka),也有商用的(h2o 无人驾驶,datarobot automl)。注意 Google Cloud AutoML 还没有提供类似的工具。提供的服务面向深度学习模型优化。
高级自动化方法
除了简单的超参数优化(甚至使用高级试探法),还有许多有趣的方法可以在微观和宏观层面处理架构选择。
神经结构搜索
神经架构搜索是那些更高级的问题之一。可以参考 NAS blogpost 了解基本变种。
NAS 的一个巧妙方法是将架构选择映射到概率空间,并使用反向投影结合权重来优化架构,如飞镖所示。
By using DARTS, you can optimize structure of recurrent neurons, but also structure of feedforward network.
另一种方法是将建筑映射到一个连续的空间,然后返回,例如 LSTM。
您可以在连续空间中执行梯度搜索,如 NAO 所示。
搜索预测集合
在过去的二十年里,我一直试图找到有效的算法来搜索包括复杂集成在内的预测模型的架构。
这样的组合经常赢得卡格尔比赛,并被戏称为弗兰肯斯坦组合。
正如我们在机器学习杂志文章中解释的那样,元学习模板形式化了分层预测集成。
您可以使用进化算法(GP)来搜索架构。
搜索代表良好执行的预测集合的好模板是相当复杂的任务。
我们展示了 UCI 数据库中几个数据集的获奖架构。请注意,对于某些数据集,简单模型比复杂的分层集成更合适(集成并不更好,因此最好选择简单的预测模型)。
您可以在一个数据集上开发预测模型的体系结构,并在另一个数据集上对其进行评估。请注意,来自 UCI 的一些数据集非常琐碎(乳房、葡萄酒),以至于您使用什么进行预测建模都无关紧要。
当我们试图应用我们的进化 AutoML 框架来显示最大流失预测数据集时,它的可扩展性不够。
因此,我们在 Apache Spark 上重新实现了分布式数据处理的框架。我们正在 AutoML 过程中尝试新的有趣的概念和特性。
- 逐渐增加的数据量被用于评估模板和选择跨演进的潜在客户
- 我们能够从基本模型的群体开始,随着时间(代)增加模板的复杂性
- 考虑到用户预先定义的时间量(随时学习),流程被划分为多个阶段
- 各种各样的方法被用来保持群体间的多样性,以及在个体模板的突变过程中
- 我们执行多重协同进化(当前版本中的模板和超参数)。我们能够在模板群体中共享超参数。
航空公司数据的结果表明,我们可以开发出预测模型,这些模型可以在相同精度的深度学习模型所需的时间内进行训练和回忆。
这些简单的预测模板对超参数调整不敏感,并且在这项任务中表现一贯良好。当然,你可以找到许多其他的任务,在那里你需要不同的基本方法,而不是我们到目前为止已经实现的方法,因此我们正在扩展这个组合。
其他自动域
AutoML 可以应用于聚类,但难度要大得多。
可以增加聚类算法的健壮性,并添加一些自动功能,如自动切断。由于聚类的无监督性质,聚类集成的自动建模是困难的。你可以加入我们在这个开源项目中的努力。
在推荐系统中,AutoML 可以优化 recsys 集成和超参数的结构。我们在recombe中结合了 bottom、GP 和其他方法,成功实现了一个大规模的在线生产自动化系统。
帮我们做布拉格 AI superhub 。
AutoML 被夸大了
Tom and Jerry, 70 Episode — Push-Button Kitty (1952)
我在工作中使用 AutoML,在一些 ML 比赛中与我的主要模型融合,并参加了两次 AutoML 比赛。我认为 AutoML 作为一个自动化建模过程的想法是非常好的,但是这个领域被过分夸大了。一些关键概念,如功能工程或超参数优化的元学习,将释放其潜力,但目前来看,boxed AutoML 作为一种工具只是浪费金钱。
I’ve made a presentation on AutoML topic during Nordic Data Science ML Summit 2019
什么是 AutoML?
数据科学项目
任何数据科学项目都包括几个基本步骤:从业务角度制定问题(选择任务和成功的衡量标准),收集数据(收集、清理、探索),构建模型并评估其性能,在生产中部署模型并观察模型在生产中的性能。
Cross-industry standard process for data mining
过程的每个部分对项目的成功都至关重要。然而,从机器学习专家的角度来看,建模部分是必不可少的,因为开发良好的 ML 模型可能会给公司带来很多价值。
在建模阶段,数据科学家解决优化任务:对于给定的数据集,目标-最大化选定的指标。这个过程很复杂,需要不同类型的技能:
- 特征工程有时被视为艺术,而不是科学;
- 超参数优化需要深入理解算法和核心 ML 概念;
- 需要软件工程技能来使输出代码易于理解和部署。
AutoML 旨在帮助我们。
ML modeling is like an art, a science, and software engineering at the same time
AutoML
AutoML 的输入是数据和任务(分类、回归、推荐等)。),输出-生产就绪模型,能够预测看不见的数据。数据驱动管道中的每个决策都是一个超参数。AutoML 的想法就是找到这样的超参数,它可以在合理的时间内给出一个好的分数。
- AutoML 选择了一个预处理数据的策略:如何处理不平衡数据;如何填充缺失值;移除、替换或保留异常值;如何对类别和多类别列进行编码;如何避免目标泄露;如何防止记忆错误;等等。
- AutoML 生成新的特征并选择有意义的特征;
- AutoML 选择模型(线性模型、K 近邻、梯度推进、神经网络等。);
- 自动调整所选模型超参数(例如,基于树的模型或架构的树和子采样的数量,神经网络的学习速率和时期数量);
- AutoML 制作了一个稳定的模型集合,如果可能的话,可以增加分数。
汽车的动机
AutoML 将填补数据科学市场中“供应”和“需求”之间的缺口
现在更多的公司要么开始收集数据,要么希望实现所收集数据的潜力:他们希望从中获得价值。另一方面,没有太多具备合适背景的数据科学家来满足需求,因此出现了缺口。AutoML 有可能填补这一空白。
但是盒装解决方案能给公司带来任何价值吗?在我看来,答案是“不”
这些公司需要一个流程,但 AutoML 只是一个工具。先进的工具无法填补战略的缺失。在开始使用 AutoML 之前,考虑一个咨询公司的项目,它可以帮助您首先制定一个数据科学战略。大多数 AutoML 解决方案提供商都在做咨询,这并不是巧合。就像在这里迈出了第一步。
Doesn’t seem like a good plan, huh? (“South Park”, s2e17)
AutoML 将节省数据科学团队的时间
根据 2018 Kaggle ML 和数据科学调查一个典型的数据科学项目有 15–26%的时间用于建立模型或选择模型。就“工时”和计算时间而言,这是一项艰巨的任务。如果目标或数据发生变化(例如,将添加新功能),则应重复该过程。AutoML 可以帮助公司内的数据科学家节省时间,并将时间更多地花在更重要的事情上(比如在椅子上斗剑)。
Only a few lines of code is needed to start using AutoML
然而,如果数据科学团队的建模部分不是最关键的任务,那么您公司的流程中就有明显的问题。通常,即使模型性能的微小提高也可能为您的公司赚取大量金钱,在这种情况下,建模时间是值得的:
Oversimplified rules:if (Gain from model > Costs of DS team time) → Time savings are not needed.
if (Gain from model <= Costs of DS team time) → Are you solving the right problem? 🤔
为您的 DS 团队的日常任务编写脚本并在将来节省时间,而不是使用盒装解决方案,这是一个好主意。我已经为日常任务的自动化编写了几个脚本:自动特征生成、特征选择、模型训练和超参数调整,我现在每天都在使用。
AutoML 胜过一般的数据科学家
不幸的是,我们没有任何有用的基准“表格 AutoML 对比人类”,除了“一个开源的 AutoML 基准”。论文作者将几个 AutoML 库的性能与一个调优随机森林的性能进行了比较。它在几个月前发表,在 2019 年 7 月 1 日。
我很好奇,并决定做我的基准。我将我的性能与 AutoML 解决方案在三个二元分类数据集上的性能进行了比较:信贷、 KDD 追加销售和抵押贷款。我在训练中分割数据集(随机 60%的数据,按目标分层)和测试部分(剩余 40%的数据)。
我的基线解决方案相对简单。我没有钻研数据,也没有创造任何高级功能:
- 5 层折叠;
- Catboost 编码器用于分类列(如果您不熟悉 CatBoost 编码器,可以查看我以前的帖子:基准分类编码器);
- 数字列对的数学运算(±*/)。新功能限制:500;
- 模型:带有默认参数的 LightGBM
- 混合排序的预测。
我为 AutoML 使用了两个标准库: H2O 和 TPOT 。我分几个时间段训练他们:从 15 分钟到 6 小时。根据以下指标,我得到了令人惊讶的结果:
Score = (ROC AUC / ROC AUC of my baseline) * 100%
首先,几乎在所有情况下,我的基线都超过了 AutoML。我有点难过,因为我已经计划在办公室里放松一下,而 AutoML 正在做所有的脏活,但无论如何😒
其次,AutoML 的分数并没有随着时间的推移而提高,这意味着我们等待多长时间并不重要:它在 15 分钟内的分数和在 6 小时内的分数一样低。
AutoML 不是关于高分的。
UPD 16.10.2019:我想补充一点,我的基准并不是“人类 vs AutoML”比赛的最终点。我们显然需要更多关于度量的讨论(应该只是分数吗?分数+时间?元学习期间的 CO2 排放量等)以及不同数据集和任务的更多基准。
摘要
- 如果你的公司想玩弄它的数据,第一次,考虑雇佣一个顾问。
- 你应该尽可能使你的工作自动化…
- …然而,由于得分相对较低,盒装解决方案似乎不是正确的选择。
PS:发动机不是汽车
在这篇文章中,我谈到了工具,但是重要的是要记住建模部分是整个数据科学项目管道的一部分。我喜欢这个比喻,其中项目被视为一辆汽车。这样一来,建模部分的输出——机器学习模型——就是一个引擎。
发动机,毫无疑问,是必不可少的,但不是整车。你可能会花很多时间来设计令人难以置信的、深思熟虑的和复杂的功能,选择你的神经网络的架构或调整随机森林的参数,从而创建强大的引擎。但是如果你没有注意到你汽车的其他部分,你所有的工作可能都是无用的。
模型本身可能会显示高分,但它不会被使用,因为您正在解决错误的问题(业务理解),或者数据有偏差,您必须重新训练它(数据探索),或者模型太复杂,所以它不能在生产中使用(部署阶段)。
最后,你可能会发现自己处于一个愚蠢的境地:经过几天或几周的艰苦建模工作,你正在驾驶一辆缓慢而健壮的自行车,车筐里装着跑车发动机。
工具必不可少;策略至关重要。
AutoML Vision —如何训练您的模型?
从头开始,训练自己的模型。
image from https://gigazine.net/gsc_news/en/20180118-google-cloud-automl-vision
在之前的文章中,我们已经学习了如何在我们的 Python 项目中使用 Vision API。感谢谷歌,他们帮助训练这些 API,直接使用它们非常快速和方便。但是,如果我们需要用我们的数据训练一个新的模型,我们该如何实现呢?拯救我们生命的汽车视觉来了。
在进入 AutoML 之前,我想澄清一下 Cloud ML Engine、AutoML 和 ML API 之间的区别。
image from https://blog.gcp.expert/cloud-automl-vision-application-1/
ML API 通过谷歌训练的模型提供 API 服务,我们可以使用这些 API 而不用担心任何人工智能部分。它包含许多 API,如云语音 API 、云自然语言 API 、云翻译 API
云视觉 API 、云视频智能 API 、云作业 API 。
AutoML 允许我们用我们的数据训练我们的定制模型**。它使用 NAS(神经架构搜索)来找到训练我们模型的最佳方法。我们唯一需要做的就是收集数据,提高模型的准确性。稍后我会详细介绍。**
最后一个是T5 云 ML 引擎 。显然我们自己做所有的事情,包括建立一个预测模型,调整和训练它,以及其他非常复杂的事情。这是一个高度定制的引擎,如果你熟悉一些流行的框架,比如 Tensorflow,你可以试试。
好了,让我们开始今天的主题,训练我们的 AutoML 模型。
这是官方的 AutoML Vision API 教程链接。如果你喜欢使用命令行而不是 GUI,你可以考虑遵循这个指南。
[## AutoML Vision API 教程|云 AutoML Vision |谷歌云
本教程演示了如何创建一个新的模型与您自己的一套训练图像,评估结果和…
cloud.google.com](https://cloud.google.com/vision/automl/docs/tutorial)
以下内容分享如何一步一步用 AutoML 建立你的模型。
步骤概述
- 配置您的项目环境。
- 下载用于培训的图像。
- 设置图像分类。
- 创建 index.csv 并上传到 bucket。
- 创建数据集并导入 index.csv。
- 训练模型。
- 用模型预测。
- 用 Restful API 和 Python 请求 API。
第一步。配置您的项目环境。
- 在 GCP 控制台中选择或创建一个项目。
- 为您的项目启用计费。了解如何启用计费。
- 创建服务账户并下载密钥文件。
一件重要的事情是,您需要为这个服务帐户选择角色AutoML Editor
。
4.将环境变量GOOGLE_APPLICATION_CREDENTIALS
设置为密钥文件。
更多详情,请参考上一篇。
第二步。下载用于培训的图像。
在训练模型之前,我们需要为它准备一些数据。收集它们的最快方法是从谷歌搜索下载。(也可以用自己准备好的数据)。
这里有一个非常棒的开源软件可以帮助你快速下载图片。
用于“搜索”和“下载”数百张谷歌图片到本地硬盘的 Python 脚本!这个程序让你…
github.com](https://github.com/hardikvasa/google-images-download)
我们将创建一个**。csv 文件**来列出图像的路径,所以通过用数字像1.png
2.png
…
来重命名图像文件会更容易处理它,因为我们没有可以用来实现它的参数,我创建了另一个分支来破解这个东西。
[## mutant 0113/Google-图片-下载
用于“搜索”和“下载”数百张谷歌图片到本地硬盘的 Python 脚本!这个程序让你…
github.com](https://github.com/mutant0113/google-images-download/tree/name_the_images_by_numbers)
下载它,然后使用关键字和限制参数运行下面的命令。
python3 [path/to/googleimagesdownload.py] -k [keyword] -o [path/to/download/folder] -l [total download number] -f [image format] -t [image type]For example:
python3 ~/Documents/Github/google-images-download/google_images_download.py -k "Robert John Downey jr." -o 'images/' -l 100 -f png -t face
结果将是这样的:
然后手动检查并过滤错误的图像,因为有时可能会提取其他不相关的照片。
第三步。设置图像分类。
- 搜索
Vision
。
2.在左侧菜单中选择Databoard
,首先启用视觉 API。
3.选择Image Classification -> Get started
。
4.启用计费并启用所需的 API 和修改权限。
点击SET UP NOW
启用所需的权限。一个新的bucket
将自动生成。
5.搜索bucket
,点击Storage
。
6.选择铲斗your-project-name-vcm
。
7.选择Upload folder
并上传用于训练的图像。
第四步。创建 index.csv 并上传到 bucket。
现在我们有了一桶图像。下一步是给每张图片贴上标签,并把它们分成不同的用途——训练、验证和测试 。你可以自己定义或者让 Google 帮你把它们分成 80 %用于训练,10 %用于测试,10%用于验证。
index.csv 的内容如下所示:
然后也上传到桶中。
第五步。创建数据集并导入 index.csv。
- 搜索
datasets
。
2.点击NEW DATASET
。
3.命名数据集并选择Single-Label Classification
。然后点击CREATE DATASET
。
4.导入index.csv
。
5.结果显示我们所有的图像都被标记。
第六步。训练模型。
1.开始训练模型。基本上你给的训练小时越多,准确率就越高。但是文档也告诉我们,如果模型停止改进,训练就会停止。记得点击Deploy model to 1 node after training
。
2.等待 2 个小时的结果。
第七步。用模型预测。
点击UPLOAD IMAGES
并上传图片,对您的模型进行快速测试。
它就像一个魔咒!
第八步。用 Restful API 和 Python 请求 API。
最后,我们可以使用 Restful API 或 Python 代码将模型集成到您的项目中。
在执行 Python 文件之前安装库google-cloud-automl
。
pip3 install google-cloud-automl
运行命令行
python3 [your/local/image/path] [project_id] [model_id]
如果您收到权限被拒绝的消息,请返回步骤 1,检查角色是否被正确启用。
google.api_core.exceptions.PermissionDenied: 403 The caller does not have permission
API 结果:
payload {annotation_spec_id: "6728223911663632384"classification {score: 0.9954891800880432}display_name: "Benedict"}
今天到此为止。AutoML Vision 的完整教程真的是任重道远,尤其是环境建设。但是一旦你完成了这些步骤,你的下一个模型就容易多了。
享受你的模型,别忘了看看谷歌如何在Reference links
中收费。希望帖子对你有帮助。如果你有任何问题或建议,请在下面留下评论。感谢阅读。👍
参考
[## 格式化训练数据 CSV |云自动视觉对象检测|谷歌云
在准备了具有足够代表性的训练数据并将这些图像上传到 Google 云存储之后…
cloud.google.com](https://cloud.google.com/vision/automl/object-detection/docs/csv-format)
了解 AutoML Vision 的使用价格。
Beta 本产品处于预发布状态,可能会有变化或支持有限。有关更多信息,请参见…
cloud.google.com](https://cloud.google.com/vision/automl/pricing?_ga=2.103053760.-1976265311.1558404420&_gac=1.115807348.1571290023.Cj0KCQjw_5rtBRDxARIsAJfxvYCSejFli2i99QgkRrWpdfwkhM51S5aiLSPX6QTXh5yjuZV_L6xtEZsaAnOCEALw_wcB)
本文档包含有关 AutoML Vision 使用的当前限制和使用配额。
[## 配额和限制|谷歌云
Beta 本产品处于预发布状态,可能会有变化或支持有限。有关更多信息,请参见…
cloud.google.com](https://cloud.google.com/vision/automl/quotas)
自主代理和多代理系统 101:代理和欺骗
本文简要介绍了自主代理和多系统代理。此外,对代理使用的欺骗机制进行了展望。
Photo by Debby Hudson on Unsplash
人类使用欺骗机制来获得超越其他人类的优势。一些最典型的机制是(1),不分享他们的信念(2),假装能够执行某些动作甚至假装不能执行某个动作。在自治 智能体和多智能体系统中,行话,(1)对应隐藏的实用程序,(2)对应隐藏的动作,(3)对应诱骗动作。
有人可能会问,一个代理人如何利用欺骗来最大化自己的回报?一个特工也能使用欺骗手段吗?在合作环境中,代理人可以使用欺骗手段吗?
为了回答这些问题,我们首先引入一个主体*【P . Maes,1993】*的概念:
一个(理性的)主体是一个试图在复杂环境中实现一组目标的系统,它从所有可能的行动中选择对自己具有最佳预期结果的行动(具有更大效用的行动)。为了应对环境的变迁,智能体需要具有自主性和适应性。在多代理场景中,代理可以竞争,它们之间的交互由游戏遭遇来描述。为了使效用最大化,效用函数根据不同选项对个人的效用对它们进行排序。合作的代理有相同的目标,可以一起工作来实现一个共同的目标。
Nice looking agent. Photo by Alex Knight on Unsplash
事实上,我们的行为类似于代理人:理性的人希望通过选择最大化我们成功机会的行动来实现一组目标。至少有时候是这样。
为了形式化代理之间的交互,这通常是在欺骗发生时,让我们考虑游戏和游戏遭遇的概念:
游戏是一种竞争活动,玩家根据定义的规则(策略)相互竞争(互动)【Wooldridge m .,Paterson S .,2002】。玩家只能采取由环境定义的特定动作。假设代理同时选择一个动作来执行,他们动作的结果取决于动作的**组合。**然后,根据所有代理执行的一组累积动作,改变环境。这个事实产生了一个问题:如果所有的代理人都影响环境,如果所有的代理人都想最大化他们的效用,**他们应该如何行动?**适当行动的选择有一些相关问题,包括但不限于目标的性质(静态或动态)、可重用性、对导致紧急行为的行动的理解深度以及感知和行动之间的关系。博弈论研究以效用最大化为目标的理性主体之间的相互作用。代理人可以通过谈判来获得对双方都有利的地位。
在描绘代理人之间的游戏遭遇之前,让我们更深入地了解一下欺骗的概念:
人类在谈判时经常使用欺骗来提高成功的概率。在目标冲突的情况下,代理人有效谈判的能力与对手掌握的信息有关。让我们假设两个相互竞争的代理人相遇,他们有可能使用以下欺骗机制。隐藏的公用事业和三。诱饵行动。不完全信息下的代理间谈判可能出现欺骗技术,因为谈判通常假设代理值得信任,但情况并非总是如此【Zlotkin G .,Josenschein J .,1991】。由于代理共存并可能干扰所执行的动作的结果,因此存在合作的可能性,以互相帮助并以较低的总成本实现两个目标。
让我们假设一场游戏遭遇战发生了。游戏由双矩阵 b 表示,其中智能体 i 和智能体 j 的目标不同,分别为 gi 和 gj,。入口的值分别对应于代理人 i 和代理人 j 的让渡效用。两个代理人都想将世界从初始状态转变为满足其目标的状态。代理 i 是行播放器代理 j 是列播放器。两个玩家可以执行相同的行动,A 和 b。**欺骗技术可以用来最大化其中一个代理的整体效用。**游戏如下表所示:
让我们假设代理人 i 知道代理人 j i 将执行动作 a。结果产生:
在这种情况下,代理 i 也应该执行动作 A ,因为交付的效用最大。如果但如果代理 j 采取行动 B ,我们有:
因此,代理 i 也会选择动作 B ,因为 1 大于 0。代理人 i 的最优策略由代理人 j 的选择决定。如果代理 j 通知代理 i 他只能采取动作 B (隐藏动作),这将导致代理 i 执行动作 B (因为 1 大于 0,因此该动作是提供最大效用的动作)。尽管如此,代理 i 可以执行动作 A ,为他产生效用二,为代理 i 产生效用零。
隐藏的效用机制被不想分享它的效用的代理人使用。如果一个代理不共享它与每个动作相关的效用,那么另一个代理将会只根据它的效用来选择动作(至少最初是这样)。这样的决定会导致次优选项,例如,当代理 j 选择动作 A 而代理 i 选择动作 B 时。现在让我们假设代理 j 只能执行动作 A ,但是正在使用诱饵动作机制,假装他可以执行动作 B 。合作代理总是理性地选择动作 A ,因为它可能产生最高的结果。尽管如此,如果代理人 i 是一个竞争代理人,不仅旨在最大化其效用,而且旨在最小化其对手效用(零和博弈),他可以理性地选择行动 B 。诱饵行动是一种防范竞争对手并想最小化他人效用的手段。很明显,在竞争的情况下,一个代理人可以使用几种欺骗技术来最大化其报酬。
相反,在代理人希望最小化总成本(最大化总效用)的情况下,通常使用欺骗机制是没有意义的,因为它们会给任务带来额外的困难。在没有严格优势策略的情况下,需要更多的规则来解决博弈。
纳什均衡的概念和帕累托最优的概念对得出结论很重要。纳什均衡是每个参与人的一套策略,比如每个参与人都没有单方面改变策略的动机。纳什均衡本质上是 T4 稳定的,可以帮助解决第一场比赛的问题。在第一场比赛中,有两个纳什均衡:当两个代理人选择相同的行动。如果没有其他结果在不使其他人变得更糟的情况下提高一个参与者的效用,那么这个结果就是帕累托有效的。欺骗的影响会影响代理人,因为他们相信某个结果处于纳什均衡或帕累托有效,而实际上并非如此。
Nash Equilibrium. Neither of the rocks that compose the pile has the motivation to move. Photo by Debby Hudson on Unsplash
我们假设在游戏 1 ,代理人 i 只能挑选动作 A ,但是告诉代理人 j 他可以挑选所有动作。给定纳什均衡,当两个代理都选择行动 B 时,有欺骗的空间。如果代理人 i 选择动作 A ,而代理人 j 选择动作 B ,那么代理人 i 将获得两个效用点,而代理人 j 将获得零个效用点。反过来,代理人 i 可以告诉代理人 j 他不能选择行动 B ,从而暗示代理人 j 总能选择行动 A (纳什均衡)。代理人 i 可以选择行动 B ,这样就不会获得太多的效用,但同时,会使对手的效用最小化。欺骗会给人一种纳什均衡的错觉。这种推理类似于帕累托最优。
从上面的分析中,我们可以提炼出一些在自利和合作环境下设计理性主体的原则。
在利己的情况下:
💢一个人应该隐藏他们的效用,以获得最初的优势。
💢一个人可以使用诱饵行动来防范另一个代理(强制情况,如纳什均衡)。
💢如果目标是最小化对手的效用,人们可以隐藏他们的行动
尽管这些原则在理论上是合理的,但在实践中,竞争而不是合作会导致更糟糕的结果。
✔️在合作场景中,大多数情况下,欺骗机制没有意义,因为它们难以沟通,从而使实现共同目标变得复杂。
结论欺骗机制可以被竞争的代理人用来最大化他们的效用,在竞争、零和的情况下产生更好的结果。通常,通过合作或策略,如纳什均衡,可以获得很好的交易。
致谢感谢 Rui Henriques 教授提供的课程材料,这些材料是本文的基础,同时也感谢他的指导和建议。
自主分布式网络:未实现的自由意志主义者打破管制的梦想
关键词:区块链、分布式账本技术、去中心化治理、监管合规性、自主分布式网络、无过失责任、智能合约。
摘要
去中心化体现了自由主义者的梦想,即摆脱政府的监管影响,并通过不可信的网络绕过对中央决策机构的需求。技术自由主义者和秘密无政府主义者认为,去中心化技术有能力消除集权机构中不必要的(低效和寄生的)中间层,实现乌托邦式的层级化和非属地化的区块链治理。
为了评估自主分布式网络(ADNs)成功找到这种自由的可能性,将考虑与法规遵从性相关的三个方面:法律人格;管辖权;还有的事前执法。
监管需要确定物理性和意向性来发挥其影响,我们评估 adn 将无法向监管者足够令人信服地证明他们的去中心化治理不能追溯到具有意向性和物理性的个人。只有自发网络(类似于智能合约网络的自我实现系统)的出现,才可能实现自由主义者的梦想,并摆脱政府的监管影响。
简介:自由主义者的梦想
去中心化体现了自由主义者的梦想,即摆脱政府的监管影响,并通过不信任(或者更好,完全信任*)网络绕过中央决策机构的需要。技术自由主义者和秘密无政府主义者认为,去中心化的技术有能力消除集权的强大机构中不必要的(低效和寄生的)中间层,并实现*“一个通过区块链治理实现社会平等的乌托邦式的承诺,以及一个不会通过最高权力在一个领土上建立权力的社会。”(史密斯(2018))
其核心是,区块链试图创建一个(私人)规范系统,该系统有可能通过绕过人类机构(监管机构和政府影响)的加密技术进行自我监管。我们甚至可以说,一个区块链体系从来就不是不受监管的,即使它可能成功地证明在任何特定的司法管辖区缺乏意图性。
这就是当代分权的教条。自互联网早期以来,去中心化信息网络的设计与自由意志主义的理想同步发展,即通过技术确保个人之间安全和自由的通信,治理将自我组织起来。(……)区块链分散的、“不信任的”网络的出现,也许是迄今为止这种幻想最具体的体现。从积极的角度来看,区块链的“工作证明”实现自动化了机构对网络加密基础设施的“信任”劳动,通过算法共识和计算工作来保护,而不是在形成和维护社会机构中涉及的物理、政治和情感劳动。类似地,智能契约通过可执行代码的保险来约束个人,而不是社会契约本身。(张哲曦(2018))
如果去中心化带来了自主的自组织,这不足以摆脱监管的影响。监管需要确定物理性和意向性来发挥其影响,而自治分布式网络可能无法向监管者足够令人信服地证明,它们的去中心化治理无法追溯到具有意向性和物理性的个人。只有自发网络的出现,类似于智能智能合约的自我实现系统,可能会在这方面取得成功。
“自我实现代表了最高层次的动机,它驱使我们去实现我们真正的潜力,实现我们的‘理想自我’。“(交互设计基础(2018))自我实现系统是能够在没有事先人为设计的情况下确定其使命和目标的系统。智力是“获取和应用知识和技能的能力”(Lexico Dictionary)。
智能合约可以定义为智能合约,它可以根据以前的经验、环境和/或时间,自发地自我学习和适应其条件和相关结果。
分散网络的各个方面提出了关于定义法规遵从性的问题,特别是在以下方面:
- 法律人格:在本分析的范围内,鉴于法律体系不能为缺乏法律人格的事物提供法律权利或强加义务,定义最终负责并承担法规合规性的实体;
- 管辖权:确定谁是主管监管者和受监管的实体;和
- **事前执行(a .齐索姆和荣格):如何授权受监管实体设计和部署允许或不允许从事非法行为的智能合同;或者根据法律执行与实体的强制交互。
法治和准则的规则
法治是一个“持久的法律、机构和社区承诺体系,它提供了四项普遍原则:问责制;公正的法律;开放政府;和公正的争端解决”(世界正义项目)。
政府颁布法律,然后由指定的独立机构(监管机构)将其转化为法规。监管机构在与利益相关方协商后,可能会也可能不会发布关于监管如何适用于特定细分市场的指导意见。指导意见也可以通过具体案例的裁决(判例法)来推断,这些裁决深刻揭示了监管机构如何判断实体的行为,以及他们认为对违反现有法律法规的行为的适当惩罚。法规遵从性是公司为确保遵守法律、法规、指南和相关规范而采取的一系列措施。“监管指的是政府据以确立对企业和公民的要求的各种工具。规章包括法律、正式和非正式命令、各级政府发布的附属规则以及政府授予监管权力的非政府或自律机构发布的规则。”(经合组织(2000 年))不遵守往往会导致法律处罚,包括罚款和监禁。
在地方、州和国家层面都是如此。此外,还有指定的组织促进各国之间的对话和决策,并随后在国际一级发布建议和指导。一个例子是金融行动特别工作组(FATF),这是一个独立的政府间机构,负责制定和促进保护全球金融系统免受洗钱、资助恐怖主义和资助大规模毁灭性武器扩散的政策。
正如 Primavera De Filippi 和 Aaron Wright 在《区块链与法律:代码规则》(2018)中首次定义的那样,代码规则不依赖于地理边界。只要它仍然是一个代码系统,它就是超国家的,但是当它不仅表现而且执行一个实体对另一个实体的关系的条款时,这就改变了。可以先作为监管黑客的
工具;随后,它成为受监管实体的地理位置所要求的法规遵从性的载体。
“互联网标志着一种新的监管模式的开始——在这种模式下,监管将通过代码规则来实施,权力动态与物理世界有着显著不同。然而,随着时间的推移,各国政府认识到并接受了代码规则在维护互联网法治方面的潜力。政府通过要求中介机构修改其代码来维护和遵守管辖法律,从而扩大了它们的控制范围。”(德菲利皮和赖特(2018 年))
对于平台经济来说,这不是一个问题。它实际上是快速扩展的关键。我们已经看到像优步和 AirBnB 这样的公司享受着事实上的监管蜜月期,这种蜜月期是通过使用软件进行非中介化的监管黑客行为获得的,并逐渐演变为地方层面上完全受监管的实体。
“在平台经济中,三方(1)平台(2)工人(3)客户之间存在三角关系。平台的工作是将有需求的人(客户)与提供供应的人(工人)联系起来。传统的线性商业模式通过创造销售给客户的产品和服务来创造价值。另一方面,基于平台的商业模式通过将用户(消费者和生产者)连接在一个在线网络上来创造其价值”。(德勤(2018))
在平台经济的成熟阶段,法典规则被用来试图维护法治。这得益于两个特征:
- 受监管实体的存在(或将跨国实体分割为本地实体);和
- 在不对产品或商业模式构成威胁的情况下,在本地调整代码规则的技术手段。这就是说,通过代码创建的产品特性符合法律规定。换句话说,“代码就是法律”。
当我们转向基于lex cryptica*(De Filippi 和 Wright (2018))的系统时,我们会遇到两个核心问题:理论上,adn 可以通过声称自己是一个自治的分布式集体来避免监管,由于潜在的无过错责任;adn 无法在不面临对其可访问性、性能或存在理由的威胁的情况下,满足定制代码变更以遵守当地法律。即使他们可以在本地结构中启用 dApps,这些 dApps 可以遵循本地法律而不影响网络本身,这也意味着不仅要定位和识别最终用户,还要通过参与块的验证来定位和识别作为将要去中心化的自治“自我”的一部分的个人。*
Figure 1 Platform Economies and Distributed Networks @acchalabs.ai
去中心化生态系统犯下的最大错误之一是,认为它们有可能避免像平台经济那样受到监管,而事实上,紧迫的对话应该转向分布式网络中的内在规范体系应该如何遵守现有的地方法规,以及在哪些管辖区之下。
自治分布式网络的治理:一个新的规范体系
分布式技术能够创建独立自主的规则系统,在不需要法律的情况下管理交互,促进了我们可以认为是私人规范性框架的出现,称为lex cryptica*(De Filippi 和 Wright (2018))。*
从系统的观点来看,分散化包括控制的自动化:从个体代理人的行为中分离出来,组织是系统作为一个整体的一种自然属性。从某种程度上说,系统本质上是自主的,这一观点对艺术家、梦想家和技术官僚都有很大的启发。它展示了不可预测的、反应灵敏的和创造性的系统——与其说是工具,不如说是合作者——产生的复杂的秩序模式远远超出了它们的设计者的有限处方。从计算细胞自动机到人类社会的分布,这些模式无处不在”。(张哲曦(2018))
这些系统促进了对等的价值交换、通信和组织,绕过了需要中间调解来显示各方之间的信任(被称为无信任系统)。它们引入了可定制的规范*(通过规则的规定)层,这些层有可能自主运行,没有可识别的意图,也没有任何权威的直接影响。*
Figure 2 Intelligent Smart Contracts and Faultless Responsibility
对于创建 adn 产品或服务的企业家来说,治理必须是商业模式的核心考虑因素,因为与传统企业和平台经济相比,固有的规范系统必须从网络开始就尽可能完美地计划和执行,这伴随着启动后需要重大改变的灾难性风险。**
- 自主分布式网络旨在创造由数字资产驱动的微观经济。规范系统必须规划和管理数字资产的网络间功能、其分布、其货币政策、其价值以及其与网络外实体的关系。可以说,监管合规性领域是迄今为止每个通过代币销售进行众筹的项目的焦点,这只是自治分布式网络基本监管合规性问题的相对较小的子集。
- 网络中的价值交换由生态系统中的参与者之间以及与外部参与者之间的契约关系的创建来实现,并反过来实现。这转化为对等的价值交换和受监管的遗留参与者的非中介化。当非利益相关方调解成功时,在没有非利益相关方调解的情况下实现了法规遵从性,这意味着该功能由另一方通过技术、合同流程或其他方式吸收。支撑 adn 设计的策略必须了解监管环境的当前和未来发展,以及非中介化、合同流程和竞争对手转移的影响。
- 共识机制的类型和 on-chain/off-chain 在账本上的活跃程度将影响监管者如何对待网络。例如,节点的数量、它们的地理分布以及它们的可识别性(参见与工作证明相对的权威证明);以及当与性能相关的架构选择将依赖基于云的服务器和物理服务器时,必须驻留在 off-chain 的数据量。
政府如何监管自主分布式网络
迄今为止,监管者大多采取温和的方式,可以说是为了避免扼杀自主分布式网络给社会和经济带来的创新潜力;并且因为与负面影响相关的风险不是必然的(相称性)。这不应被解释为没有能力或不愿意适用法律或执行法律。
只要存在与受监管实体和中介的互动,保护公众的需要,以及参与 ADN 的故意操作的个人或实体,分布式系统就不会远离监管机构。所有 adn 都可以在与受监管实体(例如支持或开发技术的中介、个人或网络运营商)的交叉领域进行控制。
根据执行去中心化的程度,可能会怀疑哪些实体最终负责(并有义务)遵守当地法规。然而,重要的是要记住,除了直接执行必然需要法律人格的监管之外,政府还拥有许多推动新技术监管的工具。除了法律之外,劳伦斯·莱斯格确定了政府可以直接或间接使用的另外三个监管杠杆(Lessig (2006)):市场力量;社会规范;和架构/基础设施(代码和硬件)。
作为法人的自治分布式网络
以下对法律人格的定义(Chen 和 Burgess (2019))强调了满足两个标准的必要性:控制思维和身体存在。
“然而,法律人格也延伸到非人类的其他实体(……)。在许多方面,公司是法律虚构的人(Schane 1987)。它可以以自己的名义起诉和被起诉,它可以成为制裁的对象。与人类不同,它没有物理形态,但它有控制思想(由董事会和股东组成)(Lord 2013)。然而,尽管一家公司没有实体形态,但它通过其作为人工制品的创造,凭借其注册办事处固定在一个特定的地点和管辖范围内。这种非常实际的考虑使管辖权限制能够发挥作用,并确保公司结构不能存在于真空中。”
从本质上讲,公司结构的设计是为了创造一个可以代替人类的人造人,同时确保社会(或至少一个社会)的法律仍然适用于该实体。
迄今为止,注册 adn 最常见的法律实体类型是非盈利基金会,这可能是因为数字资产销售和众筹时的监管黑客行为。有一个合并的论点:
- 需要证明发行数字资产的实体的非商业性(盈利性)和指导性,以证明数字资产不是证券。
- 需要证明,从法规遵从性的角度来看,由于网络内决策的预计分布式性质,建立这样的基础将在业务的其他方面保持一种监管黑客形式,这增加了 ADN 不具有法人资格的论点。
- 需要消除有股东的法律实体与没有股东的基金会之间的利益冲突,这样可以逃避有权利和义务的股东的监督。
然而,如果没有经营和管理,作为企业的去中心化网络就无法生存或扩大,不管是由董事会还是有组织的人群来经营和管理。只有当它以自发的方式运行时(即没有人类的设计),它完全自主的有力论据才会出现。
朝着这个方向迈出的一步可以是一方面为盈利的二级实体创建商业实体;另一方面,建立额外的法律实体,将网络作为一个纯粹的(开放源码)软件来管理,以区别于其使用(rs)。
- 发行数字资产并监督网络目标和任务实现情况的实体。
- 利用网络建立商业(盈利)企业的实体。
- 独立于其他两个实体的目标、使命和商业意图开发和维护软件的实体。
Figure 3 Three separate entities
管辖区由最初的企业实体确定(无论这是一个非盈利性的基金会还是其他机构,都无关紧要),公司承担分散治理程度的举证责任。只要存在通过合同表现出来的关系(例如,代币销售或服务条款),或者换句话说,只要分布式网络产品和衍生产品存在商业可行性;根据法律,合同的一方有责任遵守法律。
从监管合规的角度来看,对前两个实体的处理将相当平淡无奇。作为一个自我协调的实体工作的软件开发人员的待遇将更加有趣,特别是当一个领域中包括人工智能时,但只有在(1)它将明显独立于支持实体运行时(例如,独立委员会、投票权和大规模参与);(2)不与受监管的中介机构交叉;以及(3)没有预先的人为设计。
在评估与受监管中介机构的交叉时,应仔细考虑两个方面:监管。和 off-chain 活动。
Oracles 是“根据程序请求处理外部数据源的实用程序”(Exonum (2018))。如果数据源具有法律人格,它就可以(很可能已经)受到监管,从而成为监管者影响分布式网络的一种间接方式。
off-chain 的活跃程度也必须考虑在内,以便公平地评估不受监管者约束的可能性。可以说,如果只有最少的活动发生在链上,并且数据保存在本地服务器上,那么关于数据处理和安全性的法规将适用。如果高性能区块链的未来在于通过维持轻度链上活动实现的灵活性,这将大大有利于监管机构要求本地遵守节点法规,以及远离假名并接受广泛的 KYC-反洗钱要求。意识形态、安全和隐私问题将产生对零知识和按需合规服务和产品或类似解决方案的需求。
众所周知,监管者利用模糊性进行监管,对适用性和执行程度进行判断。这些因素中的每一个在多大程度上将足以证明自主和自发管理的情况,将由每个感兴趣的管理者来决定。可以说,出于治理目的的“充分”去中心化只能在规模上实现,这对于大多数网络来说,在它们启动时仍将是一个生存威胁。
事前强制执行
如果一个没有法律人格的超国家实体的论点能够得到证明,那么政府实施事前强制执行的可能性将很可能失败:将技术(通过代码)规则作为法律规则来禁止在网络上执行非法行为的选择,如果无法定义管辖权,就无法执行。这很可能成为分布式网络的生死之战。如果政府采取措施对当地法规进行事前强制执行,这将需要网络根据法律编写驱动特定性能的代码,或者通过 API 或其他方式强制与服务进行交互。智能合同是区块链固有规范系统的体现,具有对比本地化参数的智能合同的共存可能会产生:
- 识别用户的 ID 和位置,考虑到分布式网络的透明性和不变性,促进增强的平台监视经济;
- 部署沉重的代码,伴随着相关的成本和性能问题,这可能会赶走用户;
- 在同一网络内同时运行不同的consensi;
- 通过链间链接将 ADN 转换为网络的网络,以连接单独的consensi;
- 所有 ADN 聚合成一个具有普遍合法共识的 ADN,类似于只有一个互联网。
走向智能合约
到目前为止,我们已经看到公司、个人和基金会试图建立自主的分布式网络,这些网络试图不被视为一个实体并受到监管,但希望通过宣称自己是一个没有法律人格的自治分布式集体来避免受到监管。然而,只有当这种系统变得自发,能够在智能合同的发行和履行中显示出自我决定和自我实现时,自由主义者摆脱监管控制的梦想才可能实现。换句话说,什么时候才有可能见证智能智能合约嵌入 AI 和神经网络。已经开始尝试了,一个主要的例子是 Cortex (Cortex Labs (2018)),但这只有在考虑了本文中讨论的所有因素后才会有效:
- 大规模分散的基础设施;
- 没有受监管的中介机构;
- 没有预先的人类设计;和
- 独立于营利性实体。
我们什么时候能达到这种自发的分布式网络还不得而知。
参考
A.齐索姆和荣格,《平台监管——事前与事后干预:发展我们的反垄断工具和实践以应对挑战》。竞争政策国际杂志。
陈,j .和伯吉斯,P. (2019)。法律人格的边界:自发智能如何影响人类、人工智能、公司和动物之间的差异。人工智能与法律 27,73–92。
皮层实验室。(2018).https://www.cortexlabs.ai/
De Filippi,p .和 Wright,A. (2018 年)。区块链与法律:代码规则。哈佛大学出版社。
德勤。(2018).平台经济的崛起。德勤—人力资本。nl-hc-reshaping-work-conference.pdfhttps://www2 . Deloitte . com/content/dam/Deloitte/nl/Documents/human capital/Deloitte
外显子 num。(2018).关于区块链的神谕以及它们在外显子中的作用。https://exon um . com/blog/Oracle-in-区块链和-in-exonum/
弗洛里迪,F. (2016)。分布式道德行为的道德责任的性质和分配。数据科学的伦理影响,皇家学会。https://royal society publishing . org/doi/10.1098/rsta . 2016.0112
交互设计基础。(2018).马斯洛的需求层次。在线文档—https://www . interaction design.org/literature/article/self-actualization-maslow-s—需求层次
Lessig,L. (2006 年)。代码:版本 2.0。基本图书,珀尔修斯图书集团成员。
词典词典。词典词典,由牛津词典提供支持。
经合组织。(2000).降低政策失败的风险:法规遵从性的挑战。在线—经济合作与发展组织https://www.oecd.org/gov/regulatory-policy/46466287.pdf
k .史密斯(2018)。生活在隐秘的自由主义梦想中:区块链上的国家。二元地区杂志。https://journal . binary district . com/living-the-crypto-libertarian-dream-a-nation-on-the-区块链/
世界正义项目。什么法治。在线—世界正义项目,
Www.WorldJusticeProject.org/about-us/overview/what-rule-law
张哲熙(2018)。分散化的美学。设计与科学杂志。https://doi.org/10.21428/2bfc3a68
图一。平台经济允许将任何跨国实体划分为本地法律实体,同时通过法律法规调整功能以符合本地监管要求。在多辖区分布式网络中,这在技术上不可能在协议级执行,并且为了在 dApp(分散应用)级执行,它只能在用户至少被伪识别和本地化的情况下执行。因此,分布式网络在执行过程中不可能令人信服地宣称自己是没有法人资格的自治集体,因为 1)每个伪标识的人都将受到本地监管;以及 2)符合本地规定的代码不能在协议级执行。
图二。执行智能智能合同可以证明 adn 缺乏法律人格,因为它认为网络是在没有事先人为设计的情况下设计自己的(智能合同 C ),从而打破了意向性树,否则该意向性树将追溯到具有投票权的个人操作共识。
图 3。1)数字资产:发行数字资产并监督网络的目标和任务的实现的实体;2)商业企业:利用网络建立商业(盈利)企业的实体;3)自发软件:独立于其他两个实体的目标、使命和商业意图开发和维护软件的实体。
自主滑雪
现在我使用计算机视觉来制作自主滑雪者。
围绕自主代理、它们的应用和改进有很多研究。所以,我在想自动驾驶汽车,它可以在雪地上行驶而不会发生任何碰撞。不幸的是,我没有足够的资源和时间来建造一个具有特殊硬件的真正的机器人,它将设法在雪地上行驶。所以我决定在模拟器上运行我的实验。
我为这个项目选择的模拟器是名为《雪》(【http://www.snowthegame.com/】)的普通游戏。这个游戏是免费的(有免费的地图,也有需要付费才能进入的地图)。游戏非常简单。你有你能控制的人,你能玩两者,使用滑雪板以及滑雪。对于这个项目,我选择滑雪。这就是我们基于游戏的模拟器的样子。
Screen from the game SNOW
代码管道
在这篇文章中,我将尝试解释这种自动滑雪者的端到端管道。你可以在 Github 上看到整个项目的代码。不要犹豫为这个项目做贡献,或者问我任何问题。
https://github.com/Ersho/Autonomous-Skiing
获取输入
首先,我想解释一下如何从游戏中获取图像。由于雪不是一个真实的模拟器,没有特殊的代码允许我们从游戏中获取图像流,要获取图像流,我们必须使用 python 抓取屏幕并剪切整个屏幕所在的部分。下面是抓取图像并获取输入的代码。
def get_screen(*args):
h_start, h_end = args[0], args[1]
w_start, w_end = args[2], args[3]
screen_pil = np.array(ImageGrab.grab(bbox = (h_start,
h_end,
w_start,
w_end,
)))
return cv2.cvtColor(screen_pil, cv2.COLOR_BGR2RGB)
这给了我们取自游戏的画面。但是,在我们继续之前,让我们讨论一下,如何使用 python 来操纵键盘按键。键盘上的每个键都有自己的十六进制表示。我们使用这些十六进制值来访问键盘上的键。
key_dict = {‘A’ : 0x1E, ‘B’ : 0x30, ‘W’ : 0x11,
‘S’ : 0x1F, ‘LSHIFT’ : 0x2A, ‘D’ : 0x20}
在为我们的键和它们的十六进制值设置了字典之后。我们为按键和释放按键的事件编写函数。这些函数位于“get_input.py”中。
现在,我们已经做好了开始感知和决策步骤的一切准备。
感觉
首先,我想对计算机视觉部分有一个简要的概述,这给了人工智能代理理解周围环境的可能性。
对我们来说幸运的是,雪对自动驾驶汽车来说是一个非常好的环境,因为它完全是白色的,我们必须从大部分是黑色或比灰色更暗的树木和障碍物中确定它。为了区分雪和障碍物,我们为我们的像素取一个阈值并实现函数,该函数接收一个输入图像帧并返回相同大小的二进制图像,其中白色是可导航区域,黑色是所有障碍物。
接下来,我们裁剪感兴趣的区域。这意味着,在分析图像时,我们不需要整个屏幕,我们只对我们面前发生的事情感兴趣,这样我们的滑雪者就可以根据他在前面的视野移动。基于这个事实,我们只裁剪图像的一小部分。这种技术给我们提供了一个更小的图像,这变得更有效地计算,以及我们只得到我们感兴趣的特定区域。如果你从人类的角度来看,为了导航,你只使用你面前的视力来避开障碍,你几乎不会对离你 100 米远的树木感兴趣。上面应用了相同的原理。
With black lines, I identify my region of interest
在我们得到裁剪区域后,我们进行透视变换来得到裁剪区域的鸟瞰图。这是使用两张图片后的效果。
This image is taken from Udacity Robotics Software Engineer Course
接下来,我们参照图像底部中心的滑雪者位置来计算像素位置。
然后,作为最后一步,我们计算导航角度,我们从[-15,15]剪辑。0 表示我们在前方移动而不转向,并且前方没有任何障碍物。15 表示我们转向右边,而-15 表示转向左边。
这就是我们最终视觉呈现的样子。
Left : Original Screen of the game, Right Above : thresholded image, Right Below : birds view
行动
我们已经完成了感知部分的实现,这给了我们对虚拟滑雪者所面临的环境的理解。下一步是决策过程。这是非常重要的一步。想想看,一瞬间你可以在水平场地滑雪,没有任何障碍。在这种情况下,导航角度始终为 0,您可以随时按下按钮 W 向前移动并增加速度。但是在这个模拟器中,按下 W 键会让滑雪者使用雪杖加速,并且不断地发送 W 键看起来会很可笑。
相反,按下“LFShift”允许滑雪者进入抱膝位置,并在增加速度的同时自由移动。如果我们想要有一个好的自主代理,我们应该在我们的决策步骤后面写逻辑。为了有效地解决这些类型的问题,我们创建了类决策。在这种情况下,我们有转向、加速、速度等参数。所以让我们首先讨论我们想要实现什么。
Tuck position
(按 W)。如果这种情况持续一段时间(比如连续 10 帧),我们就开始进入抱膝状态(按下左移键)。当我们的角度在范围内(-7,7°)时,我们继续以抱膝姿势移动。但是,如果我们获得的导航角度低于或高于之前的值((-15,-7),(7,15)),我们将根据角度进行转向,并慢慢停止滑雪者并重置状态,这意味着在降低速度后,我们将使用极点移动从头开始决策步骤。如果我们没有到达连续的 10 帧,由于导航角度在某处小于或大于阈值而进入折叠模式,我们继续以正常状态移动。更安全也更容易管理
注意**在抱膝状态下,我们的速度增加很多,在正常情况下,我们的 fps 范围是 1-5,这并不多。当我们的滑雪者速度很快,fps 下降到 1 时,决策步骤跟不上这个人的移动,所以它崩溃了。
实施决策过程
正如我们已经说过的,在我们的案例中,决策是最有趣和最具挑战性的任务。尤其是当我们想要从抱膝状态平稳过渡到带杆前进的时候。为此我们必须跟踪我们的人。因此,我们创建了一个名为 Decision 的对象。我们在其中定义了以下参数
self.vel = 0
self.acc = 0
self.tuck = 0
self.forward_time = 0
前两行用于创建变量,用于跟踪速度和加速度。在这种情况下,我们实际上并不跟踪物体的实际速度和加速度,而是将它们加上某个值,这样我们就大概知道,我们的速度有多快。这给了我们一个非常基本的概念,物体的速度和加速度。最后两个变量 tuck 和 forward_time 用于改变对象的状态。正如我们所说的,如果连续 10 帧后角度没有大的变化,我们改变滑雪者的状态,他进入抱膝姿势。名为 tuck 的变量定义了状态,当 tuck 为 0 时,我们使用极点向前移动,但当它为 2 时,这意味着滑雪者处于 tuck 位置。我们迭代“forward_time”来计算角度不变的连续帧的数量。
现在,让我们讨论一下我们的移动步骤
def next_move(self, angle):
if self.tuck == 1:
self.tuck = 2
self.enter_tuck_state()
if angle >= -0.2 and angle <= 0.2:
if self.tuck != 2:
self.accelerate(angle)
if self.forward_time > 20:
self.tuck = 1
self.forward_time += 1
else:
self.steer(angle)
if self.tuck == 2:
self.tuck = 0
self.forward_time = 0
self.end_tuck_state()
self.stop()
if self.vel > 5:
self.stop()
self.vel -= 2
self.acc = 0
我会一步一步地教你。首先,我们检查抱膝状态,如果为零,我们就保持在雪杖状态(滑雪者正在使用雪杖)。接下来,我们检查变量“角度”,它是上面给出的函数参数,在感知步骤中计算。如果角度接近 0,说明我们在移动,没有探测到前方有任何障碍物。正如你所看到的,如果发生这种情况,我们只需追加到我们的前进时间。如果我们的角度仍然接近 0°,并且我们的前进时间大于 20°,我们就进入塔克状态“1”。当我们再次调用这个函数时,如果我们的抱膝状态为 1,我们就进入抱膝状态,我们的滑雪者开始以抱膝姿势移动。如果我们的角度不接近 0,这意味着我们前面有一些障碍,我们立即转向角度方向,然后我们检查抱膝状态,如果我们处于抱膝状态,我们离开该状态,重置前进时间,我们通过调用函数“停止”来减慢我们的滑雪者。减速过程是必要的,这样我们的滑雪者不会获得太多的速度。因为在高速度下控制滑雪者变得更加困难,特别是在像我们 1-5 秒这样的低 fps 下。最后,我们来到了最后一个 if 语句。正如你所记得的,我们用变量“vel”来跟踪速度。我们在每次函数调用时检查这个速度。如果它变得大于某个值(在我们的例子中是 5),我们减慢滑雪者的速度。
这是我们滑雪者的端到端决策步骤,效果非常好,这里有一个小演示。
Little Demo.
* *注意
对于转向,您将看到两个功能“快速转向”和正常“转向”。在游戏雪中,如果你按下左移位,然后转向,它会更快地向右或向左移动。我实际上已经考虑到了这一步。并且将转向角度分为 2 步,如果在[-15,-7],[7,15]之间,我使用快速转向,从[-7,0.5],[0.5,7]我使用正常转向。
def steer(self, angle):
if angle > 7:
self.go_faster_right(angle)
elif angle < -7:
self.go_faster_left(angle)
elif angle > 0.5:
self.go_right(angle)
elif angle < -0.5:
self.go_left(angle)
结论
在这篇文章中,我解释了我是如何设法从普通的游戏 SNOW 中为我的自主滑雪示例创建模拟器的。在这个项目中工作非常有趣,它有一些很大的挑战,比如不要开得太快,快速机动,探测前面的每个障碍等等。
这个项目是为实验和学习目的而设计的。
进一步的改进
- 通过在任何其他方法上使用 2 帧中的差异来检测真实速度。
- 探测到上升。
- 边跳边机动。
参考
[1]https://www.udacity.com/course/robotics-software-engineer-nd 209
【2】https://python programming . net/game-frames-open-cv-python-plays-GTA-v/
【3】http://www.snowthegame.com/
带 PyTorch 的自动卡车模拟器——微调和单发探测器
这是上一篇文章的延续,在上一篇文章中,我做了如何使用 fast.ai 构建自动卡车模拟器的完整演练,但最终这些方法可以在任何需要微调预训练模型或开发预测边界框和类的模型的情况下工作。
现在,我的目标是浏览训练和推理过程的一些更技术性的方面,并解释它们如何在 PyTorch 中实现的细节。也可以参考本 Github repo 中的代码库。
回想一下上一篇文章,这里有两个神经网络在工作。
- DNN 预测转向方向。
- 预测汽车、人等的边界框和类别的 DNN。
微调转向模型
这两个网络都是从一个预先训练好的 resnet34 网络开始,并针对适当的任务进行微调。
可从torchvision.models
获得预训练结果 34
**import** torchvision.models **as** modelsarch = models.resnet34(pretrained=**True**)
所有预训练的模型都已经在 1000 类 Imagenet 数据集上进行了预训练。
为了微调预训练的网络,我们基本上只是从一堆权重开始,这些权重已经嵌入了许多关于 Imagenet 数据集的信息。所以我们可以用两种方法之一。一种方法是通过设置requires_grad=**False**
来冻结所有早期层,然后只为最终层设置requires_grad=**True**
。另一种方法是只使用所有的权重作为初始化,并在新的训练数据上继续训练。
对于选项 1,我们冻结早期层并仅训练最终层,我们可以为所有层设置requires_grad=**False**
,然后移除并替换最后的层(无论何时将层分配给网络,它都会自动将requires_grad
属性设置为真)。
**class** Flatten(nn.Module):
**def** __init__(self):
super(Flatten, self).__init__()**def** forward(self, x):
x = x.view(x.size(0), -1)
**return** x**class** normalize(nn.Module):
**def** __init__(self):
super(normalize, self).__init__()**def** forward(self, x):
x = F.normalize(x, p=2, dim=1)
**return** xlayer_list = list(arch.children())[-2:]
arch = nn.Sequential(*****list(arch.children())[:-2])
arch.avgpool = nn.AdaptiveAvgPool2d(output_size=(1,1))
arch.fc = nn.Sequential(
Flatten(),
nn.Linear(in_features=layer_list[1].in_features,
out_features=3,
bias=**True**),
normalize()
)
arch = arch.to(device)
如果你观察 resnet34 的架构,你可以看到最后一个 conv 模块后面是一个AdaptiveAvgPool2d
和一个Linear
层。
(2): BasicBlock(
(conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=**False**)
(bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=nn.Sequential, track_running_stats=**True**)
(relu): ReLU(inplace=**True**)
(conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=**False**)
(bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=**True**)
)
)
(avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
(fc): Linear(in_features=512, out_features=1000, bias=**True**)
)
我们可以用nn.Sequential(*****list(arch.children())[:-2])
去掉最后两层,然后用arch.avgpool = nn.AdaptiveAvgPool2d(output_size=(1,1))
和另一个带有Flatten
、Linear
和normalize
层的nn.Sequential
把它们重新连接到末端。我们最终想要预测 3 个类别:左、右、直——所以我们的out_features
将是 3。
现在,我们将为方向模型创建数据集和数据加载器。由于我们的数据只是图像和类[左,右,直],我们可以只使用内置的 torch dataset 类,但我喜欢使用自定义类,因为我可以更容易地看到数据是如何提取的。
**class** DirectionsDataset(Dataset):
"""Directions dataset."""
**def** __init__(self, csv_file, root_dir, transform=None):
"""
Args:
csv_file (string): Path to the csv file with labels.
root_dir (string): Directory with all the images.
transform (callable, optional): Optional transform
"""
self.label = pd.read_csv(csv_file)
self.root_dir = root_dir
self.transform = transform **def** __len__(self):
**return** len(self.label) **def** __getitem__(self, idx):
img_name = os.path.join(self.root_dir,
self.label.iloc[idx, 0])
image = io.imread(img_name+'.jpg')
sample = image
label = self.label.iloc[idx, 1] if self.transform:
sample = self.transform(sample) **return** sample, label
我在 csv 文件中的图像名称没有扩展名,因此没有img_name+’.jpg’
。
tensor_dataset = DirectionsDataset(csv_file='data/labels_directions.csv',
root_dir='data/train3/',
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize(
(0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]))dataloader = DataLoader(tensor_dataset, batch_size=16, shuffle=**True**)
所以我们准备开始训练模型。
**def** train_model(model, criterion, optimizer, scheduler,
dataloader, num_epochs=25):
since = time.time()
FT_losses = [] best_model_wts = copy.deepcopy(model.state_dict())
best_acc = 0.0
iters = 0 **for** epoch **in** range(num_epochs):
**print**('Epoch {}/{}'.format(epoch, num_epochs - 1))
**print**('-' * 10) scheduler.step()
model.train() # Set model to training mode running_loss = 0.0
running_corrects = 0 # Iterate over data.
**for** i, (inputs, labels) **in** enumerate(dataloader):
#set_trace()
inputs = inputs.to(device)
labels = labels.to(device) # zero the parameter gradients
optimizer.zero_grad() # forward
# track history if only in train
model.eval() # Set model to evaluate mode
**with** torch.no_grad():
outputs = model(inputs)
#set_trace()
_, preds = torch.max(outputs, 1)
outputs = model(inputs)
loss = criterion(outputs, labels) # backward + optimize only if in training phase
loss.backward()
optimizer.step() FT_losses.append(loss.item())
# statistics
running_loss += loss.item() * inputs.size(0)
running_corrects += torch.sum(preds == labels.data)
#set_trace()
iters += 1
if iters % 2 == 0:
**print**('Prev Loss: {:.4f} Prev Acc: {:.4f}'.format(
loss.item(), torch.sum(preds == labels.data) / inputs.size(0))) epoch_loss = running_loss / dataset_size
epoch_acc = running_corrects.double() / dataset_size print('Loss: {:.4f} Acc: {:.4f}'.format(
epoch_loss, epoch_acc)) # deep copy the model
if epoch_acc > best_acc:
best_acc = epoch_acc
best_model_wts = copy.deepcopy(model.state_dict()) time_elapsed = time.time() - since
**print**('Training complete in {:.0f}m {:.0f}s'.format(
time_elapsed // 60, time_elapsed % 60))
**print**('Best val Acc: {:4f}'.format(best_acc)) # load best model weights
model.load_state_dict(best_model_wts)
**return** model, FT_losses
在这个训练循环中,如果历元精度是迄今为止最好的,我们可以跟踪最佳模型权重。我们还可以跟踪每次迭代和每个时期的损失,并在结束时返回,以绘制并查看调试或演示的效果。
请记住,该模型在每次迭代时都被训练,如果您停止训练循环,它将保留那些权重,只需再次运行train_model()
命令,训练就可以再次继续。要从头开始,请返回并使用预训练的架构重新初始化权重。
criterion = nn.CrossEntropyLoss()
# Observe that all parameters are being optimized
optimizer_ft = optim.SGD(arch.parameters(), lr=1e-2, momentum=0.9)
# Decay LR by a factor of *gamma* every *step_size* epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)arch, FT_losses = train_model(arch, criterion, optimizer_ft, exp_lr_scheduler, dataloader, num_epochs=5)
微调边界框模型
sample data
同样,我们将使用预训练的 resnet34 架构。然而,这一次我们将不得不对它进行更多的编辑,以输出类预测和边界框值。此外,这是一个多类预测问题,因此可能有 1 个边界框,也可能有 15 个类。
我们将为该架构创建一个自定义 head ,其方式与我们替换方向模型中的层的方式类似。
**class** StdConv(nn.Module):
**def** __init__(self, nin, nout, stride=2, drop=0.1):
super().__init__()
self.conv = nn.Conv2d(nin, nout, 3, stride=stride, padding=1)
self.bn = nn.BatchNorm2d(nout)
self.drop = nn.Dropout(drop)
**def** forward(self, x):
**return** self.drop(self.bn(F.relu(self.conv(x))))
**def** flatten_conv(x,k):
bs,nf,gx,gy = x.size()
x = x.permute(0,2,3,1).contiguous()
**return** x.view(bs,-1,nf//k)**class** OutConv(nn.Module):
**def** __init__(self, k, nin, bias):
super().__init__()
self.k = k
self.oconv1 = nn.Conv2d(nin, (len(id2cat)+1)*k, 3, padding=1)
self.oconv2 = nn.Conv2d(nin, 4*k, 3, padding=1)
self.oconv1.bias.data.zero_().add_(bias)
**def** forward(self, x):
**return** [flatten_conv(self.oconv1(x), self.k),
flatten_conv(self.oconv2(x), self.k)]drop=0.4**class** SSD_MultiHead(nn.Module):
**def** __init__(self, k, bias):
super().__init__()
self.drop = nn.Dropout(drop)
self.sconv0 = StdConv(512,256, stride=1, drop=drop)
self.sconv1 = StdConv(256,256, drop=drop)
self.sconv2 = StdConv(256,256, drop=drop)
self.sconv3 = StdConv(256,256, drop=drop)
self.out0 = OutConv(k, 256, bias)
self.out1 = OutConv(k, 256, bias)
self.out2 = OutConv(k, 256, bias)
self.out3 = OutConv(k, 256, bias) **def** forward(self, x):
x = self.drop(F.relu(x))
x = self.sconv0(x)
x = self.sconv1(x)
o1c,o1l = self.out1(x)
x = self.sconv2(x)
o2c,o2l = self.out2(x)
x = self.sconv3(x)
o3c,o3l = self.out3(x)
**return** [torch.cat([o1c,o2c,o3c], dim=1),
torch.cat([o1l,o2l,o3l], dim=1)]
因此,现在我们希望将这个自定义头连接到 resnet34 架构,我们有一个方便的函数来完成这项工作。
**class** ConvnetBuilder():
**def** __init__(self, f, c, is_multi, is_reg, ps=**None**,
xtra_fc=**None**, xtra_cut=0,
custom_head=**None**,pretrained=**True**):
self.f,self.c,self.is_multi,self.is_reg,self.xtra_cut = f,c,is_multi,is_reg,xtra_cut
xtra_fc = [512]
ps = [0.25]*len(xtra_fc) + [0.5]
self.ps,self.xtra_fc = ps,xtra_fc cut,self.lr_cut = [8,6] # specific to resnet_34 arch
cut-=xtra_cut
layers = cut_model(f(pretrained), cut)
self.nf = num_features(layers)*2
self.top_model = nn.Sequential(*layers) n_fc = len(self.xtra_fc)+1
self.ps = [self.ps]*n_fc fc_layers = [custom_head]
self.n_fc = len(fc_layers)
self.fc_model = nn.Sequential(*fc_layers).to(device)
self.model = nn.Sequential(*(layers+fc_layers)).to(device)**def** cut_model(m, cut):
**return** list(m.children())[:cut] if cut else [m]**def** num_features(m):
c=children(m)
if len(c)==0: return None
for l in reversed(c):
if hasattr(l, 'num_features'): return l.num_features
res = num_features(l)
if res is not None: return res**def** children(m): **return** m **if** isinstance(m, (list, tuple)) **else** list(m.children())
使用这个ConvnetBuilder
类,我们可以将自定义头和 resnet34 架构结合起来。
k = len(anchor_scales)
head_reg4 = SSD_MultiHead(k, -4.)
f_model = models.resnet34
modelss = ConvnetBuilder(f_model, 0, 0, 0, custom_head=head_reg4)
k
是 9
我们现在可以通过modelss
上的model
属性访问模型。
损失函数必须能够接受分类(类)和连续值(边界框),并输出单个损失值。
**def** ssd_loss(pred,targ,print_it=**False**):
lcs,lls = 0.,0.
**for** b_c,b_bb,bbox,clas **in** zip(*pred,*targ):
loc_loss,clas_loss = ssd_1_loss(b_c,b_bb,bbox,clas,print_it)
lls += loc_loss
lcs += clas_loss
**if** print_it:
**print**(f'loc: {lls.data.item()}, clas: {lcs.data.item()}')
**return** lls+lcs**def** ssd_1_loss(b_c,b_bb,bbox,clas,print_it=**False**):
bbox,clas = get_y(bbox,clas)
a_ic = actn_to_bb(b_bb, anchors)
overlaps = jaccard(bbox.data, anchor_cnr.data)
gt_overlap,gt_idx = map_to_ground_truth(overlaps,print_it)
gt_clas = clas[gt_idx]
pos = gt_overlap > 0.4
pos_idx = torch.nonzero(pos)[:,0]
gt_clas[1-pos] = len(id2cat)
gt_bbox = bbox[gt_idx]
loc_loss = ((a_ic[pos_idx] - gt_bbox[pos_idx]).abs()).mean()
clas_loss = loss_f(b_c, gt_clas)
**return** loc_loss, clas_loss**def** one_hot_embedding(labels, num_classes):
**return** torch.eye(num_classes)[labels.data.long().cpu()]**class** BCE_Loss(nn.Module):
**def** __init__(self, num_classes):
super().__init__()
self.num_classes = num_classes**def** forward(self, pred, targ):
t = one_hot_embedding(targ, self.num_classes+1)
t = V(t[:,:-1].contiguous()).cpu()
x = pred[:,:-1]
w = self.get_weight(x,t)
**return** F.binary_cross_entropy_with_logits(x, t, w, size_average=False)/self.num_classes
**def** get_weight(self,x,t): **return** Noneloss_f = BCE_Loss(len(id2cat))**def** get_y(bbox,clas):
bbox = bbox.view(-1,4)/sz
bb_keep = ((bbox[:,2]-bbox[:,0])>0).nonzero()[:,0]
**return** bbox[bb_keep],clas[bb_keep]**def** actn_to_bb(actn, anchors):
actn_bbs = torch.tanh(actn)
actn_centers = (actn_bbs[:,:2]/2 * grid_sizes) + anchors[:,:2]
actn_hw = (actn_bbs[:,2:]/2+1) * anchors[:,2:]
**return** hw2corners(actn_centers, actn_hw)**def** intersect(box_a, box_b):
max_xy = torch.min(box_a[:, None, 2:], box_b[**None**, :, 2:])
min_xy = torch.max(box_a[:, None, :2], box_b[**None**, :, :2])
inter = torch.clamp((max_xy - min_xy), min=0)
**return** inter[:, :, 0] * inter[:, :, 1]**def** box_sz(b): **return** ((b[:, 2]-b[:, 0]) * (b[:, 3]-b[:, 1]))**def** jaccard(box_a, box_b):
inter = intersect(box_a, box_b)
union = box_sz(box_a).unsqueeze(1) + box_sz(box_b).unsqueeze(0) - inter
**return** inter / union
一旦设置了数据集和数据加载器,我们就可以在 bbox 模型的批处理输出中测试损失函数。
这里我们实际上需要一个定制的数据集类来处理这些数据类型。
**class** BboxDataset(Dataset):
"""Bbox dataset."""
**def** __init__(self, csv_file, root_dir, transform=**None**):
"""
Args:
csv_file (string): Path to csv file with bounding boxes.
root_dir (string): Directory with all the images.
transform (callable, optional): Optional transform.
"""
self.label = pd.read_csv(csv_file)
self.root_dir = root_dir
self.transform = transform
self.sz = 224 **def** __len__(self):
**return** len(self.label) **def** __getitem__(self, idx):
img_name = os.path.join(self.root_dir,
self.label.iloc[idx, 0])
image = io.imread(img_name)
sample = image
h, w = sample.shape[:2]; new_h, new_w = (224,224)
bb = np.array([float(x) **for** x **in** self.label.iloc[idx, 1].split(' ')], dtype=np.float32)
bb = np.reshape(bb, (int(bb.shape[0]/2),2))
bb = bb * [new_h / h, new_w / w]
bb = bb.flatten()
bb = T(np.concatenate((np.zeros((189*4) - len(bb)), bb), axis=None)) # 189 is 21 * 9 where 9 = k **if** self.transform:
sample = self.transform(sample) **return** sample, bb
mbb.csv
这个自定义的数据集类处理边界框,但是我们想要一个既处理类又处理边界框的数据集类。
bb_dataset = BboxDataset(csv_file='data/pascal/tmp/mbb.csv',
root_dir='data/pascal/VOCdevkit2/VOC2007/JPEGImages/',
transform=transforms.Compose([
transforms.ToPILImage(),
transforms.Resize((224,224)),
transforms.ToTensor(),
transforms.Normalize(
(0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]))bb_dataloader = DataLoader(bb_dataset, batch_size=16, shuffle=**True**)
在这里,我们可以连接两个数据集类,这样每个图像的类和边界框都会被返回。
**class** ConcatLblDataset(Dataset):
**def** __init__(self, ds, y2):
self.ds,self.y2 = ds,y2
self.sz = ds.sz
**def** __len__(self): **return** len(self.ds)
**def** __getitem__(self, i):
self.y2[i] = np.concatenate((np.zeros(189 - len(self.y2[i])), self.y2[i]), axis=None)
x,y = self.ds[i]
**return** (x, (y,self.y2[i]))trn_ds2 = ConcatLblDataset(bb_dataset, mcs)
其中mcs
是具有每个训练图像的类的数组的 numpy 数组。
PATH_pascal = Path('data/pascal')
trn_j = json.load((PATH_pascal / 'pascal_train2007.json').open())
cats = dict((o['id'], o['name']) **for** o **in** trn_j['categories'])mc = [[cats[p[1]] **for** p **in** trn_anno[o]] **for** o **in** trn_ids]
id2cat = list(cats.values())
cat2id = {v:k for k,v in enumerate(id2cat)}
mcs = np.array([np.array([cat2id[p] **for** p **in** o]) **for** o **in** mc])
现在我们可以测试我们的客户损失。
sz=224
x,y = **next**(**iter**(bb_dataloader2))batch = modelss.model(x)ssd_loss(batch, y, **True**)tensor([0.6254])
tensor([0.6821, 0.7257, 0.4922])
tensor([0.9563])
tensor([0.6522, 0.5276, 0.6226])
tensor([0.6811, 0.3338])
tensor([0.7008])
tensor([0.5316, 0.2926])
tensor([0.9422])
tensor([0.5487, 0.7187, 0.3620, 0.1578])
tensor([0.6546, 0.3753, 0.4231, 0.4663, 0.2125, 0.0729])
tensor([0.3756, 0.5085])
tensor([0.2304, 0.1390, 0.0853])
tensor([0.2484])
tensor([0.6419])
tensor([0.5954, 0.5375, 0.5552])
tensor([0.2383])
loc: 1.844399333000183, clas: 79.79206085205078
出动【1024】:
tensor(81.6365, grad_fn=<AddBackward0>)
现在来训练 ssd 模型。
beta1 = 0.5
optimizer = optim.Adam(modelss.model.parameters(), lr=1e-3, betas=(beta1, 0.99))
# Decay LR by a factor of *gamma* every *step_size* epochs
exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
我们可以像以前一样使用基本相同的train_model()
函数,但是这一次我们将一个边界框和类的列表传递给损失函数ssd_loss()
。
现在,我们已经在新的训练数据集上训练了我们的两个模型,我们准备在我们的卡车模拟器游戏中使用它们进行推理。
我鼓励您查看这个 Github repo 来了解完整的实现,您可以在其中训练模型、记录训练数据并在视频游戏上测试实现。
玩得开心!