TowardsDataScience 博客中文翻译 2019(一百七十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

关于在 PyTorch 减肥,你需要知道的一切

原文:https://towardsdatascience.com/everything-you-need-to-know-about-saving-weights-in-pytorch-572651f3f8de?source=collection_archive---------0-----------------------

一旦我们完成了对模型的训练,我们深度学习实践者会做什么?

我们心寒!!!

哈哈哈 开个玩笑……

我们要么保存学习到的权重,要么保存整个模型,以便我们可以进一步训练模型,或者使用训练好的模型进行推理!

接下来你们可能有兴趣知道的是,我们什么时候只保存学习过的权重,什么时候保存整个模型。

在这篇博客中,我们将试图找到这些问题的答案。

我将非常简单明了地向您解释在 PyTorch 中保存模型架构及其权重的艺术的来龙去脉。

我们还将学习如何访问不同的模块。准确地说,在任何给定的 PyTorch 模型中。

所以可以随意分叉这个 kaggle 内核并使用 代码 😃

我们开始吧!!!

我们从使用 PyTorch 导入编码的 基本必需品 开始。

接下来,我们定义一个基于 CNN 的模型。

让我们初始化并打印模型,看看里面有什么。

打印出模型向你展示它的架构。但是我们要潜得更深,因为我们是深度学习的实践者!

我们需要确保我们理解模型里面到底有什么。

有一种方法可以访问模型的每个可学习参数及其名称。顺便说一下,torch . nn . parameter是一个张量子类,当与torch . nn . module一起使用时,它会自动添加到其参数列表中,并出现在例如 parameters() 或*named _ parameters()*迭代器中。另一方面添加一个 torch.nn.Tensor 则没有这样的效果。稍后将详细介绍这一点!

回到打印模型的所有参数。

喔喔喔!这里刚刚发生了什么?

让我们进入 named_parameters() 函数。

model.named_parameters()本身就是一个生成器。它返回名称参数*,它们只不过是参数的名称和参数本身。这里返回的参数是 torch.nn.Parameter 类,是一种张量。由于 param 是张量的一种类型,所以它也具有形状要求 _grad 属性。 param.shape 是张量的简单形状,而param . requires _ grad是一个布尔值,它表明参数是否可学习。由于模型中的所有参数都具有requires _ grad****= True**,这意味着所有参数都是可学习的,并且将在训练模型时更新。如果任何特定的参数被设置为,则该参数的权重不会在训练模型时更新。***

因此, requires_grad 是当您想要训练/冻结您的模型的一组特定层时,您可能想要更改的标志。**

现在,我们将尝试冻结所有,但最后一层的模型。如果我们浏览模型所有参数的所有名称,我们可以看到最后一层的名称是‘fc’,代表‘全连接’。**

因此,让我们冻结所有参数,除了名称为【fc . weight】【fc . bias】的参数

我们可以通过为模型的所有参数打印出 requires_grad 来验证所需的更改已经成功完成

我们可以看到,所需的更改已经成功完成!

因此,我们已经了解了如何为模型的任何所需参数更改 requires_grad 标志。我们还了解到,在我们想要学习/冻结模型中某些特定参数/层的权重的情况下,这样做非常方便。**

我们现在将学习两种广为人知的保存模型权重/参数的方法。

  1. torch.save(model.state_dict(),’ weights_path_name.pth’)
    它只保存模型的
    权重******
  2. torch.save(model,’ model_path_name.pth’)
    保存整个模型(架构
    以及权重
    )
    ****

state_dict()是什么,在哪里使用?

我们将首先看看如何编写 state_dict 的语法。这很简单。

这只是一个 python 的有序字典。

但是,打印这个,会导致混乱。所以我们不会在这里打印整个模型的 state_dict ,但是我鼓励你们继续在屏幕上打印出来!

我想这是转移话题的好时机。

**看,打印帮助(模型)告诉我们,模型是 nn 的一个实例。模块

也可以使用 python 的 isinstance 函数进行验证

model.fc 也是 nn 的实例吗?模块

显然是的!

****但是 fc 到底是什么,又是从何而来?

我们什么都能看到 nn。模块对象位于模型下

在任何 nn 上应用的 named_children() 。模块对象返回它的所有直接子对象(也是 nn。模块对象)。看看上面这段代码的结果,我们知道‘sequential’,‘layer 1’,‘layer 2’,‘fc’,都是 model 的子节点,所有这些都是 nn。模块类对象。现在我们都知道【fc】是从哪里来的了。

你知道吗? state_dict() 作用于任何 nn。模块对象并返回它的所有直接子对象(属于类 nn。模块)。

所以我们来试试模型的‘fc’层上的 state_dict() 函数。

记住 model.fc.state_dict() 或者任何 nnModule.state_dict() 都是一个有序字典。所以迭代它给了我们字典的键,可以用来访问参数张量,顺便说一下,它不是一个 nn。模块对象,而是一个简单的火炬。具有形状的张量需要 _grad 属性。****

所以一定要注意,当我们保存一个 nn 的 state_dict() 时。模块对象例如模型、焊枪。张量物体被保存!

这就是我们保存整个模型的 state_dict 的方法。

这在工作目录中生成了一个 ‘weights_only.pth’ 文件,它在一个有序的字典中保存了火炬。张量模型所有层的对象。

我们现在将尝试加载保存的重量。但是在此之前,我们需要首先定义模型架构。首先定义模型,然后在其中加载权重是有意义的,因为保存的信息只是权重而不是模型架构。****

一旦权重被加载到定义的模型中,让我们检查 model_new 所有层的 requires_grad 属性。

等等!什么?

我们为所有不同层设置的所有 requires_grad 标志发生了什么变化?似乎所有的 requires_grad 标志都被重置为 True

其实我们从来没有在第一时间保存参数的 required_grad 标志。记住,一个 state_dict 只是一个 python 字典对象,它将每个层映射到它的参数张量。它不保存参数的 requires_grad 属性。

因此,我们需要再次对所有参数的 requires_grad 属性进行必要的更改,然后才能继续对模型进行更多时期的训练

如何保存整个模型,什么时候做?

是的,我们有第二种保存东西的方法,也可以保存整个模型。对于整个模型,我指的是模型的架构以及它的重量*。*****

因此,我们将从冻结模型的最后一层(即‘fc’层)的地方继续,并保存整个模型。

这将在工作目录中创建一个‘entire _ model . PTH’*文件,它包含模型架构以及保存的权重。*****

我们现在将尝试加载保存的模型。这一次,我们不需要定义模型架构,因为关于模型架构的信息已经存储在保存的文件中。

一旦模型被加载,让我们检查 model_new 所有层的属性。

这正是我们想要看到的,不是吗?😄

所以当我们保存整个模型时,我们保存了 nn。模块对象,这样做也保存了其所有参数的 requires_grad 标志。

我强烈建议你们把这个public ka ggle kernel叉出来,玩玩代码,感受一下!

总结

我们在这个博客中学到了很多东西。

  1. nn 上应用 命名参数() 。模块对象,例如模型
    模型.图层 2模型. fc 返回所有的名称和各自的参数。这些参数是 nn。参数(火炬的子类。张量对象,因此它们具有形状要求 _grad 属性。

2. 需要 nn 的 _grad 属性。参数对象(可学习参数对象)决定是否训练或冻结特定参数。例如,如果我们想要冻结模型的层 1 ,我们将使用下面的代码。

3.将 命名为 _children() 应用于任何 nn 上。模块对象返回它的所有直接子对象(也是 nn。模块对象)。

4.任何 nn 的一个 state_dict() 。模块对象,例如模型模型.层 2模型. fc 只是一个 python 有序字典对象,它将每个参数映射到其参数张量(火炬。张量对象)。该有序字典的是参数的名称,可用于访问相应的参数张量。****

5.保存一个 nn。模块对象的 state_dict保存该对象的各种参数的 权重不保存模型架构*。也不涉及权重的 requires_grad 属性。所以在加载 state_dict 之前,必须先定义模型。*****

6.整个模型( nn。模块对象)也可以被保存,这将包括模型架构及其权重。既然我们在拯救 nn。模块对象, requires_grad 属性也以这种方式保存*。此外,我们不需要在加载保存的文件之前定义模型架构,因为保存的文件中已经保存了模型架构。*****

7.保存 state_dict 只能用来保存模型的权重。它不会保存 required_grad 标志,而保存整个模型会保存模型架构、它的权重以及所有参数的 requires_grad 属性。

8.state _ dict 和整个模型都可以被保存以进行推断。

我写这篇博客是因为我通过阅读别人的博客学到了很多东西,我觉得我也应该尽可能多地写下并分享我的学习和知识。所以请在下面的评论区留下你的反馈。此外,我是写博客的新手,所以任何关于如何提高我的写作的建议将不胜感激!😄

我也是一个独立的音乐艺术家,喜欢在空闲时间演奏和录制音乐。也许你可以在 Spotify 上查看我的艺人页面,表示支持:)
Spotify 上的 8 楼和声!

数据可视化散点图的所有信息

原文:https://towardsdatascience.com/everything-you-need-to-know-about-scatter-plots-for-data-visualisation-924144c0bc5?source=collection_archive---------7-----------------------

想获得灵感?快来加入我的 超级行情快讯 。😎

如果你是一名数据科学家,毫无疑问,你以前处理过散点图。尽管散点图很简单,但它是可视化数据的强大工具。颜色、大小、形状和回归图等几个参数的简单变化带来了大量的选项、灵活性和表现能力。

在这里,您将了解到关于散点图可视化数据的所有知识!我们将浏览所有的参数,看看何时以及如何在代码中使用它们。您可能会发现一些可以添加到您的数据科学工具箱中的惊喜和技巧!

回归绘图

当我们第一次在散点图上绘制数据时,它已经给了我们一个很好的数据概览。在下面最左边的图中,我们已经可以看到大多数数据似乎聚集在一起的组,并且可以快速挑选出异常值。

但是能够看到我们的任务会变得多么复杂也是一件好事;我们可以用回归图来做。在下图中间,我们做了一个线性图。显而易见,线性函数不起作用,因为许多点离直线很远。最右边的特性使用 4 阶多项式,看起来更有前途。所以看起来我们肯定需要至少 4 阶的东西来建模这个数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

颜色和形状

颜色和形状可用于显示数据集中的不同类别。颜色和形状对人类视觉系统来说都是非常直观的。当你看一个点群有不同颜色和形状的图时,很明显这些点属于不同的群。这对我们来说很自然。这种自然的直觉总是你在创建清晰和引人注目的数据可视化时想要发挥的。让它显而易见,不言自明。

下图左侧显示了按颜色分组的类别;右图显示了按颜色和形状划分的类别。在这两种情况下,都比我们只有蓝色时更容易看到分组!我们现在知道,以较低的误差分离 setosa 类可能很容易,我们应该将注意力集中在如何将另外两个类彼此分离上。同样清楚的是,一个单一的线性图无法将绿色和橙色点分开;我们需要更高维的东西。

在颜色和形状之间做出选择变成了个人喜好的问题。就我个人而言,我觉得颜色更清晰和直观,但你可以自己选择!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

边缘直方图

具有边缘直方图的散点图是那些在顶部和侧面绘制直方图的散点图,代表特征点沿 x 轴和 y 轴的分布。这是一个很小的增加,但对于查看我们的点的精确分布和更准确地识别我们的异常值来说是很棒的。

例如,在下图中我们可以看到,为什么轴在 3.0 附近有一个非常密集的点。有多集中?这在最右边的直方图中最容易看到,它显示 3.0 附近的点至少是任何其他离散范围的三倍。我们还看到,与其他范围相比,几乎没有任何高于 3.75 的点。另一方面,对于 x 轴来说,除了最右边的异常值之外,其他的都比较均匀。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

气泡图

通过气泡图,我们可以使用几个变量来编码信息。我们将在这里添加的新参数是大小。在下图中,我们绘制了每个人吃薯条的数量与他们的身高和体重的关系。请注意,散点图只是一个 2D 可视化工具,但是使用不同的属性,我们可以表示三维信息。

这里我们使用*的颜色、位置和大小。*位置决定了人的身高体重,颜色决定了性别,大小决定了吃薯条的数量!气泡图让我们方便地将所有属性合并到一个图中,这样我们可以在一个简单的 2D 视图中看到高维信息;没什么复杂的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

喜欢学习?

在推特上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也请在 LinkedIn上与我联系!

关于雪花参数您需要知道的一切(第 1 部分)

原文:https://towardsdatascience.com/everything-you-need-to-know-about-snowflake-parameters-part-1-6224ccd7c559?source=collection_archive---------26-----------------------

[专业数据技能](http://towardsdatascience.com/tagged/professional data skills)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Andrea Sonda on Unsplash

雪花是一个非常受欢迎的云数据仓库,以其简单、强大的功能、有竞争力的价格和易于维护而闻名。来到 Snowflake 的 DBA 通常会惊喜地发现,他们只需调整很少的东西就能让它保持运行。

其中之一就是雪花参数。对于传统数据库,DBA 经常花时间微调参数以获得最佳性能。有时,这对于提高单个查询的运行速度是必要的。有几十个雪花参数,但大多数安装都可以运行得很好,而不需要调整任何参数。

然而,知道什么在运行总是好的——不仅仅是为了知道,而是因为有时它可以帮助更快地解决问题。

在这篇由两部分组成的文章中,我将讨论雪花参数及其工作原理。你将学习如何以不同的方式改变和重置它们,这样一个地方的改变不会影响到另一个地方。最后,我们将讨论有时会派上用场的重要参数。

让我们开始吧。

雪花参数的类型和级别

有两种方法可以识别雪花参数:参数的类型及其层次级别

参数类型基于它所控制的资源类型。有些参数适用于整个雪花帐户,有些适用于用户会话,有些适用于雪花对象。

雪花参数有三种类型:

  • 账户
  • 会话
  • 对象

一个账户类型参数影响整个雪花账户。这些参数是在帐户级别设置的,不能在层次结构的较低级别覆盖。只有 ACCOUNTADMIN 角色成员(对于一个参数,还有 SYSADMIN 角色成员)可以更改它们的值。一旦您设置了帐户参数,它将对所有用户及其会话可见。

接下来,我们有会话类型参数。这些参数主要与用户及其会话相关。它们可以在帐户级别设置,但也可以针对每个用户进行更改。在用户的会话中,它可以再次更改为不同的内容。

这是在层次结构的不同级别改变参数的一个例子。这里,会话类型参数可以在账户级别(层级的根级别)设置默认值。在帐户下,我们还有单独的雪花用户(层次结构的第一层),每个用户可以有多个会话(层次结构的第二层)。创建帐户时(或之后),可以为用户帐户更改在帐户级别设置的参数值。当用户登录时,她可以为她的会话将相同的参数更改为不同的值。换句话说,该参数现在在层次结构的三个级别上具有三个不同的值。

会话类型参数可用于满足不同的用户需求。例如,从美国连接的用户可能希望看到以“mm-dd-yyyy”格式显示的日期,而来自亚洲的用户可能希望看到以“dd/mm/yyyy”格式列出的日期。此参数的帐户级别值可以是默认的“yyyy-mm-dd”。在用户级别设置该值可确保不同的用户以他们希望的方式查看日期。

现在,假设一个来自美国的用户登录到数据仓库,但是想要查看“MMM-dd-yyyy”格式的日期。她只能为自己的会话更改参数。

ACCOUNTADMIN 和 SYSADMIN 角色成员都可以为用户分配或更改参数。如果在用户或会话级别没有对会话类型参数进行更改,则应用帐户级别的值。

最后还有对象类型参数。这些参数适用于雪花对象,如仓库和数据库。仓库没有任何层次结构,因此可以在帐户级别设置特定于仓库的参数,然后针对各个仓库进行更改。

类似地,可以在帐户级别设置特定于数据库的参数,然后针对每个数据库进行设置。与仓库不同,数据库有一个层次结构。在数据库中,模式可以覆盖帐户或数据库级别的参数集,而在模式中,表可以覆盖帐户、数据库或模式级别的参数集。如果在层次结构的较低级别没有进行更改,则在最近的较高级别设置的值将应用于下游。

使用雪花参数

那么如何看出雪花有哪些参数呢?

看你想看什么了。对于帐户或会话类型参数,您可以运行以下命令:

—- shows parameters defined at the account level
SHOW PARAMETERS IN ACCOUNT;—- shows parameters defined at the user level
SHOW PARAMETERS IN USER;-- shows parameters defined at the session level
SHOW PARAMETERS IN SESSION;-- shows parameters defined at the session level
SHOW PARAMETERS

让我们看看输出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里:

  • 是参数名
  • 是为该参数设置的当前值
  • 默认值 是该参数的默认值
  • 级别 是应用当前值的层级位置。如果默认值和当前值相同,则该字段为空。

以下是在会话级别更改参数的示例:

ALTER SESSION SET TIMEZONE=’Australia/Sydney’;

如果您现在运行此命令:

SHOW PARAMETERS LIKE ‘%TIMEZONE%’;

输出显示当前值是在会话级别设置的,它不同于默认值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要查找在帐户级别设置的值,请运行以下命令:

SHOW PARAMETERS LIKE ‘%TIMEZONE%’ IN ACCOUNT;

它显示默认值在帐户级别没有改变。请注意“级别”列在这里是空的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要将参数重置回原来的值,请运行以下命令:

ALTER SESSION UNSET TIMEZONE;

现在让我们来谈谈对象类型参数。与帐户或会话类型不同,查询对象类型参数需要指定对象类型(数据库、模式、表或仓库)和对象名称。

此代码片段显示了如何列出数据库、模式、表和仓库的对象属性:

-- Shows parameters set at database level
SHOW PARAMETERS IN DATABASE MYTESTDB;-- Shows parameters set at schema level
SHOW PARAMETERS IN SCHEMA MYTESTDB.TEST_SCHEMA;-- Shows parameters set at table level
SHOW PARAMETERS IN TABLE MYTESTDB.TEST_SCHEMA.MY_TEST_TABLE;-- Shows parameters set for a warehouse
SHOW PARAMETERS IN WAREHOUSE MYTESTWH;

假设您想要将 TEST_SCHEMA 的数据保持期更改为 0 天,这实际上关闭了它的时间旅行。运行如下命令:

ALTER SCHEMA MYTESTDB.TEST_SCHEMA SET DATA_RETENTION_TIME_IN_DAYS=0;

要将其改回默认值,请运行如下命令:

ALTER SCHEMA MYTESTDB.TEST_SCHEMA UNSET DATA_RETENTION_TIME_IN_DAYS;

这就是关于查询和设置雪花参数您需要知道的一切。

第 1 部分结束

这是不到十分钟的关于雪花参数的介绍。这里没有什么奇特或复杂的。然而,真正的力量来自于知道需要时可以调整哪些参数,以及调整到什么水平。这就是我们将在第 2 部分讨论的内容。敬请关注。

如果你喜欢它,请鼓掌,在 Twitter、Medium 和 LinkedIn 上关注我。

关于雪花参数您需要知道的一切(第 2 部分)

原文:https://towardsdatascience.com/everything-you-need-to-know-about-snowflake-parameters-part-2-4bc96390ccbe?source=collection_archive---------11-----------------------

专业数据技能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Kai Dahms on Unsplash

在这个由两部分组成的文章系列的第一部分中,您了解了雪花云数据仓库参数是如何工作的。

合乎逻辑的下一个问题是,您应该了解哪些参数?更重要的是,你应该什么时候使用它们?

在这最后一部分,您将了解一些有用的雪花参数。

事不宜迟,这是清单。

中止 _ 分离 _ 查询

该参数告诉雪花,如果客户端连接断开(浏览器窗口关闭、网络连接中断等),它是否应该中止正在进行的查询。这是一个会话类型参数,可以在帐户、用户或会话级别设置。默认值为 FALSE,这意味着即使客户端连接断开,雪花也将继续运行查询。

作为管理员,您可能希望为人类用户将该参数设置为 TRUE,这样他们断开连接的查询就不会浪费宝贵的仓库资源。同样,对于应用程序用户帐户,该值可以设置为 FALSE。这些帐户通常运行大型聚合或冗长的数据加载。将这些帐户的参数设置为 FALSE 将确保关键数据处理任务不受连接中断的影响。

LOCK_TIMEOUT

这是一个会话类型参数,它告诉 Snowflake 在超时和中止查询之前应该等待多少秒来获取资源锁。默认值是 43200 秒或 12 小时,这通常被认为太长了。

作为一个大概的数字,您也许可以将这个值降低到 30 分钟,并保留应用程序帐户的默认值。

数据保留时间天数

这是一个对象类型参数。它可以设置为:

  • 帐户级别:该值将应用于雪花帐户中的所有数据库、模式和表
  • 对象级:该值适用于单个数据库、模式或表

DATA _ RETENTION _ TIME _ IN _ DAYS告诉雪花应该将历史数据保持可用多长时间,以便用户可以返回到他们数据中的特定时间点。默认值是 1 天,在雪花标准版中只能返回到这一天。对于雪花企业版和更高版本,这可以设置为最多 90 天。将该参数设置为 0 意味着对象的时间旅行已关闭。

如果您使用的是雪花企业版或更高版本,在帐户级别将该参数设置为 90 并忘记它可能很有诱惑力。在这样做之前,请考虑它将如何影响您的数据存储成本。您的帐户是否用于非生产工作并托管大量非生产数据?您的数据处理例程是否创建了大量临时表?在这种情况下,您可能希望关闭非生产数据库或表的数据保留以节省成本。

时区

这是一个会话类型参数,指定雪花帐户的时区。除非有任何在用户或会话级别设置它的实际需要,否则在帐户级别设置该值并保留它。

使用缓存结果

这是另一个会话类型参数,应该在帐户级别设置,不能在用户或会话级别更改。

Snowflake 尽可能使用缓存,它的大部分性能优势来自于能够在再次运行相同的查询时使用缓存的结果——无论是来自云服务层还是来自仓库层。当在缓存中找到匹配的结果集时,Snowflake 返回该结果集。这大大提高了性能,因为没有使用仓库来处理请求。

该参数的默认值为 TRUE,除非有非常特殊的用例,否则应该保持不变。在对查询性能进行故障排除时,您可能希望通过运行以下命令来仔细检查是否在会话级别启用了缓存:

SHOW PARAMETERS LIKE '%USE_CACHED_RESULT%'

语句 _ 超时 _ 秒

这个参数告诉雪花在系统取消之前一个 SQL 语句可以运行多长时间。默认值为 172800 秒(48 小时)

这既是会话参数,也是对象类型参数。作为会话类型,它可以应用于帐户、用户或会话。作为一种对象类型,它可以应用于仓库。如果在两个级别都设置了,则使用最低的值。

您可以在帐户级别保留默认值,但可以根据您的仓库进行更改。例如,如果您不希望您的 ETL 仓库运行数据加载命令超过 8 小时(并且不花钱),那么为仓库设置参数:

ALTER WAREHOUSE <warehouse> SET STATEMENT_TIMEOUT_IN_SECONDS = 28800

处理完成后,您可以重置参数:

ALTER WAREHOUSE <*warehouse*> UNSET STATEMENT_TIMEOUT_IN_SECONDS

语句排队超时秒数

STATEMENT _ time out _ IN _ SECONDS一样,这个也是会话和对象类型参数。与该参数不同的是,它并不控制已经在运行的 SQL 语句应该允许运行多长时间,而是在系统取消它之前应该允许它在仓库队列中等待多长时间。默认值为 0,这意味着语句在得到服务之前一直保留在队列中。和前面的参数一样,如果在仓库和会话级别都设置了该参数,则使用最小值。

如果数据加载或查询在排队后超时,请检查帐户、用户和仓库级别的参数值。

最大并发级别

这可能是仓库最重要的参数之一。这是一个对象类型参数,可以在整个帐户范围内设置,也可以为单个仓库设置。 MAX_CONCURRENCY_LEVEL 告诉雪花在一个仓库中可以并行运行多少条 SQL 语句。当提交的 SQL 语句的数量达到这个阈值时,任何新的 SQL 语句可能会也可能不会被放入队列中。雪花是怎么决定这个的?以下是方法。

对于配置为自动扩展到最大集群数的多集群仓库,在达到阈值后提交的任何新 SQL 都将导致一个新集群加速运行。然后,新的 SQL 语句由新的集群提供服务。

如果多集群仓库已达到其集群的最大限制,或者如果它是单集群仓库,则新的 SQL 语句将被放入队列中。您可以通过将仓库扩大到更高的容量来避免这种情况。此外,请记住,多集群仓库是雪花企业版和更高版本的一个功能。

假设您的仓库没有扩大,也没有更多的集群可以运转。SQL 语句在队列中等待多长时间?你猜对了——它是由你在语句 _ 排队 _ 超时 _ 秒数参数中指定的时间决定的。

现在,从大型多集群仓库开始,并将 STATEMENT _ QUEUED _ time out _ IN _ SECONDS 参数设置为 0,这样就不会出现阻塞,这可能很有诱惑力。但是您真正应该做的是针对较小的仓库测试您的峰值负载,并查看是否有任何语句始终处于排队状态*。*如果您使用的是雪花企业版或更高版本,请从较小的多集群仓库开始。从最大集群数的保守值开始,随着测试的进行逐渐增加。对于 Snowflake Standard Edition 帐户,从一个小仓库开始,随着测试的进行逐渐增加它的大小。

此外,将该参数设置为与仓库大小成比例的值。例如,如果您为“小型”仓库将该参数设置为一个很高的值,那么查询很可能需要很长时间才能完成,因为每个查询占用的资源会更少。如果将该参数设置得太低,可能会出现不必要的排队。最佳选择是对每个峰值负载场景进行测试。

日期输出格式

这是一个会话类型参数。它可以在用户或会话的帐户级别设置。顾名思义,这个参数告诉雪花如何显示日期。除非需要更改报告的显示格式,否则请使用默认格式 YYYY-MM-DD。

网络 _ 策略

雪花网络策略允许(或不允许)来自特定 IP 地址或地址范围的流量。这个 IP 白名单(和黑名单)充当了雪花内部事实上的防火墙。网络策略参数告诉雪花哪个网络策略有效。

这是一个帐户类型参数,这意味着它不能被用户或她的会话覆盖。

对雪花的连接进行故障排除时,可以查询此参数。如果客户端连接被拒绝,即使存在网络连接,您也可以检查此参数来查找任何网络策略名称。然后,您可以从策略中找到被阻止的 IP 地址,并查看客户端的地址是否在这些被阻止的 IP 中。

资源 _ 监视器

资源监视器帮助控制雪花的仓库使用量。系统管理员经常创建资源监视器来跟踪雪花仓库使用的信用。如果设置了配额,雪花可以在达到阈值时发送通知,或者立即暂停仓库。可以在帐户级别创建资源监视器,在这种情况下,配额适用于帐户中所有仓库使用的总配额,也可以在仓库级别创建资源监视器,在仓库级别,配额仅适用于单个仓库。如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RESOURCE_MONITOR 是一个账户类型参数,只能在账户级别设置。参数值是为帐户定义的资源监视器的名称。

这也强调了这样一个事实,即仅仅为一个帐户创建一个资源监视器是不够的——它的名称应该分配给 RESOURCE_MONITOR 参数。

SAML _ 身份 _ 提供者

这是另一个帐户类型参数。只有在使用第三方身份提供者(如 Active Directory、Okta 或其他)配置单点登录(SSO)时,才需要设置此选项。

参数值应该是用单引号括起来的 JSON 文档。该 JSON 文档指定了身份提供者生成的证书名称、身份提供者的 URL、身份提供者的类型以及雪花登录页面中显示的身份提供者按钮的标签。

在大多数生产设置中,企业通常希望将雪花与他们自己的身份系统集成在一起。因此,设置这个参数需要基础设施工程师和数据库管理员的合作。

单点登录页面

该参数在测试单点登录时很有用。同样,这是一个帐户类型参数,只能在帐户级别设置。这是一个布尔参数,控制当启用联合身份验证时,雪花将如何显示登录页面。

  • TRUE 表示预览模式关闭,用户可以在雪花登录页面看到 SAML 身份提供者的 SSO 登录提示。
  • FALSE (默认值)表示预览模式开启,用户可以使用特定的 URL 导航到 SSO 登录页面。

URL 的格式在雪花文档中有描述。

最后的话

这就结束了我们的雪花参数系列。我希望这是一个有用的介绍。不过,需要注意的是:不要在生产雪花环境中更改任何参数,除非有强有力的理由,并且该更改已经过测试和批准。对于 DBA:在创建或修改用户帐户或仓库时,考虑为这里描述的一些参数分配标准值。

如果你喜欢这篇文章,请鼓掌欢迎,并在 Medium、Twitter 和 LinkedIn 上关注我。

关于 TensorFlow 2.0 您需要了解的一切

原文:https://towardsdatascience.com/everything-you-need-to-know-about-tensorflow-2-0-b0856960c074?source=collection_archive---------5-----------------------

Keras-API、SavedModels、TensorBoard、Keras-Tuner 等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2019 年 6 月 26 日,我有幸在圣保罗 papis . io LATAM 大会上展示了一个 TensorFlow (TF) 2.0 工作坊。除了作为工作坊主持人代表大坛的快乐之外,我很高兴谈论 TF 2.0。

研讨会的目的是强调与以前的 1.x 版本的 TF 相比有什么变化。在这篇课文中,你可以跟上我们将要讨论的主要话题。当然,看看的 Colab 笔记本中的实用代码。

TensorFlow 2.0 简介

TensorFlow 是 Google 在 2015 年开源的通用高性能计算库。从一开始,它的主要焦点就是为构建神经网络(NNs)提供高性能的 API。然而,随着时间的推移和机器学习(ML)社区的兴趣,lib 已经发展成为一个完整的 ML 生态系统。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

目前,该图书馆正经历着自诞生以来最大的一系列变化。TensorFlow 2.0 目前处于测试阶段,与 TF 1.x 相比,它带来了许多变化,让我们深入了解一下主要的变化。

默认情况下急切执行

首先,急切执行是运行 TF 代码的默认方式。

您可能还记得,为了在 TF 1.x 中构建一个神经网络,我们需要定义这个称为图的抽象数据结构。另外,(您可能已经尝试过),如果我们试图打印一个图形节点,我们将看不到我们期望的值。相反,我们会看到对图形节点的引用。实际上,为了运行图表,我们需要使用一个叫做会话的封装。使用 Session.run() 方法,我们可以将 Python 数据传递给图表,并实际训练我们的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TF 1.x code example.

随着急切的执行,这种情况发生了变化。现在,TensorFlow 代码可以像普通 Python 代码一样运行——急切地。这意味着操作是一次创建和评估的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tensorflow 2.0 code example.

因此,TensorFlow 2.0 代码看起来很像 NumPy 代码。事实上,TensorFlow 和 NumPy 对象可以很容易地从一个对象切换到另一个对象。因此,您不需要担心占位符会话feed _ dictionalities等。

API 清理

许多像 tf.gans、tf.app、tf.contrib、tf.flags 这样的 API 要么消失了,要么被移动到单独的存储库。

然而,最重要的清理之一与我们如何构建模型有关。你可能还记得,在 TF 1.x 中,我们有不止一两种不同的方法来构建/训练 ML 模型。

Tf.slim、tf.layers、tf.contrib.layers、tf.keras 都是可以用来构建 NNs 的 API。TF 1 . x 中不包括排序 API 的序列。这种缺乏标准化的情况有一个很大的问题——大多数时候,不清楚为每种情况选择哪一种。

尽管这些 API 中有许多都有很好的特性,但它们似乎并没有汇聚成一种通用的开发方式。此外,如果我们用这些 API 中的一个来训练一个模型,那么使用其他 API 来重用那个代码并不直接。

在 TF 2.0 中,tf.keras 是推荐的高级 API。

正如我们将看到的,Keras API 试图解决所有可能的用例。

初学者 API

从 TF 1.x 到 2.0,初学者 API 变化不大。但是现在,Keras 是默认和推荐的高级 API。

总之,Keras 是一组层,描述了如何使用清晰的标准构建神经网络。基本上,当我们使用 pip 安装 TensorFlow 时,我们获得了完整的 Keras API 和一些附加功能。

初学者的 API 叫做 Sequential。它基本上将神经网络定义为一堆层。除了简单之外,它还有一些优点。注意,我们根据数据结构(一堆层)来定义模型。因此,它最小化了由于模型定义而产生错误的可能性。

喀拉斯调谐器

Keras-tuner 是一个用于 Keras 模型超参数调谐的专用库。在撰写本文时,lib 处于的 pre-alpha 状态,但在带有 tf.keras 和 Tensorflow 2.0 beta 的 Colab 上运行良好。

这是一个非常简单的概念。首先,我们需要定义一个模型构建函数,它返回一个编译过的 Keras 模型。该函数将表示调优对象的参数作为输入。使用it,我们可以定义一个候选值范围,从中对超参数值进行采样。

下面我们建立了一个简单的模型,并优化了 3 个超参数。对于隐藏单元,我们对预定义范围内的整数值进行采样。对于辍学率和学习率,我们在一些特定值之间随机选择。

然后,我们创建一个表示随机搜索策略的 tuner 对象。最后,我们可以使用 search() 方法开始优化——它与 fit() 具有相同的签名。

最后,我们可以检查调谐器摘要结果并选择最佳型号。注意,训练日志和模型检查点都保存在目录文件夹 (my_logs) 中。此外,最小化或最大化目标(验证准确性)的选择是自动推断的。

看看他们的 Github 页面了解更多。

高级 API

当你看到这种类型的实现时,它又回到了面向对象编程。这里,您的模型是一个 Python 类,它扩展了 tf.keras.Model 。模型子类化是由 Chainer 启发的想法,与 PyTorch 如何定义模型有很大关系。

使用模型子类化,我们在类构造函数中定义模型层。并且 call() 方法处理向前传递的定义和执行。

子类化有很多优点。更容易执行模型检查。例如,我们可以(使用断点调试)在给定的一行停下来,检查模型的激活或逻辑。

然而,伴随着巨大的灵活性而来的是更多的错误。

模型子类化需要程序员更多的关注和知识。

一般来说,你的代码更容易出错(比如模型连接)。

定义训练循环

在 TF 2.0 中训练模型最简单的方法是使用 fit() 方法。 fit() 支持两种类型的模型,顺序模型和子类模型。如果使用模型子类化,你需要做的唯一调整是覆盖 compute_output_shape ()类方法,否则,你可以通过它离开。除此之外,您应该能够将 fit()tf.data.Dataset 或标准 NumPy nd-arrays 一起用作输入。

然而,如果你想清楚地了解梯度或损失的情况,你可以使用梯度带。如果你在做研究,这尤其有用。

使用梯度带,可以手动定义训练程序的每个步骤。训练神经网络的每个基本步骤,例如:

  • 前进传球
  • 损失函数评估
  • 偶数道次
  • 梯度下降步骤

单独指定。

如果你想知道神经网络是如何训练的,这就更直观了。如果您想检查模型权重或梯度向量本身的损失值,您可以将它们打印出来。

梯度胶带具有更大的灵活性。但是就像子类化和顺序化一样,更多的灵活性伴随着额外的成本。与 fit() 方法相比,这里我们需要手动定义一个训练循环。作为一个自然的结果,这使得代码更容易出现错误,也更难调试。我相信,与通常对开发新事物感兴趣的研究人员相比,这是代码工程师(寻找标准化代码)的理想选择。

同样,使用 fit() 我们可以很容易地设置 TensorBoard,如下图所示。

设置张量板

您可以使用 fit() 方法轻松设置 TensorBoard 的实例。它也适用于 Jupyter/Colab 笔记本电脑。

在这种情况下,您添加 TensorBoard 作为对 fit 方法的回调。

只要你使用的是 fit() 方法,它对顺序 API 和子类 API 都有效。

如果选择使用模型子类化,自己编写训练循环(使用评分带),还需要手动定义 TensorBoard。它包括创建摘要文件,使用*TF . summary . create _ file _ writer(),*并指定您想要可视化的变量。

作为一个值得注意的点,有许多回调你可以使用。一些比较有用的是:

  • EarlyStopping:顾名思义,它设置了一个规则,当监控的数量停止改善时,就停止训练。
  • ReduceLROnPlateau:当指标停止改善时,降低学习率。
  • TerminateOnNaN:遇到 NaN 丢失时终止训练的回调。
  • LambdaCallback: Callback 用于动态创建简单的自定义回调。

您可以在 TensorFlow 2.0 回调查看完整列表。

提取您的 EagerCode 的性能

如果您选择使用渐变磁带来训练您的模型,您将会注意到性能的大幅下降。

急切地执行 TF 代码有利于理解,但在性能上失败了。为了避免这个问题,TF 2.0 引入了 tf.function

基本上,如果你用 tf.function 修饰一个 python 函数,你就是在要求 TensorFlow 接受你的函数并将其转换成 tf 高性能抽象。

这意味着该函数将被标记为 JIT 编译,以便 TensorFlow 将其作为图形运行。结果,您获得了 TF 1.x (graphs)的性能优势,如节点修剪、内核融合等。

简而言之,TF 2.0 的思想是你可以将你的代码设计成更小的函数。然后,您可以使用 tf.function 注释您想要的内容,以获得额外的性能。最好修饰代表最大计算瓶颈的函数。这些通常是训练循环或模型的向前传递。

注意,当你用 tf.function 来修饰一个函数时,你失去了急切执行的一些好处。换句话说,您将无法在该代码段内设置断点或使用 print()

保存和恢复模型

TF 1.x 中另一个严重缺乏标准化的地方是我们如何为生产保存/加载训练好的模型。TF 2.0 也试图通过定义单个 API 来解决这个问题。

TF 2.0 没有很多保存模型的方法,而是标准化了一个叫做 SavedModel 的抽象。

这里就不多说了。如果你创建一个顺序模型或者使用 tf.keras.Model 扩展你的类,你的类继承自 tf.train.Checkpoints 。因此,您可以将模型序列化为 SavedModel 对象。

SavedModels 与 TensorFlow 生态系统相集成。换句话说,您将能够将其部署到许多不同的设备上。其中包括手机、边缘设备和服务器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

转换为 TF-Lite

如果您想将 SavedModel 部署到嵌入式设备,如 Raspberry Pi、Edge TPUs 或您的手机,请使用 TF Lite 转换器。

注意,在 2.0 中,TFLiteConverter 不支持冻结的 GraphDefs(通常在 TF 1.x 中生成)。如果你想转换一个冻结的 GraphDefs 来在 TF 2.0 中运行,你可以使用 tf.compat.v1.TFLiteConverter。

在部署到嵌入式设备之前执行训练后量化是非常常见的。要使用 TFLiteConverter 实现这一点,请将 optimizations 标志设置为“OPTIMIZE_FOR_SIZE”。这将把模型的权重从浮点量化到 8 位精度。它将减少模型大小并改善延迟,而模型准确性几乎没有下降。

请注意,这是一个实验性的标志,它可能会发生变化。

转换到 TensorFlow.js

最后,我们还可以将同一个 SavedModel 对象转换为 TensorFlow.js 格式。然后,我们可以使用 Javascript 加载它,并在浏览器上运行您的模型。

首先需要通过 pip 安装 TensorFlow.js。然后,使用 tensorflowjs_converter 脚本将训练好的模型转换成 Javascript 兼容代码。最后,您可以加载它并在 Javascript 中执行推理。

您也可以在浏览器上使用 Tesnorflow.js 来训练模型。

结论

最后,我想提一下 2.0 的一些其他功能。首先,我们已经看到,向一个顺序的或者子类化的模型中添加更多的层是非常简单的。虽然 TF 覆盖了大多数流行的层,如 Conv2D、TransposeConv2D 等;你总能发现自己处于这样一种情况,你需要一些得不到的东西。如果你正在复制一些论文或做研究,那就更是如此。

好消息是,我们可以开发自己的自定义层。遵循相同的 Keras API,我们可以创建一个类并将其扩展到 tf.keras.Layer 。事实上,我们可以按照非常相似的模式创建定制的激活函数、正则化层或度量。这里有一个关于它的好资源

还有,我们可以把现有的 TensorFlow 1.x 代码转换成 TF 2.0。为此,TF 团队创建了 tf_upgrade_v2 实用程序。

此脚本不会将 TF 1.x 代码转换为 2.0 惯用代码。它基本上使用 tf.compat.v1 模块来实现名称空间发生变化的函数。此外,如果您的遗留代码使用 tf.contrib ,脚本将无法转换它。您可能需要使用额外的库或者使用新的 TF 2.0 版本中缺少的函数。

感谢阅读。

关于解释相关性你需要知道的一切

原文:https://towardsdatascience.com/eveything-you-need-to-know-about-interpreting-correlations-2c485841c0b8?source=collection_archive---------0-----------------------

并非所有的相关性都是表面上看起来的那样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相关性是评估变量之间关系的最广泛使用的统计方法。然而,相关性必须谨慎使用;否则,它可能导致错误的解释和结论。

相关性可能产生误导的一个例子是当您处理样本数据时。因为样本中的明显相关性不一定存在于样本所来自的总体中,而可能只是由于偶然的巧合(随机抽样误差)。这就是为什么相关性必须伴随着显著性检验来评估其可靠性的原因。

此外,在解释关系时,应该注意不要混淆相关性和因果关系,因为尽管相关性表明两个变量之间存在关系,但它并不自动暗示一个变量导致另一个变量(因果关系)。

这篇文章将定义相关性,相关性的类型,解释如何使用相关系数测量相关性,尤其是如何使用显著性检验评估线性相关性的可靠性。如果熟悉相关,可以跳过介绍。

1 —相关性介绍

相关性是一种统计度量,描述两个变量如何相关,并表明当一个变量的值发生变化时,另一个变量倾向于在特定方向上发生变化。因此,我们可以指出一些现实生活中的相关性,如收入与支出、供给与需求、缺勤与成绩下降等。

每个关联都有一个符号和一种形式,符号可以是积极的、消极的或中性的:

  • 正相关:两个变量同向变动(即一个变量随着另一个变量的增加而增加。或者,一个随着另一个减少而减少)。
  • 负相关:两个变量反向运动(即一个变量增加,另一个变量减少,反之亦然)
  • 中性相关:这两个变量相互之间没有关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于相关性的形式,它可以是线性的、非线性的或单调的:

  • 线性相关性:当两个变量以恒定速率变化并满足等式 Y = aX + b 时,相关性是线性的(即,关系必须以直线绘制)。
  • 非线性相关性:当两个变量不以恒定速率变化时,相关性是非线性的。在这种情况下,变量之间的关系不是直线,而是曲线(抛物线、双曲线等)。
  • 单调相关:在单调关系中,变量倾向于以相同的相对方向运动,但不一定以恒定的速率运动。所以所有的线性相关都是单调的,但反过来就不一定了,因为我们也可以有单调的非线性关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2 —相关系数

正如我们在上面的图片中看到的,绘制散点图对于观察变量之间可能存在的相关性非常有用。但是为了用数值量化相关性,必须计算相关系数。

相关系数有几种类型,但最常见的是皮尔逊相关 r 。这是一种参数测试,仅当变量呈正态分布且变量之间的关系呈线性时才推荐使用。否则,应使用非参数 Kendall 和 Spearman 相关检验。

皮尔逊相关系数

皮尔逊相关( r )用于衡量两个变量之间线性关系的强度和方向。数学上,这可以通过将两个变量的协方差除以它们的标准偏差的乘积来实现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pearson’s correlation

r 的值在-1 和 1 之间。相关性为-1 表示完全负相关,而相关性为 1 表示完全正相关。相关性为 0 表示两个变量的移动之间没有关系。

下表展示了如何解释相关系数的大小(强度)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

credits : Parvez Ahammad

3 —显著性检验

使用相关系数量化两个变量之间的关系只能说明问题的一半,因为它只测量了样本中的关系强度。如果我们获得不同的样本,我们将获得不同的值,并因此可能得到不同的结论。

所以我们想得出关于群体的结论,而不仅仅是样本。为此,我们必须进行统计显著性测试**。显著性检验告诉我们,我们在样本中观察到的情况在总体中是否是真实的,并且可以通过假设检验来进行。**

假设检验是统计推断的核心部分。统计推断是根据人口样本对人口进行推断。

在开始假设检验之前,让我们用下面的公式总结一下。

提法

  • 假设我们有一个 n 大小的样本数据,有两个变量 x 和 y。
  • x 和 y 之间的样本相关系数® 是已知的(可以使用上面的公式计算)****
  • x 和 y 之间的总体相关系数ρ(希腊字母“rho”)是未知(因为我们只有样本数据)
  • 目标:我们想根据 r 推断出ρT5 的值****

逐步进行假设检验

假设检验会让我们推断总体相关系数 ρ 的值是接近 0 还是显著不同于 0。我们根据样本相关系数 r 和样本大小 n 来决定。

  • ρ接近 0 :表示总体中 x 和 y 之间没有显著的线性相关性。
  • ρ显著不同于 0 : 表示人群中 x 和 y 之间存在显著相关性。

如果测试显示总体相关系数 ρ接近于零,那么我们说没有足够的统计证据表明两个变量之间的相关性是显著的,即相关性是由于样本中的偶然巧合而发生的,并且它不存在于整个总体中。

所以,事不宜迟,让我们看看如何运行测试:

第一步: 假设规范

我们首先指定无效假设和替代假设:

备择假设总是我们试图证明的,在我们的例子中,我们试图证明在总体中 x 和 y 之间存在显著的相关性(即ρ≦0)**

零假设是我们试图提供证据反对的假设,在我们的例子中,我们试图提供证据反对人口中 x 和 y 之间没有显著的线性相关性的假设(即ρ = 0)

  • 零假设 Ho: ρ = 0
  • 备选假设 Ha:ρ≦*0*

第二步:T 检验

T-test 也称为学生 T-test 是一种推断统计,它允许测试适用于总体的假设,或者简单地说,它允许使用样本数据将假设推广到整个总体。在我们的例子中,它将帮助我们发现 x 和 y 之间的样本相关性对于整个人口是否是可重复的。

我们使用以下公式计算 t 检验的值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用:

  • n 是样本量
  • r 是样本相关系数

t 值越大,相关性可重复的可能性越大。但是多大才算“够大”?这是下一步的工作

第三步: P 值

每个 t 值都有一个 p 值。p 值是零假设为真的概率。在我们的例子中,它表示样本数据中 x 和 y 之间的相关性偶然发生的概率。

p 值为 0.05 意味着您的样本中只有 5%的结果是偶然发生的。p 值为 0.01 意味着只有 1%的机会。因此,较低的 p 值是好的,但“足够低”是多低呢?。

在大多数研究中,我们认为统计显著性的阈值是 p 值为 0.05 或更低,它被称为显著性水平α。因此,我们可以将显著性水平设置为 0.05 (α =0.05),然后求出 P 值。

为了找到 p 值,我们需要两件东西,t 检验值(来自步骤 2)和自由度的数量,可以按如下公式计算 df = n-2(n 是样本的大小)。有了这两个值,我们可以通过下式计算 p 值:

  • 使用软件
  • 通过 t 型表查找

第四步:决定

最后,我们做出决定:

  • 如果P-值小于显著性水平(α =0.05),我们拒绝零假设,支持备选项。我们得出结论,相关性是静态显著的。或者简单的说“我们得出结论,在α水平上,总体中 x 和 y 之间存在线性关系”**
  • 如果P-值大于显著性水平(α =0.05),我们无法拒绝零假设。我们得出结论,相关性是而不是 静态显著。或者换句话说“我们得出结论,在总体中 x 和 y 之间没有显著的线性相关性”**

3 —相关性与回归

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Credits: GraphPad

当研究数值变量之间的关系时,了解相关和回归之间的区别是很重要的。

相关性是一种统计度量,它量化了两个数值变量之间关系的方向和强度。另一方面,回归是一种统计技术,它根据自变量 X 的已知值,通过公式 Y = a + bX 来预测因变量 Y 的值。

参考资料:

  • [mintab.com]:线性、非线性和单调关系
  • [ 打开课本 ]:检验相关系数的显著性
  • janda.org】:相关系数的显著性

推荐系统中图形神经网络的发展

原文:https://towardsdatascience.com/evolution-of-graph-neural-networks-for-recommender-systems-51e24d3b5bd4?source=collection_archive---------12-----------------------

介绍推荐系统中图神经网络的三个进展。

注*:在整篇文章中,我将偏向于时尚背景下的推荐系统。*

随着人工智能热潮在行业中兴起,以及大量公共用户数据可供我们使用,每个公司都希望通过向客户展示/推荐对他们来说似乎很有吸引力的东西来吸引他们,无论是产品还是服务。

从基本的协同过滤和购物篮分析开始,并继续使用矩阵分解的潜在因素模型,如奇异值分解和 PMF,现在已经扩展到更复杂的东西。

让我们分析一个特殊的情况。比方说,我们已经收集了一系列人群的现代流行时尚系列的数据,现在我们必须向他们推荐一套完整的时尚系列(上装、下装、手表和鞋子等)。)或一些单品来完成他们已经存在的时装系列。第一个想法是将时尚项目的一些潜在表示输入到双向 LSTM 中。但是经过进一步的思考,我们意识到 LSTMs 固有的顺序结构成了一个问题,因为不存在固定的项目顺序。套装中不同物品之间的复杂关系,如夹克和鞋子、鞋子和袜子之间的关系等。无法正确学习。

为了克服上述问题,第一个想法是以图形的形式形成某种表示,其中边可以表示被表示为节点的两个项目之间的关系。这就是 GNN(图形神经网络)的用武之地。让我们继续进行这种表示,并根据我们的目的对其进行改进

图形神经网络

GNN 在建模节点之间的依赖关系方面的能力不仅是推荐系统的真正突破,也是社交网络的突破。因此,让我们分析一下 21 世纪第一个十年出现的图形神经网络的基本结构。基本上每个节点都是一个循环单元,灰色的信封表示每个节点的特征。每种边类型都有一个神经网络表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在任意时间步,对于一个给定的节点,我们从邻近的循环单元得到消息,就像在一个线性 RNN 网络中一样,并把它们聚集起来。我们使用 Almeida-Pineda 算法继续学习,该算法通过运行传播到收敛,然后基于收敛的解决方案计算梯度来工作。这样我们就可以独立地得到每个节点的嵌入。然后我们把这些放在一起,连接起来,得到图形的表示。

很明显,一个节点对另一个节点的影响随着它们之间的距离呈指数衰减。所以我们可以说,它很难在一张图中长距离传播信息。因此,门控图神经网络(GGNN)来克服这个问题。

门控图形神经网络

顾名思义,主要的变化是我们使用 GRUs(门控递归单元),因此我们让递归在一定数量的时间步长内发生,同时通过时间反向传播,而不是使用经典的 Almeida-Pineda 算法。

节点注释首先被复制到隐藏状态的第一个组件中,其余的用零填充。图的不同节点之间的消息流通过具有取决于边类型和方向的参数的输入和输出边来处理。然后使用隐藏状态和注释,GRU 风格的更新发生。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是仍然在 GGNN 中,节点通过以固定的方式在边上传递它们的状态信息来与其他节点交互,这导致了它难以对灵活和复杂的节点交互进行建模的限制。因此,节点式图形神经网络应运而生。

节点式图形神经网络

NGNN 的目标是用节点参数对边缘交互进行建模。NGNN 中的每个节点对应一类服装物品。

记住不同类之间的交互,初始化不同类之间的边。从 a 到 b 的边具有与在时尚集合中找到给定 b 的概率成比例的权重。对于每一项,我们都找到了特征,它们被用来更新相应类节点的初始状态。

为了克服 GGNN 的问题,我们维护两个不同的权重矩阵**,分别对应于每个节点的输入和输出**,不像 GGNN 中所有边都有一个公共的权重矩阵。该输入输出权重用于寻找图中任何边的变换函数。除此之外,传播与 GGNN 相同。

在 T 个传播步骤之后,我们可以获得节点的最终状态,这也是最终的节点嵌入。

在此之上,添加了一个注意机制,以计算出集合中不同项目的兼容性。例如,一双 袜子与一套包含人字拖的时装不兼容。由于一个节点从其他节点接收状态信息,这种注意机制很容易被合并。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A simple graph. The areas of circles and the widths of the links are proportional to the number of fashion items in the corresponding categories and the co-occurrence frequency between categories.

我参考的一些令人惊叹的论文和视频—

  1. 图形神经网络:方法与应用综述
  2. 门控图序列神经网络微软研究论文
  3. 门控图序列神经网络视频作者讲解
  4. 整体着装:基于节点图神经网络的服装兼容性学习

机器翻译的发展

原文:https://towardsdatascience.com/evolution-of-machine-translation-5524f1c88b25?source=collection_archive---------15-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1949 年,洛克菲勒基金会的研究员沃伦·韦弗提出了一套基于机器翻译的建议,这些建议是基于信息论和第二次世界大战期间密码破译的成功。

几年后,机器翻译研究在美国许多大学开始认真进行。正如哈钦斯报告所描述的,1954 年 1 月 7 日,乔治敦-IBM 实验开始,IBM 701 计算机有史以来第一次自动将 60 个俄语句子翻译成英语。这是机器翻译系统的首次公开演示,引起了媒体和公众的极大兴趣。

ALPAC 报告指出,机器无法与人工翻译质量竞争,并建议停止对机器翻译的资助。但是几名研究人员继续研究如何使用机器来创建自动化语言翻译。这些研究大多集中在有限的语言对,有限的输入和基于规则的引擎。到 20 世纪 80 年代,大量依赖大型机技术的机器翻译引擎投入使用,如 SYSTRAN、Logos 等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

统计机器翻译

布朗等人。al (1990) 提出在机器翻译中使用统计方法。他们提出了一种翻译过程,其中将源文本划分为一组固定位置,然后使用词汇表选择固定位置集来创建序列,最后重新排列目标固定位置中的单词以形成目标句子。他们成功地开发了自动词汇表创建和目标单词序列排列的统计技术,但未能提供翻译句子的示例。

布朗等人。al (1993) 描述了翻译过程的五个统计模型,并给出了在给定一组双语句子对的情况下估计这些模型参数的算法。这些模型后来被认为是 IBM 校准模型。他们定义了一对双语句子之间的逐字对齐的概念。他们的算法为任何给定的句子对的每一个逐字对齐分配了一个概率。虽然他们的研究仅限于较小的英语和法语翻译,但这对句子中的单词间关系的对齐是一个相当大的改进。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

沃格尔等人。al (1996) 描述了一种使用一阶隐马尔可夫模型的统计机器翻译中的单词对齐的新模型,因为它解决了语音识别的时间对齐问题。该模型背后的主要思想是使逐词对齐概率取决于对齐位置而不是绝对位置。基于 HMM 的模型产生与混合对齐模型相当的翻译概率,并且在基于 HMM 的模型中位置对齐更加平滑。

Och et。al (1999) 描述了一种确定用于统计机器翻译的双语词类的方法。他们开发了一种基于最大似然法的优化标准,并进一步描述了一种聚类算法。他们的实验结果表明,双语词类的使用显著改善了统计机器翻译。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于句法的统计翻译模型是由 Yamada 等人提出的。艾尔(2001) 。他们的模型通过在每个节点应用随机操作,将源语言解析树转换成目标语言字符串。这些操作捕捉到了语言上的差异,如词序和大小写标记。该模型产生的单词排列比 IBM Model 5 产生的单词排列更好。

Koehn 等人提出了一种新的基于短语的翻译模型和解码算法。al(2003) 这使得他们能够评估和比较几种先前提出的基于短语的翻译模型。他们设计了一个统一的框架来比较不同的其他翻译模型。科恩等人提出的模型。al(2003)基于噪声信道模型 Brown 等人。al(1993)和他们使用贝叶斯规则来重新表述将法语中的外国句子翻译成英语的翻译概率。

蒋等人。al(2005) 提出了一个基于短语的机器翻译模型,该模型使用分层短语——包含子短语的短语。他们建议使用由单词和子短语组成的分级短语来解决这个问题。他们的模型基于加权同步上下文无关文法。该模型使用分层短语构建部分翻译,然后在标准的基于短语的模型中连续组合它们。他们没有使用传统的噪声信道方法,而是使用了更通用的对数线性模型。

神经机器翻译

2013 年,Kalchbrenner&blun som(2013)提出了一种新的用于机器翻译的端到端编解码器结构。他们引入了一类称为循环连续翻译模型的概率连续翻译模型,该模型完全基于单词、短语和句子的连续表示,不依赖于对齐或短语翻译单元。

Sutskever et al.(2014) 提出了使用深度神经网络依次进行机器翻译的序列学习。他们的方法使用多层长短期记忆(LSTM)将输入序列映射到固定维度的向量,然后使用另一个深度 LSTM 从向量中解码目标序列。他们的结果表明,具有大深度 LSTM 和有限词汇的神经机器翻译系统可以胜过标准的基于 SMT 的系统。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

秋等人。al (2014) 提出了一种新的神经网络模型,采用两个递归神经网络(RNN)作为编码器和解码器。一个 RNN 将符号序列编码成固定长度的向量表示,而另一个将该表示解码成另一个符号序列。他们的结果表明,RNN 编码器-解码器能够捕捉短语的语义和句法结构。

巴赫达瑙等人。al (2014) 提出了一种方法,该方法允许模型自动软搜索源句子中与预测目标单词相关的部分,而不必将这些部分显式地形成为硬段。通过这种方法,他们在英语到法语的翻译任务中获得了与现有的最先进的基于短语的系统相当的翻译性能。

Luong 等人。al (2015) 提出了两种有效的注意机制,一种是始终关注所有源词的全局方法,另一种是每次只关注源词子集的局部方法。他们使用不同注意力架构的集成模型在 WMT 的 15 英德翻译任务中建立了一个新的最先进的结果,25.9 BLEU 点。

Jozefowicz 等人。al (2016) 在不同规模的语料库上对不同的神经网络模型进行了实验,他们的实验表明,RNNs 可以在大量数据上进行训练,并且它们优于包括精心调整的 N-grams 在内的竞争模型。他们的实验表明,大型正则化 LSTM LM(具有投影图层,并使用具有重要性采样的真实 Softmax 的近似值进行训练)的性能比 N 元模型好得多。

在第一届机器翻译会议(WMT’16)的研究结果中,参与 WMT 评估的神经机器翻译系统比基于短语的统计机器翻译系统高出多达 3 BLEU 评分( Bojar 等人。al 2016

菲利普·科恩写道,“神经机器翻译(NMT)是一种令人兴奋和充满希望的机器翻译新方法。然而,尽管这项技术很有前途,但我们仍有一段路要走,才能在所有用例中与基于规则的机器翻译(RBMT)和统计机器翻译(SMT)相媲美。一些业内人士最近声称,我们所有人都即将达到接近人类的质量,这可能有点过于简单化了。”。他认为,即使神经机器翻译系统产生了高质量的结果,也很难在工业规模上实现这种系统,因为它需要在处理翻译的基础设施上进行巨额投资。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谷歌的神经机器翻译

吴等(2016) 提出了一个遵循通用序列间学习框架的模型 Sutskever 等(2014) 注意 Bahdanau 等。铝(2014) 。该模型由三部分组成:编码网络、解码网络和注意网络。编码器网络将源句子转换成向量列表,每个输入符号一个向量。当这个向量列表被传递到解码器网络时,它一次产生一个符号,直到遇到特殊的句尾符号(EOS)。编码器和解码器通过注意模块连接,注意模块允许解码器在解码过程中关注源句子的不同区域。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

吴等(2016) 架构描述如下。左边是编码器网络,右边是解码器网络,中间是注意力模块。底部的编码器层是双向的:粉色节点从左到右收集信息,而绿色节点从右到左收集信息。编码器的其他层是单向的。剩余连接从编码器和解码器中倒数第三层开始。该模型被划分为多个 GPU 以加速训练。在他们的设置中,有 8 个编码器 LSTM 层(1 个双向层和 7 个单向层)和 8 个解码器层。通过这种设置,一个模型副本被分成 8 个部分,并放置在通常属于一台主机的 8 个不同的 GPU 上。在训练期间,底部双向编码器层首先并行计算。一旦两者都完成,单向编码器层开始计算,每个都在单独的 GPU 上。为了在运行解码器层期间保持尽可能多的并行性,他们仅使用底层解码器层输出来获得循环注意上下文,该上下文被直接发送到所有剩余的解码器层。softmax 层也被分区并放置在多个 GPU 上。根据输出词汇的大小,他们要么让它们在与编码器和解码器网络相同的 GPU 上运行,要么让它们在一组单独的专用 GPU 上运行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他们的解码器网络实现为 RNN 网络和 softmax 层的合并。解码器 RNN 网络为要预测的下一个符号创建隐藏状态,然后通过 softmax 层生成候选输出符号的概率分布。在他们的实验中,作者发现神经机器翻译系统必须具有用于编码器和解码器网络的深度 rnn,以实现良好的准确性,它们需要捕捉源语言和目标语言中的微小不规则性。他们在研究中实施的注意力模型类似于 Bahdanau 等人。铝(2014)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

吴等(2016) 承认了这样一个事实,即简单地增加更多的层会使网络更慢且难以训练,可能是由于爆炸和消失梯度问题。他们在堆栈中的 LSTM 层之间引入了剩余连接。剩余连接极大地改善了反向传递中的梯度流,这允许他们用 8 个 LSTM 层来训练他们的编码器和解码器网络。他们将双向连接用于底部编码器层,同时保持其他层单向连接,以在计算过程中实现最大的并行化。

Wu et al (2016) 使用两个公开可用的语料库 14 的英语到法语和英语到德语作为他们的神经机器翻译系统的基准。除了这些公开可用的语料库,他们还使用了谷歌的翻译产品语料库,对于给定的语言对,这个语料库比 WMT 语料库大得多。WMT En- > Fr 包含 36M 个句子对,而 En- > De 包含 5M 个句子对。他们通过与标准 BLEU 评分标准一起进行并排的人类评估来评估他们的模型。并列评分从 0 到 6 不等,0 分表示“完全无意义的翻译”,6 分表示“完美的翻译:译文的意思与原文完全一致,语法正确”。他们使用在 TensorFlow 中实现的系统来训练模型。他们在实验中使用了基于单词、基于字符、基于混合字符和几种不同词汇量的单词模型。表格总结了他们在 WMT En - > Fr 数据集上取得的结果。他们的最佳型号 WPM-32K 获得了 38.95 的 BLEU 评分。WMT En - > De 比 En- > Fr 要困难得多,这是因为训练数据的规模更小,并且德语是一种形态更丰富的语言,需要词汇作为单词模型。他们最好的型号 WPM-32K 取得了 24.61 的 BLEU 分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他们进一步使用 RL 训练来微调正常最大似然训练后的句子 BLEU 分数。他们集成了 8 个 RL-refined 模型,并在 WMT En->Fr 数据集上获得了 41.6 BLEU 点的最先进结果。他们在 WMT En->De 数据集上获得了 26.30 BLEU 点的最新结果。这四个翻译是:1)从 statmt 网站下载的最佳基于短语的翻译,2)8ML 训练的模型的集合,3)8ML 训练然后 RL 精炼的模型的集合,以及 4)直接从测试数据获得的参考人类翻译。结果显示在表中。实验结果清楚地表明,尽管 RL 细化可以获得更好的 BLEU 评分,但它几乎没有改善人们对翻译质量的印象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谷歌的 NMT 是机器翻译的最新水平。

