让你的科学与芝诺多公平
如何使用 Zenodo REST API 用 Python 上传数据
达斯汀·休姆斯在 Unsplash 拍摄的照片
发布的数据应该公平:可查找、可访问、可互操作和可重用。数据仓库,比如 Zenodo,有助于确保研究项目的公平性。
Zenodo 是一个免费平台,允许任何人上传和存储数据,使其可以搜索并提供数字对象标识符(DOI)。通过网页上的拖放功能,从本地计算机上传小文件很容易。但是如果文件很大并且在远程计算机上,那么你需要使用 Zenodo REST API 。
这篇文章描述了如何通过 Python 使用 API 与你的 Zenodo 帐户交互,这样你就可以以编程的方式创建项目和上传数据。
目录
RESTful API 基础
应用程序编程接口(API)是两台计算机相互通信的一种方式。它的工作原理就像一个网络浏览器,但是你写代码从服务器请求数据,而不是点击按钮。大多数 API 都是 RESTful 的,这意味着它们遵循一组称为表述性状态转移的规则。深入探究 REST APIs 超出了本教程的范围。然而,理解什么是 API 以及它如何在基础层面上工作是很重要的。
RESTful API 将数据组织成一串唯一的链接,类似于网页统一资源定位器(URL),只是它们被称为统一资源标识符(URIs)。例如,基本的 Zenodo API 是 https://api.zenodo.org/api 的和 https://zenodo.org/api/deposit/depositions 的的一个 URIs。
如果你点击这些链接,你实际做的是发送一个请求到一个服务器,在你的屏幕上显示的是*响应。*基本的 Zenodo API 链接将显示所有的 URIs,而/deposit/depositions
链接可能会显示这样的错误消息
{"message":"The server could not verify that you are authorized to access the URL requested. You either supplied the wrong credentials (e.g. a bad password), or your browser doesn't understand how to supply the credentials required.","status":401}
写着“status”:401
的部分是一个状态码,表示我们未经授权,需要提供一个访问令牌。
RESTful APIs 的一个很好的简单解释可以在这个视频的前两分钟中找到。
芝诺多 API
假设我们有一个 Zenondo 帐户,我们想从本地计算机与之交互。我所说的交互是指创建项目、上传数据、更新元数据以及删除文件或整个项目。我们可以用 API 向 Zenodo 发出四个基本请求:GET
、POST
、PUT
和DELETE
。
- 获取是读取数据
- POST 是创建项目并将数据移动到芝诺多
- 放是改变与项目相关的元数据
- 删除将删除数据或项目
这些是我们将用来与 Zenodo 交互的 HTTP REST API 方法。一般来说,这是如何工作的,我们(客户机)将向 Zenodo(服务器)发出请求,作为回报,我们将得到响应。该响应可以是返回给我们的数据和/或表明我们的请求成功或失败的响应状态码。上的响应代码:
- 2** =一切顺利
- 4** =客户端错误(你做错了什么)
- 5** =服务器错误(服务器出现问题)
这一切现在听起来可能有点抽象,但当我们应用它时,它将是有意义的。
总而言之,API 是一种代码,它让我们通过发送请求 ( GET
、POST
、PUT
、DELETE
)和作为回报的响应,在互联网上与服务器(在本例中是 Zenodo)进行通信。
更深入的解释,请看佩里·艾辛的帖子。
https://medium.com/@perrysetgo/what-exactly-is-an-api-69f36968a41f
在我们开始之前…
您需要创建一个帐户和一个访问令牌。使用 API 时,这个令牌是您帐户的密钥。我们向它提供我们的请求,告诉 Zenodo 我们有适当的权限来访问这个帐户。
- 你首先需要用芝诺多创建一个账户。
- 之后,您将需要创建一个访问令牌来使用 API 。该令牌将是一个长的字母数字字符串,并且只显示一次。
将此令牌保密 - 复制令牌并将其作为环境变量保存在您的环境文件中(例如
~/.bash_profile
):
export ZENODO_TOKEN=YOUR_ACCES_TOKEN_GOES_HERE
- 确保您可以从终端访问令牌:
echo $ZENODO_TOKEN
如果一切正常,这将在您的提示中显示您的令牌值。 - 安装 python 请求包:
conda install -c conda-forge requests
你也可以通过 pip 安装 - 确保可以导入包:
import requests
如果您正在使用 JupyterLab,python-dotenv
包是在笔记本中使用环境变量的一个好方法。该软件包有助于从环境文件中读取键值对,并确保您的令牌在与同事共享笔记本时保持私有。
现在一切都准备好了,您创建了一个帐户,存储了您的访问令牌,并安装了必要的包。
现在我们准备开始使用 Zenodo API 了!
获取关于 API 的信息
让我们从向 Zenodo 基础 API 发出一个GET
请求开始。
我们在访问令牌中附加了一些头信息,现在应该返回内容了。对于这种类型的请求,这不是必需的。我们得到的是一个包含两条重要信息的响应对象,即状态代码和响应数据:
print(r.status_code)
:显示状态码
2** =一切成功
4** =客户端错误(您做错了)
5** =服务器错误(服务器出错)print(json.dumps(r.json(), indend=2))
:以可读的方式显示响应 JSON 输出。输出如下所示
我们得到的响应是与 API 相关的所有 URIs。URI 的存款是我们唯一会用的。
- **存款:**用于上传和发布到 Zenodo
(这与 web 界面中可用的功能相同)。
其他 URIs 主要用于搜索芝诺多。
发布创建项目的请求
您可以使用 web 界面或通过 API 以编程方式创建项目。为了完整起见,我将展示这两种方式。如果你正在填充大量的可选元数据,web 界面会更容易使用,并且 API 可以快速创建你想要上传的项目。
使用网络界面
进入你的账户,点击顶部的“上传”,然后点击右边绿色的“新上传”按钮,创建一个新项目
新建一个项目:点击顶部的“上传”,然后点击右边的“新建上传”。(图片由作者提供)
最起码,要在旁边标有红色*的字段中进行填写。完成后,点击顶部的“保存”。顶部的 URL 会改变,并给你的项目一个唯一的 ID。这里有一个例子:
https://zenodo.org/deposit/4781404
/deposit
表示这是一个私人项目。
这是一个公共项目 URL
https://zenodo.org/record/4760205
/record
表示这是一个公共项目。
使用 API
为了用 API 创建一个项目,我们将发出一个POST
请求。
这将创建一个没有标题或信息的空项目。
r
是响应对象,包含两条有用的信息
r.status_code
:表示作业是否成功
(记住 2**处的响应表示成功)r.json()
:哪个是服务器以 JSON 格式返回给我们的数据
响应代码201
表示“已创建”
注意响应输出中的links
中的id
和bucket
。这些以后会有用的。
存储 id 和存储桶
从这个响应中,我们想要保存两条信息id
和links
中的bucket
。
id
是与项目相关的唯一编号bucket
是你上传数据文件的地方
下面是保存从输出中提取这些内容的代码。
这个在网页上看起来怎么样?
当你登录到 Zenodo 并导航到上传时,你会看到这个。
一个没有标题的项目,当你看里面的时候,你会看到没有字段被填写,也没有上传。这是意料之中的,因为我们创建了一个空白项目。在 API 中,我们没有将空数据附加到我们的POST
请求中。
提交更改元数据的请求
现在让我们更改一些与我们的项目相关的信息。为此,我们将发出一个PUT
请求。
这些更改将立即生效,并将在网页上显示。
上传数据的上传请求
就像填写元数据一样,上传数据有两种方式:通过 web 界面和通过 API。同样,我将展示两者。
从 web 上传
如果您的数据集很小,并且位于本地计算机上,那么通过网页上的拖放功能上传文件可能是最好的方法。导航到您的项目,然后单击“选择文件”。
拖放对于笔记本电脑上的小数据集是很好的(图片由作者提供)
使用 API 上传
如果数据集很大或者位于远程计算机上,则需要使用 API。为此,我们向bucket_link
发起一个PUT
请求。
如果我忘记保存存款 id 和存储桶链接怎么办
这种情况时有发生,尤其是当我不断重写r
的时候。如果您忘记了“id ”,找到它的最简单方法是访问项目网页并查看 URL。
一旦知道了 id,就将它保存到一个名为deposition_id
的变量中。
您也可以发出GET
存款请求来抓取id
和bucket
。
r = requests.get(f"{baseurl}/deposit/depositions",
headers=headers)
删除文件和项目
在这一节中,我将向您展示如何使用 API 删除文件和项目。
从你的项目中删除东西太容易了。发出DELETE
请求时要小心,如果要执行此操作,没有弹出窗口需要仔细检查。
删除文件
要删除一个文件,我们需要获得惟一的file_id
,然后发出一个DELETE
请求。
注意使用filter()
首先找到正确的文件名,然后获取文件的id
。如果项目中有多个文件,这是必要的。
在这种情况下,响应状态代码是204
,表示“无内容”,这通常是对DELETE
请求的响应。
如果您遵循此示例,您将会看到该文件在网页上不再可见。
删除项目
要删除一个项目,向沉积发出一个DELETE
请求id
。
一旦你这样做了,你的项目就…
最后的想法
Zenondo API 让您能够从命令行与您的帐户进行交互。你能在网页上做的任何事情都可以用 API 来做。然而,仅仅因为你可以用 API 做这些事情,并不意味着你应该这样做,或者它很容易和直观。例如,我个人觉得用 web 界面创建项目和添加元数据更容易。
API 的主要优势是能够将远程数据上传到您的帐户。
我对 Zenodo 唯一的不满是它不允许你上传目录树,这是 GitHub 上的一个未解决的问题。解决方法是上传目录结构的压缩版本。从整体来看,这只是一个小小的不便。然而,如果你上传时绝对需要这种结构,我建议看看开放科学框架。
发布您的项目
完成上传数据和填写所有元数据后,您可以将项目公开以确保其可访问性。我建议从网页上做这件事。单击蓝色的“发布”按钮,让任何人都可以访问您的项目。可及性是公平原则之一,公平的科学更好。
教程笔记本
额外资源
特别感谢 Rachana Maniyar 博士 编辑本帖的草稿版本
感谢阅读和支持媒体作者
https://lukegloege.medium.com/membership
Makie:高水平,美丽的情节
熟悉 Makie.jl,这是一个用于 Julia 编程语言的高级绘图和统计图形库。
作者图片
介绍
在 Julia 的生态系统中,已经出现了许多可视化数据的奇妙解决方案。尽管如此,许多用户经常最终使用 Plots.jl。虽然 Plots.jl 肯定是一个很酷的包,但重要的是要记住,该包必须提供的是来自其他编程语言的不同软件的三个独立端口。这些端口是 Plot.ly、Matplotlib.pyplot 和 GR。默认情况下,Plots.jl 使用 GR 可视化库,这是一个很好的库,但在许多方面非常缺乏特色。此外,像这样使用端口真的会减少预编译时间,而且使用 PyCall 这样的包会影响 Julia 的性能。有趣的是,如果你感兴趣,我确实有一个关于 Plots.jl 的 GR 后端的完整教程:
还有一些其他纯粹的朱利安解决方案已经出现。在我看来,最大的例子是牛虻包。牛虻包的交互性比不上 Plot.ly,但对大多数情况来说已经足够了。最重要的是,牛虻可视化很容易操作,而且看起来很好!我还写了一篇关于使用该包的教程和概述,如果您感兴趣,可以在这里查看:
在 Julia 中还有另一个很棒的可视化库,名为 Vegalite.jl。我见过许多其他科学家,他们发誓说这是 Julia 中最好的一个,但我仍然偏爱牛虻. jl。这是因为我发现牛虻更容易使用。Vegalite 有一个奇怪的方法,它涉及到在你的绘图中为各种不同的设置使用大量的数组,而不是参数。也就是说,我要说的是,与列表中的其他选项相比,Vegalite 确实有一些严肃的统计可视化。实际上,我比较了另一篇文章中提到的所有三个选项,如果您愿意,可以在这里查看:
所有这些文章都有更多的信息可以链接,这真是太棒了。
Julia 语言及其绘图功能的另一个新增功能是 Plot.ly 打包了该语言的官方端口。我必须承认,我还没有机会尝试这一点,但我很高兴尝试一下,我甚至可能会写一篇关于它的文章,并将其与 Python 实现进行比较!
有了生态系统中的所有这些图形库,我真的很想接触所有这些库,以便公开比较所有可用的选项,并找出我想要使用的那个。很高兴知道他们中的许多人,因为我认为他们都有自己的功能。在 Julian 图形库之旅中,我的下一站是 Makie.jl. Makie.jl 有点独特,因为有多个使用不同图形库的库实现。例如,我决定使用 OpenGL,所以我将通过 Pkg 添加 MakieGL.jl。还有一个 webgl 版本和一个 Cairo 版本,分别是 WGLMakie.jl 和 CairoMakie.jl。让我们继续添加软件包并开始吧!
julia > ]
pkg > add GLMakie
基本绘图
由于我从未实际使用过 Makie.jl 包,所以我决定稍微熟悉一些基本情节。Makie.jl 遵循图形库的典型高级约定,所以幸运的是这里不会有任何 Vegalite-esc 曲线球。
using GLMakie
像 Plots.jl 一样,我注意到 Makie 也需要很长时间来预编译。这可能是因为我决定使用 OpenGL,但我怀疑事实是否如此。我说真的真的花了很长时间。这不太重要,但肯定是您在应用程序中使用该包时需要记住的事情。我绘制的第一个例子直接来自 Makie 文档:
points = [Point2f0(cos(t), sin(t)) **for** t **in** LinRange(0, 2pi, 20)] colors = 1:20
figure, axis, scatterobject = scatter(points, color = colors, markersize = 15)
figure
作者图片
看起来像是 OpenGL 驱动程序加载失败!好消息是我碰巧知道一个事实,Cairo 在我的电脑上可以很好地运行我的 Julia 安装,所以我们将切换到 CairoMakie,而必须再次预编译它。
julia > ]
pkg > add CairoMakie
using CairoMakiepoints = [Point2f0(cos(t), sin(t)) for t in LinRange(0, 2pi, 20)]
colors = 1:20
figure, axis, scatterobject = scatter(points, color = colors, markersize = 15)
figure
作者图片
耶!
实际上,我很喜欢这个库的功能,虽然它是极简的可视化,类似于没有交互性的 GR,这是我在大多数情况下所需要的。类型是可变的,所以我们现在可以改变这个结构内部的数据来产生不同的结果。更牛逼的是,我们可以在这个数字上加数字!这实际上让我想起了很多很久以前制作的图形库。这真的很酷,因为它是元编程和面向对象的,但该项目已经停止。实际上,我在《走向数据科学》上写过相关文章,所以如果你碰巧对那个项目感兴趣,里面有很多非常非常有趣的 Julia,你可以在这里查看:
该系列有许多不同的部分,所以如果您真的对这个包及其背后的代码感兴趣,这可能是一个不错的读物。无论如何,从我的开发历史来看,很明显我是图形模块化的狂热爱好者,Makie.jl 正是提供了这一点!这很快成为我最喜欢的图形库。我们可以添加基本上任何新的数字到我们的数字,通过使用!版本散点!方法。
circlefunc = ts -> 1.5 .* Point2f0.(cos.(ts), sin.(ts))
scatter!(circlefunc, LinRange(0, 2pi, 30), color = :red)
figure
作者图片
布局
Makie.jl 也有一个相当健壮的布局实现。它们比 GR 更容易理解和制作,看看吧!我们可以制作一个完全空的图形,并在其上添加我们可视化的所有模块部分!
fig = Figure(resolution = (700, 500), backgroundcolor = RGBf0(0.98, 0.98, 0.98))
ax1 = fig[1, 1] = Axis(fig, title = "Pre Treatment")
data1 = randn(50, 2) * [1 2.5; 2.5 1] .+ [10 10]line1 = lines!(ax1, 5..15, x -> x, color = :red, linewidth = 2)
scat1 = scatter!(ax1, data1,
color = (:red, 0.3), markersize = 15px, marker = '■')
fig.layout
ax2, line2 = lines(fig[1, 2], 7..17, x -> -x + 26,
color = :blue, linewidth = 4,
axis = (title = "Post Treatment",))fig
作者图片
动画片
Makie.jl 除了之前牛逼且实现良好的特性外,还有对动画的支持!我真的很兴奋,我已经知道我会一直使用这个图书馆了!我已经很高兴我尝试了这一点,动画只是一个蛋糕上的糖衣,它已经非常湿润,可以在你的嘴里融化。为了创建一个动画情节,我们还需要添加“AbstractPlots”包。
julia > ]
pkg > add AbstractPlots
我将继续尝试它。为了实际创建动画,我们将使用 record()方法。这实际上会将其输出到一个视频文件。这有点奇怪,因为我当然更喜欢 GIF 之类的东西——但不管怎样,它会起作用的。
**using** GLMakie
**using** AbstractPlotting.Colors
figure, ax, lineplot = lines(0..10, sin; linewidth=10)
n_frames = 30
framerate = 30
hue_iterator = LinRange(0, 360, n_frames)
record(figure, "color_animation.mp4", hue_iterator; framerate = framerate)
**do** hue lineplot.color = HSV(hue, 1, 0.75) **end**
作者图片
也可能行不通。
结论
我相信随着时间和努力,一定会有办法加载适当的驱动程序,并实际上让我的系统与 Makie.jl 的全部功能一起工作。不管动画斗争,我非常兴奋地开始使用这个图形库!它的模块化性质和原始能力正是我在这样的东西寻找。我真的很高兴我试用了它,我现在实际上对这个包感到非常兴奋。我强烈推荐它。我认为这个包最糟糕的部分可能是包的分段性,你需要用 Pkg 添加很多包。当然,这没什么大不了的,我认为这个图形库的能力绝对值得。感谢您的阅读!我当然推荐试试这个库!
制作更好的填充地图
改善您的地理数据交流
在我看来,在地图上可视化地理数据是向受众传达数据的最有效方式之一。与包含相同数据的简单表格或条形图相比,我们对州、地区和领地的了解有助于我们更快、更好地发现趋势。
然而,并不是所有的地图都是平等的。有一些简单的方法可以改善我们可视化地理数据的方式,使我们的信息更流行,更好地向我们的受众传达信息。
作为一个例子,看看下面两张地图。左边的来自美国消费者新闻与商业频道可视化各州家庭收入中值,右边的来自 CDC 可视化 COVID 数据。你怎么想呢?
左图:各州收入中位数的美国消费者新闻与商业频道视觉图。右图:美国疾病控制中心各州 COVID 感染地图。
这里有几个想法引起了我的注意:
- 如果您在左侧地图上选择 5 个州,并找到相应的家庭收入桶,您需要多长时间?10 个州?一个 5000 美元的分色是否有意义(例如,与一个 10000 美元的桶相比,类别数量增加一倍是否对信息有影响)?
- 在右边,找到正确的蓝色阴影然后将其映射到底部的桶需要多长时间?你能不能立即确定哪些州的 COVID 病例最高和最低?
当我们不得不付出额外的努力来理解信息时,地图并不能更好地传达信息。我们可以使用更好的颜色、文本的策略性使用和变换来改善上面的视觉效果。
下面,我们将在上述地图的基础上介绍改进连续和分类地理变量可视化方式的策略,并引入新的示例。
连续变量
让我们来看看中等收入的地图。我喜欢使用 Tableau,但认为他们的默认设置甚至可以产生一个足够的地图是一种误导。只需将数据放入 Tableau 地图中,就会生成以下内容:
来自 2017 美国 ACS 的 HH 收入中值的默认表格图
重叠的地理区域,即使是灰色的,也会让人分心。如果你仔细观察,颜色表明新泽西州、马萨诸塞州、康涅狄格州和新罕布什尔州是中等收入最高的州,但我不能肯定地说。
在表示精确的连续变量很重要的情况下,首先考虑变量是否有方向,以及这是否会影响颜色选择以改善感知——一种结果是否比另一种更好(绿色与红色)?与变量的关联是否有助于读者更好地理解变量(例如,蓝色代表平均值。各州降雨量)?
对于中等收入,我们可以选择绿色,因为绿色通常与金钱联系在一起,通常绿色与“更好”的结果(更高的中等收入)联系在一起。从风格上来说,当可视化美国各州时,我也发现底层地图没有什么价值,所以我通常会删除它。
做出这两个改变(颜色改为绿色和去除背景)是一个开始,但并没有真正达到预期的效果。我仍然没有更好地快速识别哪些州具有最高和最低的值。
美国 HH 收入中值地图,绿色,无背景地图
有三种后续技术来改善视觉效果:
- **扩大色阶:**在你的色阶上扩大两种颜色之间的差异,以提供更大范围的颜色选择。
- **变换变量:**通过取平方根、自然对数或提高值的幂(即平方或立方)来增加(或减少)变量之间的差异,以达到着色的目的。
- **标记选择值:**通过只标记前 x%的值、后 x%的值或两者来吸引人们对某些州/地区的注意。
你对下面的有什么看法?
它并不完美,但更容易看出哪些州是深绿色的(东北部),哪些州是浅色的(东南部)。要实现这一点,您可以将色标更改为更亮的连续绿色,将不透明度从默认的 80%增加到 100%,并通过将其提升到 4 次方来转换变量,这将放大状态之间的差异。
为了更进一步,我们可以选择标记一些状态,以便查看者可以快速识别更暗和更亮的值意味着什么。看下面,我们仍然可以使用视觉颜色线索来知道哪个更高或更低,并且还可以看到“更低”意味着 $70K。
用戏剧化的色标、变换和数据标记进行连续制图。
上面的并不完美,但这是对标准画面视觉效果的改进。在尺度上没有显著差异的连续变量很难绘制,但是可以使用上面的简单视觉技巧改进基线。
等级映射
有时知道单个最高值并不重要,重要的是那些更高或更低的值。当显示层次是一个选项,而不是精确的连续值时,我喜欢使用我所谓的层次映射来平衡颜色、文本和注意力。分层映射是一种既能实现连续变量的特异性,又能实现分块的直观简单性的方法。
让我们来看看另一种看待 COVID 数据的方式(与上面的视觉略有不同,但数据和用例相似)。下面是一张 30 天 COVID 增长率的地图,按实施了等级映射的州划分。
各州的 30 天 COVID 病例增长率。分层映射的一个例子。
在地图中有一些视觉提示需要考虑(另一个例子在这一部分的下面)。首先,我根据从最高到最低的度量将状态分成三个桶(Tableau 中使用WINDOW_PERCENTILE
的简单IF > ELSEIF
语句)。
其次,因为越高越糟糕,我选择了红色作为主要颜色,这种颜色通常与糟糕的结果联系在一起。我选择了深红色>浅红色>灰色三色组合,而不是我有时难以理解的纯红色。对我来说,这将注意力集中在黑暗的状态,并使主题更容易拉出。它还明确区分了类别。
最后,我选择只包含中值或高值的文本(同样,在文本标记卡上有一个带有WINDOW_PERCENTILE
的IF > ELSEIF
声明)。低值有多低真的重要吗?也许吧,但在这种情况下,我不认为它保证了地图上的空间。在 Tableau 中,如果值对查看者很重要,也可以很容易地将它放在悬停文本中。
每 100,000 名居民的积极 COVID 住院率;分层映射的另一个例子。
我最喜欢这些地图的一点是,通过观察哪些地方有颜色,哪些地方没有颜色,可以相当直观地发现图案。试着快速解读大图主题的每张地图,看看你是否有同样的感觉。
分类变量
没有层次关系的分类变量更容易映射,但我们仍然有办法确保我们的数据能够被用户轻松快速地解释。对于分类变量,一些改进映射的技巧是:
- 使用互补色,读者可以很容易地识别出不同之处(尽可能避免连续的颜色)。
- 如果可能,将类别限制在 5 个或更少。如果有 5 个以上的变量,最好考虑替代视觉效果或更广泛的卷式分类。
- 尝试在地图中标注,而不是让读者经常查阅图例。
考虑下面的地图,它测量(截至 2013 年)一个州是连续 3 次或更多次投票支持共和党,连续 3 次或更多次投票支持民主党,还是“独立”(任何一方的连续投票都少于 3 次)。
注意使用互补的、不同的颜色,以便在类别之间提供视觉线索(我喜欢使用这个网站来帮助我挑选颜色,当我不受公司品牌颜色的限制时)。此外,的原始图像有 7 个类别,我将其合并为 3 个(我将 3–5、6–10 和 11+更改为 3+)。最后,请注意在一组相似颜色的状态附近标记类别的方式,这是一种替代通常远离视觉效果的图例的方式。
分类映射的例子
绘制地图是一种非常有效的信息交流方式,通过一些简便的技巧,我们可以制作更好的可视化效果,改善我们的受众对数据的理解,并带来更有影响力的演示和数据故事。
有反馈吗?有兴趣联系吗?随时联系我LinkedIn。
制作完美的 ML env。在 Ubuntu 20.04 上使用 Tensorflow 2 和 CUDA 10.1,双启动 2021
在 Ubuntu 20.04 上使用 Tensorflow 2 和 Nvidia CUDA 支持的简单、快速和可靠的 Python3 环境,满足您的所有 ML 需求!
正如我所希望的那样简单,在搜索了互联网上的各种文章之后…事实证明并非如此。尤其是如果你的电脑是 Windows 10 双启动的话。
所以经过几夜的挣扎,看到红色的错误,听到安装失败的哔哔声…我成功了!这是我成功之路的总结!
- 步骤 1:“双重启动”安装和 BIOS 调整。
- 第二步:检查 Python3 和 GCC。
- 第三步:整理!(可选—如果是全新安装,则跳过)
- 第四步:安装!(最期待的)
来源:下载自谷歌图片
第一步:**【双引导】**安装和 BIOS 调整。
相信我,这是确保操作系统和 BIOS 设置正常的关键一步,这样你就不必一次又一次地经历卸载和重新安装的麻烦。
‘双开机’安装:
对于 Ubuntu 20.04 双引导安装,我按照这个视频稍加改动。我预装了 Windows 10。我的电脑和视频中的有不同的硬件设置,所以我根据自己的需要为安装配置了磁盘分区。在那段视频的 9 分钟时,我在安装时勾选了“为图形和 Wi-Fi 硬件以及其他媒体格式安装第三方软件”复选框(可选)。一旦完成,你应该会看到 GRUB 引导加载器,带有 Ubuntu 和 Windows 引导管理器选项,如视频中所示的和。
BIOS 调整:
在您的“双重引导”安装之后,在 BIOS 设置中,确保“安全引导”选项必须是“启用的”(上面的视频要求禁用它),“快速引导”选项必须仍然是“禁用的”,并且您应该仍然看到 GRUB 引导加载程序和可用的选项。一旦完成,我们就可以进入下一步了!(注:不同的 BIOS 有不同的引导选项,如果您找不到选项,请参考您的版本的手册。)
第二步:检查 Python3 和 GCC。
Ubuntu 20.04 预装了 Python3 和 GCC。要验证这一点,您可以运行以下命令。
sudo apt update
sudo apt -y upgrade
python3 -V
gcc --version
此外,验证pip
是否已安装并使用该命令正常工作(如果您这样设置,它可能是pip3
,但不是我)。
pip --version
我的版本是:
- Python 3.8.5
- gcc(Ubuntu 9 . 3 . 0–17 Ubuntu 1 ~ 20.04)
- pip 21.1.2
第三步:整理!(可选—如果是全新安装,则跳过)
即使你已经完成了前两个步骤,我仍然建议你完成上面的步骤来修复你在之前的尝试中可能错过的任何东西。
卸载/移除/恢复您迄今为止对系统所做的所有 CUDA 相关更改!以下命令应该可以帮您做到这一点:
sudo rm /etc/apt/sources.list.d/cuda*
sudo apt remove --autoremove nvidia-*
sudo apt-get purge nvidia*
sudo apt-get autoclean
sudo apt-get autoremove
sudo rm -rf /usr/lib/cuda*
sudo rm -rf /usr/local/cuda*
从.profile
和.bashrc
文件中删除 CUDA 路径(通常附加在if
和fi
之间的末尾)并保存。
sudo gedit ~/.profile
sudo source ~/.profile
sudo gedit ~/.bashrc
sudo source ~/.bashrc
一旦移除,echo $PATH | grep cuda
和echo $LD_LIBRARY_PATH | grep cuda
应该不会有‘cuda’在里面!
现在我们将整理 python 包。如果您设置了任何 python 虚拟环境(在这里阅读和,您应该切换到它们。但是对于我的设置,我运行了这个命令:
pip uninstall tb-nightly tensorboardX tensorboard tensorflow tensorflow-gpu
这可能会抛出一些错误,这取决于您是否安装了该软件包,所以不必担心!
第四步:安装!(最期待的)
在我们开始之前,确保到目前为止的步骤都已经完成。如果按照正确的顺序进行,安装并不可怕!所以让我们开始吧…
安装 CUDA 10.1 和 cuDNN 7:
这些都是稳定的版本,命令都经过了反复测试,所以只要一个一个地运行它们,就能看到神奇的事情发生了!(查看此了解更多信息。)
sudo add-apt-repository ppa:graphics-driverssudo apt-key adv --fetch-keys [http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub](http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub)sudo bash -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list'sudo bash -c 'echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda_learn.list'sudo apt install cuda-10-1
执行完最后一个命令后,安装会暂停,并在此显示以下屏幕:
在安装过程中,屏幕上弹出“配置安全引导”屏幕。来源:作者图片
按下向下箭头键并阅读全文。按 tab 键,然后按 enter 键进入。屏幕上有很好的书面说明,它们会带你完成步骤。您将被要求设置一个密码(8 到 16 个字符),该密码将在重新启动时再次被要求验证它是真实的用户。不要忘记密码!如果有的话,记下它(我把我的mycuda1234
)。如果您仍然对“登记 MOK”屏幕感到不舒服,请参考本文中的。
完成后,系统启动,运行命令:
sudo apt install libcudnn7
这应该会在您的系统上安装 CUDA 和 cuDNN。最后一部分是运行sudo gedit ~/.profile
并追加下面的块并保存。
# set PATH for cuda 10.1 installation
if [ -d "/usr/local/cuda-10.1/bin/" ]; then
export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
fi
重新启动计算机,并尝试以下命令:
/sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH) 2>/dev/null | grep libcudnncat /proc/driver/nvidia/versionnvidia-settings -q NvidiaDriverVersionnvidia-sminvcc --version
这些现在应该运行没有任何错误!如果是,恭喜你!您已经成功地在您的机器上设置了 CUDA 10.1。
用 Python 3 安装 tensor flow 2.0:
如果您正在使用 python 虚拟环境,请切换到适合您需求的环境。要用 Python 3 设置 Tensorflow 2.0,首先,我们运行一个命令来获取依赖关系:
sudo apt install python3-testresources
这将在 Tensorflow 安装时防止此错误:
ERROR: launchpadlib 1.10.13 requires testresources, which is not installed.
现在运行以下命令完成(这确保您拥有 Tensorflow 版及其所有依赖项):
pip install tensorflow
pip install --upgrade tensorflow==2.2
pip install --force-reinstall tensorflow==2.2
通过运行pip freeze | grep tensorflow
检查安装,它在我的系统上给出以下输出:
tensorflow==2.2.0
tensorflow-estimator==2.2.0
作为最后一步运行命令:
python3 -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
这可能会打印几行,但是倒数第二行应该包含Created TensorFlow device
,最后一行应该返回一个类似的张量:tf.Tensor(368.0642, shape=(), dtype=float32)
我希望这篇文章很容易理解,并让您的完美 ML 环境准备就绪!
对我提到的使这个设置工作的资源的一个巨大的呼喊!
https://medium.com/@exesse/cuda-10-1-installation-on-ubuntu-18-04-lts-d04f89287130 https://documentation.commvault.com/commvault/v11/article?p=118661.htm https://itsfoss.com/ppa-guide/
让情感模型变得可以解释
模型可解释性
理解人工智能的内部运作有很多目的,每一个都进一步扩大了它的范围和有效性。
我们一生中花了大量的时间去挖掘他人的动机。(“她为什么说那个?”).我们在这个世界上经常被别人的言行所困惑,通过假设和归因来解决我们之间的理解差距(“我确定这是因为我昨天迟到了。”)或者通过询问,既间接(“她的问题到底是什么?”)并且直接(“除非你告诉我为什么你那样说,否则我不会离开。”).换句话说,我们想象为什么或者问为什么。
随着人工智能变得越来越普遍,我们开始想知道它的动机是很自然的。是的,这部分是因为我们害怕会奴役我们所有人的超级智能可能会从人工智能中进化出来,并希望看到它的到来。但至关重要的是,这也是因为这种新智能的机制对我们来说是如此陌生。我们有兴趣了解它是如何工作的。如果它做出的决定对我们的生活有重大影响,我们很自然会想知道它是如何做出这些决定的。
我们想知道,就像我们经常对人类做的那样:
- 决策正确吗:人工智能出错的频率有多高?决策是否基于所有相关信息?
- 这些决定公平吗:人工智能表现出对人类如此普遍的有害的社会偏见吗?
- 决策可靠吗:AI 每次遇到类似的输入都会做出一致的决策吗?
- 这些决定合理吗 : 这些决定能向我们解释吗?
- 决策是确定的 : 特定决策的 AI 有多有把握?
理解是建立信任的先决条件。使用算法技术来理解人工智能的决策被称为人工智能可解释性。在 Dialpad,我们使用可解释性技术来帮助我们的客户理解他们通过产品功能进行交互的深度学习模型的输出。我们还使用这些技术来改进我们的深度学习模型。
拨号键盘的可解释性
让我们以目前在产品中运行的情感分析模型为例,可解释性在其中扮演着重要的角色。情绪分析功能挑选出通话记录中表现出积极或消极情绪的部分。
每当一个说话者说了一些表示他们对某事非常高兴或满意的话,积极情绪就会被识别和强调。
一个例子:“我们喜欢这个演示,它提供了很多信息。”
每当说话者说了一些表示他们对某事非常沮丧或恼火的话,消极情绪就会被识别和强调。
一个例子:“这不起作用,我真的很沮丧。”
关于我们的情感分析功能的旧版本,一个常见的用户抱怨是,他们不明白为什么某些句子被标记为积极或消极的情感。
在句子很长或者表达的情感不太明显的情况下尤其如此。此外,一些情感判断是主观的价值判断。例如,情感分析模型对脏话应该有多敏感?
有些人不赞成在商务交流中使用任何脏话,认为它们是“负面的”,而另一些人则根据上下文评估它们的适当性,或者根本不介意它们。在这种情况下,情感分析的“正确性”取决于用户的视角。
有时尽管模型是完全错误的。例如,当今的情感分析模型在讽刺方面表现很差,通常标记为积极的情感,因为使用了“积极”的词,这显然是(无论如何对人类来说是显而易见的)轻蔑的表示。
许多这些灰色区域存在于情感检测的任务中。为了在情感分析功能中建立信任,我们需要使作为其基础的深度学习模型变得可解释。
如何审问人工智能
当我们戳
当我们敦促深度学习模型解释自身时,我们希望揭示模型功能的哪些错综复杂之处?我们可能想知道:
- ****输入数据的哪些元素对做出的决策最重要。例如,在一个帮助自动驾驶汽车感知的深度学习模型中,我们可能想知道相机图像的哪些部分最常帮助模型区分类似的物体,如路灯杆和交通灯杆。
- 一个模型需要学习哪些中间任务才能达到它的既定目标。例如,为了学习如何概括一段文本,模型需要学习词类吗?我们可能还想知道模型的哪些部分专门执行这些中间任务。
- 为什么模型失败,什么时候失败。当语音助手无法理解对他们说的话时,那个特定的输入或者那个输入和模型之间的交互会导致这个失败。
- ****是否存在某些模型表现不佳的可识别输入组?这条询问线对于确定你的模型是否已经学会了基于性别、种族和其他受保护类别的有害偏见至关重要。
当他们回应时
深度学习的解释有两大类:
****全局可解释性/结构分析:这包括研究模型的内部结构,检测哪些输入模式被捕获,以及这些模式如何被转换以产生输出。这类似于进行大脑核磁共振成像或脑电图检查,可以让你窥视大脑,看看它是如何连接的,研究各个组成部分及其对不同刺激的反应,记录结构和操作故障等等。
****局部可解释性/行为分析:这包括通过观察单个特定实例的行为来推断模型如何工作。这类似于心理学实验,要求参与者在干预前后执行指定的任务,以研究所述干预的效果。
提问的艺术
有几种技术可以用来查询深度学习模型的工作情况。虽然这些技术的机制超出了本文的范围,但我将尝试总结主要的类调查:
用局部扰动解释:在这条研究路线中,我们非常细微地改变单个输入的不同部分或方面,以观察这如何影响输出。如果输入的一个部分或一个方面——一组可识别的像素,一个特定的单词——在输出中产生明显的变化,人们可以得出结论,输入的这些部分对输出最重要。
例如,在自动语音识别模型中,一个将口头语音转录为文本的模型,从头到尾一个接一个地丢弃音频的小部分,并查看这种干预如何改变转录的文本,将告诉您特定音频文件的哪些部分对其转录最重要。
这一类技术会给你局部的解释。这类技术包括渐变、遮挡、激活最大化。
用代理人解释:通过这类技术,我们建立更简单的、基于树的或线性的机器学习模型,来解释更复杂的深度学习模型的个体预测。线性模型让我们非常清楚地知道哪些输入要素对预测很重要,因为它们本质上是为不同的输入要素分配权重。权重越高,特征越重要。
这一类技术会给你局部的解释。这一类的技术包括石灰、 SHAP 、 SmoothGrad 。
****基于传播的方法(利用结构):在这里,我们深入研究模型结构,并研究单个神经元的贡献,以了解哪些神经元和层对输出影响最大。使用一种名为层相关性传播 (LRP)的技术,发现在流行图像数据集上训练的分类模型只学会了如何识别一匹马,因为大约五分之一的马图像中存在源标签。移除标签也移除了将图片分类为马的能力。此外,在汽车图像上插入标签会将分类从汽车更改为马。
资料来源:https://www.nature.com/articles/s41467-019-08987-4.pdf(抄送 4.0)
可解释的模型可以帮助模型建立者发现这种错误的相关性并加以纠正。
这一类技术会给你全面的解释。这类技术包括 LRP 、解卷积、导向反向传播。
元解释:我们使用技术来发现相关的或基础的任务,这些任务是模型为了完成工作必须首先学习的。为此,我们插入模型的中间层,即位于输入和输出之间的层,并要求它们执行各种感兴趣的任务。例如,一项研究的作者发现 BERT 的中间层编码了丰富的语言信息层次,例如学习句子中的名词是复数还是单数,动词的时态是过去、现在还是将来,动词的类型和句子的主语是否匹配。他们得出结论,这些技能的学习似乎是执行高级自然语言任务(如文本分类和生成连贯文本)的先决条件。
使情绪模型可解释:指南
步骤#1:决定解释的种类
如上文部分所述,解释本质上可以是全局的(基于结构)或局部的(基于预测)。我们想帮助用户理解个人情绪预测,所以我们选择使用局部可解释技术,专门解释个人预测。
步骤#2:决定解释的形式
接下来,我们必须决定解释应该采取什么形式。它应该是视觉的,文本的,表格的,图形的?什么形式的解释既容易理解,又可能回答用户对输出的问题。我们决定向用户展示哪些单词对迫使模型将一个句子标记为积极或消极情绪最有影响。我们决定在产品中突出这些词。用户研究表明这种形式的解释是最有帮助的。
在某种意义上,这种解释的汇总为用户提供了一个观察情绪模型世界观的窗口——该模型发现哪些类型的负面情绪特别值得注意,它对隐喻等比喻性语言的理解程度如何,什么习惯性地混淆了它。
图片由 Dialpad 提供
步骤#3:在可解释技术之间进行选择
你选择的技术将取决于你建立的深度学习模型的类型。有些技术是模型不可知的,也就是说,它们适用于每一种模型,而有些技术是特定于模型的。我们尝试了各种技术,对输出结果进行了多次人工评估,并在局部扰动技术家族中选择了一种技术,它给了我们最直观、最丰富的解释。
在这个过程中,我们必须做出几个设计选择——例如,我们选择的技术返回对预测最重要的单词和短语的加权列表。我们必须做出选择——我们是应该向用户显示所有重要的单词,也许用渐变的颜色来表示哪些单词更重要和更不重要,还是只显示单词的子集。最后,我们定义了一个阈值,决定只突出显示最重要的单词。我们还编制了一个格式规则列表,用于清理和完善解释——例如,如果短语中的大部分单词被认为是重要的,则突出显示整个短语。
您用于个人预测的任何技术都必须集成到模型推理代码中,并在模型做出预测后执行,因为您实际上是在解释那个预测。有许多打开 源 包你可以适应解释你的模型。
步骤#4:优化技术
我们必须优化所选择的技术,因为情感功能必须足够快速和灵活,以便在实时环境中操作,并且对于做出预测所花费的时间,我们现在添加了一个解释预测的额外任务。你可以通过删除无关的操作,使用更有效的库和函数来完成中间任务,甚至改变技术来更快地返回结果。
我们最重要的学习?
关键是要让你的听众站在最前面,以听众可能喜欢的解释的形式和类型为基础做出决定。为满足管理标准而给出的解释可能与为日常用户的教育而给出的解释有很大不同。
我们的用户发现,这一功能升级有助于他们更好地理解和信任情感分析功能,其在产品中的使用和可见性也有所增加。
可解释性也帮助我们建立了一个更好的模型。通过各种解释技巧,特别是本地解释的集合,我们能够识别和地址:
- 误报的原因,模型不应触发的次数。
- 可能导致不利结果的数据偏差。
结论
理解人工智能的内部工作有很多目的,每一个目的都促进了人工智能的范围和有效性。我们必须理解建立更好和更公平的模式,建立信任,并建立一个包容和致力于人类繁荣的数字未来。
在 10 分钟内制作一个简单快速的聊天机器人
图像来源
在现实世界中,聊天机器人的响应时间非常重要。无论是旅游业、银行还是医生,如果你想真正帮助你的客户,响应时间应该更短,类似于与客户服务代表交谈时的响应时间。
除了时间,理解聊天机器人的主要动机也很重要,每个行业都不能使用类似的聊天机器人,因为他们有不同的目的,并有不同的语料库来回复。
虽然变形金刚很容易得到合适的回复,但回复可能需要时间。另一方面,就时间而言,可以应用各种其他方法,甚至可以找到一些基于规则的系统来获得适合所提问题的适当答复。
你可能已经联系了多少次旅行社,要求退还你去年在封锁期间预订的机票,我敢肯定,得到一个恰当的答复是远远不现实的。
现在让我们制作一个简单的聊天机器人并安装这些包:
pip install nltk
pip install newspaper3k
包装报纸 3k 有如下几个优点:
- 多线程文章下载框架
- 新闻网址可以识别
- 可以从 HTML 中提取文本
- 从 HTML 中提取顶部图像
- 所有的图像提取都可以从 HTML 中完成
- 可以从文本中提取关键词
- 可以从文本中提取摘要
- 可以从文本中提取作者
- Google 趋势术语提取
- 用 10 多种语言工作(英语、德语、阿拉伯语、中文……)
按如下方式导入库:
#import libraries
from newspaper import Article
import random
import nltk
import string
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity
我已经在我以前的博客中谈到了 CountVectorizer。
余弦相似性或余弦核将相似性计算为 X 和 Y 的归一化点积:
sk learn . metrics . pairwise . cosine _ similarity(X,Y=None,dense_output=True)
参数
X{ n array,稀疏矩阵}形状(n_samples_X,n_features)** 输入数据。Y{ n array,shape 的稀疏矩阵}(n _ samples _ Y,n_features),默认=无** 输入数据。
如果没有,输出将是 x 中所有样本之间的成对相似性。 dense_output bool,default=True 即使在输入稀疏时是否返回密集输出。如果为 False,则如果两个输入数组都是稀疏的,则输出是稀疏的。
回报
核矩阵:n 个形状数组(n_samples_X,n_samples_Y)
import numpy as np
import warnings
warnings.filterwarnings('ignore')
在我的博客中已经解释了标记化。这里我们从一个医疗保健网站获取数据
article=Article("https://www.mayoclinic.org/diseases-conditions/chronic-kidney-disease/symptoms-causes/syc-20354521")
article.download()
article.parse()
article.nlp()
corpus=article.text
print(corpus)
#tokenization
text=corpus
sentence_list=nltk.sent_tokenize(text) #A list of sentences
#Print the list of sentences
print(sentence_list)
一旦你准备好了语料库,你可能不得不考虑用户或客户可能会问或说的问题,这些问题与我们拥有的内容没有任何关系。
它可以是问候信息、感谢信息或类似再见的信息。团队需要对这样的信息和他们的反应进行头脑风暴。
我试着在这里介绍一些。
问候机器人响应
#Random response to greeting
def greeting_response(text):
text=text.lower()
#Bots greeting
bot_greetings=["howdy","hi","hola","hey","hello"]
#User Greetings
user_greetings=["wassup","howdy","hi","hola","hey","hello"]
for word in text.split():
if word in user_greetings:
return random.choice(bot_greetings)
#Random response to greeting
def gratitude_response(text):
text=text.lower()
感恩机器人回应:
#Bots gratitude
bot_gratitude=["Glad to help","You are most welcome", "Pleasure to be of help"]
#User Gratitude
user_gratitude=["Thankyou so much","grateful","Thankyou","thankyou","thank you"]
for word in text.split():
if word in user_gratitude:
return random.choice(bot_gratitude)
排序列表
# Default title text
def index_sort(list_var):
length=len(list_var)
list_index=list(range(0,length))
x=list_var
for i in range(length):
for j in range(length):
if x[list_index[i]]>x[list_index[j]]:
#swap
temp=list_index[i]
list_index[i]=list_index[j]
list_index[j]=temp
return list_index
聊天机器人响应功能,使用预定义文本的余弦相似度来响应。
#Creat Bots Response
def bot_response(user_input):
user_input=user_input.lower()
sentence_list.append(user_input)
bot_response=""
cm=CountVectorizer().fit_transform(sentence_list)
similarity_scores=cosine_similarity(cm[-1],cm)
similarity_scores_list=similarity_scores.flatten()
index=index_sort(similarity_scores_list)
index=index[1:]
response_flag=0
j=0
for i in range(len(index)):
if similarity_scores_list[index[i]]>0.0:
bot_response=bot_response+' '+sentence_list[index[i]]
response_flag=1
j=j+1
if j>2:
break
if response_flag==0:
bot_response=bot_response+" "+"I apologize, I dont understand"
sentence_list.remove(user_input)
return bot_response
对于从聊天退出列表中退出,单词被写成“退出”、“再见”、“回头见”、“退出”。
作为对这些话的回应,聊天机器人将退出。
启动聊天机器人,尽情享受吧!
#Start Chat
print("Doc Bot: I am DOc bot and I will answer your queries about chronic kidney disease, if you want to exit type, bye")
exit_list=['exit','bye','see you later','quit']
while(True):
user_input=input()
if user_input.lower() in exit_list:
print("Doc Bot: Bye Bye See you later")
break
elif greeting_response(user_input)!= None:
print("Doc Bot: "+ greeting_response(user_input))
elif gratitude_response(user_input)!= None:
print("Doc Bot: "+ gratitude_response(user_input))
else:
print("Doc Bot: "+ bot_response(user_input))
请参见以下聊天机器人的回复:
作者图片
重要的是要注意到“谢谢”并不在我们的机器人感恩功能中,因此有了这个消息。随着时间的推移,您可以扩充这样的词汇表,或者利用正则表达式对其进行微调。
结论:
这是一个小例子,让你开始制作快速简单的聊天机器人。你需要为不同的行业微调聊天机器人,这些行业的语料来自实时数据或云上的一些存储。
我们需要记住,实时数据有其自身的挑战,聊天必须从最新的数据中得到回应。一个例子是在旅行社订票。
感谢阅读!
原载于 2021 年 1 月 6 日 https://www.numpyninja.comhttps://www.numpyninja.com/post/making-a-simple-and-fast-chatbot-in-10-minutes。
通过辩论让 AI 变得安全
播客
伊桑·佩雷斯解释了人工智能辩论如何让我们安全地获得超级智能
要选择章节,请访问 Youtube 视频这里。
编者按:这一集是我们关于数据科学和机器学习新兴问题的播客系列的一部分,由 Jeremie Harris 主持。除了主持播客,Jeremie 还帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:
大多数人工智能研究人员相信,有一天我们将创造出超级智能系统——在各种各样的任务中远远超过人类的机器。
如果这种情况最终发生,将会带来一些潜在的严重问题。具体来说:如果一个系统是超智能的,我们如何保持对它的控制?这是人工智能对齐问题的核心——将高级人工智能系统与人类价值观对齐的问题。
对齐问题的完整解决方案必须包括至少两件事。首先,我们必须确切地知道我们希望超级智能系统做什么,并确保当我们要求它们做时,它们不会误解我们(“外部对齐”问题)。但是第二,我们必须确保这些系统是真正地在尝试优化我们要求他们做的事情,并且他们没有试图欺骗我们(“内部对齐”问题)。
创造内部一致的超级智能系统可能看起来是不同的问题——许多人认为它们是不同的。但在过去的几年里,人工智能研究人员一直在探索一种新的策略家族,一些人希望这种策略能够让我们同时实现超级智能和内在一致性。今天的嘉宾 Ethan Perez 正在使用这些方法构建语言模型,他希望这些语言模型能够成为未来超级智能系统的重要组成部分。Ethan 曾在谷歌、脸书和 MILA 从事前沿研究,现在正全职致力于开发具有泛化能力的学习系统,有朝一日这种能力可能会超过人类。
以下是我在对话中最喜欢的一些观点:
- 研究创造超级智能人工智能系统的方法的挑战之一是,超级智能的含义相当不清楚。比 90%的人类都聪明的系统是超级智能吗?99%呢?如果一个系统只和人类中值一样聪明,但却能以百万倍的速度思考,因为它工作在计算机时钟时间上,那会怎样?或者,如果人类水平的智能可以简单地被复制大量次,允许并行探索许多不同的可能性,会怎么样?这些问题没有普遍接受的答案。
- 有可能监督学习技术无法让我们一路到达超级智能系统。这是因为他们依赖于人类产生的数据,只能学习像那些人类一样表现(有一些额外的优势,我不会进入)。从一个角度来看,监督学习系统可以说是“模拟器”而不是“原始思考者”,但伊森认为,通过教它们简单的逻辑,或许有可能将它们的能力扩展到超智能领域。
- 这种逻辑就是分解:伊桑的工作包括训练语言模型来分解抽象和复杂的问题(比如,“苹果应该是非法的吗?”)转化为他们所依赖的更简单、更易处理的子问题(比如,“苹果有多有害?”,以及“一件事要有多有害,我们才能宣布它为非法?”).然后在子问题上重复这种分解方法,这个过程可以根据需要重复多次,以确保我们得到的最终子问题是简单的。如果这些最后的问题足够简单,像 GPT-3 这样的人类训练语言模型可以用来直接回答它们。这种技术属于统称为迭代蒸馏和扩增(IDA)的策略家族。
- 这种方法的一个好处是它是人类可以理解的。至少在原则上,人类可以调查每个分支子问题,并确信人工智能使用的逻辑是合理的,并且人工智能没有试图欺骗他们(这是当前在人工智能比对文献中深入探索的一个严重问题)。但在实践中,Ethan 的系统生成的问题和子问题树太大,人类无法详细解析。因此,Ethan 正在探索一些方法,可以让人类更有效地发现给定的人工智能系统是否提供了真诚的答案。其中一种方法是辩论:通过让两个人工智能系统在一个精心控制的环境中相互辩论,逻辑错误或欺骗可能会浮出水面,并被人类法官抓住。我们讨论了这种方法可能有效的一些原因,以及可能无效的一些原因。
播客中引用的链接:
- 伊森引出的情节在这里。
- 伊森的个人网站在这里。
章节:
- 0:00 介绍
- 1:37 伊森的背景
- 7:26 与 IDA 的问题
- 12:09 哥德尔不完全定理
- 15:01 当今 IDA 的角色
- 26:45 国际开发协会和 GPT-3 的能力
- 29:54 系统和辩论流程
- 41:21 让 AGI 发挥作用
- 49:33 我们控制这些系统的能力
- 51:41 总结
请查看下面的文字记录:
杰里米·哈里斯(00:00):
大家好。我是杰里米。欢迎回到迈向数据科学播客。今天的这一集是关于人工智能中最大的未决问题之一,句号。这就是我们是否能够使用当前的人工智能系统达到超人智能水平的问题。
Jeremie Harris (00:18):
许多人怀疑我们是否能够使用传统的机器学习来实现超人的智能,原因之一是传统的机器学习算法通常是根据人类创造的数据进行训练的。因此,逻辑是,你怎么能通过在人类水平的数据上训练它来达到超人的智能呢?
Jeremie Harris (00:38):
现在,有很多策略可以解决这个问题,试图从人类水平的数据中获得超人的智能,其中一种叫做迭代蒸馏和放大,简称 IDA。虽然 IDA 本身有多种形状和大小,但迄今为止,IDA 最常见的卓有成效的应用之一是问答系统。现在,这通常包括将复杂的问题分解成简单的问题,从理论上讲,这些问题可能非常复杂,人类无法理解,人类实际上可以解析,处于人类水平的人工智能系统实际上可以回答和处理。
Jeremie Harris (01:12):
我今天的嘉宾 Ethan Perez 是 IDA 风格问答系统的专家。我们将会讨论这些系统,他对这些系统如何产生 AGI 的想法,以及他对人工智能安全更普遍的思考。所以,有很多要了解的。我希望你和我一样喜欢这次谈话,没有任何进一步的麻烦,让我们开始吧。
杰瑞米·哈里斯(01:32):
你好,伊桑。非常感谢你参加我的播客。
伊桑·佩雷斯(01:34):
嘿。很好聊天。
杰瑞米·哈里斯(01:37):
你能来我真的很高兴。实际上,这是一次我一直很兴奋能和某人进行的谈话,而你绝对是最好的人选。我真的很好奇你对一种特定的比对 AI 安全,AI 比对策略的看法,这是一种可能会在辩论或 IDA 中出现的策略。我们一会儿会讲到这是什么。但首先我想了解你一点,探索你的背景,你是如何来到这个空间的。那么,你是如何发现人工智能安全和人工智能对齐的,是什么让你全职研究它?
Ethan Perez (02:12):
我对人工智能的长期影响普遍感到兴奋。我,在早期,有一些数学背景,我在想,哦,有了这种背景我能做些什么有影响力的事情。对机器学习有了更多的了解。然后我读了尼克·博斯特罗姆的书《超智能》,我觉得这本书大概是有这些兴趣的人的常见读物。我认为这让我开始思考人工智能的长期影响,哦,我真的应该思考当我们的技术在能力上接近人类水平,甚至超过人类水平时会发生什么。
伊桑·佩雷斯(02:51):
这可能是我生命终结时发生的事情,甚至不是在我的有生之年。但我认为,这真的是人工智能将产生许多影响的地方,也是我们能够使用人工智能来实际提升我们人类知识的地方,这是我真正关心的事情。
Jeremie Harris (03:06):
顺便提一下,我想问一点关于超智能的事情。是什么超级智慧改变了你对事物的看法?读了这本书,你的观点是如何转变的?
Ethan Perez (03:17):
我认为这本书非常注重长期考虑。我不认为我有足够的专业知识或时间去衡量尼克当时对存在风险和其他事情的非常具体的论点。但我认为它确实提出了一些论点,即人工智能和非常强大的人工智能系统是可能的。
Ethan Perez (03:41):
我记得的一个关键论点是,假设我们有一个系统可以在某些任务上达到人类水平的能力。也许一些可以想象的方法就是模仿人类的大脑。这可能在计算上非常昂贵,但至少在原则上,这似乎是可能的,因为我们是这种智能系统的一个例子。我们只需要复制它。
Ethan Perez (04:09):
然后,如果你做某种复制程序,也许如果你认为神经科学[听不清 00:04:13]是不可能的,我们可以在很大规模上对人类文本或数据进行监督学习或无监督学习,并获得类似的效果。但这似乎有点道理,然后他提出了这一点,哦,你可以在很大程度上加速或并行化该软件,然后得到某种超人的东西,在某种意义上,它可以比人类更快地做事情,但在人类水平的能力质量上。
伊森·佩雷兹(04:40):
我认为这让我很兴奋,哦,我的阅读速度和我能学到的东西太多了。如果我能有 1000 份我的拷贝,去阅读互联网上的不同部分,那将是非常令人兴奋的。我正在寻找一种新的饮食或寻找一个新的哲学问题,然后向我报告他们收集的所有信息。我认为这是一个似是而非的论点,对我来说似乎很现实,哦,这似乎很合理,我们可能会得到比我们在集成方面做得更多的系统。
耶雷米·哈里斯(05:18):
是啊。从某种意义上来说,这几乎就像是在玩智力是一个定义非常模糊的东西的游戏,在这里你甚至可以通过几乎完全复制人类的神经硬件而变得超级聪明。在一个不同的媒介中进行,在那里计算会更快,因为它是[听不清 00:05:37]细胞或其他东西的基质。你马上就有了某种东西,它实际上是超人的,尽管算法只是人类的。这是一种有趣的…是的,硬件软件方面。
杰瑞米·哈里斯(05:49):
这是否给了你提示?就像,你准备好了超级智慧,你就像,“我知道我想把这作为我一生的工作。”
伊森·佩雷斯(05:53):
这促使我接受了我的第一份主要研究实习,并且-
Jeremie Harris (05:58):
在 MILA,对吗?
伊森·佩雷兹(05:59):
是的。在 MILA。没错。艾伦·库维尔是一位伟大的导师。我在那里有其他非常好的同行,并最终有了一篇成功的论文。然后,我真的很享受整个过程。我对我们如何利用机器学习来帮助人类提升我们的集体知识感到非常兴奋。我只是读了很多书,总是很兴奋地想了解这个世界。有时候,我觉得非常瓶颈,或者我觉得我们真的需要在回答一些关于世界的问题的能力上有所改变。尤其是,我在哲学方面思考这个问题,看起来,哦,这些真的是很难的问题,看起来我们需要很多很多年才能回答一些问题。我想,我们真的需要思考新的方法来解决真正具有挑战性的问题。
Ethan Perez (06:50):
然后,我想在第一次研究实习后,我开始更广泛地思考,哦,还有哪些方法可以让我们超越人类的能力。是的,我的意思是,没有太多的方法可以做到这一点,这似乎是合理的,这就是我遇到迭代蒸馏和放大的地方,以及在不同范式的背景下进行的辩论,以超越人类的能力,而不仅仅是模仿人类的能力,监督和非监督方法都可以做到。
Jeremie Harris (07:26):
这实际上给我们带来了另一个有趣的方面,也就是从一开始,你就在接近 IDA,迭代蒸馏和放大,这是我从对话开始就一直在取笑的东西。你谈到这是从人工智能系统获得超人能力的一种方式。我很乐意讨论这一点,因为通常当我听到 IDA 谈论时,我会花更多的时间与 AI 安全社区的人交谈,所以他们专注于 IDA,将其作为实现可以被询问的安全 AI 系统的一种方式。我也想谈谈这个,但我真的很好奇,是什么阻止我们在没有 IDA 的情况下获得超人的性能。我认为那可能是一个有趣的起点。
伊森·佩雷斯(08:06):
是的。是的,我的意思是,我认为基线,思考它的起点是,嗯,我们训练系统回答问题的默认方式是监督学习。这是训练系统回答问题的所有最先进和标准的方法,MLP 只是使用监督学习,我们收集问题答案的大型数据集,然后我们学习从问题到答案的映射。这是一个很好的范例,只要我们能够收集问题的答案,这对于人们在谷歌上搜索的许多问题和非常实际的问题都是可能的,比如,这个人是什么时候出生的?但是,当我们无法收集问题的答案时,这种范式基本上就崩溃了。
Ethan Perez (08:53):
然后,基本上,然后我们只是没有任何训练数据来训练我们的监督学习算法。这基本上是迭代蒸馏和放大试图解决的问题是,假设你有一个系统可以进行人类水平的问题回答,因为你已经在我们有人们收集的问题答案的数据上训练了它。所以你有了这个黑盒子,投标问答系统。现在的问题是,我们如何使用这个系统来回答一些超出其分布的问题,因为它没有被一个问题的答案所标记?
伊桑·佩雷兹(09:30):
比方说,就像哲学中的问题,我认为这是一个很好的例子,因为我们没有这类问题的答案。因此,它们可能不在分布范围内,可能需要不同的推理过程才能得到答案。但是我们有一个非常好的问答系统,可以回答很多其他相关的问题。
Ethan Perez (09:49):
我们可以考虑的解决这个问题的方法是,将我们没有实际答案的问题分解成子问题,我们可以用现有的问答系统来回答这些子问题。所以我们可以把它分解成,我不知道,如果这样的问题,人们有自由意志吗?我们首先会有一个问题,自由意志是什么意思?然后我们可以围绕自由意志的神经科学提出一些问题,等等,等等。然后,对于这些问题中的每一个,我们可以用我们的问答系统来回答它们,或者如果因为它们具有挑战性而需要进一步细分,我们可以进一步细分它们,然后回答这些子问题。
Ethan Perez (10:34):
我们希望通过不断地将这些问题分解为子问题,我们最终会找到一个有监督的问答系统需要训练的问题;其中这些子问题是我们可靠地期望我们的训练模型准确回答的那种问题。那么,现在我们已经回答了这个大问题的一系列不同部分,给定这些子问题的答案,我们预测最终答案应该容易得多。
Jeremie Harris (11:04):
所以,简单地说,为了确保我理解它,你有一些复杂或非常困难的问题,这个问题名义上需要超人的智慧来回答。你拥有一种,也许是人类的,甚至是你训练出来的亚人类水平的智力。你可以训练它,因为你有一大堆真实人类给出的问题和答案,所以你可以用这两样东西来训练这种大致人类水平的智能。然后我们希望可以把这个非常复杂的问题分解成子问题,最终可以用这个略低于人类或大致相当于人类水平的智能来回答。这就是计划吗?
伊桑·佩雷兹(11:46):
是的。没错。
Jeremie Harris (11:50):
这太酷了,因为对我来说,如果这是真的,如果我们真的可以做到这一点,那么原则上没有问题,如果我错了,请纠正我,但是没有问题不能被分解成最终人类可以理解的子问题。
Ethan Perez (12:09):
我想你可能会进入,如果你做非常一般的陈述,你可能会进入围绕哥德尔不完全性定理的问题,我们知道有些真实的陈述我们无法证明答案。但是也许有一个适度的版本,我的意思是,一些用来证明哥德尔不完全性定理的例子有点奇怪,人们并不真正关心它们。但是你可能会说,对于大多数我们真正关心的问题,可能有一些合理的方法把它们分成子问题,足够多的子问题。在某些情况下,我们可能会回答非常多的子问题,是的。
哈利斯(12:56):
对不起。你能详细解释一下与此相关的哥德尔不完全性定理吗?我想可能有些听众不熟悉哥德尔的不完全性定理。
伊桑·佩雷斯(13:02):
哦,是的。
杰里米·哈里斯(13:03):
这是一个有趣的方面。
伊桑·佩雷斯(13:05):
是啊。我是说,我肯定不是这方面的专家。
杰里米·哈里斯(13:08):
当然,是的。
Ethan Perez (13:08):
但据我所知,这种说法的简单陈述是存在真实陈述,我们知道这些陈述是真实的,但无法证明这些陈述是真实的。这些通常是自我参照的陈述,就像-
耶雷米·哈里斯(13:27):
就像一个能容纳自己的筛子,或者类似的东西,是吗?
伊桑·佩雷兹(13:30):
是的,或者这种说法是错误的。他们有一种自我指涉的特质。这最初让我很难过。我想,哦,我们不能证明每一个真实的陈述。这真的令人失望,但我认为这将是一个很大的进步。我的意思是,这些很奇怪,因为它们是自我指涉的,而且有很多…有一个存在的证明,我们不能证明对每一个真实的陈述进行推理,但我认为…对我来说,这有点不清楚,在实践中实际上在多大程度上成立。
Jeremie Harris (14:04):
我想这本身就是一个有趣的问题,就像谈论 IDA 的局限性或任何策略的局限性一样,我的意思是,从安全的角度来看,我们希望使用 IDA 这样的东西来制造一种超级智能,可以探索任意复杂的想法。如果这些想法最终涉及的逻辑领域最终不是人类可以理解的,也就是说,我们实际上不能把它们分解成甚至人类可以理解的术语,那么这就像是妖怪从瓶子里出来了。从本质上讲,我们没有希望在预测这个系统的行为时重新控制这个思维过程。
伊桑·佩雷兹(14:44):
是的。我猜你可能想要一个可以说“嘿,我不能回答这个问题”的系统。
耶雷米·哈里斯(14:51):
对。
伊桑·佩雷斯(14:53):
就像“给定我的计算资源,找不到证据”之类的话。
Jeremie Harris (15:01):
我们通过引用人类水平系统或几乎人类水平系统来谈论 IDA,然后我们谈论它如何导致超级智能。我想我的一个问题是,艾达今天怎么样?游戏的状态是怎样的,你可以用 IDA 系统做些什么,否则你可能做不了什么?
伊桑·佩雷斯(15:21):
哦,是的。我认为这是一个很好的问题。我认为这种系统现在很有用,因为从根本上来说,它们,我的意思是,这就像迭代放大中的放大,你正在放大一个现有系统的能力,你已经训练它能够做更多的事情。
伊桑·佩雷斯(15:43):
例如,在我的一些工作中,我采用了标准的问答系统,它可以回答关于维基百科中某个段落的问题。他们非常擅长回答关于维基百科上单个段落的问题,但他们很难回答问题,或者不清楚如何将他们应用于答案在多个不同维基百科文章或不同段落中的问题。
伊桑·佩雷斯(16:08):
例如,乔治·华盛顿和亚伯拉罕·林肯谁出生得早?这些信息仅出现在维基百科的两篇文章中。我在工作中所做的是训练一个模型,首先为原始问题生成子问题,所以你会得到一些子问题,大意是,乔治·华盛顿什么时候出生?亚伯拉罕·林肯什么时候出生?然后,您可以使用预先训练的模型单独回答每个问题,然后将子问题的两个答案与子问题一起传递给另一个问答系统。然后它应该能够预测答案,基本上,我想是关于子问题的两个答案的争论。
Ethan Perez (16:55):
它使整个过程变得更加容易,然后我们表明它改善了当前流行的问答基准的结果。
Jeremie Harris (17:06):
你如何训练它识别子问题?我在努力思考这个问题……是不是只有一个带标签的训练集?你用的是这个吗?
伊桑·佩雷斯(17:13):
是的。我认为这是最简单的事情,但它们是一种奇怪的监督方式。得到这些问题和子问题对并不常见。是的,另一个简单的策略,如果你没有那么多的监督,我有一篇论文可以做到这一点,就是基本上利用这些大型语言模型,这些模型可以根据一些例子进行调整,从而进行推广。
Ethan Perez (17:41):
是的,所以我们基本上一直在使用 GPT-3,加上一些其他技巧,来生成子问题。您以一个问题和子问题对或几个子问题为条件,然后提示一个新问题。它可以很好地生成子问题。还有,在我的另一篇论文中,我们基本上只是想看看我们是否能在没有监督的情况下完全生成子问题。在那里,我们使用了一些来自未预见的机器翻译的疯狂方法来做到这一点。不过,如果你感兴趣的话,我可以更详细地介绍一下。但是有一种…这是你可以使用的不同方法的一个高层次。
耶雷米·哈里斯(18:22):
是的。不,我觉得非常有趣的是,你在看,有效地,用,我不知道术语是“一点点逻辑”还是一种你正在烘焙的逻辑结构来扩充 GPT-3。这让我想到了另一个问题,尤其是作为一个在这个领域工作的人,他有很多 Q & A 类型的问题。当 GPT3 问世时,你对它的印象如何?你对 lit 的出色表现有多惊讶?
伊森·佩雷斯(18:50):
我印象深刻。我想我印象最深的地方可能是使用模型来生成论点或建议,或者其他形式的长文本生成。这真的很好,尤其是大多数人问的那种问题,因为这方面可能有最多的训练数据。所以任何与政治或政治争论或经济,经济争论,护教学和宗教辩论有关的东西。它实际上只是做了一个合理的工作,我不知道,引用圣经经文或其他非常疯狂的事情;因为互联网上可能有很多关于这类事情的讨论。所以它比我见过的做这些事情的任何模型都要好。
伊桑·佩雷斯(19:46):
是的,我认为有些地方可能会失败,或者如果你想要非常精确的东西,如果正确的输出数量是一个,并且没有任何其他正确的输出,如果你想要一个问题的答案,你需要一个问题的准确答案,这仍然是…我的意思是,这不是真正使用监督。我认为这基本上是监督有帮助的地方,就是得到你想要的那种事情。
耶雷米·哈里斯(20:20):
你认为它背后有一个合理的世界模型吗?在多大程度上…因为我认为人们一直在争论的一个领域是,GPT-3 基本上是一种美化的记忆工具吗,就像你说的,“哦,我以前见过这个。我以前见过有人对圣经中的一节有这样的争论。我知道引用什么。诗句…”它实际上是在更高的抽象层次上连接点。你认为它落在光谱的哪个位置?
伊桑·佩雷斯(20:47):
嗯,这是个好问题。肯定是在做一些概括。我和一个朋友最近在玩它,他有点怀疑,我就想,“哦,那么是什么让你相信它在做某种推广呢?”他说,“嗯,它可能在网上看过很多食谱。也可能看到过关于独角兽的文章,但可能从未见过这两者在一起。”因为我不知道,这似乎不太可能。所以他只是[听不清 00:21:14]用一个…比如,“给我一个如何做独角兽眼汤的配方。”然后我们开始谈论我们如何需要红宝石,我们需要熔炼铁矿石,把它放进汤里,在上面撒上一些金粉作为装饰。
耶雷米·哈里斯(21:35):
哇。
伊桑·佩雷斯(21:35):
写得非常详细。是的,我不知道。这看起来像是一条鱼在寻找证据,证明它正在进行某种推广。我认为在某种程度上,似乎很难抓住那些没有真正做好工作的案例。
Jeremie Harris (21:53):
在此基础上,你是否预计随着 GPT3 的扩展,我的意思是,显然谷歌刚刚推出了他们的一万亿参数模型,我们可以预计在不久的将来会有更多的扩展。你认为扩大规模可能会使 GPT-3 达到你一直在探索的 IDA 战略,至少是最近探索的 IDA 战略被它所包含的程度吗;它本身就足够好,不需要这种增强,或者这种增强可以用来针对该模型的下一层失败?换句话说,这是 GP-3 加 IDA 的扩展,能让我们任意地走多远吗,我想这是我想问的。
伊桑·佩雷斯(22:35):
是的。我认为 IDA 的好处在于,它可以利用你所拥有的任何能力,得到一个可以做更多事情的模型。我认为……我不担心更大的语言模型包含了 IDA 的需求,因为无论你有什么大的语言模型,你总是可以通过编写这个深度问题分解过程来让它回答更多种类的问题。到目前为止,我们的模型越好,似乎就越容易从问题分解中获益;因为,是的,如果你有一个更好的语言模型,你就可以产生更好的子问题。
Ethan Perez (23:22):
来自 GPT-3 的问题分解比来自我们以前的序列到序列方法的问题分解做得更好。即使是在预训练的基础上,也比不使用序列的方法做得更好。这只是一个明显的梯度,从子问题中获得的好处有所提高。是的,所以我认为我们会看到这种问题分解带来的越来越大的影响。
Jeremie Harris (23:48):
这很有意思,因为我猜想在某个时候,随着这些语言模型变得越来越复杂,它们就像一个越来越复杂的世界模型一样,这个世界模型将包括问题分解的值,因此……基本上,我们可以说,GPT-N 可以同时优化问题分解和回答问题。换句话说,如果这一切都发生在同一个优化引擎的引擎盖下,你会从这种互动中受益?
伊桑·佩雷兹(24:21):
是的。我认为这似乎是正确的。只要你有你需要做的分解量的训练数据。我不知道,GPT-3 可能会在一些问题上接受训练,可能需要几个或两到四个子问题。所以它可能只是在做这个内部分解过程,并预测答案。谁知道呢?你甚至可以从内部权重中解码出子问题。
伊桑·佩雷斯(24:53):
但我认为棘手的是,你如何归纳出比人们通常在互联网上回答的问题更需要分解的问题。我认为这就是这个结构化过程有帮助的地方,因为你可以任意地将问题分解成子问题。
Jeremie Harris (25:13):
我喜欢它是因为它在玩这个……我有一个物理的心理模型,或者你可以把它称为物理、逻辑和机器学习作为一个连续体的两端。在物理学中,我们走进世界,进行一系列实验,试图找出似乎一直适用的潜在规则,比如不管发生什么,这些规则总是正确的。任何参照系中的光速都是一样的。重力也是如此等等。
杰瑞米·哈里斯(25:48):
逻辑法则有点类似于……好像你在这里假设了一条逻辑法则。问题分解定律你可以连贯地把复杂的命题分解成简单的命题,永远都是这样。这几乎就像你在试错,机器学习,让我在大象周围摸索,但实际上从来没有…就像,机器学习模型实际上不会提出规则。他们提出了预测模型,这些模型有一点点不同,也没有那么基础。
Jeremie Harris (26:18):
感觉就像你把两者结合在一起。你会说,好吧,你真的,真的很擅长建立这个世界的模型。这是一个非常灵活的模型,但是当它遇到没有被训练过的东西时,它就会失败。因此,我们认为,这个原则的补充,将是真实的,独立于上下文,给予它更大的影响。这是一个公平的框架或描述吗[听不清 00:26:41]?
伊桑·佩雷兹(26:41):
是的。不,我想差不多就是这样。是的,你做到了。
杰瑞米·哈里斯(26:45):
你认为有什么是艾达加 GPT-3,或者 GPT-N,我应该说,做不到的吗?IDA 能让我们越过超级智能 AGI 终点线吗,或者有其他东西,比如自我游戏或强化学习,必须与这些系统相结合吗?
伊桑·佩雷斯(27:06):
是的。我认为这是一个好问题,至少如果你想回答问题,而不是说,在世界上采取行动。然后,我认为一个语言模型加上问题分解会让你走得很远。我的一些不确定性是围绕…我发现的一个问题是,如果您错误地回答了一个子问题,那么这可能会作为一个错误传播到最终答案中。如果你回答“乔治·华盛顿是什么时候出生的”,就说是 1900 年。然后,你会错误地回答“他比亚伯拉罕·林肯早出生吗”这个问题。
Ethan Perez (27:56):
我认为我们需要深入思考如何进行问题分解,如何使用子问题的答案。我们可能只需要对任何不同的问题做许多不同的问题分解。我们也可能想直接问这个问题。也许维基百科上有一些文字说,“乔治·华盛顿出生在亚伯拉罕·林肯之前。”所以我们可能只想直接问这个问题。也许出生日期无法得知,所以我们想看看他们的死亡时间,也许如果他们死亡时间的差异足够大,那么我们可以得到一些估计。这将让我们对他们的出生日期做一些贝叶斯更新。
Ethan Perez (28:40):
我们可能希望将这些不同的问题分解结果集合在一起。另外,我认为其他重要的事情,是看回答子问题的模型在预测答案时的置信度。我发现的一件事是,当模型对自己的答案不太有信心时,整个过程很可能会以一个不正确的答案结束,我认为这是有道理的。
耶雷米·哈里斯(29:09):
有道理,是的。
伊桑·佩雷斯(29:11):
这是一种我们应该仔细调整的事情。它出现在我们建立的系统中,但这是我们应该小心的事情,哦,也许我们应该实际训练更好校准的模型,看看我们应该如何利用它们的信心来影响我们对整体预测的信心。这个系统有很多不同的部分,我认为确实需要仔细研究,以使整个过程正常进行。
耶雷米·哈里斯(29:38):
是的。毫无疑问,这是一个很高的赌注,尤其是就我认为的那些早期的问题而言,对吗?系统越早出错,整个树越早受到危害。那是…
伊桑·佩雷斯(29:53):
是的。
杰里米·哈里斯(29:54):
好的。这实际上把我们带到了,因为你提到了组装。你有一大堆不同的问题分解。问题分解一得出一个结论。问题分解二导致不同的结论等等。最后,你平均一下,或者你让他们都投票,然后你用这个来集合他们的预测,你会得到一些更可靠的结果。另一个角度呢,让这些系统,也许,经历某种辩论过程。我知道这是你一直在做的另一件事。
伊桑·佩雷斯(30:24):
是的。
哈里斯(30:25):
你能谈谈辩论及其在这方面的重要性吗?
伊桑·佩雷斯(30:28):
是的。我认为高层次的想法是相似的,那就是当我们有一个更困难或更复杂或不知何故不分布的问题时,我们需要以某种方式递归地分解它,以便达到这样一个点,即我们实际上可以从一个经过监督学习训练的模型中做出评估。
Ethan Perez (30:48):
辩论的方式是不同的,我将从强化学习的角度出发,讨论如何解决这个问题。假设你想问一个模式,我该不该吃 keto?给我一个答案,并解释一下为什么我会认为你给了我一个好的答案。如果你对那些解释没有那种监督,你可能想做的一件事就是让你的语言模型生成一个解释。然后,你就查一下解释,然后你看,哦,这个好像有道理吧?如果它看起来合理,那么 RL 类型的方法将奖励给出良好解释和答案的语言模型,如果它看起来不正确,则给予负面奖励。
伊桑·佩雷兹(31:39):
如果你认为答案很容易核实但很难找到,我认为这种事情很有意义。数学证明可能是一个例子,其中有一个非常复杂的推理过程,以生成整个证明。但是一旦我们有了证据,那么检查答案就容易多了,然后每个人都可以积极地奖励提出证据的模型。这种强化学习类型的方法似乎会让我们超越人类的能力,因为我们实际上并没有产生答案。我们让模型做一些昂贵的计算来得出答案,然后我们检查它们。
伊桑·佩雷斯(32:16):
问题在于它不安全,或者可能与我们的价值观不一致,因为我们基本上只是在优化一个模型,以生成令人信服的答案,或者看起来正确的答案。但是
耶雷米·哈里斯(32:27):
我们认为有说服力的事情。
伊桑·佩雷斯(32:30):
是的。是啊,没错。我认为这就是辩论的动机所在,我们有一个模型来回答一个问题。然后我们可以让同一个模型带给我们对这个问题的答案的思考,我们可能会错过,这是反对这个答案的非常有说服力的案例。所以也许它提供了另一个答案,所以现在我们既有了最初的答案,也有了相反的答案。对于一个好的模型来说,这些可能是这个问题的两个最佳答案。我们可能会想,好吧,现在我们知道的更多了,也许是一些我们可能没有的缺失信息。
伊桑·佩雷斯(33:17):
辩论,以类似的方式,是重复的放大。你可以重复整个过程,然后你可以说,好的,给定我这个答案和反驳的答案,我可以对那个回答产生一个反驳的论点,一个反驳的论点,等等,等等,直到基本上,我们有足够的信息让一个人以相当高的信心预测正确的答案是什么。然后我们可以用它来…既然我们对这些数据有可靠的人类判断,那么我们可以训练可靠的模型来做出同样的预测,只是使用监督学习。
Jeremie Harris (33:59):
这里的希望是让两个人工智能系统相互辩论,在这个过程中,它们最终以人类可理解的方式揭示彼此论点的优缺点。
伊桑·佩雷兹(34:09):
是的。
耶雷米·哈里斯(34:10):
这样我们就可以走了,哦,这个人工智能是恶意的,它试图愚弄我来帮助它实现统治世界的计划,而这个人工智能正在做正确的事情。当我看到这场辩论结束时,它的答案实际上是有道理的。这真的有用吗?我想我会想象的一件事,或者我在这里会想象的一个问题是,当这两个争论的系统大大超过人类的推理能力时,你最终会处于一种脱节的情况,就像你说的,听起来对人类有说服力的东西和实际逻辑会支配的东西之间。这种逻辑变得非常复杂,看起来欺骗一个人会变得非常非常容易,而传达真实的论点会变得非常困难。
伊桑·佩雷兹(35:04):
是的。我认为这是这种方法的主要不确定性。你可能会认为,随着运行这种辩论的模型变得更好,那么论点和反论点都会变得更好,以一种有益的方式,因为你更有可能抓住论点中的某些领域,但是是的。看起来确实有…我的意思是,有一些有趣的实验,比如 OpenAI 进行的人体实验,他们让了解物理的聪明人参与辩论过程,并试图以一种方式…非物理的,不太物理的人尝试判断辩论。对我来说,评估这些争论真的非常非常困难。
伊桑·佩雷斯(35:54):
所以我认为,这是另一件需要调整的事情,以便找出我们如何能够最容易地评判辩论,这样我们仍然可以有信心对整个过程做出可靠的评判。
杰瑞米·哈里斯(36:11):
对,因为我不知道,对我来说,这看起来很天真,这就像是一个维度的诅咒,问题领域变得越复杂,他们的推理就越复杂,高维度就越高,这些人工智能就有更多的自由。看起来这些自由度,就像是你需要楔入欺骗的空间。随着问题复杂性的增加,空间似乎也在增长。
Jeremie Harris (36:46):
但是,是的,希望有一些潜在的原则,所以我们可以实际上揭示[听不清 00:36:50]规模多一点。
Ethan Perez (36:52):
你可能需要将这些方法结合起来。我不知道。训练一些 IDA 类型的系统,然后因为它完成了这种分解,然后它能回答什么样的问题,也能判断什么样的辩论,这超出了人类的能力。然后,你可能想用这个系统作为这个辩论过程的裁判。它可能比直接使用人类注释者作为评判者做得更好。
伊桑·佩雷斯(37:22):
对于辩论,我认为动机之一是这可能是一个很好的训练信号,如果你可以训练一个模型来准确判断辩论的结果。然后,你可以把它作为某种自我游戏的奖励信号,甚至是 AlphaZero 类型的系统,其中模型优化奖励,并更好地产生这些论点。然后随着他们变得更好,你也可能认为他们可能是整个系统更好的法官。这些拼图有不同的组合,我们可以试着把它们拼在一起,但这是一个悬而未决的问题,关于怎样做才能得到可靠的判断。
Jeremie Harris (38:04):
我也很好奇的一件事,这不仅影响了研究人员选择的工作策略,也影响了他们对安全的态度以及他们认为必须要研究的校准和人工智能安全技术。这些技术问题和关于人工智能时间线的想法之间有着紧密的联系。当你认为一个 AGI 人类水平的一般智能,或者我们可以用那些术语来指的东西,将会出现;你有,我不知道,你对此有什么看法?如果是,这是否告知了您的立场,即是否要在能力、一致性或其他方面开展工作?
伊桑·佩雷斯(38:41):
是的。对此我做了一个预测。有一根很好的线。我可能要晚些时候发给你,但这个研究小组 AUT 有一个非常好的帖子,他们收集了许多不同人的人工智能时间轴。我认为从这点来看…
杰里米·哈里斯(38:53):
我会发布一个链接。我确实看到了你的非法情节,所以每个人都可以查看播客附带的博客帖子,你将能够看到伊森的非法帖子,因为我认为它有点耐人寻味。
伊森·佩雷斯(39:02):
好的。很好,是的。我认为这在很大程度上取决于你对 AGI 的定义。我想我在考虑,它既需要良好的语言建模能力或语言能力,良好的视觉能力,又能够在世界上采取行动。我认为,在我的预测中,我把它分解成两种情况。有一种情况是,我们通过组合我们目前拥有的现有组件并利用我们拥有的计算对它们进行扩展来获得一般智能。然后,我的分布还有另一个组成部分,那就是在另一个场景不成立的情况下,只是在下一个世纪或几个世纪之前,嗯,不确定它什么时候会发生。所以我会有一些时间线上的衰减分布。
伊桑·佩雷斯(39:57):
在第二种情况下,我们何时能获得总体情报似乎还不确定,因为这很可能是一些非常困难的突破……我们已经在这个问题上努力了很长时间,所以可能需要很长时间才能获得我们需要的必要突破。但在另一种情况下,似乎很有可能在短期内,如果我们得到更大的 GPT 式模型,如果我们有足够的计算能力来获得良好的性能;那么我认为我们得到相当好的语言模型似乎是合理的。然后我们只需要将它们与视觉组件结合起来,我认为这是 CLIP 和 DALL-E 以及其他一些模型的发展方向。然后,我们只需要给他们一些在世界上采取行动的能力,或者能够像我们希望的那样训练他们。
耶雷米·哈里斯(40:56):
某个身体。
伊桑·佩雷斯(40:58):
是的。也许…我不知道我是否被束缚在身体上,但是至少模型应该能够,例如,经营一家公司,选择优化一些目标的行动。除了获得和理解视觉和语言,这似乎还需要更多的工作。
Jeremie Harris (41:21):
我认为你提出这个问题的方式是每个人都在他们的脑海中含蓄地提出了这个问题,但是从来没有人像你这样明确地提出来,或者就我在评论中看到的那样。核心问题是,嘿,我们基本上解决了所有需要解决的概念性问题了吗?基本上,我们是否已经拥有了所有这些成分,强化学习,深度学习,我们只是将它们混合在一起,并添加少量的香料,然后我们就有了 AGI?或者有一些基本的东西,是否是一些奇怪的量子效应,或者一些我们必须弄清楚的东西,使 AGI 实际工作?
Jeremie Harris (41:53):
如果我没记错的话,您实际上说过,您认为目前我们有四分之一的机会拥有实现起飞所需的一切。对吗?
伊桑·佩雷斯(42:03):
是的。我想那是对的。我的意思是,这很大程度上取决于你对 AGI 的定义。我认为语言模型本身非常强大,可能已经足够好了-
杰里米·哈里斯(42:17):
[听不清 00:42:17]
伊桑·佩雷兹(42:17):
…对世界有巨大的影响。我在那篇文章中说的是四分之一,但我认为可能大多数人在这个问题上比我低。有些人会更高。
哈里斯(42:29):
哦,有意思。所以你认为大多数人会认为可能有一些缺失的概念成分?
伊桑·佩雷兹(42:37):
是的。我认为这可能是一种被 OpenAI 的一些扩展工作所削弱的观点,但一般来说,大多数研究人员似乎都是这样的,“哦,我们确实需要一些新的想法来处理事情。”
Jeremie Harris (42:55):
当我看着你的图表时,给我留下深刻印象的一件事是,你已经做到了,基本上,我们在未来 10 年左右的某个时候达到 AGI 峰值的可能性,基本上是你的大幅提升,这与我们可能已经拥有一切,我们需要的只是规模。所以在接下来的 10 年内,我们将能够扩大我们的规模。
杰里米·哈里斯(43:13):
然后,当然,你有他的高度不确定性的大时期,你喜欢,“我不知道。如果在这段时间内没有实现,扩展也不起作用,那么谁知道我们什么时候会有大想法呢?”这引起了关注吗?你担心未来 10 年我们可能会袭击 AGI 吗?你认为我们从安全的角度,从结盟的角度,从哲学的角度准备好了吗?
伊桑·佩雷斯(43:38):
是啊。这个问题问得好。我认为,在某种程度上,如果没有[听不清 00:43:47]模型,似乎很难研究这些安全方法。
哈里斯(43:48):
能力?
伊桑·佩雷斯(43:48):
是的。在我们…几年前,很难对一个问题提出一个好的子问题。是的,所以我的一部分感觉是,哦,随着我们越来越接近非常强大的语言模型,这些方法将变得越来越有用。是的,但是看起来,我不知道,也许我们需要很长一段时间来接近拥有强大的语言模型,并且有很多时间来开发我们的方法。然后,哦,然后我们会为此做好准备,我们会有所有这些超越人类能力的方法,以一种适当的方式推广。
伊桑·佩雷斯(44:32):
是的,也许更多的是轨迹的形状…
哈里斯(44:35):
有意思。
伊桑·佩雷斯(44:36):
这对我很重要。
杰里米·哈里斯(44:40):
这是否意味着我们会知道?因为现在我认为我们正在扩展世界上最大的机器学习模型。我认为每年都有 10 倍的增长。对我来说,这似乎表明,当我们找出解决方案时,我们很可能不会在人类智力水平之下哼唱,而是突破那个门槛,然后创造出比我们能处理的更大的东西。这是一个看似合理的担忧,还是你认为其他事情可以消除这种担忧?
伊桑·佩雷斯(45:13):
嗯,我认为它的计算能力非常有限。在这种情况下,我们从我们当前的方法集中得到的方法通常是智能的,看起来未来的方向是,我们需要大量的扩展。在这种情况下,在你得到的模型的质量和你使用它的计算量之间会有一些权衡。我认为这确实限制了……是的,我想就智力而言,它确实可以快速增长。
伊森·佩雷兹(45:49):
是的,看起来……我的意思是,我们确实需要更高数量级的计算能力来达到接近人类水平的智能。在这一点上,这就像是,你在用一大笔预算,谷歌研发预算的很大一部分来训练模型。这是一个问题,嗯,还有多少钱可以花在这些上面?这似乎是一个需要一段时间的过程,至少需要一些时间,甚至可能需要某种政府项目来筹集比谷歌研发预算更多的资金来扩展模型。但似乎很难就这么过去了。
Ethan Perez (46:28):
我们也有这些非常可预测的幂律曲线,随着计算的增加,语言建模的损失将如何下降?也就是说……就我们从更多计算的训练中获得的语言建模的改善程度而言,我们获得的收益正在放缓。我认为这些因素都向我暗示,事情会有所放缓。
Jeremie Harris (46:52):
嗯,我想如果他们这样做了,这将表明像 IDA prolyl 这样的策略将变得更加有价值,因为我们需要这里或那里的一些额外推动。IDA 是否有必要跨越 AGI 门槛,或者是否有其他可信的技术……IDA 本身是否是一种可信的方式,换句话说,让我们从基于人类水平数据训练的系统中获得超人水平的性能?
伊桑·佩雷斯(47:25):
是的。好的,所以我脑海中的描述是这样的,一个非常好的语言模型将捕捉到人类智力和能力的全部分布。它知道人类智力的最高端是什么样的。例如,我提出 GPT-3 就好像是斯坦福大学两个教员之间的对话。然后对话是非常独特的,这是他们引用不同的名人和非常高质量,格式良好的英语之类的东西。
Jeremie Harris (48:01):
非常复杂的对话。
伊森·佩雷兹(48:02):
对,没错。那里,我想,那里很清楚。我的意思是,那似乎…我的意思是,就质量而言,它高于人类智力的平均值。所以我认为这似乎是一个合理的地方…我的意思是,也许你可能已经认为是超人了,这取决于你的想法-
耶雷米·哈里斯(48:22):
对。没错。它选择了人类人口的前百分之一。那是超人的东西吗?我是说,也许,是的。是啊。
伊桑·佩雷兹(48:32):
是的。我是说,那已经很有用了。然后我想,也许如果你使用某种基于强化的方法,就像我描述的那样,你可以超越它。但我认为你会开始看到我描述的一些失败,模型产生的答案令人信服,但不一定正确。在那里,我认为你会陷入危险,嗯,人们可能会使用这些答案,因为它们可能是正确的,但它们也是经过优化的,只是为了说服你-
杰里米·哈里斯(49:04):
【听不清 00:49:04】。
伊桑·佩雷斯(49:04):
因此,你可能会根据错误的信息做出重要的决定。我认为,当我们试图超越人类能力的水平时,我们可能会想要…我们可能基本上需要使用蒸馏和放大或辩论的方法,以一种我们有信心会奏效的方式让我们超越人类能力的这一体系。
Jeremie Harris (49:33):
你对……总体上持乐观态度吗?因为我们已经讨论了 IDA 作为一种增强这些系统的潜力,以获得超人水平的性能。看起来我们确实有策略,至少在原则上,看起来他们有很好的机会让我们拥有超级智慧。不管这些策略中的哪一个有效,还是其他什么有效,我们似乎很有可能最终会实现目标。你对我们控制这些系统的能力持乐观态度吗?也许明智地使用它们是另外一个问题。而是我们控制它们的能力,以确保我们不会把我们宁愿放回瓶子里的精灵从瓶子里放出来。
伊桑·佩雷斯(50:12):
是的。我认为问答系统的好处之一就是我们可以决定如何处理这些信息。这并不是说我们让系统自己自主行动,我认为这是很多困难的来源。我的意思是,正确回答这个问题仍然有困难,但我认为如果我们真的能解决这个问题,我认为更简单的问题,只是让模型概括过去人类的能力,只是在预测的领域,回答问题;然后,我认为我们可以使用这些方法中的一些来帮助我们在更普遍的情况下,我们希望我们的系统只是以一种不受人类监督的方式自动采取行动。
Ethan Perez (51:03):
例如,我认为建立这种联系的一种方式是使用这个经过 IDA 或辩论训练的问答系统,为运行制造业的系统提供奖励,如亚马逊制造或在科技公司做出 CEO 级别的决策等。我认为,如果我们有某种超人的问答系统,可能会更容易获得对这些采取长期行动的系统的准确评估。
耶雷米·哈里斯(51:41):
有意思。好吧,我们希望问答系统将会成为解决方案的重要组成部分。非常感谢你的时间和想法,伊森。你有没有一个个人网站,你想让人们实际上-
伊桑·佩雷斯(51:53):
是的。
杰里米·哈里斯(51:53):
……看看他们是否有兴趣关注你的工作?
伊桑·佩雷斯(51:55):
是的。只是 ethanperez.net。
哈利斯(51:57):
太棒了。点网。太棒了。我喜欢。非常,是什么?我不想说是潮人,但它有很好的美感,是的。太好了。
伊森·佩雷斯(52:07):
很好。这是唯一可用的。[听不清 00:52:09]
杰里米·哈里斯(52:09):
不错。很好。我想,欢迎来到 2021 年。伊森,非常感谢。我真的很感激。
伊桑·佩雷斯(52:16):
是的。谢谢你邀请我。
使用脚本制作交互式 Web 应用程序 PyWebIO 方式
在制作数据科学 web 应用程序时,Streamlit 不是您的唯一选择
网络应用是展示你作品的最有效的方式,因为它们是独立于平台和高度互动的。如果 Python 是您选择的语言,您可以选择,包括 Django 和 Flask,这是 Python 中两个领先的 web 开发框架。然而,对于你来说,学习它们并不容易,因为你要制作功能性的 web 应用程序。
之前,我已经写了几篇关于使用 Streamlit 的文章( 1 、 2 、 3 、 4 ),Streamlit 是一个在数据科学家中很流行的趋势 web 框架。随着几个主要投资者的支持,Streamlit 预计将继续增长,如果您有兴趣了解如何使用 Streamlit 轻松制作交互式应用程序,我们鼓励感兴趣的读者探索这个框架。
在这里,我想描述一种制作交互式 web 应用程序的替代工具。GitHub 上几乎有超过 1.8k 的星星,这个趋势 Python 库 PyWebIO 允许用户仅使用 Python 脚本创建 web 应用程序,而无需任何 HTML、CSS 或 JavaScript 知识,类似于 Streamlit。然而,这是不同的—我将把讨论留到本文的结尾。在此之前,我们先来看看 PyWebIO 是如何工作的。
事不宜迟,让我们开始吧。
装置
在虚拟环境中(是的,为您的项目建立一个虚拟环境是一个好的实践),您可以通过运行以下命令使用pip
来安装该包:
pip install -U pywebio
请注意pywebio
需要 Python 3.5.2+。
第一次互动——让我们收集意见
顾名思义,这个 Python 库专门处理输入和输出。让我们先用一些数据输入来尝试一下。
输入示例(图片由作者提供)
如您所见,PyWebIO 为您提供了常用的 web 小部件来收集输入。该示例包括文本输入、用于连续数值选择的滑块、复选框、用于选择的下拉框以及基于单选按钮的多项选择。除了这些显示的小部件,您还有其他选项,比如文件上传和多行文本输入。
对于这些小部件,您可以添加标签、验证、占位符和许多其他微调配置。
为了便于您复制上述操作,您可以找到下面的代码。
输入示例的代码
产量怎么样?
在上一节中,为了向您展示代码和输入小部件,您已经看到我使用了put_code
函数作为输出小部件。如您所见,它创建了一个灰色小框,用不同的字体显示代码。除了显示代码,最常见的是使用put_text
函数显示文本,你可以使用put_table
函数显示表格。
pout.put_text("This is an awesome library.")pout.put_table([
("Col 1 Title", "Col 2 Title"),
("Row 1, Col 1", "Row 1, Col 2"),
("Row 2, Col 1", "Row 2, Col2")
])
您将看到一行文本和一个结构良好的表格,如下所示。
输出表(图片由作者提供)
就像 Streamlit 一样,PyWebIO 也支持 markdown,这为使用 markdown 语言显示信息创造了很多机会。下面的代码和截图向您展示了一些常见的降价用法。
pout.put_markdown("# This is the Title")
pout.put_markdown("## This is the Subtitle")
pout.put_markdown("_Bold Text_")
pout.put_markdown("__Italic Text__")
pout.put_markdown("*__Bold & Italic__*")
pout.put_markdown("[google.com](google.com)")
降价示例(图片由作者提供)
除了文本,您还可以使用put_image
功能轻松显示图像。
pout.put_image(open("airplane.jpg", "rb").read())
显示图片(图片来源:维基百科,授权:公共领域)
虽然我向您展示的是来自本地的图片,但是您也可以使用显示在线图片的 URL。
如果你想有一些需要特别注意的东西,你可以使用toast
功能把它作为一个通知框。此通知将在指定的延迟后消失。
pout.toast("Please Pay Attention!", duration=10)
吐司示例(图片由作者提供)
另一个重要的输出/输入部件是按钮——许多 web 应用程序没有按钮就无法运行。PyWebIO 当然支持按钮。让我们现在试一试。
def show_text():
pout.toast("Button is clicked!", duration=10)
pout.put_button("I'm Ready!", onclick=show_text)
按钮示例(作者图片)
您也可以探索其他输出小部件。例如,您可以显示下载文件的链接或显示供选择的弹出菜单。
Streamlit 与 PyWebIO
如果你用过 Streamlit,你可能会想知道 Streamlit 和 PyWebIO 有什么区别。以下是我思考这个问题时想到的四个要点。如你所见,它们不是同一类东西。
- 整体生态系统。Streamlit 得到了更大的发展,因此,它有更成熟的小部件和更好的内置 web 应用程序的外观调整。它还提供云托管服务,让您可以轻松部署应用程序。许多数据科学家和机器学习工程师已经采用了 Streamlit。相比之下,PyWebIO 相对较新,它正在等待看它如何被该领域接受。换句话说,PyWebIO 的生态系统仍在成长。
- 剧本执行/设计原则。 Streamlit 完全执行脚本。每当脚本中有变化时,将再次评估脚本。因此,对于某些用例来说,这可能是一个难题。相比之下,PyWebIO 线性地评估脚本。当脚本需要输入时,它不能让您继续,直到输入被提供。
- **预期使用案例。**对我来说,你可以使用 Streamlit 来开发更精致、结构更复杂、服务大众的 web 应用。相比之下,PyWebIO 擅长解决较小的任务。因为它的“线性”设计,如果你开发一个内部使用的逐步 web 应用程序,它是有用的。
- **开发者友好。**我发现它在开发阶段变得更加友好,因为它的“热加载”功能——当你更新你的脚本时,你的 web 应用程序会重新加载以反映变化。然而,从设计上来说,PyWebIO 本质上是 web 应用程序中 Python 控制台的图形表示,因此您只能使用会话和脚本中的位置。因此,您可能会发现很难立即修改您的脚本以查看更改。(编辑:根据 PyWebIO 开发人员的回应,您可以通过启动服务器进行“热加载”开发。可以在这里找到说明:https://pywebio . readthedocs . io/en/latest/guide . html # overview)
结论
在本文中,我们回顾了新的 PyWebIO 库最常见的特性,您可以使用这些特性通过 Python 脚本创建 web 应用程序。我预计 PyWebIO 将继续增长。
然而,由于它的设计原则(例如,线性执行)和更有限的用例,我怀疑它能否吸引许多数据科学家和机器学习工程师。尽管如此,您肯定可以找到该工具的一些相关用例。
感谢阅读这篇文章。通过注册我的简讯保持联系。还不是中等会员?使用我的会员链接通过支持我的写作(对你没有额外的费用,但是你的一部分会费作为奖励被 Medium 重新分配给我)。
让分析更容易:破译数据标题
3 个重要的数据标题,它们的作用,以及如何与它们交互
卢卡斯·布拉塞克在 Unsplash 上的照片
作为一个不经常与分析团队互动的人,看到不同的数据标题可能会感到困惑。数据科学家和数据分析师有什么区别?数据工程师是做什么的?每个职位的人都有什么样的才能和技能?
无论您是与数据团队互动,为他们招聘,还是只是好奇这些数据角色做什么,这都是适合您的地方!我们将比较和对比数据工程师、数据科学家和数据分析师的工作,以及您对他们的期望。
对视频感兴趣?看看下面的短视频,类似的内容!
作者提供的视频
为了理解这些角色的作用,让我们先回顾一下分析过程。为了让分析产生最大影响,我们必须:
- 在可访问的系统中拥有可用的数据
- 将原始数据转化为分析和见解
- 以创新的方式使用数据来推动收入增长机会、改善客户体验和/或改进我们的产品
我们将讨论的三个标题中的每一个都有助于该过程中的这些关键步骤之一。数据工程师通过从后端系统提取数据并将其暴露给分析团队,使数据可访问。数据分析师使用数据提供关于过去行为和趋势的见解。数据科学家使用数据来预测未来的行为、趋势和商业机会。**
数据分析师和数据科学家之间的最大区别是,数据分析师通常是向后看,报告已经发生的事情,而数据科学家是向前看对未来事件做出预测。数据工程师通过为这两个角色提供及时、相关和准确的数据,使他们能够更好地完成工作。
数据工程师
照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
数据工程师通常有很强的技术背景,应该能够将数据从大的、非结构化的格式转换成干净的、可工作的格式,供数据团队使用。它们通过从不透明的系统中解锁数据并将其公开到数据库中以供使用,使其他数据专业人员能够完成他们的工作。
例如,如果您经营一家零售企业,您可能会将数据存储在事务系统中。数据工程师将数据从销售点(POS)系统转移到数据分析师可以引用的表中。分析师很少能直接在 POS 系统中“查询”(搜索)数据,需要从该系统到可访问数据库的转换。
优秀的数据工程师通过以下方式为数据团队的成功做出贡献:(1)有效地向其他团队公开数据;(2)了解如何优化数据格式以节省公司资金。存储数据需要成本,了解组织公司数据的最有效方式可以大规模节省成本。
除非你直接管理一个团队,否则你可能不会经常与数据工程师交流。但是,也许您有一个以前没有回答的新业务问题,您想知道该数据点是否存在于系统中的某个地方,可以提取出来进行分析。这个团队可能是回答这个问题的良好起点。
数据分析师
米利安·耶西耶在 Unsplash 上拍摄的照片
数据分析师是分析小组的骨干,帮助向业务部门提供见解。他们将数据工程团队公开的数据从原始数据转化为洞察力。例如,对于前面提到的 POS 数据,数据工程团队通常会交付一个原始的交易文件。然后,分析师寻找模式或趋势,或者使用数据来回答业务问题。
数据分析师有两个主要关注领域:(1)将数据转化为洞察力,以及(2)向业务部门报告。因此,他们通常能够胜任一种或多种数据分析工具,如 Excel、Python 和/或 R,以及 PowerPoint、Tableau 或 PowerBI 等通信工具。
您应该向数据分析师询问有关业务进展的问题—销售趋势如何?是否有某些产品组表现突出?什么是关键指标的同比比较?如何解释[指标]的[减少/增加]?
您的问题可以是有针对性的—报告单个数据点—也可以是开放式/探索性的,具体取决于具体情况。最终,数据分析师负责使用数据回答业务问题,并将其报告给业务部门。
数据科学家
被《哈佛商业评论》称为“21 世纪最性感的工作”的数据科学家职位已经成为声称从事机器学习和人工智能的公司的统称。有时候,数据科学家确实有更多的数据分析师职责,但我们将讨论数据科学家应该在公司做什么。
与向后看的数据分析师不同,数据科学家是向前看的。他们希望了解我们如何使用数据来进行预测,或者在未来推动对企业更有利的行为。数据科学家花时间了解建模和机器学习可以在哪些方面给组织带来影响,然后采取措施去做。
建模的一个常见挫折是获取可用和可靠的数据;数据科学家的大部分时间都花在寻找、清理和准备数据以输入到模型中。构建(基线)模型的实际过程已经自动化,并且随着时间的推移变得更加容易。
当与数据科学家一起工作时,你应该依靠他们来识别机器学习可以为你的组织增加价值的领域。
例如,你能从被搅动的顾客身上学到什么来预测下一个可能离开的顾客吗?你能建立一个推荐系统,在结账时向当前顾客追加销售吗?你能创建客户群并对他们进行个性化营销吗?
职位因公司而异,但总的来说,这些职位对数据团队来说是一致且重要的贡献者。每个都为组织提供了独特的价值:
- 数据工程师从系统中提取原始数据,并将它们转换成表格或文件进行分析
- 数据分析师从原始数据中获取洞察力,通常查看过去的趋势来回答业务问题
- 数据科学家使用原始数据开发模型和/或预测,以推动未来的行为或见解
您对数据团队有什么样的体验?我错过了什么,你会补充吗?
有兴趣讨论更多关于数据素养的内容吗?随时 在 LinkedIn 上和我联系 !
让分析更容易:什么是机器学习?
在(大约)5 分钟或更短时间内对复杂分析主题进行可解释的解释。
作者图片
有多少次你听说数据科学项目由于业务团队和数据团队之间缺乏沟通而失败?如果这种情况发生在你的公司,你见过多少次公司采取下一步措施来提升员工的技能?对于那些采取措施的人来说,这是一个为期一天的研讨会,有望引起共鸣(永远)吗?专注于解释分析内容的冗长课程?
许多公司想要更多的分析人才——不仅仅是数据科学家,还包括具有分析思维的产品负责人或能够解释分析并采取行动的营销经理。然而,他们并不总是(1)提供有意义的分析培训机会和(2)为非技术员工量身定制内容。
分析民主化的下一波浪潮不是更好的数据科学家,而是更多了解分析的非分析人员
根据我的经验,目前的分析培训内容主要侧重于培训数据分析师或数据科学家,而不是培训能够从工作中受益(但不仅仅是使用)分析的人。所以,我决定尝试一些新的东西,一个叫做让分析更容易的系列。数据科学&分析既艰难又令人生畏。本系列将分析主题,并将其翻译成可解释的解释,供不倾向于数字,但希望(或需要)了解分析的人使用。
因此,无论您是分析人才的招聘人员、查看仪表板的销售经理,还是试图了解分析如何影响您的业务的高管,这都适合您!
更喜欢视频?看看这个内容相似的 YouTube 视频。
作者提供的视频
什么是机器学习?
机器学习这个词可能会让人联想到机器人或科幻小说。虽然这可能需要一个数学博士来理解后端,但有一个简单的联系可以让这个话题不再神秘。**当你听到机器学习,就想想模式识别。**机器学习算法有效地获取输入(数据),找到模式,并生成输出(预测)。
作者图片
让我们举个例子——夏天的一个星期五下午,你去湖边小屋过一个放松的周末。你会注意到与冬天的星期二相比,交通特别拥挤。你可以合理地将一天中的时间(下午)、一周中的日期(星期五)和季节(夏天)与路上的汽车数量联系起来。
照片由 Iwona Castiello d’Antonio 在 Unsplash 上拍摄
如果有人说他们将“使用机器学习来预测交通”,他们本质上说的是他们将采用已知的输入(一天中的时间、一周中的日期和季节)来预测输出(路上的汽车数量)。该模型将从过去的数据中发现存在的关系或模式(例如,夏天路上有更多的汽车;星期三路上的车更少)并使用该信息对未来进行预测。
在另一个例子中,假设去年夏天你是一家冰淇淋店的经理。每天你记录总销售额。夏天快结束了,你想知道你能卖出多少产品,这样你就不会(1)在年底有太多的库存积压,( 2)因为库存不足而失去潜在的销售机会。
在销售额特别高或特别低的日子里,你回头寻找模式。你会注意到周末的销售额往往高于平日,而且天气越热,销售额越高。你还会注意到,在下雨的日子里,你的销售额会下降——这是机器学习在起作用。您正在寻找与销售相关的模式,并利用它来预测未来的销售预期。
机器学习模型将采用这些输入(温度、星期几、降雨量)来预测总销售额。它会寻找模式——就像你观察到的那样——并将其量化为输出。
机器学习是强大的,因为它可以大规模地找到这些模式,并抓住我们可能错过的趋势。我们可以识别某一天的流量或某一家店铺的趋势,但无法识别数百天或数千家店铺的趋势。此外,我们偏向于自己的假设和信念,而模型在寻找模式时更客观。
人们会(有意或无意地)让机器学习听起来像一个巨大、棘手、复杂的话题。这并不意味着你不能知道它什么时候可以被应用,或者在高层次上他们正在做什么。
如果你认为输入中存在可以告知输出的模式,机器学习可能会对你的角色有用——想想像什么时候会有流量或哪些因素会导致冰淇淋销售这样的例子。在新客户或流失客户中是否有一种模式需要研究?产品使用趋势的预测?也购买了产品的客户的追加销售机会?
机器学习并不陌生——它已经无处不在。你生活中常见的应用可能是网飞根据你过去看过的节目推荐一个节目(*识别你观看偏好中的模式)*或者 Instagram 在搜索标签上整理他们认为你会喜欢的内容(识别你互动的内容类型中的模式)。
机器学习可能看起来令人生畏,但你已经在生活中定期与它的应用进行交互,并可能已经在日常生活中创建了类似的“心理模型”(看起来好像要下雨了)→ 识别以前暴雨的模式,并将其与你当前看到的联系起来)。
机器学习很难,但理解它是什么并不是必须的。敬请关注未来的主题,或者随时留下您希望看到解释的分析概念的反馈。
对联系或了解更多感兴趣? 在 LinkedIn 上给我发个便条 !
用 IoT 和 ML 制作更好的奶酪
利用低成本物联网和机器学习解决方案优化奶酪制作流程。
一家小型奶酪厂希望改进其生产流程,专注于产品质量。关键的焦点是改善冷藏室的温度监控,以保持产品新鲜并延长保质期。
以前的质量控制系统需要一个人每四个小时去一次冷藏室,手动从数字显示器上读取温度。这对于正常工作时间的监控很有效,但是对于晚上和周末就不行了。当然,假设四小时内没有任何差错。由于工厂位于农村地区,电力中断经常发生,因此安装了备用发电机。然而,发生了发电机无法启动的情况,这导致了周末的一些产品损失。
第一阶段侧重于改进监控,这将简要讨论,第二阶段侧重于实现机器学习,这将在本文中详细讨论。
阶段 1:改进监测
该项目的第一步是实施物联网(IoT)解决方案,以提供对冷藏室制冷系统的实时监控。虽然有一些商业物联网解决方案可用,但考虑到传感器、基础设施和云托管费用,成本往往会迅速增加,尤其是对小型工厂而言。
更具成本效益的解决方案是定制的物联网设备,利用 ESP32 微控制器和一些现成的传感器。一个简单的基于 web 的应用程序被创建并托管在本地 PC 上。
该系统测量冷藏室内部的温度、制冷机组的功耗和外部环境温度。现在,实时温度每 30 到 60 秒自动捕获一次,而不是手动进行现场测量,这提供了更一致的监控和对系统运行的更多洞察。
如果温度超过上限或下限达 30 分钟,就会发出警报,但是,似乎每隔几个小时就会发出警报,无需人工干预即可恢复正常。
正常高低限物联网监控系统趋势。作者图片。
阶段 2:使用数据获得更好的洞察力
物联网解决方案的实施提供了改进的监控和大量的实时数据,这是以前所没有的。该项目的下一阶段是实施更高级的分析,即使用生成的数据,以更好地了解过程和系统操作。
三个关键业务需求
1.怎样才能更好的实现制冷温度监控?我们需要了解常规的有害警报以及在控制范围内会发生什么。
2.制冷系统目前的能源性能如何?首先,我们能否利用现有数据建立一个良好的能源模型,我们能否确定潜在的能源节约?
3.需要做些什么来实施已确定的变更,这样做是否具有成本效益?
计划评估方法
- 数据准备:建立数据摄取管道,包括数据质量处理。这也将允许在未来添加额外的数据。
- 探索性数据分析(EDA) :探索新数据,识别特征,识别潜在的新特性。
- **开发和测试 ML 模型:**根据业务需求,开发合适的模型并测试性能。
- **总结成果:**讨论项目这一部分的发现和后续步骤。
数据和 python 笔记本可以在 GitHub :-)上获得
数据准备
传感器描述和数据
各种传感器的描述位于sensors _ sensor _ 202107282041 . CSV中。它包括:
- sensor_id 与日常数据文件相匹配;
- sensor _ typesensor _ uom(计量单位);
- sensor_ucl 和 sensor_lcl 是用于报警的控制上限和下限;和
- sensor_uucl 和 sensor_llcl 是用于报警的控制上限和下限。
添加了 sensor_short_name 的数据框细节,便于参考。图片作者。
感兴趣的传感器是冷藏室温度、冷藏室功耗和外部环境温度。有两个冷藏室:一个用于在制品(WIP ),一个用于配送(DP)。
物联网系统在 2021 年 3 月底实施,提供了大约五个月的高频数据。每日数据文件以压缩的 CSV 文件形式接收,由系统创建用于备份目的。该文件包含三列:
- 时间戳 :获取传感器读数的日期和时间
- 值 :传感器描述文件中的原始传感器读数,单位为测量单位;和
- sensor_id_id :与传感器描述文件匹配的传感器的整数 id。
查看原始数据的统计数据,我们可以看到当前读数(32 和 36)有大约 5000 个额外的数据点,这表明一些数据点缺失。还可以看出,温度读数(29、30 和 31)的最小值为-127,这是可疑的,并且还会影响平均值和标准偏差,这取决于该值有多少数据点。
原始数据的基本统计(第一遍)。作者图片。
数据处理
开发了一个数据管道来读取单个压缩的 CSV 数据文件,将其合并到一个数据帧中,并执行一些清理。根据实时监控系统,以下标准用于过滤质量差的数据:
- 值-99 被分配给任何质量差或不可用的传感器值;
- 值-127 表示一些温度传感器的数据质量差;和
- 值-327 和 327 表示质量差的数据处于设备范围的极限。
在此应用中,温度通常略高于零摄氏度,因此-99 或-127 的值不在正常范围内。没有等于-99 的数据点,也没有处于极限的数据点,但是有 155 个数据点等于-127。移除这些之后,统计数据看起来更符合流程。
在移除质量差的数据之后,温度标准偏差和最小外观的统计数据与过程一致。作者图片。
温度数据在五分钟的时间段内被平均,以减少来自原始测量的噪声,因为系统是缓慢动作的,至少对于温度是如此。正常开关周期数据的变化略有减少,但除霜尖峰仍然突出。
对于能量分析,电流测量值(功率测量值)被转换为能量测量值,因为电流变化很快,可以在噪声电流趋势中观察到。我们还对能耗感兴趣,而不是瞬时值。在三相系统中,现场电压为 400 伏。假设平均功率因数为 0.85。该分析的温度数据是一个小时内的平均值。
这些步骤在data-ETL . ipynb中有所概述。
探索性数据分析
外部温度呈正态分布,有道理。WIP 温度看起来像预期的那样具有特定的设定点,然而,DP 温度似乎具有两个不同的设定点。在能量上,我们可以看到设备关闭的时间段(峰值在第一个框中)。
每个传感器的数据分布。图片作者。
在分析时间序列趋势(温度和能量)时,似乎有一些能量峰值与工作日的每日温度相匹配,但在周末没有太大变化。包含星期几可能是一个很好的特性。周六和周日的能源消耗不同于一周中的其他日子,因为周末的工作最少。在这一周中,不断有人进出冷藏室,并添加新产品。
WIP 冷藏室每周一天的能耗与外部温度。周末观察到的明显差异。作者图片。
观察调度冷藏室的设定点差异,我们可以将冷藏室温度分为 3.5°C,以比较高设定点(4°C)和低设定点(2°C)的能耗差异。平均差额为 3 538 千瓦时/年,约为 18%。这意味着如果它在较高的设定点运行,可能会节省 18%,假设它不会影响产品质量。然而,随着时间的推移,我们需要考虑可能产生重大影响的相关变量。
比较低(2°C)和高(4°C)设定点之间能耗分布的箱线图。作者图片。
这些步骤在EDA . ipynb中有所概述。
使用异常检测进行冷房温度监控
更一致的监控中的一个见解是每 6 小时发生的显著的自动除霜循环。这是大多数有害警报的原因。这不是常识,也很少引起对之前人工读数的关注,除非读数是在这段时间内获得的。实时监控使这一点变得可见,但有害警报无助于新系统的采用。
六小时制冷循环,显示了一个清晰的模式和除霜循环接近尾声。图片作者。
解决恼人警报的一个解决方案是使用自动编码器、卷积神经网络。有一个使用 Keras 库进行时间序列异常检测的很好的例子,它使用了来自 pavithrasv 的自动编码器,该编码器被用于本分析。它基本上接受输入数据并对其进行编码(压缩),减少特征,然后开始解码特征以重建原始数据,同时将误差降至最低。因此,确保输入数据的高质量和正常对于手头的流程非常重要。
我们有六小时一个周期的温度趋势,在正常情况下是可以预测的。在检查了时间序列趋势后,确定了一个好的时间段作为自动编码器的训练数据(在 2021–05–07 16:30 和 2021–05–11 4:20 之间)。这种方法的困难在于处理未标记的数据和直观地找到好的周期。研究了一个典型的循环,以确定创建训练序列所需的时间步长。典型的时间步长约为 74,即 6 小时 15 分钟。
指标
在定义 Keras 模型时,选择均方误差(MSE)作为损失函数,以惩罚较大误差的益处,这对于该应用至关重要。对于其他参数,使用默认值。
模型评估和选择
经过训练后,我们看到该模型与训练和验证数据集都非常吻合。通过绘制 MSE,在训练损失最大值为 0.13 时计算重建阈值。当参数调整过多时会遇到一些困难,导致模型中的大量损失。
派遣冷房温度的培训与验证损失。图片作者。
确定重建误差阈值的训练损失函数的分布。图片作者。
从模型中检查和重建单个序列,并计算误差以验证模型的拟合。使用训练序列之一,我们观察到良好的拟合和最小的误差。使用一些检测到的异常序列,可以清楚地看到大误差区域。
无异常的重建趋势示例(测试数据)。图片作者。
带有异常的重构趋势示例。图片作者。
结果
将此应用于所有可用的数据,有一些我们期望捕捉的明显异常,但也有一些其他可能或可能不重要的异常。重要的是,一些设定值的变化也被确定为异常,这可能意味着过程没有正常运行。使用提供的示例,这是一个很好的第一步。
突出异常的长期趋势。有些异常是意料之中的,比如更高的峰值,而有些则在正常的控制范围内,但可能会有影响产品质量或设备寿命的重大变化。作者图片。
调整损失函数阈值会影响模型检测异常的灵敏度。如果阈值太高,我们可能会错过设定点温度偏移两度的时间段,这可能意味着使用额外的能量或减少产品的保质期。
这是一个复杂的方法,用一些基础知识和世界类库就可以实现。它可以减少我们的应用程序的有害警报,并且应该与其他方法结合使用,以实现更健壮的实现。
这些步骤在 异常-检测-dp.ipynb 中有所概述。 对 WIP 冷室做了类似的分析( 异常-检测-wip.ipynb )。
估计制冷系统的能量性能
到目前为止,人们关注的焦点一直是冷藏室的温度监测。为了建立一个衡量能源绩效的模型,需要衡量相关的变量。物联网系统测量外部环境温度以及制冷设备消耗的电流。从能源的角度来看,冷室温是一个设定点,而不是一个相关变量。然而,这将影响能耗,因为在不同时期,调度冷室似乎有两个不同的设定点。
从质量的角度来看,要求将房间保持在 4℃左右,因此任何更冷的温度都意味着在这种特定的气候下需要更多的能量来降温。因此,我们的能量模型可以估计两个设定点之间的能量差,并估计潜在的能量节省。
定义模型
使用将能耗与环境温度和设定点温度相关联的回归分析,开发了一个简单的能量模型。使用每日数据是因为数据在较小的时间间隔内可能会有噪声,尤其是具有有限特征的数据。与 EDA 阶段相同的温度分割用于数据集,即 3.5°C。对于该模型,使用每日数据,将 4°C 设定点用作基线,将 2°C 设定点用作我们的报告期。基准期和报告期的可用数据点分别为 53 个和 61 个,因此非常平衡。
EDA 还显示了能量消耗和外部温度之间的相关性。我们用基线期的散点图证实了这一点,并且在右上角观察到四个明显的异常值,以及与 lowess 线的轻微非线性。异常值已从分析中剔除。
调度冷藏室能耗与外部温度的关系,添加等高线图,并用红色表示一条 lowess 线。作者图片。
指标
均方根误差(RMSE)优于平均绝对误差(MAE ),因为它对大误差不利。与预测能量的小偏差并不重要,但一个大值会影响累积能量性能。另一个指标是调整后的 R 平方,因为我们有一个以上的功能,它提供了一个比 R 平方更鲁棒的指标,R 平方通过添加功能来提高。该指标的实际应用是解释能耗的可变性,并在我们可能遗漏某些功能时给出提示。
模型评估和选择
特征(外部温度和设定点温度)已标准化,25%的数据集用于测试。作为基本参考,拟合了 OLS 回归模型,剔除了异常值,只有轻微的非线性。该模型在测试集上产生了 3.83 的 RMSE 和 0.5356 的调整 R 平方,这解释了约 53%的可变性。这可能表明一些缺失的相关变量或过程控制问题。
为了看看是否可以用更健壮的算法来改进模型,我选择使用增强回归树,即 XGBoost,因为它对特征的非正态性不敏感,更容易解释和准确。我包括 3 个交叉验证,因为它是一个小数据集,使用每日数据和网格搜索进行超参数调整。为了找到最佳参数,选择了相当宽的范围,但在选择时要小心,以确保模型不复杂且可能过度拟合,例如 max_depth 不应太深。为了减少过度拟合的可能性,我还指定了 colsample_bytree 和子采样参数,以便它在每一步使用稍微不同的数据。
该模型得出的 RMSE 为 3.49 和调整后的 R 平方为 0.6147 ,比 OLS 回归模型高出约 8%。最佳参数是在最大深度为 5,采样参数都为 0.3,这意味着没有过度拟合的可接受模型。看看测试数据的回归图,残差看起来是随机分布的,只有一个点在 Q-Q 图中突出。
使用 XGBoost 模型的测试数据的回归图。用 Python 模拟 R 图——数据之旅&音乐(emredjan.xyz) 。图片作者。
结果
现在,我们可以在报告期数据上使用优化的 XGBoost 模型来预测在较高设定值下消耗的能源。预测能量消耗和实际能量消耗之差的累积和将给出在此期间消耗的额外能量。在此期间,额外的能源消耗为 419 千瓦时,对其进行调整以代表年度数字,预计额外的能源消耗为 2 507 千瓦时/年,即高出约 11%。
显示使用 2°C 设定点的额外能耗的累积能源性能。平线期是使用基线数据最多的时期,即设定点为 4℃。作者提供的图像。
因此,基于更保守的能源模型,该工厂可能在一年内节省 2 507 千瓦时(约 11%)。这大约是在 EDA 阶段完成的平均盒图分析的 70%。这是一个很好的节约,特别是在电力中断时使用柴油发电机,这会增加企业成本和碳排放。
需要注意的几个关键问题是,有些数据是不可用的,如关于生产量的数据,以及门打开和关闭的次数(潜在的附加功能)。另一个原因是能源消耗受环境温度的影响,我们只查看了几个月的数据,因此不能代表所有季节。
这些步骤在energy-model . ipynb中有所概述。
业务成果和考虑因素
一个关键的发现是突出的自动除霜循环。了解了这一点后,维护经理想知道为什么另一家工厂的一个拥有相同系统的冷藏室没有任何除霜循环。事实证明,这个系统没有正常运行,这也解释了为什么它需要更频繁的维护和消耗更多的能源。这种情况已经得到纠正,降低了他们组织中另一家工厂的成本。
根据能源分析,我们确定 2°C 和 4°C 的设定点之间存在能耗差异。降低约 11%的能耗可以在更大范围内产生巨大影响,尤其是考虑到更多自持能源系统,如太阳能和电池。它可能对这种系统的资本成本以及电池容量有影响。
相比之下,冷藏室的工作温度较低可能会有好处。可能会消耗稍微多一点的能量,但这可能会延长产品的保质期。考虑到产品中的固有能量,这可能意味着减少食物浪费和节约能源。
结论
该项目专注于利用新的实时数据从低成本、定制的物联网解决方案中提取价值。使用简单的机器学习技术进行异常检测,可以让人员专注于实际的警报,并避免讨厌的警报。通过持续测量能源性能,可以实现能源和成本节约。
简单机器学习模型的应用意味着,可以开发一种低成本、非计算密集型的分析解决方案,该解决方案易于理解、实施和维护,同时提供 80%的商业价值。
改进的机会
项目这一阶段的下一步是构建机器学习管道并将其集成到主要的物联网解决方案中,并提供一个接口来重新训练和部署测试模型。
后者不仅对模型维护很重要,而且因为可用数据有限,使用更大、更有代表性的数据集会有好处。
对于异常检测,自动编码器应与控制限值以及统计过程控制原则相结合,以提供更强大的报警功能。
对于能源模型,还应该收集额外的数据,以添加更多的功能和增加每日数据点。这种分析的困难在于我们可用的每日数据点有限,这可能意味着该模型在操作中不能很好地概括。
笔记本和资料可在GitHub*😃*上获得
参考
- 使用自动编码器的时间序列异常检测
- 在 Keras 中构建自动编码器
- MAE、MSE、RMSE、决定系数、调整后的 R 平方——哪个指标更好?
- XGBoost中超参数调谐
- 在 Python 中模拟 R 图
使用机器学习使 dashcam 视频符合 GDPR 标准
我的旅程从建立一个最小可行的产品一直到从零开始训练一个检测器,不需要标记一个图像
示例性 dashcam 镜头
自从我的车有了 dashcam,数据保护法就成了我的一个话题——在许多国家,分享我自己车上的原始视频是非法的,因为它们包括可识别的特征,即车牌和人脸。
对专注于交通分析和驾驶教育的德国 Youtube 频道的快速研究显示,许多人在分享视频前手动编辑这些视频,其他人使用付费服务,根本不审查可识别数据,或者只私下分享视频。这足以引起我的兴趣:在不投入太多时间和金钱的情况下,审查可识别信息的任务能自动化到什么程度?它完全符合我最近关于机器学习的研究,我正在寻找一个小项目,以获得一些不同方法的实际经验。这篇文章并没有过多关注技术细节,关于机器学习主题的优秀博客已经存在。相反,我想谈谈我是如何完成这个看似简单的任务的,我的动机是什么,以及遇到了哪些障碍。
结构很简单,我从一个最小可行的原型开始,添加一些改进来克服 MVP 的缺点,然后为了主要组件的完整重建而废弃它。
首先,我要考虑多个重要的方面。目标是一个简单的应用程序,它将 dashcam 视频作为输入,并输出一个新的视频,其中人脸和车牌是模糊的。可用性也很重要,因为这样的工具可以让很多人受益——他们中的很多人不喜欢使用命令行界面或者自己编译任何东西。直觉上,这可以分解为
- 将视频分割成帧
- 检测每个框架上的板和面
- 模糊这些区域
- 将处理后的帧编码成结果视频。
Python 和 opencv 使第 1、3 和 4 步变得非常简单——唯一缺少的部分是检测可识别信息的可靠算法。选项是有限的:
- 自己应用机器学习技术
- 使用传统的图像处理技术
- 利用现有的机器学习项目
第一个选择是最有趣的,尤其是因为我可以运用我新学到的技能。然而,缺乏一个带标签的数据集(甚至是一个数据集),无法获得巨大的计算能力,以及导致 GPU 价格飙升的长期芯片短缺,让这个想法很快停止,并迫使我评估其他选择。使用纯传统的图像处理技术失败了,因为需要检测的对象种类繁多,以及错过检测的严厉惩罚(最终迫使我的程序的用户手动编辑视频)。
考虑到这一点,我研究了当前车牌检测(LPD)的情况,不要与车牌识别(LPR)混淆,后者也试图读取实际的车牌字符。很快,我找到了 understand-ai 的 Anonymizer ,这是一个开源 repo,可以自动审查图像中的可识别信息。太好了!
将匿名器集成到一个简单的 Python GUI 中(大喊到 Qt !)是一个相当简单的任务,并导致了我的工具 DashcamClearner 的工作原型,我在 Github 上发布了它。这感觉非常令人满意,最终的视频显示了良好的准确性,并提供了一个工作原型;这很快就让我保持了很高的动力。
MVP 的 Qt-GUI
经过进一步检查,开始出现一些裂缝:
- 在一些画面中,明显没有检测到车牌
- 由于依赖 Python 3.6 和几个严重过时的库,运输/安装非常麻烦
- 性能。在 GTX 1060 上大约每秒 1.2 帧,一个 1 分钟的剪辑可能需要将近半个小时来处理!更糟糕的是,最终的工具应该能够在广泛的硬件上运行,可能没有 Nvidia GPUs(或 Tensorflow 1.x with CUDA 所必需的令人难以置信的复杂设置),进一步降低了已经缺乏的性能。
尽管被托管在 Github 上开源,Anonymizer 的内部工作本质上是一个黑盒——其网络的权重在第一次运行时被下载,确切的结构是未知的。这给我带来了一个问题:我根本无法提高性能,而且提高准确性也只能在匿名器的范围之外。
起初,我试图在不放弃主要思想的情况下,利用匿名器来扩展程序的可能性。为此,我引入了几个后处理选项:
- 使用 opencv 来模糊感兴趣的区域,而不是 Anonymizer 的默认算法来提高性能
- 模糊前帧中的感兴趣区域,在大多数静态视频中,如果漏检只出现在几帧中,这将隐藏漏检
- 扩展模糊区域以改善仅部分检测到车牌或人脸的情况
这些小的添加已经使结果看起来更好了,代价是必须处理更多的参数。但是主要的问题,缓慢的性能,仍然存在,过时的依赖仍然是一个噩梦,缺乏对工具核心部分的控制困扰着我。
也就是说,我不得不重新评估我早期的选择——在这个项目中断了很长时间之后。我又用传统的图像处理算法碰了碰运气,但无济于事。无论我如何结合阈值、梯度、轮廓检测和一般过滤,可靠的检测似乎大大超过可用的工具。作为下一个尝试,我使用了级联分类器。但类似的问题困扰着这种方法,太多的漏检和低于标准的性能。
我仍然没有数据集,我不愿意标记从互联网上搜集的成百上千的图像,我也没有足够的计算能力从头开始训练任何合理规模的网络。早期 MVP 的主体与使用 Anonymizer 完全无关,切换到另一种检测算法就像重载实现检测的函数一样简单,detect _ identificate _ information(image)。
以下来自 Github 的片段显示了该工具主体的当前状态,以及它在视频中循环、检测可识别信息、模糊信息和写回视频的不同阶段。
def run(self):
*"""
Write a GDRP compliant copy of the input video
"""* # gather inputs from self.parameters
print("Worker started")
input_path = self.parameters["input_path"]
output_path = self.parameters["output_path"]
threshold = self.parameters["threshold"]
# customize detector
self.detector.conf = threshold
# open video file
cap = cv2.VideoCapture(input_path)
# get the height and width of each frame
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
# save the video to a file
fourcc = cv2.VideoWriter_fourcc(*'H264')
writer = cv2.VideoWriter(
output_path,
fourcc,
fps,
(width, height)
)
# update GUI's progress bar on its maximum frames
self.setMaximum.emit(length)
if cap.isOpened() == False:
print('error file not found')
return
# loop through video
current_frame = 0
while cap.isOpened():
ret, frame = cap.read()
if ret == True:
new_detections = self.detect_identifiable_information(
frame
)
frame = self.apply_blur(frame, new_detections)
writer.write(frame)
else:
break
current_frame += 1
self.updateProgress.emit(current_frame)
self.detections = []
cap.release()
writer.release()
在我寻求克服 MVP 状态的问题时,我通读了几篇文章,无意中发现了最初的 YOLO 论文,一个具有非常令人印象深刻的性能的单发探测器。经过多次迭代,维护人员的变更和关于名称的争议, YOLOv5 为我提供了一个非常容易使用的检测器,它具有针对许多类的预训练权重,我决定用它进行一些实验。从 COCO 基准测试中检测物体的性能看起来非常惊人,所以我决定训练 YOLOv5 只检测车牌和人脸。唯一的问题是缺少我迫切需要的标记数据。这就引出了本文的主要工作——与其尝试在网上查找数据集或花几天甚至几周的时间进行标注,为什么不自动创建我自己的数据集呢?
为了得出有标签的数据,我所要做的就是开车。想出一个方法来标记我自己的数据。但是有了早期的匿名器原型,标记可以工作,尽管速度很慢。
YOLO 是一个杰出的探测器,我所要关注的是拥有大量可靠的数据。结果现在是 DashcamCleaner 的 repo 的一部分,这是一个小脚本,允许您以正确的格式为 YOLO 创建带标签的数据。它的工作原理如下:
- 遍历所有给定的输入视频文件和图像
- 将输入分成训练集和验证集
- 抓取每个视频的每第 n 帧(抓取所有帧会导致许多帧看起来几乎相同,所以这个选项非常重要——尤其是如果你像我一样有许多原始素材。我选了 n=20)
- 将抓取的帧和图像保存到各自的输出文件夹中
- 运行 Anomyzer 来检测人脸和车牌
- 将所有标签导出到一个熊猫数据框架中
- 以 YOLO 的格式保存标签,对熊猫的礼貌和它对数据帧的简单管理
这个脚本的用法很简单:
>> python generate_training_data.pyusage: generate_training_data.py [-h] input output labelformat skipframes trainsplitpositional arguments:
input input folder containing video and jpg files
output output folder for labeled training images
labelformat label format - yolo, voc or torch
skipframes for each analyzed image, skip n frames in videos
trainsplit training split of all data
选择 YOLO 时,输出的结构如下图所示。训练数据被分成两个顶级文件夹,即图像和标签,每个文件夹又被分成训练集和验证集。
生成的文件夹结构
总之:一旦这个公认缓慢的过程结束,近 400 分钟的记录产生了超过 35k 的 YOLO 正确格式的标记图片,具有非常好但不完美的准确性。太好了!
培训 YOLOv5 非常简单——官方报告非常好地描述了这个过程。由于对性能的关注,也由于减少到只有两类(脸,车牌),选择了更小的 yolov5s 配置。在个人电脑上进行培训对我来说很重要,因为从 GDPR 的角度来看,将我的数据集上传到像 colab 这样的网站上是有问题的。为了验证训练数据实际上被正确标记(即检查 Anonymizer 和我对 YOLO 标记符号的转换是否工作良好),在开始训练之前,我使用 Yolo Mark PWA 测试了一些随机样本。
之后,进行了只有 500 幅图像和 5 个时期的短验证训练,以确保训练有效。即使在非常有限的数据上进行如此短暂的训练,YOLO 也已经能够很好地进行归纳,并在非常不同的图像中检测出车牌和人脸!我的训练数据文件夹位于驱动器 F:的根目录下,训练命令如下所示:
python train.py --img 1920 --batch 2 --weights yolov5s.pt --workers 2 --epochs 30 --data F:/training_data/dataset.yaml
这里有一些事情需要解释:乍一看,这些参数似乎非常不理想,导致训练非常缓慢。这是有原因的:对我的标签的分析表明,我的许多目标,尤其是车牌,非常非常小(仪表板摄像头使用令人难以置信的广角镜头!),因此以全分辨率进行训练可以确保最高的精度。小批量和工人数量是由于我的 GTX 1060 老化,无法可靠地将更多数据存储到其 VRAM 中。Google Colab 可以解决这个问题(根据我的测试,一个 Pro 帐户给你一个 16G VRAM 和 4 核 Haswell Xeon CPU 的 P100),但由于 GDPR 的原因(以及 Colab 的 ToS 不鼓励像这样的非交互式、计算昂贵的任务),我必须依赖自己的硬件。
当然,这些数据并不完美。Anonymizer 遗漏了一些检测(虽然可以很容易地用手修复),但更重要的是,所有数据都来自单个摄像头。但是,使用本文中描述的工具,只需增加数据集生成的输入,从而引入更多样化的训练数据,就可以很容易地解决这个问题。数据集生成脚本将图像和视频作为输入,并将它们分成训练集和验证集,因此组合不同的来源也不成问题。
集成到我现有的工具中也相当简单,因为 YOLOv5 可以与 Pytorch Hub 一起使用。给定定制训练模型的权重路径,在代码中初始化检测器是一行代码:
model = torch.hub.load('ultralytics/yolov5', 'custom', weights_path)
剩下的就是通过将检测到的坐标输入到我的 Box 类中来稍微修改模型输出结果的方式。这允许该工具保持后处理的改进,如帧存储或 ROI 放大。结果令人印象深刻:速度比 Anonymizer 提高了 10 倍,同时检测更加可靠!应用于更一般的图像,结果显示了训练集的不平衡:人脸检测不像车牌检测那样健壮。这就是生成我自己的训练数据的能力派上用场的地方:喂养任何(无标签!)数据集中的人脸插入到generate _ training _ data . py中应该会产生更可靠的人脸检测。
就我个人而言,我对我的这个小项目的结果非常满意。创建一个易于使用的开源应用程序来审查视频中的可识别数据的目标已经完全实现,在这个过程中,我学到了许多关于不同神经网络架构的知识。主要成就是从一个工作良好但速度缓慢的黑盒检测器和没有标记的训练数据过渡到一个没有任何手动标记工作的更快的解决方案。
本文使用的所有相关代码,特别是从无标签的 dashcam 视频生成训练数据的脚本和最终的 GUI 项目,都可以在 Github 上获得。我还没有完成,但是当我已经达到了项目工作的点时,我想直接分享这个里程碑。未来的工作包括
- 一旦“真正的”训练完成,就更新权重
- 将工具打包为独立的可执行文件
- 用更平衡、更高质量的数据重新训练 YOLOv5
如果您有任何问题、更正或改进的想法,请随时评论或联系我!或者下载代码或者为您自己的项目克隆代码这里。
利用数据科学制定决策
一个简单的例子,说明如何使用为化学物理学开发的算法来优化商业决策。
通过将现实世界中的商业决策转化为最小化的功能,我们可以将数据科学应用到它将产生最大影响的地方。只是要小心当地的最小值!来自 Pixabay 的 Susanne stck Li 的图片。
随着数据科学中几乎每天都有新算法和技术出现,人们很容易忽略企业投资分析的最初原因。
任何业务的潜在驱动因素都很简单;基本上,这些目标是:
- 降低成本
- 增加收入
- 降低风险
然而,令人惊讶的是,数据科学项目常常远离这些业务驱动因素。通常情况下,工作的重点是哪里有数据可用,或者哪里有测试最新工具和算法的空间,而不是可以为组织提供最大价值的领域。
在本文中,我们将通过一个成功的例子来回顾基础知识,说明我们如何将数据科学应用于现实世界的业务决策,从而为底线带来切实的影响。
我们将“窃取”最初为预测原子分子结构而开发的盆地跳跃优化算法,并通过改进采购决策来降低成本。
优化供应链
在我们的示例中,您为 Initech 工作,这是一家专门在全球分销小部件的公司。
它从三个首选供应商那里采购这些部件。每个供应商按照相同的规格生产,并提供两种价格:
- 每个部件的单一单价,以及
- 如果是批量购买,可以享受折扣价;这节省了制造和物流成本。
批次大小和可用折扣因供应商而异,如下所示:
三家供应商的价格结构摘要。作者图片
例如,如果 Initech 从供应商 1 ( widgets to you Inc. )订购了 250 件 Widgets,这将由两批(200 件)以 10%的折扣率组成,其余 50 件以单一单价订购。
Initech 每天需要这些供应商提供各种不同的订单规模。这位首席执行官确信,这些订单的下单方式可以改进,最近他花了一大笔钱聘请顾问,这些顾问制作了一个大型幻灯片,详细介绍了他们在这个问题上与她意见一致的情况。不幸的是,无论是首席执行官还是顾问都没有能够提供一个更好的解决方案。
因此,请你来看看你能否解决以下问题:
对于给定的最小订单规模,我们如何通过向三家供应商订购来找到最低的可能成本?
当前流程
为了了解 Initech 目前是如何订购小部件的,您与采购经理进行了交谈。他们解释说,当收到订单时,他们将采用最适合每个供应商订单的“批量”价格。他们向您展示了一个今天最低订购量为 500 件的示例:
- 他们购买符合订单数量的最佳价值批次(这是供应商 2 对 260 件的 35%折扣)。
- 他们一次又一次地重复这个过程。
- 一旦剩余数量低于所有批量,他们将向提供最佳单价的供应商(供应商 3)订购。
对于 500 的订单,这导致:
- 来自供应商 2 的一批(260 件),
- 供应商 1 的两个批次(200 件),
- 供应商 3 的 40 个单位,单位成本。
这是一辆总造价 4149。你向经理解释说,你将尝试使用优化技术来改进这一点,并且你认为流域跳跃算法可以提供一种有效的方法来降低每份订单的成本……他们嘲笑你。
“这种购买流程已经通过几代小部件采购经理传承下来,没有办法再改进了!”
建模问题
为了优化 Initech 的供应链决策,我们首先需要能够对问题进行建模。这在 Python 中非常简单,在下面的代码中,我们提供了每个供应商的详细信息,并创建了一个函数,在给定每个供应商的订单值的情况下计算总成本:
使用 Python 创建业务问题的基本模型
我们创建的函数为我们提供了我们想要最小化的东西,因为它与订单的总成本相关。下一步将应用盆地跳跃优化算法,但首先让我们了解更多关于算法如何工作。
跳盆?
流域跳跃算法是 1997 年开发的,用于化学物理领域[1]。它在问题空间中“跳跃”,探索不同的“盆地”,然后找到这些盆地的最小点。
如果这没有很大的意义,下面的图表可能有助于想象这在实践中是如何工作的。
流域跳跃算法如何跨越局部最小值点(a 和 b)以找到包含全局最小值(点 c)的流域的图示。作者图片
大量的问题可以有‘局部极小值’。这些解决方案与周围环境相比看起来是最佳的,但并不代表整个问题空间的最佳解决方案。
上图中的 a 点和 b 点代表局部最小值,c 点是可能的最佳解(全局最小值)。
盆地跳跃算法能够通过在问题空间中“跳跃”来避开这种局部最小值。在它到达的每一个区域,它会局部搜索最优(最小)点。
这一特性使它成为一种适用于大量问题的健壮的通用优化算法。
实现盆地跳跃
为了将盆地跳跃应用到我们的问题中,我们可以利用 Python 中的 SciPy 库。这需要输入一些参数,如下所述:
- 待优化的功能。这需要有一个单一的数字输出,我们正试图最小化(这是我们上面创建的“func”函数)。
- 对该函数输入值的第一次“猜测”。这在某些情况下可能很重要,但是在这个例子中,这似乎没有什么不同。因此,我们只是为每个供应商输入了一些任意的数量:每个供应商 200 个订单[200,200,200]。
- niter’代表算法的迭代次数,更多的迭代可能会找到更好的结果,代价是需要更多的时间来完成。
- 步长设置算法中每个“跳”的最大值。设置这个值需要一点反复试验,因为它将取决于手头的问题。在本例中,值为 500 就可以了。
然后我们有最小化器关键字参数,这些用于将值传递给最小化器函数,盆地跳跃算法位于该函数之上。这些描述如下:
- 方法:标识要实现的具体算法。在我们的例子中,这是 SLSQP ,因为它允许我们输入问题的界限和约束(见下文)。
- **界限:**这些界限定义了算法中每个项目的上限和下限(在我们的例子中,是每个供应商)。因此,我们利用这一点来确保订单高于零。
- **约束:**这些类似于界限,但允许我们在整个问题中设置阈值。因此,我们利用这一点来确保所有供应商的订单都不会低于最低订单金额。
将所有这些放在一起,我们得到以下结果:
这将返回以下内容:
这里进行了很多工作,但两个最重要的输出是lowest _ optimization _ result,它详细说明了我们提供给算法的函数的最低输出(在这种情况下,它是最小订单数所能找到的最低成本)和输出 x ,它详细说明了获得最佳结果所需的输入。
舍入后,我们因此得到:
- 供应商 1 没有订单
- 供应商 2 的 520 份订单(两批)
- 没有供应商 3 的订单
有些不对劲
您对这个结果感到非常兴奋,并回到采购经理那里向他们介绍这个结果。
但是,他们并不以为然:“你的‘超级智能’算法已经超序了!我们只需要 500 个小部件,但它想让我们订购 520 个。”
他们是对的。你后悔在和他们交谈之前没有看到这一点。然后,您意识到算法的任务是寻找满足最小数量的最低成本订单。
你检查成本;采购经理的流程将导致订单金额为 4,149,,但是使用流域跳跃算法的总成本为 3,723 ,订单成本减少了 10% 。
采购经理很惊讶:“啊,我一直被困在当地的最低价格!我从未考虑过订购更多的产品可能会降低整体成本,而且我们还可以利用额外的 20 个部件!”
你回去告诉首席执行官,通过几行代码,你已经将 Initech 的销售成本降低了 10%。她欣喜若狂,问你还可以利用数据科学改善哪些业务领域。“所有的,”你回答。
摘要
在本文中,我们看到了实施数据科学技术如何对公司的底线产生巨大而切实的影响。
工作示例提供了一个输出,作为企业可以采取行动的决策。我们基本上已经能够创建一个优化问题,将商业决策直接映射到结果。
最后,通过能够在问题空间“跳跃”,我们的算法已经能够提出一个真正新颖的解决方案,一个很容易被人类决策者忽略的解决方案。
进一步阅读
参考
[1]David J. Wales 和 Jonathan P. K.Doye,通过盆地跳跃的全局优化和包含多达 110 个原子的 Lennard-Jones 团簇的最低能量结构(1997)https://pubs.acs.org/doi/10.1021/jp970984n
让 FastRP 图嵌入为您服务
实践教程
如何针对您的具体问题调整 FastRP 的超参数
介绍
图无处不在!单个数据点可以通过多种方式连接到其他数据点。通过使用这些连接的数据,通常以图形结构表示,我们可以制作机器学习模型,这些模型有可能比仅从柱状数据中创建模型更准确。但是为了将图形数据整合到机器学习模型中,我们必须首先找到一种将其矢量化的方法。
我已经写过关于如何开始使用图嵌入并展示了一种可视化它们的方法。我的朋友 Tomaz Bratanic 和我写了一些关于两种最常见的图形嵌入技术的内部工作原理的博客文章(这两种技术都可以在 GDS 的 Neo4j 图形数据科学图书馆找到): FastRP 和 node2vec 。Tomaz 也写了一些关于使用 FastRP 进行节点分类和链接预测的文章。
然而,就像在 ML 模型中可能使用的任何向量嵌入一样,为了从模型中获得最佳结果,必须对所有讨厌的超参数进行调整。在这篇文章中,我将通过一个例子演示如何使用 Optuna 针对给定的节点分类问题调整 FastRP 超参数。
使用这些嵌入,我们将比较基于单词嵌入的多类分类的传统 ML 方法和基于图嵌入的方法。
因此,在这篇文章中,我们将做以下事情:
- 构建图:将 CORA 数据集(通过 Apache 2.0 许可提供)导入 Neo4j 沙盒实例
- 设置问题:为传统方法和基于图形的方法创建 ML 模型
- 优化 FastRP 超参数:探索使用 Optuna 我们可以将基于图形的模型做得多好
- 讨论和最终想法
最后,我希望你能看到,不仅严格地从图嵌入中创建一个 ML 模型是可能的,而且有时你实际上能得到比传统 ML 模型更好的结果,甚至使用比传统方法维数更少的向量!
本帖附带的 Google Colab 笔记本可以在这里https://dev.neo4j.com/classic_vs_graph_ml找到。
构建图表
为了让自己开始运行,您需要创建一个免费的 Neo4j 沙盒数据库。在这个练习中,你需要选择一个空白的沙盒。
您应该会看到如下所示的屏幕:
创建空白沙盒(作者图片)
您应该特别注意 Bolt URL 和密码,因为它们是从 Python 连接到数据库所必需的。(这个沙盒在这篇博文发表的时候就已经被销毁了,所以在这篇博文中它只是用于演示的目的。)
我们将使用 CORA 数据集,这是一个经典的图表数据集,用于查看关于机器学习主题的同行评审科学文章之间的共同引用。出于几个原因,这对于本例是一个有用的数据集。首先,数据集已经被标记。根据给定论文所属的机器学习子分支,它被分为 7 个不同的类别(稍后将详细介绍这些类别)。其次,维护人员已经创建了这些论文摘要的一系列词向量,我们将使用这些词向量来比较我们基于图的 ML 方法和基于自然语言处理(NLP)的传统 ML 模型。这些嵌入是基于 1433 个唯一单词的字典一次性编码的。最后,图形本身很简单。这是一个单部分图,意味着只有一种类型的节点(论文)和一个时间关系(引用)。许多图算法在处理单部图时效果最佳,尽管我们今天不会利用这些算法。如果不是这样,我们需要将我们的图重构为一个单部分图,这将是未来博客文章的主题。
将数据上传到图表中
为了便于导入,我已经将 CORA 数据集上传到 GitHub 的 CSV 文件中。如果你想知道更多关于如何将数据导入 Neo4j 的信息,你可以看看这篇博文。该数据集的图形模型如下所示。
CORA 图形模型(图片由作者提供)
我们要做的第一件事是,在导入数据之前,基于节点的 id,在数据库中为节点创建一些惟一性约束。这样做的好处是既能确保没有重复,又能为节点创建索引,从而加快数据搜索的速度。为此,我们通过浏览器进入沙箱。(见这篇博文,关于中途下来,如果你想学习如何访问浏览器。)从浏览器中,我们将输入以下 Cypher 命令:
接下来,从浏览器中,我们将加载 CORA 节点列表。在这个文件中,我们有每篇论文的节点 id(一个整数)、每篇论文被分配到的类(在数据集中称为subject
),以及由 CORA 维护者提供的词向量(在数据集中称为features
,它是一个独热编码整数的列表)。
最后,我们将引入每篇论文的关系(又名边缘)。这个文件是节点 id 的 CSV 文件。每行都有一个source
和一个target
节点。这样,我们知道这两者中的每一个都将通过一种我称之为CITES
的关系联系在一起。
所以现在我们有一个完全填充的图表来处理。我们应该看到有 2708 个论文节点,它们之间有 5429 个引用关系。该图应该如下所示:
CORA 图的一部分(图片由作者提供)
(注意,这是图形的一小部分,由 Cypher 命令MATCH (n) RETURN n LIMIT 300
返回,它防止屏幕变得过于混乱,浏览器陷入停滞。)
太棒了。现在我们有了一个图,我们可以继续做一些 ML 了!
设置问题
现在我们有了这个图,我们需要创建一个 GDS 内存图,我们将使用它来计算 FastRP 嵌入。这些图形投影非常有用,因为它们将所需的节点和关系放入有效存储在存储器中的存储空间中,并且仅包含用于运行后续计算的必要信息。为此,我们将在浏览器中运行以下程序:
如前所述,我们幸运地使用了 CORA,因为图已经是单部分的了。所以我们可以使用单个节点投影Paper
,和单个关系类型CITES
。请注意,我们声明此图是无向的。这是因为我们假设被引用的文章可能与引用它的文章属于同一类,反之亦然。有关如何创建内存中图形的更多信息,请查看 GDS 文档或查看我的快速视频这里。
酷毙了。这给了我们从数据库中创建 ML 模型所需的一切!
如前所述,我们将使用 Google Colab 笔记本来运行我们的模型,可以在这里找到。我们将使用的许多包已经预装在 Colab 中。然而,我们仍然需要安装官方的 Neo4j Python 驱动程序以及 Optuna(当我们到达那里时)。关于如何使用该驱动程序的更多信息,请参考这段视频或这篇博客文章。我们看到我们需要连接到我们的沙箱实例。这些信息可以从如上所示的沙箱 UI 中获得。
基于词嵌入的 ML 模型
让我们从嵌入这个词开始。应该预先注意,我没有创建这些嵌入,也没有机会对它们进行调优。因此,我们将不得不利用我们现有的资源,把它当作一个基准模型。
在笔记本中,有一些函数可以从 Neo4j 中获取数据,并将列转换为与scikit-learn
兼容的数据类型。我在这里就不赘述了。
一旦我们有了这些数据,笔记本就使用来自scikit-learn
的支持向量分类器(SVC)说明了一个多类分类模型。在这个例子中,我们使用 SVC 的默认超参数,并使用 5 重验证。这篇博文的目的不是调整这个模型,而是强调基于使用哪种嵌入的分类准确性的差异。因此,这个模型将在本文中保持一致。模型的主体是:
当运行时,发现平均精度为 0.724(当然,基于 ML 建模的随机性质有变化),并且获得以下混淆矩阵:
单词嵌入模型的混淆矩阵(作者图片)
用数字表示的类如下,它们的样本(节点)总数在括号中:
- 神经网络:0.0 (818 个节点)
- 规则 _ 学习:1.0 (180 个节点)
- 强化 _ 学习:2.0 (217 个节点)
- 概率方法:3.0 (426 个节点)
- 理论:4.0 (351 个节点)
- 遗传算法:5.0 (418 个节点)
- 基于案例:6.0 (298 个节点)
很明显,我们有一个不平衡的阶级问题,但这就是生活。考虑到这一事实以及我们无法访问原始词汇,0.726 的准确度真的不算太差。
基于 FastRP 图嵌入的 ML 模型
我们将从使用上面创建的内存中的图来创建 FastRP 图嵌入开始。在与这个模型相关联的笔记本中,我们为每个节点创建了一个 256 维的图形嵌入。然后,我们像以前一样运行非常基本的 SVC 模型,并获得以下混淆矩阵:
基本 FastRP 嵌入的混淆矩阵(图片由作者提供)
我们还获得了 0.845 的平均精度!与单词嵌入模型相比,这是一个相当大的改进!这有一些很好的理由。第一,NLP 是出了名的吵。NLP 模型的质量在很大程度上取决于你输入的内容,这是基于垃圾输入-垃圾输出的原则。然而,如果不能访问词汇表,就不可能研究如何改进这些单词嵌入。然而,这些个体节点之间的连接一点也不嘈杂。事实上,让我们通过 t-SNE 降维来进一步探索这些嵌入。如果我们将这些 256 维的向量降低到 2 维,我们得到如下:
FastRP 嵌入的 t-SNE 可视化(图片由作者提供)
在一个理想的世界中,我们会看到每一个类都在它们自己的、非常可区分和可分离的集群中。虽然我们没有在所有情况下都看到这一点,但我们看到的情况多少是可以解释的。0.0 类对应于神经网络,这是一个相当广泛的类别。事实上,很可能其他课程会在这里引用一两篇论文,使它们比其他论文联系得更紧密。相比之下,遗传算法(紫色类 5.0)是一个非常狭窄和具体的主题。因此,它们与该学科之外的许多其他论文没有联系也就不足为奇了。这可能会导致它们更加集中。检查图中的其他集群可以让我们得出类似的结论。
优化 FastRP 超参数
我们现在已经看到了 FastRP 图嵌入的工作原理。然而,这些结果是在指定嵌入的维数时仅使用算法的默认设置而获得的。一般来说,在现实世界中这样做很少是个好主意。像 ML 中使用的任何其他嵌入一样,图嵌入应该通过优化它们的超参数来调整。这就是 Optuna 的用武之地。
有许多不同的 Python 包用于调优嵌入,Optuna 是最容易使用的包之一。一般的想法是,您指定一些要优化的变量,给它们一个要评估的值范围,然后指定要优化的目标度量(在本例中是准确性)。然后,Optuna 在该超参数空间中进行复杂的搜索,进行给定次数的迭代,直到找到度量的最佳值,这是通过使用这些最佳超参数获得的。
在我们的例子中,我们将使用完全相同的 SVC 模型,但是允许 Optuna 改变 FastRP 超参数,直到我们得到最佳值。这一点在这本笔记本中有所体现。
我们首先为 Optuna 将要进行的试验指定超参数:
这些params
值将由 Optuna 通过复杂的搜索方法进行数学选择。它们将被输入到 ML 算法中,该算法根据params
的试验值计算精度,试验值在每次运行时会发生变化:
一旦这些东西准备就绪,我们就可以开始研究了:
这里我们提供了一些初始的,任意选择的参数。然后,我们告诉 Optuna 以“最大化”的目标度量(准确性)创建研究。然后,我们让 Optuna 对这项研究进行 100 次试验,几分钟后我们就可以获得优化的超参数。在这种情况下,我们可以看到我们的精度提高到了 0.868!虽然仍然涉及到一些随机变量,但是如果您多次运行此研究,您将会看到精确度和优化的超参数值变化不大。
然而,有趣的是,在这个解决方案中,哪些超参数是最重要的:
超参数重要性(图片由作者提供)
很明显,嵌入维数支配着解决方案。Optuna 在这次运行中确定的最佳维数是 506。虽然这在我们的范围的较大一端,有趣的是注意到这比 1433 维的单词向量少多少。其次,我们可以看到,转移矩阵中的第四个权重比第三个权重更重要(见这篇博文),这证实了原始算法的作者所报告的。
讨论和最终想法
在这篇博文中,我展示了一个针对给定问题的 FastRP 超参数的简单优化。重要的是要注意,这个过程绝对应该用你的问题的具体图表来完成。我在选择这张图时也非常特别,因为它让我们有机会评估传统的 ML 模型和图形模型。我不会说这是每个图,甚至每个问题的正确方法。例如,如果您的图不是非常密集连接的,那么 FastRP 计算中涉及的矩阵可能会太稀疏而无法获得有意义的结果。
我在帖子中没有展示的一件事是除了非常基本的 FastRP 算法之外的任何东西。还有许多其他的图形嵌入算法,Neo4j 和其他地方都有,可以使用。事实上,FastRP 有一个更复杂的兄弟,叫做fastr extended,它也可以将节点属性引入到这个嵌入中!但这将是未来博客文章的主题。看看像 node2vec 这样的流行算法如何响应这种方法也是值得的。最后,我使用了最基本的分类器:SVC。如果您选择另一个分类器,看看会发生什么是值得的。当然,您可以使用 TensorFlow 或 PyTorch 中的嵌入功能!我的朋友克里斯托夫·奈斯用图形神经网络写了一个很好的演示。
说了这么多,我希望你能够看到使用图表解决有趣的 ML 问题有巨大的好处!
有关更多信息…
我制作了一系列迷你视频(我的目标是 5 分钟或更少),向数据科学家传授如何使用 Neo4j 进行数据科学研究的基础知识:“面向数据科学家的小型 Neo4j”我试着每周给 Neo4j 新用户添加一个非常具体的主题视频。
一些其他参考
其中许多链接在上面的不同地方,但这里有一个适当的列表。
- FastRP 上的图形数据科学库文档
- “生成图嵌入的快速随机投影算法的幕后场景”
- “理解 Node2Vec 算法的完整指南”
- “twitch verse:为节点分类任务使用 FastRP 嵌入”
- “深入探讨 Neo4j 链接预测管道和 FastRP 嵌入算法”
- Optuna 文档
特别感谢 Jacob Sznajdman 和Tomaz Bratanic对这篇博文的内容和评论提供帮助的人!另外,特别感谢Alessandro Negro对本帖的宝贵见解和编码支持!*