如需 www.ibidemgroup.comT2 的西班牙语翻译或西班牙语翻译,请点击此处。

数据时代传统统计检验的演变

原文:https://towardsdatascience.com/evolution-of-traditional-statistical-tests-in-the-age-of-data-326300caa65a?source=collection_archive---------25-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于研究/学术起源的显著性测试与基于数据科学和分析的更动态应用角色的显著性测试之间的差异

让我们从统计学中显著性检验的简单定义开始。

统计显著性测试表明所观察到的感兴趣变量的差异(不同样本/组之间)是否表明了一些真正的差异(通常在应用了一种处理方法之后),或者这些差异是否仅仅是由于偶然因素/采样误差。

定义显著性检验的方法还有很多。所有的人或多或少都在说同样的话。

注意: 这不是掌握显著性检验的教程。外面有很多这样的人。这是在更多基于研究/学术领域的显著性测试中使用的不同方法的概述,因为它仍然在大学课程中教授(至少在我的经验中),而不是在数据科学和分析的更多基于应用的领域中的演变。希望这篇文章也能表明,不完全熟悉前者并不影响一个人与后者合作的能力。

序言

假设我有一个改变的想法。这种改变可能是一种向高中生教授数学的新方法,我相信这将有助于他们在 AP 考试中取得更好的成绩。这种变化可能会使我的电子商务网站的登录页面看起来略有不同,我相信这会导致访问者在我的网站上花更多的时间。不管是什么想法,我需要一种方法来测试它是否会引发我认为会发生的变化。

继续以电子商务网站为例,我随机挑选访问者并将他们分成两组,A 组和 B 组。我向 A 组(这是我的对照组)的访问者展示旧的登录页面,向 B 组(这是我的治疗组)的访问者展示据称是新的和改进的登录页面。然后我测量每组访问者在我的网站上花费的平均时间,你瞧!B 组访问者在我的网站上停留的平均时间高于 A 组访问者!

现在,我需要做的就是排除这种由于偶然发生的群体间花费在我的网站上的平均时间的差异的可能性。可能我的新页面与这种差异没有任何关系,我只是运气好,不管登陆页面看起来怎么样,我都分配了平均会在我的网站上花更多时间的访问者。

输入显著性测试

显著性检定

在我们讨论进行显著性测试的不同方法之前,重要的是要记住我们感兴趣的变量不是每个访问者在我们网站上花费的时间,甚至不是每组访问者在我们网站上花费的平均时间。这是 A 组和 b 组的访问者在我们网站上停留的平均时间的差异,这是一个叫做我们的测试统计的小东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Our Test Statistic

现在我们已经准备好了,来看看我们两组之间的平均时间差异是否是偶然发生的。为此,我们需要进行一个显著性测试,这需要经历以下一般步骤

  • 宣布零假设:这只是我们假设自己错了的一种奇特说法。在我们的例子中,这意味着假设我们的登陆页面对访问者在我们网站上停留的时间没有影响。我们的差异只是由于一个幸运的样本,而 A 组和 B 组访问者在我们网站上花费的平均时间之间的真正差异应该是 0。
  • 模拟零假设下的数据收集:这里我们需要创建一种假设现实,其中零假设为真。在这个现实中,A 组和 b 组的访客在平均时间上没有区别。我们需要查看我们在这个现实中收集的数据,这就是问题所在—
    这是这个假设现实的创造,其中基于研究/学术的方法与你可能在数据科学和分析应用中看到的更注重计算的方法分道扬镳。
  • 计算 P 值:最后,我们计算当我们收集数据时,我们最初观察到的一个测试统计数据出现极端情况的概率。我们在假设的现实中这样做,其中零假设为真,以计算 me 偶然看到我们的结果的频率。这是我们的 p 值。

传统方法

t 检验是一种非常常见的方法,用于进行涉及均值差异的显著性检验。t 测试已经存在很长时间了,远在计算机成为主流之前。因此,在缺乏我们习以为常的便捷计算能力的情况下,我们如何模拟零假设下的数据收集呢?很简单,我们使用一个定理,并基于它做一个假设。

输入中心极限定理

特别是,传统方法使用 C **中心极限定理的含义。**用最通俗的术语来说,中心极限定理表明

如果我 从一个总体中反复抽取样本并取每个样本的平均值,那么给定足够的样本,所有那些 意味着 将遵循一个近似的 正态分布 而不管总体本身遵循的分布

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Visual Representation of The Central Limit Theorem

统计理论还指出,任何正态分布的线性组合也是正态分布的。使用这些信息,我们可以假设如果(我不会真的去做)我会一遍又一遍地重复进行我的实验,并从两组访问者那里收集我的测试统计数据,那么我所有的测试统计数据将会遵循一个近似正态分布。不需要很大的计算能力,因为我实际上没有一遍又一遍地做实验。我在假设如果我做了,我会看到什么样的分布。现在有了这个假设,我可以继续从我的测试统计量中计算我的标准化** t 统计量,以获得零假设下我的观察值的 t 得分。**

注意: 现在我确信 你们中的一些人可能会奇怪为什么我们不计算 z 统计量来获得 z 得分,因为这是我们标准化正态分布时得到的结果。其原因是,为了获得标准正态分布和 z 值,我们需要总体标准差,但我们也不知道。我们只知道我们收集的 A 组和 B 组两个样本的标准差。因此,在没有总体标准偏差的情况下,为了处理样本标准偏差,我们将使用正态分布的近似值,称为具有不同自由度的 t 分布,因此也就是 t 得分。有趣的事实是,我们的自由度越高(取决于我们的样本大小),我们就越接近标准的正态分布(当然是渐近分布)。

下面是计算 t 统计量的公式。这个小公式是在零假设下得出的,即每个样本的真实总体均值没有差异(在我们的例子中,这意味着每组访问者在我们网站上花费的平均时间是相同的)。也就是说,它们的差值为 0,这正是我们试图得到 t 统计量的假设(我们的假设现实还记得吗!)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

T-statistic under the null hypothesis

我们只需插入现有的值,然后弹出我们的 t 统计量。X1 是我的治疗组的样本平均值,X2 是我的对照组的样本平均值,S 是样本标准偏差,n 是样本大小。

一旦我们有了 t 统计量,我们所要做的就是用适当的自由度查看它在 t 分布曲线上的位置,并计算看到如此极端结果的概率,这将是我们的 p 值。

自由度的计算只需使用我们的样本大小,方法如下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Degrees of Freedom Calculation

让我们假设,对于我们的电子商务网站,我们的 t 统计量约为 2.39,基于我们的样本大小,我们的自由度等于 60。从这里开始,我甚至不需要计算器来计算我的 p 值。我可以使用一个简单的 t 分布查找表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Look up table for the t-distribution

根据该表,在下面曲线的右尾下的面积,是在零假设下,看到均值差异至少与我们在实验中观察到的差异一样极端的概率,偶然约为 1%。换句话说,我们的 p 值是 0.01

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Area under the curve for a one-sided t-test

现在,我们可以使用这个结果来拒绝零假设,并得出结论,我们的新页面确实有助于增加每个访问者在我们网站上花费的时间,或者我们可以得出结论,我们看到我们的原始结果是偶然的。通常在大多数研究/学术领域,你会看到 p 值低于 5%意味着我们可以拒绝零假设,这就是我们的例子。

这里有一个小的统计迷因去它,给你。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算/当代方法

如果在宣布零假设后,我们有办法在零假设下模拟我们实验的结果很多次(记住,是为了创造我们的假设现实),这样我们就不必依赖于定理、假设和标准正态分布的近似值来告诉我们,如果我们真的重复实验很多次,我们会看到什么。

输入计算机

幸运的是,与过去不同,我们有计算能力在几秒钟内对实验结果进行数十万甚至数百万次的重新采样。手工做起来不太容易甚至不可行的事情,尤其是在计算机出现之前的时代。

这意味着,使用某些有效的重采样技术,我们可以模拟我们的假设现实,而不依赖于任何定理、正态性假设,也不必考虑我们对总体标准差的了解。

回到我们的两个组的例子,A 组(对照组)和 B 组(治疗组),我们可以使用某些简单的重采样技术来模拟零假设下的数据收集。

假设我们有两组数组。A 组是一个数组,其中包含每个被展示旧登录页面的访问者在我们的网站上花费的时间。类似地,B 组是一个数组,显示了每个被展示了新登录页面的访问者在我们网站上花费的时间。假设这两个数组的大小都是 31。我们还可以说,当我们进行实验时,我们发现 B 组的访问者在我们的网站上花费的平均时间比 a 组的访问者多大约 30 秒。为了在零假设下刺激数据收集,我们需要创建两个数组的平均值没有差异的条件。下面介绍两种重采样技术如何实现这一点。

排列重采样

  • 将两个数组连接成一个大数组。对于我们来说,这应该是 62,因为我们的两个数组都是 31。
  • 打乱整个数组,所以现在每个组的观察值随机分布在整个数组中,而不是从中间分开。
  • 从中间任意分割数组,将数组的前 31 个索引中结束的观察值分配给 B 组,其余的分配给 a 组。
  • 从新组 b 的平均值中减去这个新组 A 的平均值。
  • 这将给我们一个排列测试统计。

这是一个排列重采样的可视化展示—

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Assume Observations 1,2,3,4 originally belonged to Group A and observations 5,6,7 originally belonged to Group B

通过混合两种样本,然后将它们混在一起,我们消除了它们分布的差异。我们创造了我们的假设现实,他们来自同一个群体,没有使用任何定理或衍生的标准化统计。

我们重复上述步骤数十万次,并计算数十万个排列测试统计。然后,我们简单地看一下,在我们计算的总排列测试统计数据中,我们计算的排列测试统计数据的比例至少与我们在 30 秒内的原始差异一样高。瞧啊。这是我们的 p 值。不需要近似的正态分布或查找表。

自举重采样

Bootstrap 重采样就是通过替换从分布中进行重采样的过程。这意味着我们可能会对一个值进行多次重采样,对多个值进行多次重采样,对没有值的情况进行多次重采样,甚至可能会有一些值从未出现的样本。一切都很好。这是一个自举重采样的可视化展示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3 different bootstrap resamples from the same sample

在我们开始进行 bootstrap 重采样之前,我们仍然需要为我们的零假设创造条件,以便在。我们可以通过以下步骤做到这一点—

  • 考虑具有 B 组(治疗组)观察值的阵列
  • 从数组中的每个元素中减去 B 组的平均值
  • 将 A 组(对照组)的平均值加到数组中的每个元素上。这是我们的新数组,有一个移动的平均值。
  • 从此数组中取出相同大小的引导程序重新采样。
  • 计算该引导重采样的平均值与 A 组(对照组)观察值的原始阵列平均值的差值
  • 这将给我们一个自举测试统计

在这里,我们简单地将 B 组在我们的网站上花费的平均时间更长的观察结果转移到 a 组,再次创建我们的现实,其中这两个数组具有相同的平均值,以收集数据。然后,我们从这个移位的数组中取出几十万个自举重采样,以计算几十万个自举测试统计,其余的与我们对置换重采样所做的相同。我们简单地计算我们收集的总的 bootstrap 统计数据中 bootstrap 统计数据的比例,该比例至少与我们获得 p 值的 30 秒原始差值一样高。同样,不需要近似的正态分布或查找表。

摘要

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

有大量的资源可以帮助你掌握显著性测试及其相关概念。这也可能意味着,当你在不同的方法、教程和指南中导航,以决定你想专注于哪一个时,有时很容易感到困惑。希望这篇文章能让你对显著性测试的本质有一个好的认识,以及在两个领域实现其目标的不同方式。在显著性检验中有许多相关的重要概念,如 I 型误差、II 型误差、效应大小、功效…等等,我没有涉及,但你会发现,无论你决定把重点放在资源和应用,现在你知道区别。快乐学习。

如果我遗漏了什么,或者有什么不准确的地方,或者如果你有任何反馈,请在评论中告诉我。我将非常感激。谢谢你。

自然语言处理中文本表示的演变

原文:https://towardsdatascience.com/evolution-of-word-representations-in-nlp-d4483fe23e93?source=collection_archive---------32-----------------------

在自然语言处理的背景下,文本的表达是如何发展的,每种方法的优点是什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Conor Luddy on Unsplash

信息可以用多种方式表示,同时保持相同的含义。我们可以通过多种语言传递信息,我们可以用数学表达式或图画来表达一些东西。我们选择更适合传达我们想要传递的信息的表征。在自然语言处理中,我们必须将文本数据转换成机器可以处理的东西。数字!有许多方法可以实现这种转换。一个简单的方法是给文本中的每个单词一个特定的 id。但是,并不是所有的表示都是相同的,有些表示比其他表示更复杂,携带的信息更多,这将影响 NLP 模型的性能。

凭借当今的计算能力,我们有能力构建能够执行非常复杂的任务和处理大量数据的 ML 模型。我们想给我们的模型提供尽可能多的信息。

一键编码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source :(Marco Bonzanini, 2017)

最简单的表示形式之一是一键编码。它们将一个单词转换成一个 N 维的向量,向量中充满了 0 和一个 1 的单个(热)位置。

向量是正在使用的字典的大小,每个位置代表一个单词,带有 1 的位置代表单词向量所映射的单词。这个概念很简单,并且在 NLP 的早期阶段使用过。它很便宜,只需要很少的计算能力就可以将文本数据转换成一个热编码数据,并且很容易实现。

但是,它没有携带任何关于数据的额外信息,是一种极其臃肿的表示。这种表示只是一大堆识别单词的 1 和 0,NLP 模型需要从零开始学习每个向量的意思。

一袋单词

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image source

单词包是一种简化的表示,它将文本表示为一个多重集(包)。文本被转换成字典大小的向量,每个索引代表一个单词,索引处的值是该单词在文本中出现的次数。表象背后的直觉是,词语本身携带着理解所需要的信息。

但是,并非每个句子都是如此。句子中单词的顺序可能会改变它的意思。单词包不考虑句子的顺序,这是它不如单词嵌入强大的原因之一。它也没有给出每个单词意味着什么的任何信息,模型被给予很少的先验知识。

单词嵌入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Source

单词嵌入是单词到向量的映射。

一个单词被转换成一个 N 维的向量,其中每一维都有一个潜在的含义。单词与这些潜在含义的关系将定义维度的值。

二维的单词嵌入可以如下映射单词:

男人→ [0.85,0.05 ]

狗→ [ 0.9,0.1 ]

苹果→ [ 0.12,0.9 ]

香蕉→ [0.06,0.95 ]

猕猴桃→ [ 0.48,0.56 ]

在这个例子中,我们注意到第一维对于狗和人有一个高值,而第二维对于苹果和香蕉有一个高值。这可能意味着第一维与动物有关,第二维与水果有关。还要注意 kiwi 在两个维度上都有一个中间值。

二维空间太小了,不足以表达单词的意思,除非我们想要一种嵌入的方式来提供不同于动物的水果。嵌入通常有 50、300、600 或 900 个维度。

嵌入的魔力。

嵌入本身是非常令人惊奇的,可以做一些可爱的把戏。

我们可以想象,在嵌入中,“男人”和“女人”这两个词的表征之间的差异是一个解释性别差异的值。“国王”和“王后”也是如此。因此,我们知道:

——=——

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www.tensorflow.org

因此,如果我们有“男人”、“女人”和“男孩”的向量,我们可以预期 + — 将产生。这意味着单词嵌入的维度学习单词的意思,并且能够辨别“女人”和“男人”代表相似的实体。

如何训练一个单词嵌入?

单词嵌入通常是通过用大语料库在无监督的任务中训练模型来产生的。比如试图预测句子中缺失的单词。

训练嵌入在计算上是昂贵的。对于大多数问题,下载可用的经过训练的嵌入是最好的选择。如果你的语料库过于具体(例如。有很多行话)你可能想训练自己的嵌入。

正如我们在单词 kiwi 的例子中看到的,嵌入不知道如何处理有多重含义的单词。嵌入会将含义平均到单个向量中,在数据集上出现频率较高的含义会获得较高的权重。

单词嵌入也达不到它以前从未见过的单词,如新词、拼写错误和词汇以外的单词。

扩展嵌入

为了补救单词嵌入的一些问题,目前大多数流行的模型通过分成“特征”来标记单词,并使用这些特征而不是单词本身来训练嵌入。

记号赋予器可以将单词“google”分成“goog”和“le ”,嵌入将学习这些特征。它可能会对过去分词中的动词做类似的事情,例如:’ watched’ → 'watch ‘,’ ed '。现在,假设单词“googled”不在嵌入的训练集中。记号赋予器可以将单词分割成特征:“goog”、“le”、“ed”,所有这些特征嵌入之前都见过,并且每个特征都有适当的特征向量。因此,嵌入即使以前没有见过这样的单词,它仍然可以给它一个很好的表示。

这种直觉可以应用于拼写错误、新词和词外词汇,并且极大地提高了词嵌入的性能。

结论

复杂的单词表示是给 NLP 模型更多先验知识的一种廉价方式,对于数据稀缺且难以收集的任务非常有用。由于这个原因,我们看到了一系列越来越复杂的单词表示法。

单词嵌入非常强大,在 NLP 中已经无处不在。我们探索了单词嵌入和更原始的单词表示背后的一些直觉,我们看到了为什么一些可能比另一些更有利。

人工智能的进化方法:过去、现在和未来

原文:https://towardsdatascience.com/evolutionary-approaches-towards-ai-past-present-and-future-b23ccb424e98?source=collection_archive---------5-----------------------

达尔文主义能给 AI 带来革命吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Open environments and competition among species are two driving forces of Darwinian evolution that are largely absent in recent works on evolutionary approaches toward AI models. Within a given generation, faster impalas and faster cheetahs are more likely to survive (and reproduce) than their slower counterparts — leading to the evolution of faster and faster impalas and cheetahs over time. Can these and other principles of genetics and natural selection guide us towards major advances in AI?

目录

  • 简介
  • 遗传和自然选择
  • 进化计算
  • 进化策略
  • 采用直接编码的遗传算法
  • 采用间接编码的遗传算法
  • 开放式(这才是真正有趣的地方!)
  • 还缺什么?
  • 结论
  • 参考文献

介绍

自大约 2012 年[1]以来,人工智能的爆炸式增长几乎完全由反向传播(backprop)训练的神经网络(深度学习)模型驱动。这包括图像分类、自动语音识别、语言翻译、机器人和可以玩单人或多人游戏的自主代理的模型。

然而,正如在生物学中所观察到的,越来越多的模型是使用基于进化方面的方法构建的。这种方法出现在深度学习时代之前,但直到最近才被扩大到可以与反向训练的深度学习模型相竞争的程度。

在这篇博文中,我们讨论了其中的一些进化方法,将它们与生物进化和有机体发展进行了比较和对比,并推测它们如何最终带来比传统深度学习模型具有更大(或更多)能力和能效的人工智能模型。

遗传学和自然选择

简而言之,达尔文的理论认为进化是由被自然选择放大的特征的微小变化驱动的。与具有有害特征的生物相比,具有有益特征的生物更有可能繁殖,从而将这些特征传递给后代。

达尔文不知道特征是如何从父母传递给后代的(这让他的见解更加令人印象深刻),但我们现在知道生物体的基因型及其发育环境决定了其表型(身体和行为特征)。一般来说,新的基因型通过父母 DNA 的随机突变、来自多个父母的基因混合(有性生殖)或两者而出现在后代中。

进化计算

科学家对生物进化的理解产生了受进化启发的计算优化模型。其中最简单的是进化策略。在遗传算法中发现了更大和更多样的建模复杂性。在这两种情况下,目标都是优化一个适应度函数,该函数旨在测量人工有机体在某些特定任务上的表现。另一种方法是放弃适应度函数,转而利用一个或多个物种的多个智能体的丰富、开放的环境,其中智能体只为生存和繁殖而竞争。

进化策略

进化策略是一类优化算法,其中,在每次迭代(世代)中,参数向量(基因型)的群体被扰动(突变),并且它们的适应函数值被评估[2,3]。然后,最高得分的参数向量被重新组合以形成下一代的种群,并且该过程被重复,直到目标被完全优化。在协方差矩阵自适应进化策略(CMA-ES)中,模型参数的分布由协方差矩阵表示。在每一代中,个体代理的模型参数从分布中提取。在确定了哪些代理具有最高的适合度分数之后,基于那些最佳代理的参数值来更新协方差矩阵。想要一个很棒的二维可视化,请看这篇很棒的 Otoro 博客文章

尽管这种方法很简单,但有时它可以与用强化学习方法训练的相对现代的大规模深度学习模型竞争,如 OpenAI [4]所示,并在这篇帖子中描述。进化策略方法相对于强化学习方法具有一些好的特性,因为进化策略易于实现并跨核心/CPU 扩展,模型训练快速,并且该方法不利用梯度(当使用基于梯度的方法时,对具有离散输出的任务的训练是困难的)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Above are a few videos of 3D humanoid walkers trained with evolution strategies by OpenAI (videos taken from their blog post). Results have quite a bit of variety, based on which local minimum the optimization ends up converging into. As will be noted later in this post, however, none of movements look very natural in contrast to those of biological animals, some of which begin fluid walking and running within minutes or hours after birth.

直接编码的遗传算法

虽然术语遗传算法可能被不同的研究者和从业者以不同的方式使用,但是我们在这里以非常一般的方式使用它。在每一代中,算法:(1)基于适应度函数从大小为 P (N < P)的群体中选择前 N 个代理,(2)通过从这些顶级代理单独(无性)或成对(有性)繁殖产生新一代代理,以及(3)在繁殖期间,后代基因通过突变、交叉(混合两个伙伴父母的基因)或两者而变化。

进化策略和遗传算法之间的另一个区别是,在进化策略中,群体的基因组由概率分布来表示。典型地,这意味着在给定世代中群体的所有成员将在参数(基因组)空间内的单个聚类中被发现。相比之下,在遗传算法下,对种群没有这样的约束。然而,在实践中,除非环境或额外的算法组件促进种群多样性(在这种情况下,可能出现多个“物种”),否则单个种群集群通常会进化。

在遗传算法的许多应用中,基因型到表现型是直接的,这意味着每个基因直接编码代理模型的一个参数。事实上,基因及其表型表达可能是相同的,例如,代表深度学习模型中的权重或偏差项的数值。如上一节所述,使用进化策略训练的模型使用直接编码。

相比之下,生物学是基于间接编码的。例如,由 DNA 组成的基因并不直接编码大脑神经元之间突触的强度。相反,它们为蛋白质编码,这些蛋白质共同发挥作用,实现大脑(及其突触)的发展,并根据有机体的经验学习突触增强或减弱的规则。我们将在下一节回到人工智能的间接编码的例子。

2017 年,Ken Stanley 和 Jeff Clune——进化神经网络参数的“神经进化”方法的长期倡导者——展示了直接编码的遗传算法在众多 Atari 游戏中表现良好的潜力,包括难以通过强化学习(Q-learning 或策略梯度)解决的游戏[5]。他们在优步人工智能实验室的团队使用了一种简单的遗传算法,通过向父网络的参数添加高斯噪声,将基因突变引入无性繁殖的后代。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

In addition to evolving agents to play Atari games, the team from Uber AI Labs evolved agents to complete a relatively simple maze, albeit one with two different “traps.” Agents trained with an evolution strategy (ES) consistently get stuck by Trap 1 and never evolve further. Agents trained with a genetic algorithm (GA) do better, but get stuck in Trap 2. When agents are chosen for reproduction based not only on their fitness score but also their display of novel behaviors (GA-NS), the species ultimately evolves the ability to complete the maze. Agents trained with two different reinforcement learning methods (A2C and DQN) do not learn to complete the maze.

优步团队还额外检验了奖励表现出新奇行为的代理人(允许他们繁殖)的效果。他们证明,尽管这样的代理人通常在传统的适应度函数上得分很低,但随着时间的推移(几代人),这种方法使整个人群受益。为行为新颖性赋值的遗传算法是一种质量多样性算法【6】,这种算法是一个活跃的研究领域。这种观点认为,在整个种群中维持一个多样化的行为库提供了一个新的、更复杂的行为库,这些行为可能会产生有益于后代有机体的新的、更复杂的行为,尽管复杂行为所基于的更简单的行为的价值很小甚至是负面的。【请注意,这在很大程度上是一种启发式方法,因为尚不清楚什么样的自然力会促进“无价值”行为表型的跨代保留。 ]

另外,优步团队使用了一种创造性的有效方法来保留数千个大型代理的基因型(每个代理有数百万个神经网络参数)。也就是说,他们保存了一份记录,记录了用于创建最初一代代理的随机数生成器种子,以及用于创建每组突变的种子。因此,可以从种子向量中重新创建单个代理,并且可以这样存储代理,而不是直接存储代理的模型参数。

间接编码的遗传算法

一般来说,利用间接编码模型的遗传算法没有直接编码模型成功(在现代大规模问题上)。尽管如此,间接编码模型可能被证明是非常强大的,因为它们有可能对复杂的、精密的模型进行紧凑的编码。例如,虽然一个生物体中的一组基因可能是固定的,但基因的蛋白质产物可以以组合的方式跨越时间和空间(在生物体中)相互作用,从而允许几乎无限的可能性。下面我们着重介绍两个间接编码的例子。

超整齐

到目前为止讨论的进化计算方法有一个固定大小的基因组。即固定架构的神经网络。基因定义了这种固定结构的参数,但没有定义该结构的任何方面,因此遗传算法无法增长、收缩或修改该结构。2002 年,Stanley 和 Miikkulainen 引入了扩充拓扑的神经进化(NEAT) [7]。NEAT 定义了基因和神经网络内的连接之间的映射,并且可以适应定义新连接或节点的新基因的进化添加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

NEAT defines rules that map genes to a network architecture in addition to values of network weight and bias terms. Under a genetic algorithm, the network can grow by adding connections and nodes.

然而,NEAT 是一个直接编码模型,每个基因定义两个节点之间的连接权重。虽然一些基因可以呈现“禁用”状态,但这可以被视为编码零权重值。这将我们带到超净。

在 HyperNEAT [8]下,NEAT 训练的网络的输出定义了二级网络的权重。该辅助网络是用于执行所需任务的网络。在最简单的版本中,该次级“任务”网络具有排列在二维空间中的节点,使得每个节点可以通过其(x,y)坐标来识别。第一个网络被称为复合模式生成网络(CPPN),它采用四个输入来定义任务网络中两个节点( ij )的位置:(x i ,y i )和(x j ,y j )。CPPN 的输出是连接这两个节点的权重值。因此,NEAT 可以用来发展一个指导任务网络“开发”的 CPPN。任务网络,而不是 CPPN,由适应度函数来评估。

使用超净方法,相对较小的 CPPN 网络可以定义任意规模和密度的复杂任务网络。作为 CPPNs 可进化性的证明,模型已经进化到产生复杂的二维图像。虽然进化的任务网络的性能落后于最近的模型,但 HyperNEAT 已经被用来训练模型玩 Atari 游戏[9](大约在同一时间,DeepMind 展示了这种通过强化学习训练的模型[10])。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

In this HyperNEAT example, the task network (right) is a two-layered network in which neurons connect between the lower and upper layer, but not within layers. The CPPN network (left) defines connection strengths of the task layer for a given pair of task network nodes. The CPPN is a neural network defined by the NEAT genome-to-network mapping, and can be evolved using a genetic algorithm, with a fitness function applied to the task network defined by a given CPPN instantiation.

机体发育

生物进化不直接建立成熟(成年)生物的表型。相反,基因通过发育(例如,产前、婴儿期、青春期)间接建立生物体表型。基因也在成年期对生物体环境的反应中发挥作用(例如,在从低海拔向高海拔移动的生物体中产生更多的红细胞)。虽然 NEAT 进化出一群神经网络,但这些网络实际上并不是从基因组“生长”出来的。相反,它们是直接实例化的,因为纯网络是直接编码的。

研究人员如 Jordan Pollack 和他的前博士后 Sylvain Cussat-Blanc,正在探索包含生物体发育时期的进化计算方法。在 2015 年的一项研究[11]中,他们使用与 NEAT 相关的遗传算法进化出了基因调控网络(grn)的模型。一般来说,grn 是基因(和非基因 DNA、RNA 和蛋白质)控制其他基因表达(翻译成蛋白质)的网络。不同的基因在不同的发育时期和不同的环境条件下表达。因此,进化的不是生物体本身,而是它们发展的方式。作者证明了优于标准遗传算法。然而,计算复杂性很高,并且不太可能使用今天的标准硬件扩展到更具挑战性的现代人工智能任务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Rather then evolve a genome that directly encoded a neural network (such as NEAT), Pollack and colleagues [11] evolved a gene regulatory network that controlled the development of a neural network, much like biological genomes direct human growth from embryo to adult.

最近,Miller 等人[12]构建了神经网络中神经元(体细胞及其树突)的发育模型。发展模型由计算机程序来表示,这些程序可以使用 遗传编程 来进化。遗传编程明显不同于遗传算法,我们让读者在其他地方探索这个主题。尽管如此,Miller 和他的同事采用了一种进化计算方法来创建开发模型,构建有用的神经网络。结果是网络可以生长新的树突和神经连接,以学习新的任务。

开放性

到目前为止,我们已经讨论了利用适应度函数对个体代理的表现进行明确评分并确定哪个代理将为下一代产生后代的进化方法。显然自然没有明确的适应度函数。(然而,它确实有一种隐含的反向适应度函数——如果生物 X 比生物 Y 产生更多的后代,那么生物 X 可能比生物 Y 具有更高的适应度。)也就是说,在没有外部指导的情况下,自然界的进化产生了非常聪明的物种(人类),以及具有独特而迷人的身体和先天行为特征的物种。

这一观察推动了人工生命和 T2 的研究领域。人工生命是指在真实或人工环境中研究人工有机体,这些环境密切反映了自然环境的某些或许多方面。研究人员用这种方法来研究我们所知的生命,但也研究其他可能的生命。开放式进化研究通常会纳入类似于人工生命研究中的人工生物,并在类似于产生生物进化的条件下观察这些生物的进化——即基于环境内直接行动的繁殖(寻找配偶,获得足够的食物以生存和繁殖,躲避捕食者等)。)而不是基于明确的适合度测量。与深度学习领域相比,开放式进化领域相对较小,但实际上是一个非常古老的领域,查尔斯·奥弗里亚(Charles Ofria)、乔丹·波拉克(Jordan Pollack)、里斯托·米库拉宁(Risto Miikkulainen)和他们的学生(其中几位现在是该领域的领导者)等先驱研究人员已经在战壕中度过了几十年。关于开放的历史和前景的更完整的描述,请看来自雷曼、斯坦利和索罗斯的这篇文章,以及杰夫·克鲁恩的这篇论文

在开放环境中进化出的人工生物能否导致 AI 模型(智能体)的进步?我们认为答案是肯定的,但这至少取决于两个因素:(1)物种的共同进化和(2)丰富、多样和动态环境中的进化。(关于这个问题的不同观点,请参见丽莎·索罗斯的博士论文。)

针对第一个因素,环境必须容纳具有不同需求和能力的不同物种的多种代理,以便物种的共同进化可能导致物种内的合作——这可能是人类智能进化的先决条件。虽然共同进化已经导致猎豹和黑斑羚越来越快,但它也导致了狼的智能社会行为,正如在群体中协调狩猎所展示的那样。

Due in part to co-evolution, wolves have evolved a social intelligence that allows them to hunt in packs — thereby killing animals much larger than themselves and earning a food reward that benefits the entire pack, not just individual wolves.

事实上,OpenAI 最近的一项研究表明,尽管奖励系统看似贫乏,但经过强化学习训练的代理之间出现了复杂的互动行为。值得注意的是,奖励是根据团队(类似于物种)的表现给予的,而不是个人表现——就像一群狼在完成一次大屠杀后都会得到奖励一样。

Given the simple task of playing hide-and-seek, these agents learn to collaborate to perform complex task that at first blush, seem to have little to do with the primary hide-and-seek objective. Competition between teams is a driving factor in the emergence of these collaborative within-team behaviors. Note that these agents were trained by reinforcement learning rather than evolutionary computation. However, the relevant point is that competition between teams of agents (or species) can promote novel and complex behaviors.

这里应该提到强化学习和进化计算之间的一个重要对比。事实上,强化学习是动物一生中学习的一个模型。当动物的行为得到奖励时(通过食物、住所、交配等)。)更有可能重复这种行为,希望对其有益。然而,许多动物的能力是通过进化获得的,并在出生前的发育过程中或出生后不久就被赋予了。例如,人类生来就有几乎与生俱来的“物体感”(尽管不是“物体恒定性”)——婴儿不需要学习空间接近的“像素”(视网膜上的光子)更有可能是同一物体的一部分。一个与生俱来的极端例子是一些动物出生后获得复杂运动控制的速度(几分钟内)。底线是生物有机体对于许多能力是预先设定好。深度学习模型通常从零开始训练(“白板”),并严格针对特定应用。构建具有更一般的真实世界能力的 AI 智能体可能通过首先进化智能体以具有基本的先天知识(物理、情感、基本欲望等)来实现。)在“出生”。代理随后可以通过强化学习机制(在理想情况下,这种机制已经发展成为代理——例如,元学习)学习执行特定的任务

Baby wildebeests gain agile muscle control and navigation abilities with minutes of birth. Clearly evolution has given them an innate sense of gravity, physics, objectness, and an advanced sensorimotor control system. They do no need to learn these concepts and capabilities through their reinforcement learning system.

如前所述,我们认为进化智能代理的第二个关键因素是一个丰富、多样和动态的环境。这种环境包含跨越时间和空间的生态位条件,某些基因突变可能在其中被证明是有利的,但如果环境是同质的,则在随后的世代中会从物种中被洗掉。反过来,突变的有利表型也可能在不同的小生境环境中被证明是有利的,由于自我驱动的运动或由于其局部环境的变化(例如,真实世界中的气候变化),生物体可能会遇到这种不同的小生境环境。这有点类似于前面讨论的遗传算法中的质量多样性方法。

还缺什么?

除了已经陈述的以外,我们在这里列出了智能体、智能体环境和遗传算法的几个方面,我们推测这些方面可以促进智能体的进化,其能力超过当前的人工智能模型。如果条件支持,列出的一些智能体方面可能会自然进化,但它们也可以被直接强加,以加速向通用人工智能最终目标的进化。

代理人和环境

  • 养育和长期发展时期:强迫生殖代理在发展时期照顾无助的后代,可能会促进社会互动、交流(语言)、合作(给定后代的父母之间、父母与子女之间,甚至非亲属父母与子女之间——养育一个孩子需要一个村庄)等。
  • 个体识别:智能体应该能够识别同一物种的其他个体智能体(通过“视觉”或其他每个智能体独有的特征,并从智能体的基因组中获得)。如果代理人能够区分彼此,那么他们可以将单个代理人与该代理人的行为联系起来,潜在地允许信任、合作、关怀等的发展。(但也包括不信任、欺骗和勾结)。
  • 通信媒介:环境应该允许一些模态,通过这些模态代理可以进化出一种通信方式(一种语言)。这在本质上可以是听觉的、视觉的,甚至是触觉的。这可能是代理进化复杂的社会互动和合作所必需的。

基因和遗传算法

  • 用组合基因进行间接编码:使用相互作用的基因来产生更高水平的产物(例如,蛋白质,或对蛋白质产生的控制)可以允许紧凑但高表达的基因组,其可以比每个基因映射到一个且仅一个模型参数或表型性状的基因模型更有效地进化。此外,这种组合方面可以限制由于基因突变或交叉而导致后代完全不能存活(从而浪费模拟/评估时间)的可能性。
  • 指导发育的基因:与上述相关,编码生物体发育的基因,而不是最终的、成熟的生物体,可能更紧凑和可进化(如在超净中)。如果发展也是由基因和环境之间的相互作用驱动的,这可能会对基因提供额外的选择压力,从而促进进化。
  • 能够在大小上进化的基因组:行为复杂的生物可能比那些行为简单的生物需要更多的基因来定义它们的表现型(或它们的发展)。然而,从简单物种和小基因组开始的进化过程可能比基因组在进化过程开始时就很大的物种更快地进化成行为复杂的大基因组物种。在具有大基因组的简单物种中,单个基因的选择压力可能很弱,因为任何一个基因对生物体表型的影响都很小,从而减缓了进化。
  • 再生和死亡代理的结构化选择:在利用适应度函数的算法中,典型的方法是选择表现最好的代理进行再生,并杀死该代中剩余的代理。然而,在这种方法下,为药物提供适合度优势的新突变基因仍可能因物种间的遗传漂变而丢失。最近的工作[15]表明,当另一个因子繁殖时,策略性地选择杀死哪个因子(其规则由结构化的“进化图”表示),可以促进新的有利基因在整个物种中的“扩增”,并降低有利基因丢失的可能性。在富裕、开放的环境中,这种结构可能是环境间接强加的。

结论

近年来,深度学习无疑带来了巨大的人工智能进步,而且很可能会有更多进步。尽管如此,我们相信人工智能的进化计算方法在历史上一直没有得到充分研究,最终将在人工智能能力方面产生类似的飞跃——要么建立在深度学习提供的基础上,要么提供全新的能力。

最后,我们推测进化计算方法可能会产生计算效率高的人工智能。通过在给定的硬件平台上进化代理,并适当地设计基因到指令的映射,可以选择加速任务完成的基因,从而优化该平台上的性能。

参考

  1. Krizhevsky,a .,Sutskever,I .,和 Hinton,G. E,《用深度卷积神经网络进行图像网络分类》。NIPS,第 1106–1114 页,2012 年。
  2. 列亨伯格和艾根。进化策略:生物进化的最佳技术体系。1973 年,斯图加特。
  3. H.-P .施威费尔。进化战略的计算机模型的数值优化,1977
  4. 进化策略作为强化学习的可扩展替代方案。arXiv 预印本 arXiv:1703.03864 ,2017。
  5. 费利佩·彼得罗斯基·瑟奇、瓦希斯特·马德哈万、爱德华多·孔蒂、乔尔·雷曼、肯尼斯·斯坦利和杰夫·克伦。深度神经进化:遗传算法是训练深度神经网络进行强化学习的一种有竞争力的替代方法。arXiv 预印本 arXiv:1712.06567 ,2017。
  6. 贾斯汀·K·普格、丽莎·B·索罗斯和肯尼斯·O·斯坦利。进化计算的新前沿。机器人和人工智能的前沿,2016 年 3:40。
  7. 通过扩充拓扑进化神经网络。 Evol。计算。10, 99–127 (2002).
  8. 肯尼思·斯坦利;戴维·安布罗休;杰森·高西(2009 年 1 月 14 日)。“进化大规模神经网络的超立方体编码”。人工生命15(2):185–212。
  9. Hausknecht,m .,Lehman,j .,Miikkulainen,r .和 Stone,p.《一般雅达利游戏的神经进化方法》. *IEEE Trans。计算机。智能。*人工智能游戏 6,355–366(2014)。
  10. 通过深度强化学习进行人类水平的控制。性质 518,529–533(2015)。
  11. 通过扩充拓扑结构的基因调控网络进化。 IEEE Trans。Evolut。计算。19, 823–837 (2015).
  12. Miller,J.F .,Wilson,D.G .,Cussat-Blanc,s:《为解决多重问题建立神经网络的进化发展程序》。在:班扎夫,w。斯佩克特,l。谢尼曼 l。(编辑。遗传程序设计理论与实践第十六章。待定。斯普林格(2019)。
  13. 杰夫·克伦。AI-GAs:人工智能生成算法,产生一般人工智能的替代范例。arXiv 预印本 arXiv:1905.10985 ,2019。
  14. 索罗斯,丽莎,“开放式进化的必要条件”(2018)。电子论文和学位论文。5965.https://stars.library.ucf.edu/etd/5965
  15. Pavlogiannis A,Tkadlec J,Chatterjee K,Nowak MA。用进化图论构造自然选择的任意强放大器。通讯生物学。2018;1(1):71.

进化深度神经网络

原文:https://towardsdatascience.com/evolving-deep-neural-networks-ceb8d135d74d?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Johannes Plenio on Unsplash

近年来,我们许多人都看到深度学习在各个领域取得了巨大的成功,其中大部分来自于他们通过从数据中学习“分层特征提取器”来自动化经常繁琐和困难的特征工程阶段的能力[2]。此外,由于架构设计(即创建神经网络的形状和功能的过程)碰巧是一个漫长而困难的过程,主要由人工完成,创新性有限,大多数进展来自旧算法,这些算法在当今的计算资源和数据下表现非常好[13]。另一个问题是,深度神经网络主要通过梯度跟踪算法进行优化(例如, SGDRMSProp ),这些算法是约束搜索空间的重要资源,但容易陷入局部最优、鞍点和噪声梯度,特别是在强化学习等密集解决方案领域[6]。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Illustration of a function with noisy gradients and several local minima. A gradient following algorithm such as SGD will get easily trapped by the local minima if it is initialized in a low (0–30) or high (65–100) value.

这篇文章回顾了进化算法是如何被提出并被测试为解决上述问题的一个有竞争力的选择。

神经结构搜索

随着深度神经网络(DNN)变得更加成功,对允许更好性能的架构工程的需求一直在上升。随着 DNN 复杂性的增加,人类手动设计它们的能力受到限制,因此神经架构搜索( NAS )方法变得越来越重要。当考虑到萨顿的惨痛教训[15]时,这个问题变得特别有趣:

从 70 年的人工智能研究中可以得出的最大教训是,利用计算的一般方法最终是最有效的,而且是最有效的。

进化算法(EA)已被证明在这件事上是有用的[10]。

人们可能会认为 NAS 是一个三维过程[2]。第一个维度是他们的搜索空间,它定义了算法可能表示的可能架构。自然,更大的搜索空间意味着要测试更多可能的组合。为了使问题可解,一些约束直接在层上实现:

  1. 选择最大层数。
  2. 它们只能以链式(顺序)或多分支结构连接。
  3. 图层类型的构建块是预定义的,但是它们的超参数可以调整。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Chain connected (left) and multi-branch neural network (right) examples. Each node represents a layer and each arrow symbolizes the connection between them. Reprinted from Elsken et al. [2].

接下来是搜索策略,它定义了如何探索搜索空间。一些常见的替代方法是随机搜索、贝叶斯优化、强化学习、基于梯度的优化和神经进化方法。进化 NAS 的第一种方法来自 Miller 等人[7],他们使用遗传方法提出架构和反向传播来优化权重。然后,Stanley 和 Risto [12]提出了增强拓扑的神经进化(NEAT),这是一种用于进化人工神经网络(ANN)的遗传算法(GA),它不仅可以优化解决方案,还可以通过考虑适应性和多样性来使解决方案复杂化。最近,Real 等人[9]发现进化在准确性方面表现得与强化学习一样好,但它开发了更好的中期性能和更小的模型(下面给出了对这种情况的进一步描述)。

即便如此,遗传算法和 DNN 都以要求高资源而闻名,大约需要几千个 GPU 日。因此,为了使 NAS 成为一种可承受的策略,性能评估必须在比实际性能更低的可信度(即,通过使用近似值,确定性更低)上进行。这方面的一些例子是[11],它使用人工神经网络来预测候选网络的性能,逼近帕累托最优前沿,以及[8],通过实施性能估计策略,其中 LSTM 神经网络用于估计另一个候选神经网络的验证分数,仅给定几个时期的训练。一些方法不是进行估计,而是试图保持神经网络的功能,同时改变其结构,从而加快训练。Auto-Keras [5]就是基于这种方法构建的。

NAS 在传统神经网络结构中的应用已经在过去几年中进行了研究,产生了最新的技术成果。举例来说,Rawal 等人[8]提出了一种基于树的 DNN 编码,该编码通过遗传编程进行搜索,并基于标准语言建模(即预测大型语言语料库中的下一个单词)将 LSTM 性能提高了 0.9 个困惑点(即新模型现在更好地估计了目标语言分布)。此外,在图像分类方面,Real 等人[9]发展了 AmoebaNet-A,以实现 83.9%的 top-1 和 96.6%的 top-5 ImageNet 准确性,从而建立了一个新的技术状态。有人提出,通过利用遗传算法群体中固有的多样性来放大当前的集成方法,甚至通过直接奖励群体中的集成而不是直接模型,可以进一步发展这些结果。

进化强化学习

神经进化算法可分为同时进化权重和架构的算法(例如 NAS)和仅试图优化 DNN 权重的算法。进化算法与强化学习的结合通常是一种单一权重的实现。

在一般基于梯度的算法中,如随机梯度下降(SGD)约束探索梯度跟踪,它们的搜索空间变得有些线性,局部最小值成为一个问题[1]。此外,深度强化学习(Deep RL)带来了两个额外的问题:当回报稀少时,很难将行动与回报相关联,过早地收敛于局部最优(即,它们仅在做出一系列决策后发生,也称为时间信用分配)[14],并且它们对超参数选择非常敏感[3]。

在 DRL,遗传算法被提出作为解决这些问题的方法。这样等人[13]用基于种群的无梯度遗传算法改进了 DNN 的权重,并发现它在困难的深度 RL 问题上表现良好,如 Atari 和人形运动。通过将他们的结果与随机搜索(RS)进行比较,他们发现 GA 总是优于 RS,并且 RS 有时优于 RL ,这表明局部最优、鞍点和噪声梯度正在阻碍基于梯度的方法的进展,并且在某些情况下,在原点周围区域的密集采样足以优于基于梯度的方法。他们还发现遗传算法的挂钟速度比 Q 学习快得多。

Such 等人[13]还指出,一个未知的问题是,在早期阶段使用遗传算法采样,然后切换到梯度搜索的混合方法是否会获得更好更快的结果。这正是 Khadka 等人[6]在进化强化学习(ERL) 中提出的,这是一种混合算法,它使用来自 EA 的群体来训练 RL 代理,并将代理重新插入群体中进行适应性评估。他们提出遗传算法是解决之前提到的深层 RL 问题的一个很好的替代方案,但它也很难优化大量的参数。因此,GA 的探索性和时间信用分配能力与来自深度 RL 的梯度相结合,以实现更快的学习。因此,进化 RL 能够解决比深度确定性策略梯度(DDPG)更多的任务,并且比简单 GA 更快。

底线

像[6]和[9]这样的实践研究已经证明了进化深度学习应用是一种推动技术发展的有用方法。然而,在采用的方法中仍然存在许多限制,就像在 ERL 使用预定义的 NAS 构建块和非交叉或非变异。此外,值得注意的是,进化算法被视为黑盒优化方法,因此它们很少提供为什么性能高的理解。

进一步的研究将决定人工智能在深度学习中的未来,但迄今为止,至少在中长期内,它们似乎将成为解决特定学习问题的重要工具。

参考文献

  1. Aly,Ahmed,David Weikersdorfer,Claire Delaunay (2019),“用多重搜索神经进化优化深度神经网络。”更正,abs/1901.05988。
  2. 埃尔斯肯,托马斯,简·亨德里克·梅岑和弗兰克·哈特(2018),“神经架构搜索:一项调查。”更正,abs/1808.05377。
  3. Henderson、Peter、Riashat Islam、Philip Bachman、Joelle Pineau、Doina Precup 和 David Meger (2018 年),“重要的深度强化学习。”在第三十二届 AAAI 人工智能会议上。
  4. 格雷戈里·霍恩比(2006),“阿尔卑斯山:减少过早收敛问题的年龄分层人口结构。”《第八届遗传和进化计算年会论文集》, 815–822,ACM。
  5. 金,海峰,宋清泉,胡希贵(2018),“Auto-keras:基于网络态射的高效神经结构搜索”
  6. Khadka、Shauharda 和 Kagan Tumer (2018 年),“强化学习中进化导向的政策梯度。”在 NeurIPS。
  7. 米勒、杰弗里·f、彼得·m·托德和沙伊莱什·u·黑格德(1989),“使用遗传算法设计神经网络”在 ICGA。
  8. Rawal,Aditya 和 Risto Miikkulainen (2018),“从节点到网络:进化的递归神经网络。”更正,abs/1803.04439。
  9. Real,Esteban,Alok Aggarwal,黄雁萍和 Quoc V Le (2019),“图像分类器架构搜索的正则化进化”arXiv 预印本 arXiv:1802.01548。
  10. 萨利曼斯、蒂姆、乔纳森·何、陈曦和伊利亚·苏茨基弗(2017),“进化策略作为强化学习的可扩展替代方案。”更正,abs/1703.03864。
  11. 史密森、肖恩·c、杨光、沃伦·j·格罗斯和布雷特·h·迈耶(2016),“神经网络设计神经网络:多目标超参数优化。”2016 年 IEEE/ACM 计算机辅助设计国际会议(ICCAD),1–8。
  12. 斯坦利,肯尼斯·o .和里斯托·米库拉宁(2002),“通过扩充拓扑进化神经网络。”进化计算,10,99–127。
  13. 费利佩·彼得罗斯基、瓦希什特·马德哈万、爱德华多·孔蒂、乔尔·雷曼、肯尼斯·o·斯坦利和杰夫·克鲁恩(2017),“深度神经进化:遗传算法是训练深度神经网络进行强化学习的一种有竞争力的替代方法。”更正,abs/1712.06567。
  14. 萨顿、理查德·S、安德鲁·G·巴尔托等(1998),《强化学习导论》,第 135 卷。麻省理工学院出版社剑桥。
  15. 理查德·萨顿(2019)。惨痛的教训。可在:【http://www.incompleteideas.net/IncIdeas/BitterLesson.html 【13/05/19 访问】
  16. Zoph,Barret,Vijay Vasudevan,黄邦贤·施伦斯和 Quoc V . Le(2018),“学习可扩展图像识别的可转移架构。”IEEE 计算机视觉和模式识别会议论文集,8697–8710。

进化神经网络

原文:https://towardsdatascience.com/evolving-neural-networks-b24517bb3701?source=collection_archive---------6-----------------------

进化算法教程

在过去的十年里,深度学习一直主导着机器学习领域,通常会排斥其他技术。作为一名数据科学家,拥有各种工具是很重要的,我觉得一类经常被忽视的技术是进化算法。这么说可能有点自我放纵(我自己是一个长期运行的进化算法的中间产品),但我发现设计的进化技术非常棒,在许多情况下比传统的机器学习技术更实用。在本教程中,我们将使用进化算法来训练神经网络,并使用这种技术来解决回归、分类和策略问题。为此,我们将使用 Python 和 NumPy 库。

算法

进化算法以自然选择为前提,包括五个步骤:

  1. 创造一个有机体的初始种群。在我们的例子中,这些将是神经网络。
  2. 根据一些标准评估每种生物。这是生物体的适应度得分。
  3. 从第二步中挑选最好的生物体,让它们繁殖。后代可以是一个父母的完全相同的复制品(无性繁殖),也可以是两个或更多父母的嵌合体(有性繁殖)。
  4. 变异后代。
  5. 取新的变异后代群体,回到第二步。重复进行,直到满足某些条件(例如,通过了固定数量的代,达到了目标适应度,等等)。)

第一步:有机体

在本教程中,我们将使用全连接前馈神经网络作为我们的有机体。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 1: A fully-connected (dense) network with dimensions [1, 12, 12, 12, 1]

在设计我们的有机体时,我们有四个指导原则:

  1. 我们必须控制生物体的输入和输出维度。从根本上说,我们正试图进化出某种映射ℝᵃ ⟶ ℝᵇ的功能 f ,所以 ab 应该被内置到有机体中。我们通过参数化输入和输出维度来实现这一点。
  2. *我们必须控制输出激活功能。*有机体的输出应该适合手头的问题。我们通过参数化输出激活来实现这一点。
  3. 我们必须控制生物体的复杂性。理想的生物体应该足够复杂,能够进化出目标功能,仅此而已。我们通过参数化隐藏层的数量及其尺寸来实现这一点。在一个更先进的算法中,这可以通过让生物体进化自己的结构并用适应度函数惩罚复杂性来实现。
  4. 生物必须兼容有性生殖。幸运的是,上述原则确保了这一点。所有的生物都将有相同的结构,所以“交换遗传物质”在这里意味着后代将从妈妈那里得到一些层重量,从爸爸那里得到一些层重量。

实现如下:

Snippet 1: The partial Organism class and methods for creating and using it

__init__功能中,我们设置了网络。参数dimensions是图层维度列表,第一个是输入的宽度,最后一个是输出的宽度,其他都是隐藏维度。__init__函数迭代这些 n 维,以使用 Glorot 正常初始化创建 n-1 权重矩阵,这些权重矩阵被存储为layers。如果启用了偏置,还会为每个层存储一个非零偏置向量。该模型对所有内部层使用 ReLU 激活。使用output参数指定输出激活,可以是“ softmax ”、“ sigmoid ”或“ linear ”,在_activation方法中实现。

predict方法对输入矩阵反复应用 ReLU 和矩阵乘法。例如,如果网络由三个隐藏层和 softmax 输出构成,则网络将应用该函数

y=soft max(relu(relu(relu(xw₁)w₂)w₃)w₄)

其中 X 为输入矩阵, Wᵢ 为层 i 的权重矩阵, Y 为输出矩阵。

我们将创造一群这样的生物,它们都有相同的结构,但每一个都有不同的随机重量。

第二步:身体健康

衡量一个有机体的表现如何是进化算法设计的关键,而“好的表现”因任务而异。在回归中,适合度分数可以是负的均方误差。在分类上,可能是分类精度。玩吃豆人,可能是临死前狼吞虎咽的小球数量。因为适应度函数是特定于任务的,所以我们将等到下面的应用部分再来探讨它们。目前,理解我们需要一个函数scoring_function就足够了,它接受一个有机体作为输入并返回一个实数输出,其中越大越好。

第三步:繁殖

繁殖步骤本身有两个步骤:亲本选择和后代创造。每个新的有机体都需要双亲。在无性繁殖中 k 是 1,而在有性繁殖中 k 是 2 或更多。因此,要生成新一代的 n 生物,必须从上一代中选择 nk 生物;决定哪个(些)有机体将成为每个孩子的父母应该基于它们的适应性分数来完成,其中最适合的有机体应该产生最多的后代。有许多方法可以做到这一点,其中包括:

  1. 从生物的前 10%中统一选择每个亲本。
  2. 将生物体从最好到最差排序,然后通过从指数分布中取样来选择每个亲本的指数。
  3. 将 softmax 函数应用于每个生物体的得分,以创建每个生物体的选择概率,然后从该分布中取样。

我在方法一和方法二之间选择了一个折衷方案,其中前 10%的生物体被选择作为一个孩子的第一个亲本,每个亲本十次,第二个亲本使用指数分布随机选择,如上所述。我还强制要求将某一代中表现最好的生物体克隆到下一代中。以下是相关代码:

Snippet 2: The partial Ecosystem class and the method for simulating a generation

如您所见,第 5 行和第 6 行对生物体进行了评分和排序。然后,population_size新的有机体在第 8 行的循环中产生。从第 9 行的前 10%中选择亲本 1(holdout是保证后代的生物数量,这里为population_size //10)。当mating启用时,使用λ= holdout的指数分布选择父 2。当交配被禁用时,父代 1 与其自身交配,子代是克隆体。

一旦选择了 n 对亲本,就可以通过随机组合每对亲本的特征来创造后代。在我们的例子中,这些特征是神经网络层中的权重。下面是Organism类创建后代的方法:

Snippet 3: The partial Organism class and method for mating two organisms together

如您所见,mate方法确认双亲彼此兼容,然后随机选择一个双亲来继承子有机体的每个权重矩阵中的每个列向量。

第四步:突变

每一个子生物体产生后,它都要经历突变(片段 3,第 18 行)。在本教程中,变异步骤被实现为将高斯噪声添加到网络中的每个权重。这里我们不改变网络的激活或架构,尽管更高级的进化算法肯定可以通过在隐藏层中添加或删除节点来做到这一点。代码如下:

Snippet 4: the partial Organism class and mutation method

重复

这几乎不是一个步骤;剩下要做的就是检查是否满足某些条件,如果不满足,就返回到第二步。我选择以固定的代数运行该算法,但是当适应性分数达到期望的阈值时或者在代数没有改进的情况下停止也是很好的选择。以下是有机体和生态系统类的完整代码:

Snippet 5: The Organism and Ecosystem classes in all their splendor

应用

“酷。我为什么要在乎?”—可能是你

回归

让我们将这个过程应用于一个回归问题。我们将进化出一个有机体,在域x∈【0,1】中近似sin(【τx)。显然这是一个微不足道的问题,这就是为什么我们把它作为一个例子。那么我们应该如何设计我们的有机体呢?

  1. 这是一个从ℝ到ℝ的函数,所以输入和输出维度都是 1。
  2. 正弦的范围是[-1,1],所以输出激活将是线性的。
  3. 适应度函数将是有机体输出的负均方误差。
  4. 我们将使用三个宽度为 16 的隐藏层,因为对于这个简单的任务来说,这可能已经足够复杂了。

代码如下:

Snippet 6: Using an Ecosystem of Organisms to evolve the sine function

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 2: The best organism from each of 200 generations of evolution. Predictions vs. target (left), best fitness per generation (top), and network visualization (bottom).

正如你所看到的,在 200 代之后,一个有机体进化出了一个在域*【0,1】内的正弦函数的非常好的近似值。*

分类

让我们来看看这种技术如何应对分类问题。这里我们使用虹膜数据集。对于门外汉,(欢迎!)鸢尾数据集是 150 朵鸢尾花的几十年前的萼片和花瓣长度和宽度的集合。每朵花属于三个物种中的一个,任务是根据它的四个测量值按物种对花进行分类。那么这对我们的有机体意味着什么呢?

  1. 每朵花有四个实值测量,所以我们的输入维数将是 4。
  2. 有三个不同的类,所以我们的输出维将是 3。
  3. 因为我们选择了一个类,我们的输出激活将是 softmax。
  4. 我们将拿出三分之一的培训数据进行测试。这是为了确保有机体不会记住答案。

代码如下:

Snippet 7: Using an Ecosystem of Organisms to evolve the a flower classifier

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 3: The best organism from each of 20 generations.

每个散点图代表一对彼此相对绘制的不同特征。每个点都是一朵花,其中轮廓颜色代表真实的类,填充颜色代表预测的类。每一代中最佳生物体的训练和测试适应性显示在线图中,最佳生物体显示在中右面板中。在仅仅 15 代的时间里,生态系统演化出一个能够正确分类整个测试集的网络!

政策

让我们尝试进化出一种能够玩 OpenAI 的 CartPole“游戏”的生物体,包括在 AI Gym 包中。这是 YouTube 上的一个例子:

Source: Morvan on youtube

来自官方文件:

一根杆子通过一个非驱动关节连接到一辆小车上,小车沿着一条无摩擦的轨道移动。通过对推车施加+1 或-1 的力来控制该系统。钟摆开始直立,目标是防止它翻倒。杆保持直立的每个时间步长提供+1 的奖励。当柱子偏离垂直方向超过 15 度,或者手推车偏离中心超过 2.4 个单位时,该集结束。

在游戏的每个时间步,gamestate 被表示为四个实数的向量,分别对应于手推车的水平位置、手推车的水平速度、杆子的角度和杆子的角速度。然后玩家必须施加一个动作(施加+1 或-1 的力),游戏前进一个时间步长。如果玩家能够在 500 个时间步内避免失败,他们就“赢得”了游戏。

那么这对我们的生态系统和生物意味着什么呢?

  1. 每个时间步长有四个实值测量,因此我们的输入维将是 4。
  2. 有两种可能的操作,所以我们的输出维数是 2。
  3. 因为我们选择了一个动作,所以我们的输出激活将是 softmax。
  4. 适应度函数是存活的时间步数。为了稳健,我们将运行模拟 5 次,并取存活时间步长的平均数。

代码如下:

Snippet 8: Using an Ecosystem of Organisms to evolve a CartPole player

真的这么简单吗?好吧,这是结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Fig 4: The best organism in each generation playing CartPole

没错,生态系统只用了 6 代就进化出了打败游戏的生物体。我自己也有点震惊;你会注意到在第 31 行,我期望它会比这多得多。我本来打算像在其他两个问题中一样显示随时间变化的适应性,但我不会用它来打扰你,因为六个数据点并不是一个有趣的数字。

结论

进化算法直观有效。尽管上面的例子相当简单,但它们证明了进化算法适用于一大类问题。进化算法在解决方案的适合度是可测量的情况下特别有用,但不是以一种容易允许梯度反向传播的方式,如在掷球游戏中。出于这些原因,将进化算法添加到您的机器学习工具箱中是非常值得的。请继续关注我的下一篇文章,在这篇文章中,我将详细探讨适应度函数,以及合理的假设如何会导致令人捧腹的灾难性结果。

5G 时代分析角色的演变

原文:https://towardsdatascience.com/evolving-role-of-analytics-in-the-5g-era-8ce71c8f764e?source=collection_archive---------15-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Courtesy: Pixabay

请记住,曾经有一个时代,所有的业务利益相关者都需要接受教育,数据本身并不能带来推动业务增长的洞察力。相反,正是从数据中获得的分析创造了真正的价值!

当时,数据管理和分析被放在组织的不同部门。此外,企业需要一些时间来打破组织界限,将大数据和分析结合起来,以实现大数据的预期结果。再一次,在这个人工智能的时代,我们已经见证了某种形式的地震转移,人工智能正在推动技术的使用,以创造明智的,城市化的和更好的生活。而且,这一切都是从数据开始的!

鉴于自 2G 时代以来,数据和分析总是相互交织并促进敏捷和业务增长,5G 时代,分析将戴上什么新帽子?

当我们进入 5G 时代时,我们可以期待许多公司在大数据和分析方面进行更多投资。 IDC 在一份报告中指出,到 2020 年,大数据和业务分析的全球收入将增长超过2030 亿美元,复合年增长率(CAGR)为 11.7% 随着这种情况的发生,数据分析的应用将变得敏捷而稳健。虽然分析将继续完成其主要任务——从浩瀚的数据宇宙中获得洞察力以获得更好的投资回报,但分析有可能发挥一些高级作用来帮助企业增长。

随着我们转向可穿戴技术,生物特征数据收集可能会变得更加突出和快速,零售商、餐馆、生活方式组织试图了解消费者习惯或预测他们的需求。例如,来自健身跟踪设备的数据,可以整理体重、身高、心率和其他信息,可以导致餐馆或零售商更多的定制广告。

在客户层面,现在可以挖掘非结构化的社交媒体和电子邮件数据——这要归功于预测分析的强大功能。但如果一家公司正在探索非结构化数据的新方式:Instagram 和 YouTube 上的图像、音频和视频,并希望分析照片中的视频帧或姿势,该怎么办?目前,大多数数据分析工具只能解析带有标签关键词的信息,这些标签关键词使视频或照片易于找到,但可能无助于分析上下文、帧或姿势。但在未来,我们可以看到分析能够理解和总结视觉信息,并具有将非结构化和多媒体数据置于上下文中的卓越能力。

谈到物流领域,分析可以通过指导公司使用关于重要资源可用性的见解来更好地利用,从而戴上智能物流合作伙伴的帽子。换句话说,资源分配、运输路线和仓库管理可以轻松优化,从而节省时间和燃料成本。

除了在预测、营销优化、机器维护中发挥关键作用外,分析还可能在预防和检测欺诈活动中发挥重要作用。从电子商务到银行,分析在识别可疑模式和紧急向当局报警方面一直发挥着重要作用。展望未来,我们可能会看到分析通过先进的预测算法和技术,为我们预测交易相关犯罪可能在何时何地以更快的速度发生。

随着创新的步伐日益加快,分析的作用将进一步发展,并对各种运营变得至关重要。话虽如此,组织将需要加强他们的分析实践。然而,增长的灵丹妙药依赖于开放地接受分析实施方式的不断变化。与不断发展的创新保持同步的组织将在未来从数据和分析中获得回报和好处。最后,唯一可以确定的是,5G 时代将是不同的,非常有前途的,分析将引发增长和业务转型的循环。

检查 BERT 的原始嵌入

原文:https://towardsdatascience.com/examining-berts-raw-embeddings-fd905cb22df7?source=collection_archive---------12-----------------------

它们单独存在有什么用处吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BERT’s raw word embeddings capture useful and separable information (distinct histogram tails) about a word in terms of other words in BERT’s vocabulary. This information can be harvested from both raw embeddings and their transformed versions after they pass through BERT with a Masked language model (MLM) head. Figure illustrates the top k neighbors for the term cell in BERT’s raw embeddings (28,996 terms — bert-base-cased ) before and after passing through BERT model with a Masked Language Model head. (1) the input sentence. (2) The tokenized version of input sentence — Conan is not present in BERT’s raw vocabulary. It is broken down into two terms “Con” and “##nan” both of which are present in BERT’s vocabulary. (3) BERT’s MLM output finds the closest predictions in BERT’s vocabulary to the transformed vectors. For the word “cell” the top k neighbors (shown on right — this figure shows match — not the exact ordering) contain only terms that capture the semantic notion of incarceration. In contrast, the top k neighbors (shown on left) of the word “cell” before input to BERT captures all the different senses of the word in its top k neighbors — the “incarceration” sense as well as “biological” (protein, tissue) as well as mobile phone sense (phone, mobile). The top k neighbors before and after input fall in the tails of the histogram of distance/prediction score vs counts making those neighbors distinct and separable from the rest of words in the vocabulary

TL;速度三角形定位法(dead reckoning)

BERT 的原始单词嵌入捕捉有用的和可分离的信息(不同的直方图尾部)*关于 BERT 词汇表中的其他单词的单词。这些信息可以从原始嵌入和它们的转换版本中获得,在它们通过带有屏蔽语言模型 (MLM)*的 BERT 之后

当通过让模型从预测每个句子中的几个屏蔽词*(大约 15%)**(屏蔽语言建模目标)*中学习,在大型语料库上自我监督训练 BERT 模型时,我们得到作为输出的

  • 伯特模型*(学习权重)*和
  • 大约 30,000 个向量或嵌入*(如果需要,我们可以用自己的词汇训练模型——尽管在这样做之前需要考虑许多因素,例如需要用新的词汇从头开始预训练模型)*。在本文中,这些向量被称为原始向量/嵌入,以便在它们通过 BERT 模型时与它们的变换后的对应物区分开来。

这些学习到的原始向量类似于 word2vec 模型的向量输出— 单个向量代表一个单词,而不管其不同的含义或意义。例如,像“细胞”这样的词的所有不同的含义(手机、生物细胞、监狱细胞)被组合成一个向量。

当这些原始向量被输入到训练好的模型中时,它们被用来表示单词。然后,该模型使用句子中相邻单词的上下文来转换单词的表示。

例如,在预测句子中的单词的任务*(该预测任务不需要微调,因为它与训练目标相同)中,句子中的所有单词都被模型转换成依赖于上下文的表示。像“细胞”这样的词会摆脱其“移动”和“监狱”的含义,只保留其“生物”的含义,如“生物中有许多细胞器细胞 ”。在类似于“他去监狱 细胞 细胞 手机从生病的囚犯身上采集血液 细胞 样本”的句子中,由单词“细胞”的模型输出的三个独立向量将在它们中分别捕获三种感觉,而不是具有所有感觉的细胞的原始输入向量*

检查 BERT 学习的原始向量(大约 30,000 个向量——其中大约 78%是“细胞”、“蛋白质”形式的完整单词,22 %是“##os”形式的部分单词或子单词。例如,单词“icos”在输入到 BERT 模型期间被表示为两个向量—“IC”和“# # OS”)显示

  • 他们捕捉到了不同形式的相似性——语义( 皇冠 、王座、君主、女王、句法( 、她、他们)、单词屈折( 进位 、carries、carrying)、拼写( 墨西哥 、墨西哥)跨语言的语音相似性(这种相似性可能部分解释了机器翻译中变压器的性能)。本质上,原始向量的嵌入空间是由上面的例子所说明的不同类型的相似性组成的混合抓取包。
  • 原始学习向量,不管它们捕获的相似性度量的类型如何,在它们与其他向量的余弦相似性的直方图(余弦相似性与项数)中具有非常相似的分布形状。对于每个单词,都有一个尾部,那里的计数通常是个位数。在这些尾巴中,有一个以上的上述相似之处占优势。在语言建模目标上微调模型,改变分布形状(平均向右移动),但仍有明显的尾部。

这些原始向量和屏蔽语言模型可以用于各种任务

  • 给定一个术语,识别它的不同含义和主要含义(再次使用 BERT 词汇表中的术语获得)。例如,如前所述,术语“细胞”具有多种含义。在特定领域语料库上对模型进行微调后,其中一种意义可能会支配另一种意义(例如,在生物医学语料库上对模型进行微调可能会使单词“细胞”的“生物细胞”意义支配其他两种意义)。**
  • 给出两个或更多术语,找出它们之间的任何共同含义(使用 BERT 词汇表中的术语获取的含义)。例如,两种药物将共享共同的描述符,如药物、药物、治疗。
  • 特定类型的集群实体(这通常只适用于彼此不同的实体类型)**
  • 无监督的“实体识别” —我们可以用 BERT 词汇表中的一组常见名词(如药物、药品、治疗、疗法)来标记专有名词(例如像阿托伐他汀这样的药物)。这些普通名词可以作为专有名词的实体标记代理。可能存在这样的情况,词汇表中的专有名词(参见下面大写术语的词汇表统计)充当实体的代理(例如,人名——Johnson、smith、cohen 可以充当一个人的实体类型的描述符)**
  • 关系三元组的无监督收获

伯特词汇统计

上述所有潜在应用的一个共同方面是使用 BERT 的词汇来表示

  • 词汇表中的邻居,其中通过原始向量空间中输入项的向量的余弦相似性度量来寻找项的邻居
  • 通过屏蔽语言模型对句子中某个位置的单词/子单词的最高预测。句子中的任何输入术语都被标记为 BERT 词汇表中的单词/子单词。MLM 对输入句子中的位置的预测是根据伯特的词汇

使用公共词汇或描述符来表征 MLM 的输入项和输出预测使得上面列出的各种应用成为可能。

预训练 BERT 产生大约 30,000 (28,996)个向量,表示 BERT 词汇表中的单词(这些向量存储在来自拥抱脸 的 Pytorch Transformers 中的py torch _ model . bin 文件中。用于提取此内容的代码存根粘贴在下面问题的回复中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

BERT (bert-base-cased) vocabulary stats

小写术语占 BERT 词汇的近 45%,大写术语占 27%——基本上 BERT 词汇的 72%用作完整单词的描述符。包括其他语言字符和子词的符号构成了近 28%,并作为描述符来预测子词以及发音相似的声音。使用 MLM 预测句子中的术语的描述符通常是这些不同类别的混合。然而,对于像“细胞”这样的术语,顶部邻居(在原始向量邻域以及 MLM 输出预测中)将主要是其他术语,如上图“细胞、监狱等”而对于像“kan”这样的术语,主要是子词和其他语言发音相似的字符。

假设我们可以使用 BERT 的词汇来完成任务,比如用普通名词作为实体类型(药物、药品、治疗等)来标记专有名词(阿托伐他汀)。—这可以通过提取包含阿托伐他汀的句子并在标记化之前屏蔽整个单词来完成—这必须在标记化之前,因为阿托伐他汀不是 BERT 词汇表的一部分,所以它将被标记为多个子词*)出现的几个问题是*

  • 在向量的原始嵌入空间中描述一个词的描述符与 BERT 词汇表中的其他术语是不同的还是很好地分开的?
  • MLM 使用伯特词汇中的描述符来预测一个词在句子中的位置,这些描述符在预测空间中与伯特词汇中的其他术语有区别吗?

原来它们在原始向量空间和 MLM 预测空间中都是不同的。即使邻域(术语捕捉的不同感觉)的性质发生变化,这种明显的分离也通过微调得以保留

伯特的原始向量有不同的邻域

在微调前后,BERT 词汇表中每个术语的邻域及其邻居的聚集直方图显示了一个明显的尾部,其中所有术语表现出不同的相似性(语义、句法、语音等)。)驻留。邻域是通过对 BERT 的原始向量进行余弦相似性来完成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Aggregate histogram plot of the neighborhood of each term in BERT’s vocabulary with its neighbors, before and after fine tuning, reveals a distinct tail where all the terms exhibiting different similarities (semantic, syntactic, phonetic, etc.) reside. Neighborhood is done by cosine similarity on BERT’s raw vectors. This plot was done with only terms that are not subwords (##kan etc.). Aggregate histogram plot of subwords also exhibit distinct neighborhoods with a similar shape before and after fine tuning.

下图显示了 BERT 词汇表中单个术语与其他术语的直方图。它们还显示了微调后尾部的项是如何变化的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Histogram plot of BERT of the cosine similarity of a single term “genes” with vectors of all other terms in BERT’s vocabulary. The neighborhood of the term changes with fine tuning

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Histogram plot of BERT of the cosine similarity of a single term “cell” with vectors of all other terms in BERT’s vocabulary. The neighborhood of the term changes with fine tuning. Note the elimination of the different senses for the word “cell” after fine tuning it on a biomedical corpus.

伯特·MLM 对代币的预测也是截然不同的

下面的直方图显示了对输入句子“Connan got to institution cell”(在标记化之后变成“Con # # nan got to institution cell”)中的标记“cell”的预测

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

*Predictions for the token “cell” in the input sentence “Connan went to prison cell” *(which becomes “Con ##nan went to prison cell” after tokenization). We observe a distinct tail like the tails in raw embedding space plots

我们从尾部选择多少项的阈值(原始嵌入空间和 MLM 头部的预测),由我们的应用需求驱动,特别是我们需要的精度和召回水平。这些分布含义(在单个术语水平或集合水平)有助于我们做出选择(从信号中分离噪声)

Roberta 是一个具有 50,265 个词汇的类似 BERT 的模型,它在其原始向量空间中为一个词的余弦邻居以及在 MLM 目标的预测分数中展示了明显的尾部,如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Roberta Cosine neighborhood for the word “cell”. Distinct tail in histogram plot of the term against all the 50,265 terms.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Roberta output with a vocabulary size of 50,265 terms (byte pair encoding) exhibits a distinct tail in its prediction for terms in a sentence. The output above is the histogram distribution of prediction scores for the word “fell” in the sentence “he [mask] down and broke his leg”

很可能其他具有 MLM 目标的变形金刚模型()DistilbertCamembert)在原始向量空间及其预测分数输出中都表现出明显的尾部,尽管这需要确认。

原始嵌入使用示例的详细信息

如果我们有两个术语(可以是单个单词或短语)并且目标是识别这两个术语之间的共同点,我们可以

  • 首先选择每个词在句子中单独出现的句子,并使用 MLM 头找到这些词的预测邻居。这些描述符的交集充当这些术语的孤立含义的签名。
  • 选择两个术语都出现的句子,并预测这些术语的邻居。当它们在彼此的上下文中时,这产生两个签名,每个术语一个。
  • 上面我们有四个描述符集——单个术语的描述符和两个术语一起使用时的描述符。
  • 由于上面收集的所有描述符都是词汇表的一部分,我们可以在原始嵌入空间中以无向图的形式检查这些描述符,其中基于阈值(基于尾部选择的阈值)选择节点之间的连接。检查描述符倾向于产生在两个空间中捕捉相似性的签名。同样,具有高阈值的原始嵌入空间可以用于组合描述符中的拼写变化。这被证明在无监督地获取术语的同义词候选项的任务中是有用的。

最后的想法

距离 word2vec 的原始论文— “向量空间中单词表示的高效估计(2013 年 1 月)”已经过去了将近 7 年。BERT 和它的 transformer 变体已经成为 NLP 任务的主要部分。虽然 word2vec 训练的输出只是向量(我们从训练中没有得到多少模型——只有每个向量的上下文向量副本,通常会被丢弃),在 BERT 的情况下,我们得到的输出是原始的学习向量以及一个模型,该模型可以通过微调模型和向量将这些向量转换为适合特定任务的表示。

虽然两个模型产生的向量将一个单词的多个含义组合成一个向量,并且两个模型都具有与其他单词相比的不同尾部的直方图(与 BERT 的固定单词和子单词词汇表不同,word2vec 情况下语料库中所有单词的向量),但是 BERT 的向量与众不同,原因如下

  • 伯特的向量似乎捕捉到了更大范围的相似性——例如,像“kana”这样的子词与其他语言中发音相同的邻居的相似性
  • 给定一个由单个字符、子词和单词组成的词汇表,BERT 可以有效地表示句子中的任何单词——消除了词汇表之外的场景(至少对于英语)
  • 不管语料库大小如何,固定词汇表具有显著的实际优势——在计算期间,可以将词汇表的所有向量存储在 GPU 或其他内存受限的环境中。
  • 最后,除了被转换成最适合特定 NLP 任务的表示的关键能力之外,与训练的模型结合的 BERT 矢量可以表示句子中单词的特定含义。

Word2vec 模型通过自我监督学习来学习单词的向量表示,这些向量表示捕获了单词之间的相似性。基于转换器的模型,如 BERT,除了学习向量之外,还学习多层转换,这些转换可以应用于这些向量以解决各种 NLP 任务。

为伯特和罗伯塔创建直方图以及提取原始矢量链接的代码在 Github

这篇文章是从 Quorahttps://qr.ae/TcgPF8手动导入的

检查变压器架构

原文:https://towardsdatascience.com/examining-the-transformer-architecture-e112c9580e8?source=collection_archive---------11-----------------------

本博客第 1 部分& 2 由 尼提什·阿加瓦尔 在 Exxact Corporation 的合作和赞助下撰写。

第 1 部分:开放 GPT 2 争议

“回收对世界没有好处。这对环境有害,对我们的健康有害,对我们的经济也有害。我没开玩笑。回收对环境没有好处。它对地球具有破坏性,是全球变暖的主要原因。回收对我们的健康没有好处。它会导致肥胖和心脏病、癌症等疾病。回收对我们的经济有害。它增加了产品的成本,进而增加了用该产品制造的所有东西的价格。回收对我们国家没有好处。我们为拥有世界上最先进、最高效的回收系统付出了巨大的代价。回收是对时间、能量、金钱和资源的巨大浪费。”**—open ai 的 GPT 2 模型

是的,这些不是某个试图在社交媒体上推广反回收宣言的反回收怪胎的话。这整件事是用一种语言模型……一种算法……一种人工智能写的,如果我们说得太粗鲁的话。

GPT-2 是一个生成模型,由 OpenAI 创建,在 40GB 的互联网上训练以预测下一个单词。OpenAI 发现这个模型太好了,以至于他们没有发布经过完全训练的模型——有人说这违反了他们让人工智能向所有人开放的创始格言——因为他们“担心该技术的恶意应用”。

我们在谈论哪些恶意应用程序?

开艾说,“我们还可以想象这些模型的应用出于的恶意目的,包括以下几种(或者其他我们还无法预料的应用):

  • 产生误导性的新闻文章
  • 在网上冒充他人
  • 自动制作发布在社交媒体上的辱骂或伪造内容
  • 自动制作垃圾邮件/网络钓鱼内容"

“但这种模式真的有那么好吗?”

还是说以上的担忧仅仅是某些偏执狂的观点?

这个模型并没有在算法前沿呈现一些大的飞跃。这只是该团队几个月前发布的 GPT 模型的放大版。

它确实展示了我们当前的语言建模技术在文本生成方面的能力。它是其前身的大规模升级版本。GPT-2 拥有高达 15 亿个参数(比最初的 GPT 多 10 倍),并根据来自 800 万个网站的文本进行训练。

一旦你把它与其他“流行的”生成语言模型相比较,你就能理解这个模型的功绩了。

但是首先说一句题外话——关于语言模型的一个非常简单的解释

语言模型旨在简洁地表示所观察文本的历史,以便预测下一个单词。所以,基本上只是学习预测单词。给模型一个提示,它会预测下一个单词,然后下一个单词,然后再下一个单词,很快它就会形成一个有意义的句子,把足够多的单词组合起来,你就有了一个连贯的段落,然后…几乎所有你想要的。

例如,只需观看这部于 2016 年年中发布的科幻短片,其剧本是由一个生成模型创建的,该模型使用 LSTM 建筑公司在大量科幻电影和电视节目的剧本上训练出来的:

他们让托马斯·米德蒂奇——硅谷的理查德——主演这部电影!!

或者这个哈利波特人工智能生成的同人小说怎么样,它在 2017 年底走红,并且:

正如你所看到的,这两个在质量上比 GPT-2 的例子差得多。Open AI 在他们的博客文章——中挑选并发布了一些更好的语言模型及其含义。

unicorn ”样本读起来像一份真正的科学新闻稿。“核材料盗窃”样本读起来像一个真实的新闻故事。“麦莉·赛勒斯入店行窃”样本读起来像是来自名人八卦网站的真实帖子。“ GPT-2 ”样本读起来像一个真正的 OpenAI 新闻稿。《勒苟拉斯和吉姆利》的样本读起来就像一本真正的奇幻小说。“内战家庭作业”读起来就像一份真正的优等生试卷。这个“ JFK 获奖感言”读起来像一个真正的政治家的演讲。“回收”样本读起来像真正的右翼熨平板。

不仅仅是这 8 个精选的例子。Open AI 还为我们提供了数百个原始 GPT-2 样本的转储,这可以让我们更清楚地了解模型的能力。

是的,它们中的每一个“读起来像”一些真实的人类生成的内容。但事实并非如此。

这篇文章认为,如果你略读文本,你会错过明显的荒谬之处。重点是 OpenAI 已经实现了在自动驾驶上通过针对人类的图灵测试的能力。因此,如果你没有真正集中注意力,只是浏览一下,你就不会发现这是由语言模型生成的。对于我上面提到的其他例子来说,这肯定不是真的。甚至“像正常的人类生成的内容一样阅读”也是一个巨大的壮举。

所以,是的。我要说这款真的不错。

不释放模型重量的影响

事实上,Open AI 没有发布这个模型对 AI 社区和媒体来说是一个巨大的冲击。

一些人认为这只是开放人工智能的一部分的宣传噱头,因为没有算法上的壮举。另一群人认为这种的尝试将是徒劳的,因为代码是开源的,愿意在计算资源上花足够多钱的大公司/人们将能够在短短几个月内复制结果。

但是还有另外一群人在为开放人工智能鼓掌,因为他们试图让研究人员意识到他们研究成果的影响。随着人工智能技术变得越来越强大,世界将面临一个重要的挑战,即打击合成内容和错误信息。

sou Smith chint ala 是 PyTorch 的创造者。这是他、杰克·克拉克杰瑞米·霍华德之间的一根线!

所以知道它是如何工作的,知道驱动它的算法不是很酷吗?

第 2 部分:变压器工作原理的简要描述

变压器架构

这种架构最初是在 2017 年年中谷歌的开创性论文中提出的— 关注是你所需要的全部
在这么短的时间内,这种架构已经在两篇论文中用于产生最先进的结果——一篇是 GPT/GPT-2,另一篇是伯特

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Table Source: Language Models are Unsupervised Multitask Learners, Radford et al. 2019

最小的一个对应于 GPT 模型;第二小的相当于 BERT 中最大的模型;最大的一个比第一个大一个数量级,对应于 GPT-2 模型

现在让我们来看看架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The Transformer architecture as present in the Attention is all you need paper by Google

首先,我们可以看到它有一个序列到序列的编码器-解码器架构。互联网上很多关于变形金刚的文献都是用这种架构来解释变形金刚的。但这不是 Open AI 的 GPT 模型(或 GPT-2 模型,只是其前身的更大版本)中使用的那种。

GPT 是一个只有 12 层解码器的变压器,有 117M 个参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Improving Language Understanding by Generative Pre-Training, Radford et al.

来自 Open AI 的 GPT 论文中使用的变压器架构

GPT(以及 GPT-2 的较小发布版本)有 12 层变形金刚,每层有 12 个独立的注意机制,称为“头”;结果是 12 x 12 = 144 种不同的注意力模式。这些注意力模式中的每一个都对应于模型捕捉到的一个语言属性

正如我们在上面的 transformer 架构中看到的,注意力是 Transformer 的重要组成部分。事实上,这是一种保守的说法。注意力是使变压器工作的原因。那么,我们来简单介绍一下注意力。

注意力模型

RNN 单元将把直到时间戳 t 的输入编码到一个隐藏向量 ht 中,该隐藏向量然后将被传递到下一个时间戳(或者在序列到序列模型的情况下传递到解码器)。有了注意机制,我们不再试图将完整的源句子编码成固定长度的向量。相反,我们允许解码器在输出生成的每一步“关注”源句子的不同部分。重要的是,我们让模型学习根据输入的句子和它到目前为止产生的结果注意什么。

比方说,我们想翻译 1992 年签署的《欧洲经济区协议》。(法语)到英语哪个是“欧洲经济区协议是 1992 年 8 月签订的。”**

下图显示了注意力模型对它生成的每一个翻译单词的关注程度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Source: jalammar.github.io

请注意,除了将“欧洲经济区”翻译为“欧洲经济区”之外,它几乎都是线性的。在这种情况下,它会正确地以相反的顺序出现。

这种能力允许注意力学习长程相关性。

与 RNN 的比较

如前所述,一些从业者认为我们正在见证 RNN/LSTM 的衰落。自 2014 年推出以来,它们一直是所有 NLP 任务的默认首选架构,包括语言建模、机器翻译、文本摘要、图像/视频字幕、语音到文本转换等。

但是 RNN 和它的变体有两个主要缺点:

  1. 未能记住长程相关性

RNNs 的主要吸引力之一是,他们能够使用他们对电影中先前事件的推理来通知后来的事件。但这也是他们的主要缺点之一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

rnn 需要将来自整个序列的信息编码在一个单独的上下文向量中。来源

解码器应该仅基于来自编码器的最后一个隐藏状态(h3)来生成翻译。这个向量必须编码我们需要知道的关于源句子的一切。它必须完全抓住它的意义。

随着两个单词之间的差距越来越大,RNN 人似乎“忘记”了前面的单词。

长短期记忆单元(LSTMs)和门控循环单元(gru)通过使用由门控制的记忆单元(/s)提供了一种粗略的解决方案,该记忆单元允许它们从更早的过去获取信息。

  1. 无法利用 GPU 的能力

rnn 不能并行处理输入。它们是带有环路的网络,允许信息持续存在。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: http://colah.github.io/posts/2015-08-Understanding-LSTMs/

在上图中,神经网络 A 的一个块查看某个输入 xt 并输出一个值 ht。环路允许信息从网络的一个步骤传递到下一个步骤。这意味着它们一次只能处理一个输入单元。

这就是为什么他们不能利用非常强大的 GPU 的并行计算能力。这种图形处理器允许 CNN 对大量数据进行训练,并增长到绝对巨大的规模。rnn 或
lstm 或其任何变体天生不擅长利用这种手段。

变形金刚擅长这两项任务。

深度学习工作站 来自 Exxact 特色Quadro RTX 8000非常适合训练甚至大型变压器模型。每个Quadro RTX 8000拥有 48 GB GPU 内存,一对可以通过 NVLink 连接,从而提供 96 GB 的总 GPU 内存,以适应大规模的变压器型号。

预训练语言模型—自然语言处理中的迁移学习

Transformer 架构允许创建在绝对庞大的数据集上训练的 NLP 模型,正如我们在本文中看到的。这样的模型不可能被所有人训练,就像你不会期望在 ImageNet 数据集上从头训练一个 VGG 网一样。因此,预训练语言模型的时代到来了。

通过这种大规模预训练模型学习的权重可以在以后通过针对特定数据集进行微调来重新用于特定任务。这将允许我们通过捕捉语言的底层复杂性并简单地“插入”它以适应我们的特定任务来进行迁移学习。

变形金刚是 NLP 的下一个前沿。在不到几年的时间里,这种新的建筑趋势已经超越了 RNN 建筑的成就。这种令人兴奋的发明步伐可能是早期进入深度学习这样一个新领域的最好部分!

第 3 部分:在 Docker 中从头开始训练变压器网络

本教程的培训将在我们的 Exxact Valence 工作站上使用英伟达 RTX 2080 Ti 完成。此外,我们将使用位于官方 TensorFlow GitHub 上这里的 transformer 模型实现创建一个英语到德语的翻译器。假设您已经满足了 TensorFlow GPU 的所有必要依赖项,我们提供了一个简单的教程指南,用于在 docker 中开始使用 transformers。

步骤 1)启动 TensorFlow GPU Docker 容器

使用 Docker 可以让我们为我们的培训需求构建一个完全包含的环境。我们总是推荐使用 Docker,因为它允许我们的培训环境有最大的灵活性(和宽容)。首先,我们将打开一个终端窗口,输入以下命令来启动我们的 NVIDIA CUDA 驱动的容器。

*nvidia-docker run -it -p 6007:6006 -v /data:/datasets tensorflow/tensorflow:nightly-gpu bash*

注意:上面命令的关键参数的快速描述(如果你不熟悉 Docker)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 2)安装 git

如果您正在运行一个新的 docker 容器,这可能是必要的。

*apt-get install git*

步骤 3)下载张量流模型

如果您没有模型的最新代码库,这里包含了 transformer,它们往往会非常频繁地更新。

*git clone [https://github.com/tensorflow/models.git](https://github.com/tensorflow/models.git)*

步骤 4)安装要求

作为一个必要的步骤,这将安装用于训练 TensorFlow 模型的 python 包需求。

*pip install --user -r official/requirements.txt*

步骤 5)导出 Pythonpath

将 PYTHONPATH 导出到机器上 models 文件夹所在的文件夹中。下面的命令引用了模型在我们系统中的位置。确保将*'/数据集/模型**语法替换为存储/下载模型的文件夹的数据路径。*

*export PYTHONPATH="$PYTHONPATH:/datasets/datasets/models"*

步骤 6)下载并预处理数据集

data_download.py 命令将下载并预处理训练和评估 WMT 数据集。下载和提取后,训练数据用于生成我们将用作 VOCAB_FILE 变量的内容。实际上,eval 和 training 字符串被标记化,结果被处理并保存为 TFRecords。

注: ( 根据官方要求 ):将下载 1.75GB 的压缩数据。总的来说,原始文件(压缩的、提取的和组合的文件)占用 8.4GB 的磁盘空间。生成的 TFRecord 和词汇表文件为 722MB。运行该脚本大约需要 40 分钟,其中大部分时间用于下载,大约 15 分钟用于预处理。

*python data_download.py --data_dir=/datasets/datasets/transformer*

步骤 7)设置训练变量

‘参数集’

这指定了要训练什么模型。【大】【基】

I 重要提示:【大】 型号无法在大多数消费级 GPU 上工作,如 RTX 2080 Ti、GTX 1080 Ti。如果您需要训练 【大】 型号,我们推荐一个至少有 48 GB 可用 GPU 内存的系统,如配备 Quadro RTX 8000 的 数据科学工作站 ,或 2 个配备 NVLink 的 Qudaro RTX 6000。或者一个 泰坦 RTX 工作站 带 2x 泰坦 RTX(带 NVLink 桥)也应该足够了。对于这个例子,我们使用的是 RTX 2080 Ti,因此我们选择*‘基础****’。***

**PARAM_SET=base**

‘数据目录’

此变量应设置为训练数据所在的位置。

**DATA_DIR=$root/datasets/datasets/transformer**

‘型号 _ 目录’

该变量根据在‘参数设置’变量中指定的模型来指定模型位置

**MODEL_DIR=$root/datasets/datasets/transformer/model_$PARAM_SET**

‘VOCAB _ FILE’

该变量表示预处理 vocab 文件的位置。

**VOCAB_FILE=$DATA_DIR/vocab.ende.32768**

‘导出 _ 目录’导出训练好的模型

这将指定以 Tensorflow SavedModel 格式导出模型的时间/位置。这是在步骤 8 的训练中使用标志 export_dir 时完成的。

**EXPORT_DIR=$root/datasets/datasets/transformer/saved_model**

步骤 8)训练变压器网络

下面的命令’ python transformer _ main . py '将训练变压器总共 260000 步。查看如何设置标志来引用您在前面步骤中设置的变量。可以少练 26 万步,由你决定。

****注意:这要花很长时间训练,取决于你的 GPU 资源。官方 TensorFlow transformer 模型正在不断开发中,请确保定期查看他们的 github,了解任何优化和技术,以减少训练时间。

**python transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET --bleu_source=test_data/newstest2014.en --bleu_ref=test_data/newstest2014.de --train_steps=260000 --steps_between_evals=1000 --export_dir=$EXPORT_DIR**

步骤 9)在 Tensorboard 中查看结果

正如我们前面提到的,我们可以在 Tensorboard GUI 中检查训练的状态。要实时检查,请在单独的终端(或 TensorFlow 容器)中运行以下命令,并在浏览器中键入 localhost:6007 以查看 Tensorboard。您也可以等到培训完成后再使用当前容器。

**tensorboard --logdir=$MODEL_DIR**

您应该会看到类似下面的一些培训输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传****外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 10)测试训练好的模型(将英语翻译成德语)

现在我们已经训练好了我们的网络,让我们使用 translate.py 来享受我们的劳动成果吧!在下面的命令中,将文本“hello world”替换为需要翻译的文本

**python translate.py --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE \ --param_set=$PARAM_SET --text="hello world"**

上述命令的输出:

I 0411 18:05:23.619654 139653733598976 translate . py:150】翻译“hello world”:“hello Welt”

最后的想法

我们已经了解了变压器网络,它们是如何以及为什么如此有效。目前最先进的建筑,这个领域是一个活跃的自然语言处理研究领域。现在,您应该对训练变压器网络有了一个大致的了解,要更深入地了解训练变压器,请访问 TensorFlow github repo 中的官方变压器实现。我们希望你喜欢这个博客系列,现在就去做一些令人敬畏的事情吧!

检查变压器架构

原文:https://towardsdatascience.com/examining-the-transformer-architecture-part-1-the-openai-gpt-2-controversy-feceda4363bb?source=collection_archive---------10-----------------------

本博客第 1 部分& 2 由 尼提什·阿加瓦尔 在 Exxact Corporation 的合作和赞助下撰写。

第 1 部分:开放 GPT 2 争议

“回收对世界没有好处。这对环境有害,对我们的健康有害,对我们的经济也有害。我没开玩笑。回收对环境没有好处。它对地球具有破坏性,是全球变暖的主要原因。回收对我们的健康没有好处。它会导致肥胖和心脏病、癌症等疾病。回收对我们的经济有害。它增加了产品的成本,进而增加了用该产品制造的所有东西的价格。回收对我们国家没有好处。我们为拥有世界上最先进、最高效的回收系统付出了巨大的代价。回收是对时间、能量、金钱和资源的巨大浪费。”**—open ai 的 GPT 2 模型

是的,这些不是某个试图在社交媒体上推广反回收宣言的反回收怪胎的话。这整件事是用一种语言模型……一种算法……一种人工智能写的,如果我们说得太粗鲁的话。

GPT-2 是一个生成模型,由 OpenAI 创建,在 40GB 的互联网上训练以预测下一个单词。OpenAI 发现这个模型太好了,以至于他们没有发布经过完全训练的模型——有人说这违反了他们让人工智能向所有人开放的创始格言——因为他们“担心该技术的恶意应用”。

我们在谈论哪些恶意应用程序?

开艾说,“我们还可以想象这些模型的应用出于的恶意目的,包括以下几种(或者其他我们还无法预料的应用):

  • 产生误导性的新闻文章
  • 在网上冒充他人
  • 自动制作发布在社交媒体上的辱骂或伪造内容
  • 自动制作垃圾邮件/网络钓鱼内容"

“但这种模式真的有那么好吗?”

还是说以上的担忧仅仅是某些偏执狂的观点?

这个模型并没有在算法前沿呈现一些大的飞跃。这只是该团队几个月前发布的 GPT 模型的放大版。

它确实展示了我们当前的语言建模技术在文本生成方面的能力。它是其前身的大规模升级版本。GPT-2 拥有高达 15 亿个参数(比最初的 GPT 多 10 倍),并根据来自 800 万个网站的文本进行训练。

一旦你把它与其他“流行的”生成语言模型相比较,你就能理解这个模型的功绩了。

但是首先说一句题外话——关于语言模型的一个非常简单的解释

语言模型旨在简洁地表示所观察文本的历史,以便预测下一个单词。所以,基本上只是学习预测单词。给模型一个提示,它会预测下一个单词,然后下一个单词,然后再下一个单词,很快它就会形成一个有意义的句子,把足够多的单词组合起来,你就有了一个连贯的段落,然后…几乎所有你想要的。

例如,只需观看这部于 2016 年年中发布的科幻短片,其剧本是由一个生成模型创建的,该模型使用 LSTM 建筑公司在大量科幻电影和电视节目的剧本上训练出来的:

他们让托马斯·米德蒂奇——硅谷的理查德——主演这部电影!!

或者这个哈利波特人工智能生成的同人小说怎么样,它在 2017 年底走红,并且:

正如你所看到的,这两个在质量上比 GPT-2 的例子差得多。Open AI 在他们的博客文章——中挑选并发布了一些更好的语言模型及其含义。

unicorn ”样本读起来像一份真正的科学新闻稿。“核材料盗窃”样本读起来像一个真实的新闻故事。“麦莉·赛勒斯入店行窃”样本读起来像是来自名人八卦网站的真实帖子。“ GPT-2 ”样本读起来像一个真正的 OpenAI 新闻稿。《勒苟拉斯和吉姆利》的样本读起来就像一本真正的奇幻小说。“内战家庭作业”读起来就像一份真正的优等生试卷。这个“ JFK 获奖感言”读起来像一个真正的政治家的演讲。“回收”样本读起来像真正的右翼熨平板。

不仅仅是这 8 个精选的例子。Open AI 还为我们提供了数百个原始 GPT-2 样本的转储,这可以让我们更清楚地了解模型的能力。

是的,它们中的每一个“读起来像”一些真实的人类生成的内容。但事实并非如此。

这篇文章认为,如果你略读文本,你会错过明显的荒谬之处。重点是 OpenAI 已经实现了在自动驾驶上通过针对人类的图灵测试的能力。因此,如果你没有真正集中注意力,只是浏览一下,你就不会发现这是由语言模型生成的。对于我上面提到的其他例子来说,这肯定不是真的。甚至“像正常的人类生成的内容一样阅读”也是一个巨大的壮举。

所以,是的。我要说这款真的不错。

不释放模型重量的影响

事实上,Open AI 没有发布这个模型对 AI 社区和媒体来说是一个巨大的冲击。

一些人认为这只是开放人工智能的一部分的宣传噱头,因为没有算法上的壮举。另一群人认为这种的尝试将是徒劳的,因为代码是开源的,愿意在计算资源上花足够多钱的大公司/人们将能够在短短几个月内复制结果。

但是还有另外一群人在为开放人工智能鼓掌,因为他们试图让研究人员意识到他们研究成果的影响。随着人工智能技术变得越来越强大,世界将面临一个重要的挑战,即打击合成内容和错误信息。

sou Smith chint ala 是 PyTorch 的创造者。这是他、杰克·克拉克杰瑞米·霍华德之间的一根线!

所以知道它是如何工作的,知道驱动它的算法不是很酷吗?

第 2 部分:变压器工作原理的简要描述

变压器架构

这种架构最初是在 2017 年年中谷歌的开创性论文中提出的— 关注是你所需要的全部
在这么短的时间内,这种架构已经在两篇论文中用于产生最先进的结果——一篇是 GPT/GPT-2,另一篇是伯特

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Table Source: Language Models are Unsupervised Multitask Learners, Radford et al. 2019

最小的一个对应于 GPT 模型;第二小的相当于 BERT 中最大的模型;最大的一个比第一个大一个数量级,对应于 GPT-2 模型

现在让我们来看看架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

The Transformer architecture as present in the Attention is all you need paper by Google

首先,我们可以看到它有一个序列到序列的编码器-解码器架构。互联网上很多关于变形金刚的文献都是用这种架构来解释变形金刚的。但这不是 Open AI 的 GPT 模型(或 GPT-2 模型,只是其前身的更大版本)中使用的那种。

GPT 是一个只有 12 层解码器的变压器,有 117M 个参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Improving Language Understanding by Generative Pre-Training, Radford et al.

来自 Open AI 的 GPT 论文中使用的变压器架构

GPT(以及 GPT-2 的较小发布版本)有 12 层变形金刚,每层有 12 个独立的注意机制,称为“头”;结果是 12 x 12 = 144 种不同的注意力模式。这些注意力模式中的每一个都对应于模型捕捉到的一个语言属性

正如我们在上面的 transformer 架构中看到的,注意力是 Transformer 的重要组成部分。事实上,这是一种保守的说法。注意力是使变压器工作的原因。那么,我们来简单介绍一下注意力。

注意力模型

RNN 单元将把直到时间戳 t 的输入编码到一个隐藏向量 ht 中,该隐藏向量然后将被传递到下一个时间戳(或者在序列到序列模型的情况下传递到解码器)。有了注意机制,我们不再试图将完整的源句子编码成固定长度的向量。相反,我们允许解码器在输出生成的每一步“关注”源句子的不同部分。重要的是,我们让模型学习根据输入的句子和它到目前为止产生的结果注意什么。

比方说,我们想翻译“1992 年欧洲经济区协议”。(法语)到英语哪个是“欧洲经济区协议是 1992 年 8 月签订的。”**

下图显示了注意力模型对它生成的每一个翻译单词的关注程度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Source: jalammar.github.io

请注意,除了将“欧洲经济区”翻译为“欧洲经济区”之外,它几乎都是线性的。在这种情况下,它会正确地以相反的顺序出现。

这种能力允许注意力学习长程相关性。

与 RNN 的比较

如前所述,一些从业者认为我们正在见证 RNN/LSTM 的衰落。自 2014 年推出以来,它们一直是所有 NLP 任务的默认首选架构,包括语言建模、机器翻译、文本摘要、图像/视频字幕、语音到文本转换等。

但是 RNN 和它的变体有两个主要缺点:

  1. 未能记住长程相关性

RNNs 的主要吸引力之一是,他们能够使用他们对电影中先前事件的推理来通知后来的事件。但这也是他们的主要缺点之一。

rnn 需要将来自整个序列的信息编码在一个单独的上下文向量中。来源

解码器应该仅基于来自编码器的最后一个隐藏状态(h3)来生成翻译。这个向量必须编码我们需要知道的关于源句子的一切。它必须完全抓住它的意义。

随着两个单词之间的差距越来越大,RNN 人似乎“忘记”了前面的单词。

长短期记忆单元(LSTMs)和门控循环单元(gru)通过使用由门控制的记忆单元(/s)提供了一种粗略的解决方案,该记忆单元允许它们从更早的过去获取信息。

  1. 无法利用 GPU 的能力

rnn 不能并行处理输入。它们是带有环路的网络,允许信息持续存在。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source: http://colah.github.io/posts/2015-08-Understanding-LSTMs/

在上图中,神经网络 A 的一个块查看某个输入 xt 并输出一个值 ht。环路允许信息从网络的一个步骤传递到下一个步骤。这意味着它们一次只能处理一个输入单元。

这就是为什么他们不能利用非常强大的 GPU 的并行计算能力。这种图形处理器允许 CNN 对大量数据进行训练,并增长到绝对巨大的规模。rnn 或
lstm 或其任何变体天生不擅长利用这种手段。

变形金刚擅长这两项任务。

深度学习工作站 来自 Exxact 特色Quadro RTX 8000非常适合训练甚至大型变压器模型。每个Quadro RTX 8000拥有 48 GB GPU 内存,一对可以通过 NVLink 连接,从而提供 96 GB 的总 GPU 内存,以适应大规模的变压器型号。

预训练语言模型—自然语言处理中的迁移学习

Transformer 架构允许创建在绝对庞大的数据集上训练的 NLP 模型,正如我们在本文中看到的。这样的模型不可能被所有人训练,就像你不会期望在 ImageNet 数据集上从头训练一个 VGG 网一样。因此,预训练语言模型的时代到来了。

通过这种大规模预训练模型学习的权重可以在以后通过针对特定数据集进行微调来重新用于特定任务。这将允许我们通过捕捉语言的底层复杂性并简单地“插入”它以适应我们的特定任务来进行迁移学习。

变形金刚是 NLP 的下一个前沿。在不到几年的时间里,这种新的建筑趋势已经超越了 RNN 建筑的成就。这种令人兴奋的发明步伐可能是早期进入深度学习这样一个新领域的最好部分!

第 3 部分:在 Docker 中从头开始训练变压器网络

本教程的培训将在我们的 Exxact Valence 工作站上使用英伟达 RTX 2080 Ti 完成。此外,我们将使用位于官方 TensorFlow GitHub 上这里的 transformer 模型实现创建一个英语到德语的翻译器。假设您已经满足了 TensorFlow GPU 的所有必要依赖项,我们提供了一个简单的教程指南,用于在 docker 中开始使用 transformers。

步骤 1)启动 TensorFlow GPU Docker 容器

使用 Docker 可以让我们为我们的培训需求构建一个完全包含的环境。我们总是推荐使用 Docker,因为它允许我们的培训环境有最大的灵活性(和宽容)。首先,我们将打开一个终端窗口,输入以下命令来启动我们的 NVIDIA CUDA 驱动的容器。

*nvidia-docker run -it -p 6007:6006 -v /data:/datasets tensorflow/tensorflow:nightly-gpu bash*

注意:上面命令的关键参数的快速描述(如果你不熟悉 Docker)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 2)安装 git

如果您正在运行一个新的 docker 容器,这可能是必要的。

*apt-get install git*

步骤 3)下载张量流模型

如果您没有模型的最新代码库,这里包含了 transformer,它们往往会非常频繁地更新。

*git clone [https://github.com/tensorflow/models.git](https://github.com/tensorflow/models.git)*

步骤 4)安装要求

作为一个必要的步骤,这将安装用于训练 TensorFlow 模型的 python 包需求。

*pip install --user -r official/requirements.txt*

步骤 5)导出 Pythonpath

将 PYTHONPATH 导出到机器上 models 文件夹所在的文件夹中。下面的命令引用了模型在我们系统中的位置。确保将*'/数据集/模型**语法替换为存储/下载模型的文件夹的数据路径。*

*export PYTHONPATH="$PYTHONPATH:/datasets/datasets/models"*

步骤 6)下载并预处理数据集

data_download.py 命令将下载并预处理训练和评估 WMT 数据集。下载和提取后,训练数据用于生成我们将用作 VOCAB_FILE 变量的内容。实际上,eval 和 training 字符串被标记化,结果被处理并保存为 TFRecords。

注: ( 根据官方要求 ):将下载 1.75GB 的压缩数据。总的来说,原始文件(压缩的、提取的和组合的文件)占用 8.4GB 的磁盘空间。生成的 TFRecord 和词汇表文件为 722MB。运行该脚本大约需要 40 分钟,其中大部分时间用于下载,大约 15 分钟用于预处理。

*python data_download.py --data_dir=/datasets/datasets/transformer*

步骤 7)设置训练变量

‘参数集’

这指定了要训练什么模型。【大】【基】

I 重要提示:【大】 型号无法在大多数消费级 GPU 上工作,如 RTX 2080 Ti、GTX 1080 Ti。如果您需要训练 【大】 型号,我们推荐一个至少有 48 GB 可用 GPU 内存的系统,如配备 Quadro RTX 8000 的 数据科学工作站 ,或 2 个配备 NVLink 的 Qudaro RTX 6000。或者一个 泰坦 RTX 工作站 带 2x 泰坦 RTX(带 NVLink 桥)也应该足够了。对于这个例子,我们使用的是 RTX 2080 Ti,因此我们选择*‘基础****’。***

**PARAM_SET=base**

‘数据目录’

此变量应设置为训练数据所在的位置。

**DATA_DIR=$root/datasets/datasets/transformer**

‘型号 _ 目录’

该变量根据在‘参数设置’变量中指定的模型来指定模型位置

**MODEL_DIR=$root/datasets/datasets/transformer/model_$PARAM_SET**

‘VOCAB _ FILE’

该变量表示预处理 vocab 文件的位置。

**VOCAB_FILE=$DATA_DIR/vocab.ende.32768**

‘导出 _ 目录’导出训练好的模型

这将指定以 Tensorflow SavedModel 格式导出模型的时间/位置。这是在步骤 8 的训练中使用标志 export_dir 时完成的。

**EXPORT_DIR=$root/datasets/datasets/transformer/saved_model**

步骤 8)训练变压器网络

下面的命令’ python transformer _ main . py '将训练变压器总共 260000 步。查看如何设置标志来引用您在前面步骤中设置的变量。可以少练 26 万步,由你决定。

****注意:这要花很长时间训练,取决于你的 GPU 资源。官方 TensorFlow transformer 模型正在不断开发中,请确保定期查看他们的 github,了解任何优化和技术,以减少训练时间。

**python transformer_main.py --data_dir=$DATA_DIR --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE --param_set=$PARAM_SET --bleu_source=test_data/newstest2014.en --bleu_ref=test_data/newstest2014.de --train_steps=260000 --steps_between_evals=1000 --export_dir=$EXPORT_DIR**

步骤 9)在 Tensorboard 中查看结果

正如我们前面提到的,我们可以在 Tensorboard GUI 中检查训练的状态。要实时检查,请在单独的终端(或 TensorFlow 容器)中运行以下命令,并在浏览器中键入 localhost:6007 以查看 Tensorboard。您也可以等到培训完成后再使用当前容器。

**tensorboard --logdir=$MODEL_DIR**

您应该会看到类似下面的一些培训输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传****外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 10)测试训练好的模型(将英语翻译成德语)

现在我们已经训练好了我们的网络,让我们使用 translate.py 来享受我们的劳动成果吧!在下面的命令中,将文本“hello world”替换为需要翻译的文本

**python translate.py --model_dir=$MODEL_DIR --vocab_file=$VOCAB_FILE \ --param_set=$PARAM_SET --text="hello world"**

上述命令的输出:

I 0411 18:05:23.619654 139653733598976 translate . py:150】翻译“hello world”:“hello Welt”

最后的想法

我们已经了解了变压器网络,它们是如何以及为什么如此有效。目前最先进的建筑,这个领域是一个活跃的自然语言处理研究领域。现在,您应该对训练变压器网络有了一个大致的了解,要更深入地了解训练变压器,请访问 TensorFlow github repo 中的官方变压器实现。我们希望你喜欢这个博客系列,现在就去做一些令人敬畏的事情吧!

原载于 2019 年 5 月 29 日https://blog.exxactcorp.com**

在 Tensorflow 2 中检查 LSTM 的权重和偏差

原文:https://towardsdatascience.com/examining-the-weight-and-bias-of-lstm-in-tensorflow-2-5576049a91fa?source=collection_archive---------8-----------------------

张量流 2 中 LSTM 权重和偏差混淆结构的解释

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

source: https://dnacentre.co.uk/wp-content/uploads/2018/04/blog-uk-genetic-engineering.png

好,首先,什么是 LSTM?LSTM 是长短期记忆的缩写。它是递归神经网络(RNN)中应用最广泛的一种。基本上, RNN 将时间序列数据作为输入。时间序列中的每一个数据从最早的时间步长开始依次成为 RNN 的输入。某个时步输入的 RNN 输出将与下一个时步的数据一起作为 RNN 的输入。当 RNN 处理完数据的最后一个时间步长时,将输出实际输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

How the RNN process the input

LSTM 的神经元结构是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在时间步长的每个过程中,LSTM 有 4 层神经元。这 4 层一起形成一个称为门的处理称为遗忘门- >输入门- >输出门(- >表示序列处理在 LSTM 中发生的顺序)。那就是 LSTM,我不会涉及 LSTM 的细节,因为那会是一篇很长的文章,而且这不是我这次的重点。

长话短说,为了我最近的实验,我需要取回我的 LSTM 的重量和偏差。我用 TensorFlow 2 建立了一个 LSTM。在 TensorFlow 2 中,我们可以使用下面的代码访问 LSTM 权重和偏差的结构。

import tensorflow as tfsimple_lstm_model = tf.keras.models.Sequential()
simple_lstm_model.add(tf.keras.Input((18,7)))
simple_lstm_model.add(tf.keras.layers.LSTM(2))print(simple_lstm_model.layers[0].trainable_weights)

在上面的代码中,我构建了一个接受 18 x 7 形状输入的 LSTM。18 是数据的总时间步长,7 是参数的总数。对于每个时间步长,LSTM 将采用 7 个参数。我声明这个 LSTM 有两个隐藏状态隐藏状态就像每个时间步长的 LSTM 输出。这意味着我们的 LSTM 最终将输出 2 个实数。这也意味着,LSTM中每层神经元的数量是 2。当您运行这个脚本时,您将得到如下输出。

[<tf.Variable 'lstm/kernel:0' shape=(7, 8) dtype=float32>, <tf.Variable 'lstm/recurrent_kernel:0' shape=(2, 8) dtype=float32>, <tf.Variable 'lstm/bias:0' shape=(8,) dtype=float32>]

好了,这里我们有 3 组参数,它由 lstm/kernel(形状为 7x8)、lstm/recurrent_kernel(形状为 2x8)和 lstm/bias(形状为 8)组成。最后一部分(lstm/bias)很明显,就是偏见。为什么我们有 8 个?记住,在 LSTM 中我们有 4 层神经元,我声明这个 LSTM 有 2 个隐藏状态,或者说每层有 2 个神经元。每个神经元有 1 个偏差,4 层中的每层有 2 个神经元,所以总数是 8。

容易混淆的部分是 lstm/kernel 和 lstm/recurrent_kernel。内核在这里的意思是重量。lstm/kernel 表示我们的输入相对于 lstm 每个神经元的权重。我声明输入有 18 个时间步长和 7 个参数,所以每个参数对每个神经元有 1 个权重,这就是 lstm/kernel 的形状为 7x8 的原因。最后, lstm/recurrent_kernel 表示我们的隐藏状态的权重,也称为 lstm 在前一时间步(t-1)相对于 LSTM 中每个神经元的输出。我声明隐藏状态是 2,LSTM 的总神经元是 8 ,那么隐藏状态对 LSTM 神经元层的权重形状一定是 2×8。

这就是关于 LSTMin TensorFlow 2 的权重和偏差的解释。您还可以使用 summary()函数看到整个神经网络的结构,如下所示。

import tensorflow as tfsimple_lstm_model = tf.keras.models.Sequential()
simple_lstm_model.add(tf.keras.Input((18,7)))
simple_lstm_model.add(tf.keras.layers.LSTM(2))
simple_lstm_model.add(tf.keras.layers.Dense(5))simple_lstm_model.summary()

输出是

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 2)                 80        
_________________________________________________________________
dense (Dense)                (None, 5)                 15        
=================================================================
Total params: 95
Trainable params: 95
Non-trainable params: 0

这里我将之前的 LSTM 和一个普通的神经网络层叠加在一起。这个网络的最终输出有 5 个元素。这个堆叠式神经网络的总权重和偏差为 95。

就这些了,下期帖子见。

参考:

https://medium . com/ai-journal/lstm-gru-recurrent-neural-networks-81 Fe 2 BCD f1 f 9,2019 年 12 月 15 日获取

https://colah.github.io/posts/2015-08-Understanding-LSTMs/,2019 年 12 月 15 日进入

数据科学流程中 Docker 的使用案例示例

原文:https://towardsdatascience.com/example-use-cases-of-docker-in-the-data-science-process-15824137eefd?source=collection_archive---------20-----------------------

…或者如何避免“它只在我的电脑上工作,却不在别的地方工作”的问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Jeff Lofvers 的精彩漫画展示了你在软件开发和数据科学中经常遇到的问题。您正在准备一个数据分析或预测模型,但是当您想要共享它时,它在其他人的机器上无法工作。它失败了,因为库丢失了,库有错误的版本(“依赖地狱”),或者配置不同。耗时的故障排除开始了。

解决方案并不遥远: Docker 以一种轻量级的方式解决了再现性的问题,而且还为您提供了许多其他的优势。

什么是 Docker?

Docker 是一个执行操作系统级虚拟化的免费软件。Docker 习惯于运行被称为容器的软件包。容器相互隔离,并将它们的应用程序、工具、库和配置文件捆绑在一起。所有容器都由一个操作系统内核运行,因此比虚拟机更轻量级。[ 维基百科上的 Docker

Docker 使创建、运行和分发应用程序变得容易。应用程序打包了运行应用程序所需的一切。这个概念保证了容器可以在每个 docker 运行时环境中运行。

码头工人的优点:

再现性

使用 Docker,您可以确保您的软件产品(应用程序、数据分析、预测模型等)。)运行在所有 docker 运行时环境上。你的货件更结实,因为集装箱里装着运行你的人工制品所需的一切。您不仅分发代码,还分发环境。

一致性

Docker 为各种软件产品提供了一个统一一致的运行时环境。它减少了系统管理的时间,让您专注于核心工作。你可能知道 Anaconda 环境;Docker 对于整个软件生态系统来说是类似的东西。

可追溯性

a.)Docker 容器代码的版本控制

Docker 容器是从一个脚本构建的,该脚本是必要的软件依赖关系和环境的可读摘要。这个脚本可以进行版本控制。这个脚本完全可以通过这种方式追踪。

b.)所有人工制品的统一分配环境

Docker 容器可以存储在组织内部的存储库中。你用这种方式保存整个版本历史。

便携性

Docker 容器可以很容易地从一个 docker 环境移植到另一个环境。Docker Swarm (或 Kubernetes )让你自动扩展应用程序。这样可以降低系统管理和操作的成本。

然而,Docker 在数据科学领域有哪些用例?我将专注于数据科学 OSEMN 流程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据科学流程中 Docker 的用例

今天的现实是,这个过程由各种各样的工具和编程语言组成。Docker 是管理这些异构技术堆栈的首选平台,因为每个容器都提供了运行它所需要的运行时环境,以运行它所包装的应用程序。这样就减少了技术堆栈的干扰。

1.获取:从相关来源收集数据

数据是数据科学的润滑油。例如,您可以从调查、临床试验、网络搜索、科学实验、企业应用或模拟中检索信息。通常情况下,数据工程师处理数据,但其他利益相关者也参与其中,这导致了数据库系统和编程语言的广泛多样性。

  • Web 抓取:Python 应用程序与 Selenium 的 Chrome 驱动程序和 Postgres 数据库之间存在底层依赖关系,通过 Docker Compose 打包成一个多容器应用程序
  • 标记图像:使用 vue.js、NodeJS 后端和 MongoDB 的精益 web 应用程序来标记图像
  • 调查:小型静态微型网站,由营销团队用纯 HTML 构建,带有集成的 SurveyMonkey 表单
  • 企业应用程序:在后台用 AngularJS 和 Java 实现的银行 web 应用程序使用 Oracle 数据库从客户那里产生有价值的银行数据
  • 计算机模拟:用 C++编程的模拟将结果存储在亚马逊 S3 的 JSON 中
  • 异步数据流:汽车传感器向 Kafka 发送数据,Kafka 在公司内部分发数据

所有这些技术栈都可以在 Docker 容器中独立运行。

2.清理:将数据清理和聚合成机器能够理解的格式

步骤 1 中获得的数据是石油,但现在是原油。你需要清理、处理它,并把它结合成你分析和建模所需的数据。

  • 聚合:Java 应用程序从 Kafka 流中获取数据,对底层数据进行聚合,并将其存储到 Oracle 数据库中
  • 数据分析师清理并预处理来自企业 web 应用程序的数据,为用 RMarkdown 笔记本回答业务问题做准备,他们希望与管理层分享这些数据
  • 机器学习工程师组合来自不同数据源的数据,为 Jupyter 笔记本中的预测模型清理和预处理数据
  • 在 Tableau 中,对数据进行组合、清理、聚合、预处理和持久化,以用于高级交互式仪表盘

这些用例中的一些可能已经在数据检索步骤中完成,并且有更多的数据工程技术栈。其他用例与探索和建模阶段重叠,并涉及更典型的数据分析技术。

许多数据分析工作都是在需要发布的笔记本(Jupyter,RMarkdown)上完成的。您可以为组织使用中央 Jupyter 实例。这种方法的问题是,您可能会被固定的配置和库版本所困扰。另一种方法是发布一个或多个带有 Docker 容器的笔记本。这样你就可以更加灵活地使用特定的设置。

3.探索:寻找模式和趋势

在探索阶段,你要做的就是了解数据手中有什么模式和价值。你想让所有感兴趣的人都能看到结果。

  • 数据分析师正在创建 Jupyter 或 RMarkdown 笔记本,以回答一个他们需要与所有感兴趣的人分享的问题。
  • 数据分析师将公司的客户分成新的细分市场,这些细分市场保存在 MySQL 的客户细分市场数据库中
  • 数据分析师为 RShiny、Dash、Tableau 或 Kibana 中感兴趣的利益相关者构建交互式 web 应用程序,用于高级数据探索。这样管理人员可以自己找到模式(危险区域!).

4.模型:构建模型以进行预测和预报

经过清理和预处理的数据用于训练机器或深度学习算法。你以这种方式创建模型,这些模型是观察数据的数学表示。它们可以用来预测、预报和量化不可言喻的事物。

  • 用于图像中对象检测的神经网络的完整训练过程被隔离到运行在 Azure、AWS 或 Google Cloud 上的 Docker 容器中
  • 由于 Python 的性能问题,Keras 模型被导入到 DeepLearning4J 中,并作为 Java 微服务发布

为了训练神经网络,你需要大量的 GPU 能力。您需要 Nvidia Docker 将训练过程隔离到 Docker 容器中,因为使用 GPU 无法以硬件和平台无关的方式完成。

5.解释:将结果充分利用

数据科学见解得到交流和可视化。模型作为微服务分发。

  • 微型网站讲述数据故事
  • Python 中的预测机器学习模型作为微服务发布
  • 带有聚合数据的 Java REST 微服务向付费 B2B 客户发布
  • Python 中的产品推荐服务被集成到该公司的网络应用程序中
  • 数据驱动的故事发布在公司的 Tableau 服务器上,供内部和外部使用
  • 内容管理团队中的数据故事讲述者在静态 Jekyll 网站上分享来自数据分析师的激动人心的见解

结论

Docker 对于数据科学家来说也是一个强大的工具,可以应用于 OSEMN 流程的所有阶段。你可以以一致、可复制和可追踪的方式运送所有种类的人工制品。工件在其技术栈中可能非常不同,这是数据科学项目中的现实。数据工程师使用 Oracle、MySQL、MongoDB、Redis 或 ElasticSearch 等数据库或 Java、Python 或 C++等编程语言。在分析和建模团队中,人们可能会使用 R、Python、Julia 或 Scala,而数据故事讲述者则用 JavaScript 中的 d3.js 或使用 Tableau 来讲述他们的故事。由于专家很少,最好让他们使用熟悉的技术,而不是将他们推向未知的领域。你会更快得到更好的结果。

Docker 是管理数据科学中异构技术环境的好方法。

参考

用 Docker 运行 Jekyll

在 Docker 上运行 ki Bana

how to:Docker 容器中的 Tableau Server Linux

在 docker 容器中运行 dash 应用

学习如何通过 7 个步骤对 ShinyApp 进行分类

如何使用 Docker 编译 R Markdown 文档

教程:为数据科学运行 Dockerized Jupyter 服务器 Kafka-Docker:使用 Docker 运行 Apache Kafka 的步骤

对接一个角度应用

将 Node.js web 应用程序归档

Dockerize Vue.js App

将 MongoDB 作为 Docker 容器运行

Dockerize PostgreSQL

带有 Chromedriver 和 Geckodriver 的 Docker 图像

对您的 Python 应用程序进行 Dockerize】

由延斯·劳弗于 2019 年 4 月 4 日撰写

随意分享!

原载于 2019 年 4 月 4 日jenslaufer.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值