TowardsDataScience 博客中文翻译 2020(九百八十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

什么是基于事实的建模?

原文:https://towardsdatascience.com/what-is-fact-based-modelling-106ba15649fa?source=collection_archive---------34-----------------------

基于事实的建模是一种概念建模,其中关键数据结构,即事实类型,对事实进行操作。

有一些基于事实的模型是图形化的,还有一些是基于文本的。

基于图形事实的建模方法包括对象角色建模(ORM)全面向沟通的信息建模(FCO-IM)认知(CogNIAM)。基于文本的基于事实的建模包括星座查询语言。

什么是事实?

事实是这样的陈述:

"零件‘123’在仓库‘悉尼’的‘H2’箱里. "

事实为所谓的事实类型提供数据和结构。上述事实的事实类型读数为:

“零件在仓库的箱子里”

事实类型的读数称为事实类型读数。基于事实的建模对一个论域(UoD) 进行建模,这是模型所研究的主题领域。

下图是一个简单的对象-角色模型,带有一个事实类型及其相关的事实类型读数。

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

对象-角色建模是一种基于事实的建模

基于事实的建模的历史可以追溯到 20 世纪 70 年代,它诞生于以图形方式描述存储事实数据的数据库结构的愿望将自然语言融入其中。FBM 在模型构造中采用自然语言有助于模型的解释。其他类型的概念建模也在模型的构造中包括自然语言,如下面的实体关系图,它也将库存项目建模为仓库中的一个箱中的部件。

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

实体关系图

实体关系图中的库存项目实体存储仓库中仓位的零件信息,但 ERD 不表示事实类型读数为“零件在仓库的仓位中”。

类似地,属性图模式可能有一个库存项目节点和一个边,该边表示某个特定库存项目是针对某个零件的,但不是事实类型“零件在仓库的箱中”。

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

属性图模式

当作为对象-角色模型创建时,基于事实的建模与实体关系图和属性图模式的不同之处在于,fbm 显示了更多的语义信息,并且将显示不仅库存项目是针对 (a)零件的,而且每个库存项目是针对(a)仓库中(a)箱中的零件的。

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

对象-角色模型

因为基于事实的模型语义丰富,基于事实建模的软件可以用自然语言描述实体/节点及其关系,这样人们就很容易理解他们在看什么。基于事实的建模工具可以用自然语言提供模型的术语表视图:

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

自然语言中基于事实的建模术语表示例

如果您是一名业务分析师,需要生成论域的文档,使用适当的基于事实的建模工具,您可以用自然语言生成文档,并带有调查区域的图片。如果您需要有人在数据库/模型模式上签字,这很有帮助:

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

基于事实的模型文档示例

这是对基于事实的建模的简要概述。总的来说,基于事实的建模语言(如对象-角色建模)的语义丰富性提供了最有益的概念建模体验。

用基于事实的建模语言创建的模型可以很快很容易地转换成实体关系图和属性图模式,如果你的读者喜欢的话,那么使用正确的工具,你就不会局限于基于事实的建模。

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

感谢您的阅读。如果时间允许,我会写更多基于事实的建模。

— — — — — — — — — — — — —

我的甘怎么了?

原文:https://towardsdatascience.com/what-is-going-on-with-my-gan-13a00b88519e?source=collection_archive---------29-----------------------

GANs 的挑战、解决方案和未来

生成对抗网络是一类新的深度生成模型,近年来受到广泛关注。我过去曾以非常概括的方式介绍过它们(表格合成数据 —第 1 部分和表格合成数据 a —第 2 部分),并特别关注它们在合成表格数据中的应用。但今天,重点将有所不同——在一系列文章中,我将涵盖你在训练 GANs 时可以发现的挑战、最常见的解决方案以及文学的未来方向。这篇评论的灵感来自这篇关于 GANs 挑战、解决方案和未来的精彩文章——我强烈建议你深入了解一下。

生成对抗网络

近年来,生成模型被广泛应用于各种各样的实际应用中。“生成模型”可以被定义为计算密度估计的模型,其中模型分布被学习来近似真实数据分布。

这带来了一些挑战,因为研究表明最大似然法不是一个好的选择,会导致样本过于一般化和不可行。

生成对抗网络(GANs)可以通过引入鉴别器网络来解决这一问题,该鉴别器网络能够鉴别原始数据样本和由模型生成的样本。

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

生成对抗网络体系结构

它们具有广泛的应用范围,因为它们能够通过图像、音频和数据进行隐式学习,而这些图像、音频和数据很难用显式可能性进行建模。

挑战

在某些应用领域,GANs 可能非常有用,也相当具有破坏性,但是,就像在所有事情中一样,这是在它们的好处和我们在使用它们时容易发现的挑战之间的权衡。我们可以将 GANs 面临的挑战分为三个主要问题:

  • 模式崩溃
  • 不收敛和不稳定
  • 对超参数和评估指标高度敏感

为什么模式崩溃?🔥

GAN 有时会受到生成的样本很少代表总体的限制,这意味着,例如,在 MNIST 数据集上训练 GAN 后,可能会发生我们的生成器无法生成与数字 0 不同的数字。这种情况被称为模式崩溃。

主要缺点是,由于目标函数的原因,GANs 无法集中于整个数据分布。一些实验表明,即使对于双模态分布,GANs 也倾向于产生与主模态的良好拟合,难以推广。总之,模式崩溃是泛化能力差的结果,可分为两种不同类型:

  • 来自输入数据的大多数模式在生成的数据中不存在
  • 生成器仅学习特定模式的子集。

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

用香草甘训练时模式崩溃的例子。https://arxiv.org/pdf/1612.02136.pdf

模式崩溃的原因可能各不相同,从不合适的目标函数到所选 GAN 架构在考虑分析数据时的影响。但是不要再害怕了,有很多选择可以解决这个问题,很多人都在努力应对这个特殊的挑战。

不收敛和不稳定

GAN 由两个网络组成,并且每个网络都有其损耗函数,这一事实导致 GAN 本质上是不稳定的——深入研究这个问题,发生器(G) 损耗会导致 GAN 不稳定,这可能是梯度消失问题的原因,此时**鉴别器****【D】**可以轻松区分真假样本。

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

鉴别器损失函数

在 GANs 架构中, D 试图最小化交叉熵,而 G 试图最大化交叉熵。当 D 可信度高并开始拒绝 G 产生的样品时,导致 G 的梯度消失。

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

收敛失败的 GANs 损失和精度。摘自一篇关于识别和诊断 GAN 故障模式的文章。归功于。https://machine learning mastery . com/practical-guide-to-gan-failure-modes/

这可能指的是我们在训练 GANs 时针对的非凸博弈中存在局部均衡的假设,正如一篇关于 GANs 收敛和稳定性的文章中所提出的。在文献中已经提出了一些选项来缓解这个问题,例如反转用于构建交叉熵成本的目标或者应用梯度惩罚来避免局部均衡。

超参数和评价呢?

没有好的超参数的选择,任何成本函数都不起作用,而 GANs 也不例外,它们对网络超参数的选择更加敏感。超参数的正确选择可能是冗长而费时的,到目前为止,大部分的努力都是在诸如模式崩溃或 GAN 的收敛问题上。

没有选择好的超参数,任何成本函数都不起作用!

此外,多边农业组织缺乏有意义的措施来评估其产出的质量。自创建以来,GANs 已被广泛用于各种应用领域,从监督表示学习、半监督学习、修补、去噪和合成数据创建。广泛的应用带来了大量的异构性,这使得我们更难定义如何评估这些网络的平等性。因为没有定义健壮或一致的度量标准,特别是对于图像生成,所以很难评估哪些 GANs 算法优于其他算法。为了克服这一挑战,文献中提出了一系列评估方法,您可以在本文中找到关于 GANs 评估指标的有趣细节。

解决方案

所涵盖的挑战,是时候检查已经提出并广泛应用于 GANs 的解决方案了。

如前所述,尽管 GANs 训练面临许多挑战,但对于模式崩溃和不收敛问题的解决方案有很多研究。下图描述了 GANs 挑战解决方案的一个有趣的分类,这让我们对文献中可用的选项有了一个很好的了解。

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

图片来自关于 GANs 挑战、解决方案和未来的文章。演职员表:【https://arxiv.org/pdf/2005.00065.pdf

此外,将涵盖三个主要技术,以改善 GANs 的培训和整体效果。

探索新的网络架构

更好的 GAN 模型架构设计无疑是一个有效的选择。事实上,文献中有几个 GAN 是通过探索新的架构来解决特定数据挑战而产生的——例如, CGAN 是第一个提出的 GAN 架构的有条件版本,它无疑会在合成数据时带来更好的结果,另一方面, VAE-GAN 遵循编码器-编码器架构,它利用学习到的表示来更好地衡量数据空间中的相似性,从而提高视觉保真度,最后,例如, 存储器 GAN 遵循一种存储器架构,该架构可以缓解与无监督学习相关的两个主要问题,即生成器正确学习训练样本的表示的能力,以及鉴别器更好地记忆已经看到的生成样本的能力。

内存 GAN 遵循一种内存架构,可以缓解与无监督学习相关的两个主要问题

总之,在架构再造方面,研究将解决方案定位如下:

  • 条件生成
  • 生成-判别网络对
  • 利用编码器加入架构
  • 改进的鉴别器架构
  • 探索记忆网络

引入新的损失函数

由于模型参数波动很大,并且可能以永不收敛的方式变化,一些人决定探索新的损失函数,以帮助 GANs 达到更好的最优。事实上,一些研究人员已经指出,选择正确的损失函数可以有效地解决训练不稳定性。损失函数的改进可以归类为新的概率距离和散度的建议,这可以解决模式崩溃问题,因为它稳定了 GAN 训练,如在 WGAN 中观察到的,或者通过引入正则化或梯度惩罚,如在 WGAN-GP 中观察到的,这改进了之前提出的 WGAN 的训练稳定性。

检查替代优化算法

GANs 优化背后的概念是最小-最大博弈,这通常导致在训练过程中我们无法找到局部纳什均衡,也就是说,它们无法收敛。在文献中发现的一些文章中,已经提出了使用 同时梯度下降 t ,即使在已知难以训练的 GAN 架构上,也导致更稳定的训练和改进的收敛。

甘斯的未来

恭喜你!简而言之,您已经了解了在与 GANs 一起工作时发现的最常见的挑战,以及文献中最常提出的一些解决方案!从这篇综述中,可以理解,尽管在与 GANs 合作时有许多挑战需要解决,但它们无疑是近年来机器学习领域最重要的发现之一。

希望这篇评论能启发你开始挖掘这些令人惊叹的算法,并探索新的应用!

有用的链接

Github Repos

法比亚娜 YData的首席数据官。

通过设计使数据在保密的情况下可用。

YData 帮助数据科学团队交付 ML 模型,简化数据采集,因此数据科学家可以将时间集中在重要的事情上。

什么是好代码?

原文:https://towardsdatascience.com/what-is-good-code-an-actionable-introduction-1cad30551ad4?source=collection_archive---------23-----------------------

编码最佳实践

10 分钟可操作的介绍。

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

优秀的代码转换器(图片由作者提供)

在接下来的部分,我将介绍手头的主题,让你了解这篇文章将会涵盖的内容,以及其中的每一个论点将会如何处理。希望这能帮助你决定是否值得花时间阅读这篇文章的其余部分。然而,如果你想快速找到文章的症结所在,可以跳过下面的部分。好东西在那里等着你!

你想知道成为一名伟大的程序员必须遵循的 5 个简单提示吗?或者,提升你的编码能力,并在科技巨头中获得梦想中的工作的秘方?

—如果是,停止阅读。

因为,今天我拒绝让你知道这些强大的行业秘密。我这样做的原因有三。

1。没有这样的秘密。

如果有的话,我也退出俱乐部。唉!

2.写好代码的能力对别人的帮助比对你的帮助更大

如果你想学习写好代码,从而改善你的简历,或者能够完成你的下一个可交付成果,那么这是而不是需要学习的技能。写好代码是一种团队技能;这对你的同龄人有帮助,如果他们实践了,对你也有帮助。简单地说,写好代码是礼貌的事情。

它唯一能直接帮助你的时候,是当你碰巧回到你很久很久以前写的一段代码的时候!

3。好代码是一个以用例为中心的术语。

根据守则的目的,我们衡量其好坏的尺度将会改变。虽然我将触及一些不同的用例,但作为这篇文章的一部分,我将主要探索它们,为我今天想要关注的主要用例添加一些上下文和一些对比。

一个庞大且足够复杂的代码库,这意味着由许多作者跨多年路线图逐步开发,其生产环境托管在弹性 web 服务中并依赖于弹性 web 服务,其最终客户是人。

随着我们进一步探索,我们为什么选择将自己限制在这些参数之内将变得不言而喻。但是现在,让我们介绍一个简单而著名的思想,我们将在此基础上完成这篇文章。

“代码被阅读的次数远远多于它被编写的次数”

这是一个非常简单并且在某种程度上非常明显的观察结果,但却蕴含着深刻的见解。— 为人工阅读操作优化代码。

当我们第一次学习编码时,我们编写 Hello World 程序,然后慢慢学习简单的数据结构和算法。然后我们被介绍给 Big-O(s ),并学习从时间和空间复杂性的角度来思考。在我们的整个学术生涯中,我们都带着这种如何处理代码的心智模型,然后尝试在我们的工作空间中使用它来开发软件产品。

如果我们的目标是编写编译器/解释器能够理解的代码,这是一种很好的方法。因为,在这种方法中,我们对全局状态的概念、到处使用 setters 以及编写任何晦涩复杂的逻辑(从人类的角度来看)变得很舒服,只要它生成解释器可以更快处理的字节代码。

现在,我们不应该忽视这种方法带来的好处。我们的程序工作起来,占用尽可能少的空间,运行尽可能快。并且,如果代码一旦被编写,就意味着被固定在石头上,这种方法将会是解决我们所有问题的灵丹妙药,我们将从此过上幸福的生活。但是真实世界的用例,我们正试图为其编写好的代码,要流畅得多,也要混乱得多。

在墨菲定律占主导地位的混乱的现实世界中,这种方法带来了明显的权衡。

没有人愿意接触的错误代码库。

我们都知道那些代码库,我们曾经在某个时间点工作过,并且会找一百个借口来避免再次工作。造成这种情况的原因有很多,但其中一些最常见的,也是让我不时产生夜惊的原因是。

一切都是相连的。

代码是有效的(好吧,7/10 次是有效的),但是如果你在一个内部模块中改变一个私有方法来做一件事情,它会破坏一个完全不同的模块中的一些现有特性,做一些完全不同的事情。

每个人都有副业。

在整个代码库中,方法改变它们的输入参数,并且比蛇油有更多的副作用。这使得如果不阅读整个流程,甚至是最底层的细节,就不可能理解正在发生的事情。看着你,System.out.println()【1】【2】。

请把调试器递给我,好吗?

最近我在解决一个竞争性的编码问题。我最终得到了两个解决方案,一个(在某种程度上)优化了可读性,一个优化了编译器。

以下是一般性问题陈述。

通用问题陈述解决方案

现在让我们实现一个编译器优化的。

编译器优化解决方案

代码很小,并且非常高效。太好了。但是它是如何工作的呢?没那么简单,对吧?在您开始理解这段代码是如何工作的之前,您必须进行一次演练或启动调试器。

现在想象一下。

此代码为您客户的物流系统提供动力,但存在一个缺陷。你不修好它的每一分钟,成千上万的顾客都不知道他们是否还有足够的汽油来完成旅程。 在这样的代码中,你愿意成为负责尽快修复 bug 的人吗?

现在再想象一下。

编写本代码时,天然气的价格很便宜。所以我们的顾客不在乎价格,只要他们能完成他们的旅程。最近,运营国与其石油和天然气贸易伙伴之间爆发了一场贸易战。突然之间,价格成了一个重要的变量。 这个逻辑应该放在哪里?

现在你可能会说,“哎,让当初写这个的人,照顾一下这个要求吧”。那个人可能已经换了团队,换了公司,或者成为了一名口袋妖怪训练师。谁知道呢。

代码库是整个团队/社区的共享继承。 这个法典库应该是远古时期的。开发者应该是可替换的。如果我的缺席意味着我开发的特性成为孤儿,那么我的代码就是这种继承的负担。

因此,虽然这段代码对于当前用例来说是一项资产*(小、轻、快),但是最轻微的震动都会将它变成负债(难以理解、修复和扩展)*。

在我们混乱的现实世界中,记住墨菲定律,

“任何可能出错的事情,都会出错”【3】

现在让我们转向更人性化的可读性优化解决方案。

人类可读性优化的解决方案

好,让我们看看这里会发生什么。

  • 对于每个站,从第一个开始,评估我们是否能从那里完成路线,过滤掉所有我们不能的站。
  • 在过滤的电台中,找到具有最小索引的电台。
  • 如果没有车站符合标准,我们会通知该路线无法完成。

我们甚至不需要知道circularoutedetails 做什么或者我们如何评估路线是否可以完成,就可以在高层次上理解我们正在做什么。****

现在,如果我作为一个读者想知道一些低层次的细节是如何工作的,我可以深入研究这些方法并弄清楚它。因此,尽管代码库更大,但作为读者,我可以简单地挑选我想知道的内容。第一步,我会在一本十页的字典中摸索,字典中的单词是随机排列的;第二步,我会按照严格的字母顺序,有条不紊地阅读第一千页。

做事情的能力是一种非常强大的能力,但遗憾的是,这种能力没有得到充分的重视。

在这个解决方案中,概念和职责被分离到代码的封装部分中。此外,方法、类和字段的命名经过精心选择,以帮助轻松识别所述职责(上面的代码可以进一步改进,我同意,但是你要明白)。所以现在当一个 bug 爬进来时,我不需要摸索整个代码库,我可以找到最有可能产生问题的部分并修复它。

如果你想检查整个代码库,请看这里

[## 实践/竞争

一个解决竞争性编程问题的 Repo,既干净又优化。GitHub 是超过 50 个…

github.com](https://github.com/pratickRoy/Competitive)

但是等等,我听到你问,

“嗯,我明白你的意思了。但是第二种解决方案速度较慢,因此在日常工作中,您将向客户交付较慢的结果。还有,会产生更多的硬件成本。”

所有有效的点,我很高兴你问他们!
为了回答这个问题,我会将您重定向到我们的用例定义。所以让我重申一下。

一个庞大且足够复杂的代码库,这意味着由许多作者跨多年路线图逐步开发,其生产环境托管在弹性 web 服务中并依赖于弹性 web 服务,其最终客户是人。

所以现在以这个用例为背景,让我们来详细回答这个问题。

1.速度

“但第二种解决方案速度较慢,因此,每天向客户交付结果的速度都较慢”

为了可测量的效率差异,让我们假设第一个解取 O(n)第二个解取 O(n )加油站数量为 1000 个,每一步的操作需要 1 s 。因此第一个解决方案将花费 1 毫秒,而第二个将花费 1 秒。毫无疑问,从电子学的角度来看,这是一个巨大的差异,但从人类感知的角度来看,这几乎是不可察觉的。一个人很难判断一个页面是在 1 毫秒还是 1 秒内加载的。我们用例的核心需求是什么?— “并且其最终客户是人类。”

但这种解释有点不真诚。这是因为我选择的价值观。如果有 10⁶加油站会怎么样?那么第一个解决方案将占用 1s第二个将占用 10⁶s 。10⁶s 肯定会引起用户的注意。在这里,第一个解决方案显然是更好的。或者是?

当设计一个真实世界的应用程序时,如果希望一次性处理 10⁶实体,您首先不会希望将它作为一个同步操作。10⁶实体,每个都可能有自己的数据库查找和服务间调用,是 10⁶潜在的故障点。我们需要确保节流&重试机制、状态管理和幂等保护措施到位。如果你的代码应该在一个单线程同步调用中处理一百万个条目,也许可以再试试这个设计。

我在这里想说的是,可伸缩性在很大程度上是一个高层次的架构问题。它可以通过多种方式解决,其中许多方式与您编写的代码无关。如果您不得不担心在代码方法级别满足您的规模需求,并且为此您不得不牺牲可读性,那么首先我们应该考虑重新检查架构一次。

然而,假设你正在建立一个高频交易平台,每一纳秒都很重要。在这里,选择第一种解决方案是有意义的。但如果最终客户是人,这里或那里的几秒钟对他们来说通常不是问题。然而,如果通过牺牲可读性**,你的团队花了几个月的时间来交付一个不破坏你的代码库中所有其他东西的新特性,或者花了几个小时来识别和修补一个严重的错误,这阻止了你的客户使用你的应用**,这**实际上影响了你的客户。**所以钥匙拿走了。

始终根据您的客户进行编码。

2.硬件成本

此外,这将导致更多的硬件成本。

没错。但是今天硬件很便宜。[4]

现在我不是提倡浪费。就算便宜,还是要花钱的,还是要付出环境的代价。

但是如果你牺牲可读性来节省硬件成本,你最终会让你的团队付出更多。因为可读性低,需要花费更多的工时在 bug 和每个新功能上。从经济和环境角度来看,熟练工人的工时要昂贵得多。(我在这里不对这种说法进行限定,因为我认为简单的谷歌搜索就足够了,但如果你不同意,请给我留言,我们可以进一步讨论)

所以关键外卖。

只要不影响理解,代码应该尽可能优化。

测量可读性?

嗯,好吧,我听到你问了,

“有道理,但是可读性是一个主观的实体。我们如何衡量它?为了能够在实践中加强这一点,我需要一些客观的方法来衡量它,对吗?否则就没什么用了”

嗯,正如你提到的,这是一个主观的质量,所以虽然我们不能得到一个精确的测量,我们可以按照著名的 WTFs 每分钟规则 [5]得到一个相对的测量,如果你想一想,这就是我们所需要的。

所以一个简单的方法是,

让你的同事阅读你的代码。他们在阅读你的代码时吃惊的次数越少,可读性就越好。

同样值得注意的是。我们提到的用例的参数是足够模糊的,如果你仔细想想,我们在日常生活中构建和使用的许多产品都属于这个描述,包括 Medium。
——我不会进一步解释,但先详细说明一下。这是值得的。😃

唷!那是一篇很长的文章。然而,我忽略了许多细微差别和问题。因此,如果你不同意我说的任何话,或者想进一步讨论以上任何问题,或者进一步讨论我在这里可能没有提到的任何细微差别,请留言。我非常乐意参与。辩论和讨论代码是生活中为数不多的可以而且应该过度享受的乐趣之一。

来源、脚注和进一步阅读链接

  • 一个很好的关于副作用的介绍 wiki:
    【1】副作用(计算机科学),Wikipedia
  • 一个很有见地的问题,强调了代码中副作用的经常是无意的后果:
    【2】system . out . println()在 Java 中有副作用吗? (2016),堆栈溢出
  • 很酷的一页,整理了大量的墨菲定律。看一看。这些定律有趣、令人沮丧、鼓舞人心、稀奇古怪,同时又有关联:
    【3】墨菲定律|非常廉价的想法
  • 一篇很好的介绍文章,介绍了问题的硬件和软件解决方案。有点过时,但让你思考下一个该问的问题:
    【4】j .阿特伍德,硬件便宜,程序员贵 (2008),编码恐怖
  • 一篇详细介绍每分钟 WTF 规则的博客:
    [5] A. Eaton,[每分钟 WTF——代码质量的实际测量](http://reviewthecode.blogspot.com/2016/01/wtf-per-minute-actual-measurement-for.html#:~:text=WTF%20Per%20Minute%20-%20An%20Actual%20Measurement%20for%20Code%20Quality,-Cars%20have%20MPH&text=Developers%20have%20WTFPM%20(WTF%20per,more%20WTFPM%20they%20can%20attain.) (2016),Blogspot
  • 我对什么是好的编码的看法深受 Robert C. Martin 先生作品的影响。
    【5】亚马逊链接为他的书清理代码。

最后一次外卖

在你走之前,这是最后一份外卖。如果你经常检查代码库是否满足上述用例,并且不想,也不得不向作者详细解释你期望在他们的代码中看到什么。简单地说,给他们发一张弗兰克·安德伍德这段有力而简洁(并被大量转述)的引文的截图。

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

最后一次外卖(图片由作者提供)

[## 点击此处订阅:)

想在我写新东西时得到通知吗?每当我发布时收到电子邮件!

有两种作家,写得多的和写得少的。我是后者。我痴迷于创造价值,回避噪音。如果想看这样的内容,可以考虑订阅。](https://pratickroy.medium.com/subscribe)

什么是谷歌广告数据中心?

原文:https://towardsdatascience.com/what-is-google-ads-data-hub-ac914636d88?source=collection_archive---------15-----------------------

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

来源:沉积照片

营销人员需要知道的一切

每个广告服务都有兴趣展示它是如何帮助广告商增加销售额的。为此,谷歌分析、脸书分析等服务应运而生。但是当涉及到评估媒体广告的效果时,情况就困难重重了。经典的网站分析工具无法衡量媒体广告的有效性(因为广告互动发生在广告商网站之外),其他工具也无法给出透明的估计。

为了解决这个问题, Google 推出了 Ads Data Hub ,一个评估媒体库存数据有效性的工具。它允许您将显示广告数据与网站和 CRM 数据相结合。

Ads 数据中心是为了什么而创建的?

有经典的透视转换。大多数媒体工具让你知道有多少看到横幅的用户下了订单。但是这些工具没有显示用户从查看横幅到购买的所有步骤,也没有考虑从 CRM 系统购买的订单。

广告服务提供上传的工具,比如来自谷歌的数据传输,这样广告主就可以将活动信息与自己的数据结合起来。以前,你可以从 DoubleClick Campaign Manager (DCM)上传包括用户 ID 在内的每次点击、浏览或事件的原始日志数据到 Google BigQuery。然而,在 2018 年, GDPR 规则禁止广告商下载用户数据,因为他们与出版商的平台而不是广告商的网站进行互动。

因此,谷歌允许广告商根据所有隐私要求透明地评估展示广告的效果。现在用户 id 不能从 DCM 和 DPM 下载,但是可以在 Ads 数据中心获得。

Ads Data Hub 出现还有一个原因。对于大多数广告客户来说,展示广告是电视或户外广告的一种替代方式。它不是绩效营销的替代品,而是另一种媒体推广工具。与电视广告不同,媒体广告没有既定的基准。这就是为什么广告商需要一个工具来显示他通过展示广告与哪些观众互动。

谷歌创造了这样一个工具。很快,大多数投资媒体广告的大型广告商将被迫掌握广告数据中心。

Ads 数据中心报告示例

假设您在 Google Display Network 发起了媒体宣传活动,并希望评估其效果。借助 Ads Data Hub,您可以将来自 Campaign Manager 的 SQL 查询视图、来自 Google Analytics 的会话和在线购买以及来自 CRM 的已支付订单合并在一起。

因此,您将构建一个包含以下信息的报告:

  1. 广告活动的名称。
  2. 每个活动的浏览量。
  3. 活动覆盖范围—已看到横幅的用户数量。
  4. 会话数据。它包括看到横幅广告但没有点击广告链接的用户的会话。比如用户看到了一个广告,记住了,然后在搜索中找到了你的站点。
  5. 点击广告中的链接。
  6. 在线转换。
  7. 来自 CRM 的确认订单。

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

图片由作者提供

这就是 Ads Data Hub 允许你测量观看后转化率的方式。如果您构建这样一个没有 ADH 的报告,它将只包括那些点击横幅进入网站的用户。你不会了解那些没有点击广告,但后来以另一种方式进入网站的人。此外,CRM 中也没有真实的销售额(报告中的黄色栏)。

谷歌广告数据中心如何工作

Ads Data Hub 是一个 API,是 Google BigQuery 中的一个数据工具。它不是一个独立的数据存储。事实上,Ads 数据中心链接了两个 BigQuery 项目——你自己的和谷歌的。

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

来源:谷歌博客

Google 项目存储来自 Campaign Manager、Display & Video 360、YouTube 和 Google Ads 的日志数据。根据 GDPR 规则,你无法从其他地方获得这些信息。

另一个项目存储从 Google Analytics、CRM 或其他来源上传到 BigQuery 的所有营销数据(在线和离线)。谷歌团队没有访问这个项目,因为它完全是你的。

Ads Data Hub 作为一个 API,允许您同时从这两个项目请求数据,而无需在用户级别上传它们。这使得你可以将所有的点击和转换链接到印象数据,并查看每个活动如何影响转换。

**重要:**Ads Data Hub 给出的查询结果聚合到 50 个用户,也就是说每个表行必须包含 50 个或更多用户的数据。您不能深入到一个特定用户。创建此限制是为了遵守 GDPR 规则。

如何使用 Ads 数据中心

您需要在 Google BigQuery 中上传网站和 CRM 数据,这些数据将与您的广告活动中的印象数据相结合,以使用 Ads Data Hub。

您还需要配置客户端 ID 用户到 Campaign Manager(以前的 DCM)的传输,以设置将网站数据与显示广告数据相结合的标识符。你可以用泛光灯做到这一点。

下一步是什么?

  1. 访问 Ads 数据中心。为此,你可以联系 OWOX 或另一家谷歌官方合作伙伴。
  2. 将您的活动管理器、DV360、Google Ads 或 YouTube 数据连接到 Ads 数据中心。
  3. 如果您还没有将您的数据连接到 Google BigQuery,您可以使用 OWOX BI Pipeline 来完成。
  4. 使用 OWOX BI 将在线转换数据从 CRM 上传到 Google BigQuery。
  5. 构建 SQL 查询来分析上传的数据。
  6. 在 BigQuery 项目中选择一个表来保存查询结果并运行查询。
  7. 将你的分析结果可视化。

如果你不熟悉 SQL,这没什么大不了的。我们将为您提供一个解决方案,通过在报告构建器中选择所需的指标和参数,在没有任何 SQL 知识的情况下,在 OWOX BI 中基于 Ads 数据中心数据构建报告。

关于广告数据中心对营销人员的优势

很久以前,营销人员创建 Excel 文件并交换它们来共享信息。后来大家发现,最好把数据存储在一个地方,按需使用最新的信息。文档云存储的想法就是这样出现的。

Excel 仍然是最流行、最快速的数据处理工具之一。但是让“编辑”访问同一文档和处理文档的副本之间有很大的区别。

MarTech data 在为每个 MarTech 服务创建数据副本以进行计算和报告方面取得了历史性的进步。每份新报告都需要大量的工作,一遍又一遍地将数据从一个来源上传到另一个来源。Ads 数据中心成为这种模式的概念性替代。

现在,每个营销人员都可以手动将谷歌广告中的数据上传到 BigQuery。如果这些数据在广告服务中被追溯性地更改,那么 BigQuery 项目中的数据将不会自动更新,并且不可靠。

有时甚至不清楚构建某个报告需要什么样的媒体广告数据。为了每周构建一次报告,营销人员需要手动将千兆字节的相应数据上传到项目中。

相反,Ads Data Hub 通过 SQL 接口引用来自 Google 广告服务的数据。您的 GBQ 项目包含来自其他来源的数据(例如,来自 CRM)。当您需要广告活动数据的报告时,您只需通过 SQL 请求所需的信息,即可立即获得所有最新信息。您不需要在项目中存储广告数据。现在更新也是自动功能,营销人员不用担心。您收集的所有数据都可以用于您的报告。

什么是谷歌分析?

原文:https://towardsdatascience.com/what-is-google-analytics-23fe684b1e75?source=collection_archive---------52-----------------------

理解谷歌分析,为什么使用它,以及如何使用它的介绍性指南。(附案例分析示例!)

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

来源。

介绍

**本质上,谷歌分析是一种工具,它允许我们聚集、过滤和可视化数据,以了解用户如何与网站互动。**我们可以访问人们在他们使用的网站上留下的数据踪迹,而不是仅仅依靠直觉和经验来影响业务成果。这种数据跟踪为企业提供了对用户行为、兴趣等的宝贵见解,以采取行动来改进他们的产品或服务。

为什么要用?

对于任何拥有交易数据和/或在线业务(几乎所有企业都这样做)的当代企业来说,谷歌分析是一个至关重要的工具。谷歌分析帮助企业衡量营销策略的有效性、在线内容的质量、点击量、用户体验和网站功能等。通常,公司会识别并跟踪**KPI****(关键绩效指标)**来监控增长和转换率。在数据丰富的 21 世纪,企业的成功已经成为数据收集、分析和测试以满足公司目标的严格练习。

它是如何工作的?

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

Cookies 是由浏览器存储在计算机硬盘上的小文本文件,用于保存用户特定的数据。Cookies 是使用 JavaScript 跟踪代码嵌入的。来源。

听说过**饼干吗?**嗯,cookies 是使用谷歌分析的一个基本要素。没有 cookies,就没有数据可以分析!Cookies 已经成为日常网络浏览的一部分。据 W3Techs 统计,截至 2020 年 5 月, 44.2%的网站使用 cookies。

它是这样工作的:JavaScript 跟踪代码(cookies)被嵌入到一个公司的网站中。跟踪代码为访问网站的每个用户(其中“用户”是“设备”和“浏览器”的组合)分配一个唯一的“客户端 ID”。由此,一家公司可以收集大量关于用户如何参与其网站的数据。例如,这里有一些可以收集的东西:

  • 您使用的是什么设备和浏览器。
  • 如果你是新的网站或以前访问过。
  • 你点击了什么,点击了多少次。
  • 你在网站上下载的东西。
  • 你是如何进入网站的?
  • 你在网站上花了多少时间(会话时长)。
  • 你放在购物车里的东西,你丢弃的东西,你购买的东西。

帐户-属性-视图

使用 Google Analytics 的结构是通过一个 4 层的层次来定义的:**组织、账户、属性、视图。**该层级通过下图进行解释。

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

出处。

组织 —组织是我们公司。在这里,我们可以控制组织的所有 Google 产品帐户,管理谁使用 Google 产品,以及他们的权限。

账户 —账户是我们可以访问谷歌分析产品的地方。我们选择一个帐户来访问谷歌分析,并确定我们想要跟踪的属性。我们可以将一个帐户仅与一个属性相关联,或者我们可以使用一个帐户来管理多个属性,无论哪种方式对组织我们的工作流最有意义。

属性 —属性是我们从中提取数据的位置。这可以是数字位置,如网站或应用程序,也可以是物理位置,如收银机或读卡器。当我们添加新酒店时,Google Analytics 会自动创建跟踪代码(cookies ),用于从该酒店收集数据。跟踪代码中的唯一“ID”允许 Google Analytics 识别来自该物业的数据。我们所要做的就是将跟踪代码整合到我们的网站/应用程序中。

视图 —视图是我们查看数据的方式。在视图中,我们可以解析、过滤和组织来自属性的数据。我们可以为用户分配对视图的访问权限,以控制哪些人可以看到某些数据,哪些人不能。我们通常在一个物业内有许多视图。

正在设置

首先,我们想创建一个谷歌分析帐户。幸运的是,我们可以免费做这个!谷歌将为我们设置一个“演示”帐户,其中包含来自谷歌商品商店的真实数据。这是一个很好的实验环境,让我们看看真实的数据,让我们尝试谷歌分析必须提供的一些功能。要设置这个,我推荐跟随这篇在 support.google.com 找到的文章。

完成所有设置后,您可以开始创建新视图来分析和可视化您的数据。首先,要创建一个新视图,请单击“Admin”选项卡。然后,选择您想要添加视图的“帐户”和“属性”。最后,在“视图”列中,单击“创建新视图”。参见下面的分步截图作为示例。

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

第一步:点击仪表板左下角的“管理”。来源:作者。

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

第二步:从“账户”栏下的下拉菜单中选择一个账户。来源:作者。

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

第 3 步:从“属性”列下的下拉菜单中选择一个属性。来源:作者。

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

第四步:点击“创建视图”来创建一个新的视图!来源:作者。

基本观点

视图是一个透镜,通过它可以看到我们的数据。我们经常过滤我们的数据,看我们想看什么。但是,了解筛选数据永久地包括、排除或改变视图的传入数据是很重要的。我们应该始终拥有所有数据的未经过滤的原始视图,这样我们就可以随时访问我们的全部数据集。

请注意,一旦我们删除了一个视图,与该视图相关的所有数据都将永久消失。因此,我们在创建新视图时应该非常慎重,在删除任何视图之前要非常谨慎。

最后,请注意,一旦我们创建了一个视图,该视图的仪表板将显示从视图创建之日起的数据。视图不显示创建日期之前的数据。

我们希望在谷歌分析中为每个属性创建至少 3 个基本视图,以查看我们的数据:

  1. 所有网站数据 —这个视图是在谷歌分析中默认创建的,我们不应该弄乱它。这个视图向我们展示了来自我们网站/应用程序的所有原始数据。我们可以把这个视图看作是我们数据的备份。
  2. 测试视图 —如果我们想要应用新的过滤器或者进行更改,我们可以首先使用这个视图来测试它。通过使用“测试视图”,我们可以看到新的过滤器如何影响我们的数据收集,而没有丢失数据的风险。如果我们对“测试视图”中的结果有信心,那么我们可以将这些变化应用到我们的“主视图”中。
  3. 主视图 —主视图是我们用来将数据转化为关键见解的主要视图。在这里,数据由我们之前在“测试视图”中试验过的 Google Analytics 过滤器处理。请记住,如果由于某种原因出现问题,我们总是可以依靠我们的备份视图:“所有网站数据”。

例如:谷歌商品商店

一旦我们建立了自己的观点,我们需要对数据提出问题。提问允许我们有目的地浏览数据,以便解析、过滤和可视化我们收集的数据。

例如,假设我们正在谷歌商品商店的数据分析团队工作。我们的任务是找出是否有办法增加网站上的购物量。所以我们可能会问数据这三个问题:

“每周有多少用户在网站上购买商品?

有多少用户把 merch 放在购物车里,却不买?

用户在什么时候决定不买?"

为了解决这些问题,我们可以使用 Google Analytics 中的一个名为**“目标流报告”的功能。**使用此报告,我们可以了解用户在结账前放弃购物车中商品的时间点。从这里,我们可以使用动态再销售来获得更多放入购物车的鞋子的顾客转化(购买)。

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

“目标流报告”可以在谷歌分析界面的左侧找到,在转化-目标-目标流下。在这份报告中,我们可以了解网站在购买过程中失去客户的原因。来源:作者。

在最左侧,我们可以看到显示用户在过去一周如何访问谷歌商品商店的所有不同来源。从左到右,结账过程分为五个步骤:购物车、账单+运费、付款、审核订单和购买。

从图形上看,Google Analytics 让我们很容易确定我们在哪里失去了大部分购买。从“购物车”到“账单+发货”这一步,数量会有巨大的下降。从 1600 次会议,我们减少到 300 次会议。谷歌商品商店在这第一步就失去了超过 80%的顾客!

随着客户采取更多的购买步骤,我们可以看到,我们逐渐失去越来越多的潜在买家。在图的最后一步,我们可以看到只有 30 个人最终从商店购买了东西。商店在采购过程中流失了大约 98%的顾客!想想看:每 100 个人把东西放进购物车,其中只有 2 个人最终会购买。 哇!

因此,根据这些发现,我们可能会建议对谷歌商品商店用户界面进行调整,使“购物车”到“账单+运输”的过渡不那么令人生畏,因为这是我们失去最多客户的阶段。作为一个想法,我们可以请 UX 的研究人员在这些网页上推荐一种更有效的背景颜色,然后进行 A/B 测试,并随着时间的推移对这些颜色进行实验,看看什么最能阻止人们放弃他们的购物车物品,以便最大限度地购买。

在这种情况下,谷歌分析和使用它的企业之间有一个持续的反馈回路。通过分析数据,公司可以了解客户在某些网页上的行为。这就告诉了公司应该改变他们的网站以实现他们的商业目标,无论是更多的购买,更多的点击,还是更多的流量。这就是数据分析的力量。

了解更多关于谷歌分析!

如果你很好奇,想了解更多关于 Google Analytics 的知识,有很多资源可以学习!我花了几天时间学习谷歌在 谷歌分析学院 免费提供的初级和高级实践课程,以提高我的技能。这些课程非常容易使用,而且互动性很强——考考你刚刚学过的知识,这样你就不会变得懒惰,对内容感到厌倦。

完成这些课程后,我通过了谷歌分析个人资格(GAIQ)考试,这表明了使用谷歌分析的熟练程度。这是一个 70 题的选择题考试,时间限制为 90 分钟。你可以在这里免费参加T5 考试。

结论

在 21 世纪,数据分析是一项真正令人兴奋和有价值的技能。随着公司越来越少依赖直觉和经验,而是更多地依赖数据来做出决策和发展业务,对它的需求可能会继续上升。因此,请查看 Google Analytics,了解数据如何提供见解来转变您企业的产品、服务和在线形象。

什么是 Google API 愿景?以及如何使用它

原文:https://towardsdatascience.com/what-is-google-api-vision-and-how-to-use-it-372a83e6d02c?source=collection_archive---------32-----------------------

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

来源:曼努埃尔·盖辛格,佩克斯

使用服务帐户通过 OCR 从图像中提取文本。

介绍

这篇文章源于一个有趣的知识提取项目。第一步是提取 pdf 文档的文本。我工作的公司是基于 Google 平台的,所以很自然,我想使用 API Vision 的 OCR,但是找不到使用 API 提取文本的简单方法。所以这个帖子。

这个帖子的笔记本可以在 GitHub 上找到

谷歌 API 愿景

谷歌发布了 API 来帮助人们、行业和研究人员使用他们的功能。

Google Cloud 的 Vision API 拥有强大的机器学习模型,通过 REST 和 RPC APIs 进行预训练。标记图像,并将它们快速组织到数百万个预定义的类别中。您将能够检测物体和人脸,阅读印刷或手写文本,并将有用的元数据集成到您的图像目录中。(来源: API 视觉)

我们对这篇文章感兴趣的 API 部分是 OCR 部分。

光学字符识别

光学字符识别或 OCR 是一种在图像内部识别和检测字符的技术。大多数时候,卷积神经网络(CNN)是在一个非常大的不同类型和颜色的字符和数字数据集上训练的。您可以想象在每个像素或像素组上有一个小窗口切片,以检测字符或部分字符、空格、表格、线条等。

服务帐户

服务帐户是一种特殊类型的 Google 帐户,旨在代表一个非人类用户,该用户需要进行身份验证并被授权访问 Google APIs 中的数据。(来源:IAM 谷歌云)

基本上你可以把它想象成一个 RSA 密钥(通过互联网在机器之间进行高安全性通信的加密密钥),用它你可以连接到谷歌服务(API、GCS、IAM……)。它的基本形式是一个 json 文件。

笔记本

在这里,我将向您展示使用 API 和从图像中自动提取文本的不同函数。

需要安装的库:

!pip install google-cloud
!pip install google-cloud-storage
!pip install google-cloud-pubsub
!pip install google-cloud-vision
!pip install pdf2image
!pip install google-api-python-client
!pip install google-auth

使用的库:

from pdf2image import convert_from_bytes
import glob
from tqdm import tqdm
import base64
import json
import os
from io import BytesIO
import numpy as np
import io
from PIL import Image
from google.cloud import pubsub_v1
from google.cloud import visionfrom google.oauth2 import service_account
import googleapiclient.discovery
*# to see a progress bar*
tqdm().pandas()

OCR 可以接受在 API 中使用的 pdf、tiff 和 jpeg 格式。在本帖中,我们将把 pdf 转换成 jpeg 格式,将许多页面连接成一张图片。使用 jpeg 的两种方式:

首先,您可以将您的 pdf 转换成 jpeg 文件,并将其保存到另一个存储库中:

*# Name files where the pdf are and where you want to save the results*
NAME_INPUT_FOLDER = "PDF FOLDER NAME"
NAME_OUTPUT_FOLDER= "RESULT TEXTS FOLDER"list_pdf = glob.glob(NAME_INPUT_FOLDER+"/*.pdf") *# stock the name of the pdf files* *# Loop over all the files*
for i in list_pdf:
        *# convert the pdf into jpeg*
        pages = convert_from_path(i, 500)

        for page in tqdm(enumerate(pages)):
            *# save each page into jpeg* 
            page[1].save(NAME_OUTPUT_FOLDER+"/"+i.split('/')[-1].split('.')[0]+'_'+str(page[0])+'.jpg', 'JPEG') *# keep the name of the document and add increment* 

在这里,您可以通过 API 使用您的 jpeg 文档。但是,你可以做得更好,不用保存 jpeg 文件,直接在内存中使用它来调用 API。

设置凭据

在深入之前,我们需要配置 Vision API 的凭证。你会发现,这很简单:

SCOPES = ['[https://www.googleapis.com/auth/cloud-vision'](https://www.googleapis.com/auth/cloud-vision')]
SERVICE_ACCOUNT_FILE = "PUT the PATH of YOUR SERVICE ACCOUNT JSON FILE HERE"*# Configure the google credentials*
credentials = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

图片处理

这需要更多的代码,因为我们还要连接 10 页文档来创建一个“大图”并将其提供给 API。一次调用比 10 次调用更划算,因为每次请求 API 时都要付费。

我们走吧:

操作和连接图片以将它们提供给 API 的函数

使用这两个函数,您将能够加载一个 pdf 文件,将其转换为字节,创建一个“大图片”并将其馈送到函数detect _ text _ document()(详细信息如下)。

函数detect _ text _ document用于输入图片内容和凭证(您的服务帐户信息)。

输出是从图像中提取的文本。这个函数的目标是将单词连接成段落和文档。

怎么用?

您可以像这样使用这个函数块:

for doc_pdf in tqdm(list_pdf): *# call the function which convert into jpeg, stack 10 images
        # and call the API, save the output into txt file* 
        concat_file_ocr(doc_pdf)

输入就是用 glob 函数获得的路径。该凭证是在 设置凭证 部分生成的。该循环将获取输入文件的每个 pdf,使用通过转换 pdf 获得的 jpeg 文件调用 API,并保存包含检测的文本文件。

结论

在这里,您将结束关于如何使用视觉 API 并自动生成包含检测的文本文件的教程。您知道如何使用您的服务帐户配置凭证,以及如何将 pdf 转换为 jpeg 文件(每页一个 jpeg)。是全部吗?不,我有一些奖金给你(见下文)。

好处 1:每页使用 API

前面的函数允许您使用 API 来连接页面。但是,我们可以在 pdf 文档的每一页使用 API。下面的函数将请求 API 将 pdf 转换成 jpeg 格式的每一页。

使用它非常简单,只需用 pdf 文件夹的路径和凭证调用这个函数。像这样:

if per_page: *# option True if you want to use per page*
    *# call the API vision per page of the pdf*
    for i in tqdm(list_pdf):
        *# open the pdf and convert it into a PlImage format jpeg*
        call_ocr_save_txt(i, cred=credentials)

好处 2:使用多重处理库

只是为了好玩,你可以把这个 API 和多重处理一起使用(好吧,这在 python 中不是真正的多重处理,带有全局解释器锁(GIL))。但是,这里的代码:

if multi_proc:
    nb_threads = mp.cpu_count() *# return the number of CPU*
    print(f"The number of available CPU is {nb_threads}")
        *# if you want to use the API without stacking the pages*
    if per_page:
        *# create threads corresponding to the number specified*
        pool = mp.Pool(processes=nb_threads)    
        *# map the function with part of the list for each thread*
        result = pool.map(call_ocr_save_txt, list_pdf) 

    if per_document:
        pool = mp.Pool(processes=nb_threads) 
        result = pool.map(concat_file_ocr, list_pdf)

深度学习中的梯度积累是什么?

原文:https://towardsdatascience.com/what-is-gradient-accumulation-in-deep-learning-ec034122cfa?source=collection_archive---------4-----------------------

解释了神经网络的反向传播过程

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

澳大利亚八月在 Unsplash 拍摄的照片

的另一篇文章中,我们解决了批量大小受 GPU 内存限制的问题,以及梯度累积如何帮助克服这个问题。

在这篇文章中,我们将首先检查一个神经网络的反向传播过程,然后通过梯度积累的技术和算法细节。我们将讨论它是如何工作的,并通过一个例子进行迭代。

什么是梯度积累?


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

梯度累积

在进一步研究梯度累积之前,最好先研究一下神经网络的反向传播过程。

神经网络的反向传播

深度学习模型由许多相互连接的层组成,在所有这些层中,样本在每一步中都通过正向传递进行传播。在传播通过所有层之后,网络生成样本的预测,然后计算每个样本的损失值,该值指定“网络对此样本的错误程度如何?”。然后,神经网络计算这些损失值相对于模型参数的梯度。然后,这些梯度用于计算相应变量的更新。

在建立模型时,我们选择一个优化器,它负责用于最小化损失的算法。优化器可以是已经在框架中实现的常见优化器之一(SGD、Adam 等),也可以是自定义优化器,实现所需的算法。除了梯度之外,优化器可能还会管理和使用更多的参数来计算更新,例如学习率、当前步长指数(用于自适应学习率)、动量等

优化器表示计算参数更新的数学公式。一个简单的例子是随机梯度下降(SGD)算法:V = V — (lr * grad),其中V是任何可训练的模型参数(权重或偏差),lr是学习率,grad是损失相对于模型参数的梯度:

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

SGD 优化器的算法

那么从技术上讲,什么是梯度累积呢?

梯度累积意味着在不更新模型变量的情况下运行配置数量的步骤,同时累积这些步骤的梯度,然后使用累积的梯度来计算变量更新。

是的,真的就这么简单。

在不更新任何模型变量的情况下运行一些步骤是我们逻辑上将一批样本分成几个小批的方式。每个步骤中使用的样本批次实际上是一个小批次,这些步骤的所有样本组合起来实际上是一个全局批次。

通过在所有这些步骤中不更新变量,我们使得所有小批量使用相同的模型变量来计算梯度。这是强制性的,以确保计算相同的梯度和更新,就像我们使用全局批量大小一样。

在所有这些步骤中累积梯度会产生相同的梯度和,就像我们使用全局批量大小一样。

遍历一个例子

假设我们在 5 个步骤中累积梯度。我们希望累积前 4 步的梯度,而不更新任何变量。在第五步,我们希望使用前 4 步累积的梯度与第五步的梯度相结合来计算和分配变量更新。让我们来看看它的实际应用:

从第一步开始,第一个小批量的所有样本通过前向和后向途径传播,产生每个可训练模型变量的计算梯度。我们不想实际更新变量,所以此时没有必要计算更新。然而,我们需要的是一个存储第一步的梯度的地方,以便在随后的步骤中可以访问它们,并且我们将为每个可训练模型变量使用另一个变量来保存累积的梯度。因此,在计算第一步的梯度后,我们将把它们存储在我们为累积梯度创建的变量中。

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

N 步结束时累积的梯度值

现在,第二步开始了,第二个小批量的所有样本通过模型的所有层传播,计算第二步的梯度。就像上一步一样,我们还不想更新变量,所以不需要计算变量更新。与第一步不同的是,我们不是将第二步的梯度存储在变量中,而是将它们添加到变量中存储的值中,这些值当前包含第一步的梯度。

第 3 步和第 4 步与第二步非常相似,因为我们还没有更新变量,我们通过将它们添加到变量中来累积梯度。

然后,在步骤 5 中,我们想要更新变量,因为我们打算在 5 个步骤中累积梯度。在计算出第五步的梯度后,我们将把它们加到累积的梯度上,得到这五步所有梯度的总和。

然后,我们将得到这个总和,并将其作为参数插入到优化器中,得到使用这 5 个步骤的所有梯度计算的更新,这些更新是在全局批处理中的所有样本上计算的。

如果我们以 SGD 优化器为例,让我们看看第五步结束时更新后的变量,这些变量是使用这五个步骤的梯度计算的(在下面的示例中 N=5):

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

N 步后可训练变量的值(使用 SGD)

太好了!所以我们来实施吧!

可以实现任何优化器的梯度累积版本。每个优化器都有不同的公式,因此需要不同的实现。这不是最佳的,因为梯度累积是一种通用的方法,应该是独立于优化器的。

的另一篇文章中,我们介绍了实现通用梯度累积机制的方法,并向您展示了如何使用您选择的任何优化器在您自己的模型中使用它。

什么是渐变裁剪?

原文:https://towardsdatascience.com/what-is-gradient-clipping-b8e815cdfb48?source=collection_archive---------4-----------------------

一个简单而有效的方法来处理爆炸梯度

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

Unsplash阿三 S. 的照片

递归神经网络(RNN)通过利用存储关于过去输入的信息的隐藏状态来很好地处理序列数据:隐藏状态在时间 t 的值取决于它们在时间 t -1 的值以及在时间 t 的输入。这种架构虽然强大,但在训练中会导致两个问题:爆炸渐变消失渐变。在本文中,我们将研究渐变剪辑,它处理爆炸渐变问题。

爆炸和消失渐变背后的直觉

爆炸梯度是指梯度在训练中变得过大,使模型不稳定的问题。类似地,消失梯度指的是在训练中梯度变得太小。这可以防止网络权重改变其值。这两个问题都会导致模型无法从训练数据中学习。下面的非正式讨论并不严格,但足以给我们一个关于爆炸和消失梯度来源的直觉。

当我们通过时间反向传播来训练 RNN 时,这意味着我们首先通过为每个时间步长创建网络的副本来及时展开 RNN,将其视为多层前馈神经网络,其中层数等于时间步长数。然后,我们在展开的网络上进行反向传播,考虑权重共享:

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

其中 W 是递归权重矩阵。可以看出,损失函数的梯度由 W ᵀ的 n 个副本的乘积组成,其中 n 是及时返回的层数。矩阵的这个乘积是爆炸和消失渐变的来源。

对于一个定标器一个一个一个 aⁿ 呈指数级收缩或增长。比如考虑 n = 30。然后比如 1.1 ≈ 17.45 和 0.9 ≈ 0.042。我们选择 30 是因为自然语言处理任务中的一个句子有 30 个单词是很常见的,时间序列分析处理 30 天的数据也是很典型的。矩阵的乘积( W ᵀ) 的情况非常相似。看到这一点的最简单的方法是假设wt19】可对角化。然后 W ᵀ = QDQ ⁻求点对角矩阵d=diag(λ,…,λ* ₓ),以及(wᵀ)=qdq⁻用【T44*

我们参考[2]对爆炸和消失梯度问题的严格处理。

渐变剪辑

渐变裁剪是一种处理爆炸式渐变的技术。渐变裁剪的想法非常简单:如果渐变变得太大,我们重新调整它以保持它很小。更准确地说,如果‖gc,则

**g** ↤ *c* · **g**/‖**g**‖

其中 c 为超参数, g 为梯度,‖ gg 的范数。由于g/g‖是一个单位向量,重新缩放后,新的 g 将具有范数 c 。注意,如果‖ g ‖ < c ,那么我们什么都不需要做。

渐变裁剪确保渐变向量 g 最多有范数 c 。这有助于梯度下降有一个合理的行为,即使模型的损失景观不规则。下图显示了 loss 地貌中一个极其陡峭的悬崖的示例。如果没有削波,参数会大幅下降,并离开“好”区域。使用削波,下降步长受到限制,参数保持在“良好”区域。

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

[1]图 10.17

履行

常见问题

问:我们如何选择超参数 c

答:我们可以为一些时期训练我们的神经网络,并查看梯度范数的统计数据。梯度范数的平均值是一个很好的初步尝试。

问:除了 RNN,我们能在训练神经结构中使用梯度裁剪吗?

答:是的。每当我们有爆炸梯度时,我们可以对任何神经架构使用梯度裁剪。

进一步阅读

  1. [1]的第 10.11 章很好地概述了渐变裁剪的工作原理。
  2. [3]引入了新的光滑条件,为梯度裁剪的有效性提供了理论解释。

参考

  1. 古德菲勒、本吉奥和库维尔。深度学习 (2016),麻省理工学院出版社。
  2. R.帕斯卡努、t .米科洛夫和 y .本吉奥。论训练递归神经网络的难度 (2013),ICML 2013。
  3. J.张,何铁男,施瑞华,贾德巴贝。为什么梯度裁剪加速了训练:适应性的理论证明 (2020),ICLR 2020。

什么是群体常态化?

原文:https://towardsdatascience.com/what-is-group-normalization-45fe27307be7?source=collection_archive---------10-----------------------

批处理规范化的替代方法

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

照片由假虎刺属·魏泽Unsplash 上拍摄

批处理规范化(BN)已经成为许多最新深度学习模型的重要组成部分,特别是在计算机视觉中。它通过批次内计算的平均值和方差对层输入进行归一化,因此得名。为了使 BN 起作用,批量需要足够大,通常至少为 32。然而,有些情况下我们不得不接受小批量:

  • 当每个数据样本都非常消耗内存时,例如视频或高分辨率图像
  • 当我们训练一个非常大的神经网络时,它只留下很少的 GPU 内存来处理数据

因此,我们需要 BN 的替代品,它能很好地用于小批量生产。分组归一化(GN)是最新的归一化方法之一,它避免了利用批维数,因此与批大小无关。

不同的标准化方法

为了推动 GN 的形成,我们将首先看看以前的一些归一化方法。

以下所有标准化方法都执行计算

*xᵢ* ← (*xᵢ* - 𝜇*ᵢ*) / √(𝜎*ᵢ*² + 𝜀)

对于输入特征 x 的每个系数 xᵢ 。𝜇 和𝜎 是对一组系数 Sᵢ 计算的平均值和方差,𝜀是一个小常数,为了数值稳定和避免被零除而添加。唯一的区别是如何选择 set Sᵢ

为了说明归一化方法的计算,我们考虑一批大小为 N = 3,具有输入特征 abc. 它们具有通道 C = 4,高度 H = 1,宽度 W = 2:

*a* = [ [[2, 3]], [[5, 7]], [[11, 13]], [[17, 19]] ]
*b* = [ [[0, 1]], [[1, 2]], [[3, 5]], [[8, 13]] ]
c = [ [[1, 2]], [[3, 4]], [[5, 6]], [[7, 8]] ]

因此,该批次将具有形状( NCHW ) = (3,4,1,2)。我们取𝜀 = 0.00001。

批量标准化

BN 对通道进行归一化,并沿( NHW )轴计算𝜇 和𝜎 Sᵢ 被定义为与 xᵢ 在同一通道中的一组系数。

对于 a 的第一个系数 aᵢ = 2,其中 i = (0,0,0),对应的𝜇 和𝜎 是在第一个通道的 abc 的系数上计算的:

𝜇*ᵢ = mean*(2, 3, 0, 1, 1, 2) = 1.5
𝜎*ᵢ*² = var(2, 3, 0, 1, 1, 2) = 0.917

将这些代入标准化公式,

*aᵢ* ← (2 - 1.5) / √(0.917 + 0.00001) = 0.522

计算一个给出的的所有系数

*a* ← [ [[0.522, 1.567]], [[0.676, 1.690]], [[1.071, 1.630]], [[1.066, 1.492]] ]

图层规范化

层标准化(LN)旨在克服 BN 的缺点,包括其对批量大小的限制。它沿着( CHW )轴计算𝜇 、ᵢ 和𝜎 、ᵢ ,其中 Sᵢ 被定义为与 xᵢ 属于同一输入特征的所有系数。因此,输入要素的计算完全独立于批处理中的其他输入要素。

a 的所有系数都被同一个𝜇 和𝜎 归一化

𝜇*ᵢ = mean*(2, 3, 5, 7, 11, 13, 17, 19) = 9.625
𝜎*ᵢ*² = var(2, 3, 5, 7, 11, 13, 17, 19) = 35.734

因此将 LN 应用于 a 给出

*a* ← [ [[-1.276, -1.108]], [[-0.773, -0.439]], [[0.230, 0.565]], [[1.234, 1.568]] ]

实例规范化

实例规范化(IN)可视为将 BN 公式单独应用于每个输入要素(也称为实例),就好像它是批处理中的唯一成员一样。更准确地说,在沿着( HW )轴计算𝜇 、ᵢ 和𝜎 、ᵢ 时, Sᵢ 被定义为与 xᵢ 处于相同输入特征并且也在相同通道中的一组系数。

由于 IN 的计算与批大小= 1 的 BN 的计算相同,因此在大多数情况下,IN 实际上会使情况变得更糟。然而,对于风格转换任务,IN 更善于丢弃图像的对比度信息,并且具有比 BN 更好的性能。

对于第一个系数 aᵢ = 2 的 at39】其中 i = (0,0,0),对应的𝜇 和𝜎 简单来说就是

𝜇*ᵢ = mean*(2, 3) = 2.5
𝜎*ᵢ*² = var(2, 3) = 0.25

这给了

*aᵢ* ← (2 - 2.5) / √(0.25 + 0.00001) = -1.000

当我们向 a 申请时,我们得到

*a* ← [ [[-1.000, 1.000]], [[-1.000, 1.000]], [[-1.000, 1.000]], [[-1.000, 1.000]] ]

群体规范化

之前,我们在中介绍了将 BN 单独应用于每个输入要素,就好像批量大小= 1 一样。请注意,IN 也可以视为将 LN 单独应用于每个通道,就好像通道数= 1 一样。

群规范化(GN)是 IN 和 LN 之间的中间地带。它将通道组织成不同的组,并沿( HW )轴和一组通道计算𝜇 和𝜎 Sᵢ 则是与 xᵢ 处于相同输入特征和相同通道组的一组系数。

组数 G 是一个预定义的超参数,通常需要除以 C 。为简单起见,我们按顺序对通道进行分组。因此,通道 1、…、 C / G 属于第一组,通道 C / G + 1、…、2 C / G 属于第二组,依此类推。当 G = C 时,意味着每组只有一个通道,GN 变为 IN。另一方面,当 G = 1 时,GN 变为 LN。因此 G 控制 IN 和 LN 之间的插值。

对于我们的例子,考虑 G = 2。为了归一化第一个系数 aᵢ = 2 的 a 其中 i = (0,0,0),我们在前 4 / 2 = 2 个通道中使用 a 的系数

𝜇*ᵢ = mean*(2, 3, 5, 7) = 4.25
𝜎*ᵢ*² = var(2, 3, 5, 7) = 3.687

将这些代入标准化公式,

*aᵢ* ← (2 - 4.25) / √(3.687 + 0.00001) = -1.172

对于 a 的其他系数,计算类似:

*a* ← [ [[-1.172, -0.651]], [[0.391, 1.432]], [[-1.265, -0.633]], [[0.633, 1.265]] ]

归一化方法的比较

下图显示了 BN、LN、IN 和 GN 之间的关系。

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

图二之四

蓝色区域对应于用于计算𝜇 和𝜎 的集合 Sᵢ ,然后这些集合用于归一化蓝色区域中的任何系数。

从这个图我们可以看出 GN 是如何在 IN 和 LN 之间插值的。GN 比 IN 好,因为 GN 可以利用跨信道的依赖性。它也比 LN 好,因为它允许为每组通道学习不同的分布。

当批量较小时,GN 始终优于 BN。但是,当批量非常大时,GN 的扩展性不如 BN,并且可能无法与 BN 的性能相匹配。

履行

请注意,GN 的两种实现都有一个可学习的、按通道的线性变换,遵循故障归一化。这类似于 BN、LN 和 IN 的实现。

进一步阅读

  1. GN [4]的原始论文是关于 GN 的技术细节以及不同归一化方法的比较的极好参考。
  2. 即使在批量较大时 GN 不匹配 BN,GN +重量标准化[2]也能够匹配甚至优于 BN。我们参考了文献[1]和[2]的一些实验结果。
  3. [3]展示了 BN 通过使优化前景更加平滑所做的工作。这推动了重量标准化的形成。

参考

  1. A.、L. Beyer、X. Zhai、J. Puigcerver、J. Yung、S. Gelly 和 N. Houlsby。大迁移(BiT):一般视觉表征学习 (2019),arXiv 预印本。
  2. 南乔,王,刘,沈文伟,尤耶。重量标准化 (2019),arXiv 预印本。
  3. 南桑图尔卡、齐普拉斯、易勒雅斯和马德瑞。批处理规范化如何帮助优化? (2018),NIPS 2018。
  4. Y.吴和何国梁。分组归一化 (2018),ECCV 2018。

什么是 Gumbel-Softmax?

原文:https://towardsdatascience.com/what-is-gumbel-softmax-7f6d9cdcb90e?source=collection_archive---------3-----------------------

离散数据采样的可微近似法

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

paweczerwi ski 在 Unsplash 上的照片

在深度学习中,我们经常想要对离散数据进行采样。举个例子,

  • 基于生成对抗网络的文本生成
  • 离散隐变量变分自动编码器
  • 具有离散动作空间的深度强化学习

然而,来自分类分布的离散数据的采样过程是不可微的,这意味着反向传播将不起作用。Gumbel-Softmax 分布是一种连续分布,它近似于分类分布中的样本,也适用于反向传播。

Gumbel-Softmax 分布

Z 是分类分布分类 (𝜋₁,…,𝜋ₓ)的分类变量,其中𝜋ᵢ是我们的神经网络要学习的分类概率。假设我们的离散数据被编码为一个热点向量。最常见的采样方式 Z由下式给出

*Z* = onehot(max{*i* | 𝜋₁ + ... + 𝜋ᵢ₋₁ ≤ *U*})

其中 i = 1,…, x 为类索引, U ~ Uniform (0,1)。由于 max 函数的存在,这个采样公式是不可微的。为了获得可微分的近似值,我们应用以下公式:

  1. 甘贝尔-马克斯诡计

Gumbel-Max 技巧提供了一个不同的采样公式 Z

*Z* = onehot(argmaxᵢ{*G*ᵢ + log(𝜋ᵢ)})

其中 G ᵢ ~ 冈贝尔 (0,1)是从标准冈贝尔分布中抽取的同分布样本。这是一个“重新参数化的把戏”,将 Z 的采样重构为参数的确定性函数和一些固定分布的独立噪声。

采样过程的重构并没有使它变得可区分。在我们的例子中,不可微性来自 argmax 函数。然而,一旦我们有了 argmax 的可微近似值,我们就可以很容易地进行反向传播,因为它只是关于计算确定性函数的梯度 w.r.t .参数。另一方面,如果没有重新参数化的技巧,我们将不得不计算分布的梯度 w.r.t .参数,这是一个更困难的问题。

2.使用 softmax 作为可微分近似值

我们使用 softmax 作为 argmax 的可微分近似值。样本向量 y 现在由下式给出

*y*ᵢ = exp((*G*ᵢ + log(𝜋ᵢ)) / 𝜏) / 𝚺ⱼ exp((*G*ⱼ + log(𝜋ⱼ)) / 𝜏)

对于每一个 i = 1,…, x当𝜏 → 0 时,softmax 计算平滑地接近 argmax,并且样本向量接近 one-hot;随着𝜏 → ∞,样本向量变得一致。

具有上述抽样公式的分布称为 Gumbel-Softmax 分布。注意,在训练期间使用连续向量,但是在评估期间样本向量被离散化为单热点向量。

使用

每当我们有一个离散变量的随机神经网络,我们可以使用 Gumbel-Softmax 分布来近似离散数据的采样过程。然后可以使用反向传播来训练网络,其中网络的性能将取决于温度参数𝜏.的选择

直通 Gumbel-Softmax

有些情况下,我们会希望在训练期间对离散数据进行采样:

  • 我们受限于离散值,因为实值连续逼近是不允许的。比如在动作空间离散的深度强化学习中。
  • 在训练期间使用连续近似和在评估期间使用一次性向量具有非常不同的动态。这导致评估期间模型性能的大幅下降。

我们可以在正向传递中使用 argmax 将 Gumbel-Softmax 样本离散化,使其与原始分类分布中的样本相同。这确保了培训和评估动态是相同的。然而,我们仍然在反向传递中使用 Gumbel-Softmax 样本来近似梯度,因此反向传播仍然有效。这种技术在文献中被称为直通 Gumbel-Softmax。

履行

常见问题

问:我们如何选择温度参数𝜏?

答:我们可以给𝜏.一个固定的值最佳值是通过反复试验确定的,通常小于等于 1。我们也可以使用退火时间表,或者让它成为一个学习参数。

问:为什么我们不需要使用 Gumbel-Softmax 进行分类任务,这涉及到离散的类别标签?

答:这是因为在解决分类问题时通常不涉及抽样过程。相反,我们只需要我们的模型输出属于不同类别的特征向量的概率。简单地应用 softmax 函数就足够了。

进一步阅读

  1. Gumbel-Softmax 分布是由[2]和[3]独立发现的,在[3]中称为具体分布。两篇论文都是很好的参考,特别是关于分布的理论方面,以及关于重新参数化的技巧。
  2. [5]是[2]第一作者写的博文。这是一个很好的教程,有一个关于 Gumbel-Softmax 发行版采样的交互式小部件。
  3. 对于 Gumbel-Softmax 分布在 GAN 中的应用,我们参考[4],其中给出了 Gumbel-Softmax 如何解决用离散数据训练 GAN 的问题的大图。
  4. [1]提供了一个需要直通 Gumbel-Softmax 而不是普通 Gumbel-Softmax 的用例。

参考

  1. 南哈夫里洛夫和我蒂托夫。用多智能体游戏出现语言:学习用符号序列交流 (2017),NIPS 2017。
  2. E.张,s .顾和 b .普尔。使用 Gumbel-Softmax (2017),ICLR 2017 进行分类重新参数化。
  3. C.马迪森,Mnih 和叶维庆。《具体分布:离散随机变量的一个连续松弛》 (2017),ICLR 2017。
  4. W.聂、纳洛德茨卡和帕特尔。 RelGAN:用于文本生成的关系生成对抗网络 (2019)。ICLR 2019。
  5. 教程:使用 Gumbel-Softmax 的分类变分自动编码器,https://blog . ev jang . com/2016/11/tutorial-categorial-variable . html

什么是假设检验?老师为什么不相信骗子学生?

原文:https://towardsdatascience.com/what-is-hypothesis-testing-why-dont-teachers-believe-the-liar-students-6203a5a4b52f?source=collection_archive---------63-----------------------

免责声明:我们无意根据学生在课堂上的位置做出任何推断。该教师为男性,因为该男教师的照片是从 Unsplash 获得的。无意推断性别和/或教师。

老师的一个时期

老师正在检查每个人的作业。他一张接一张地走着。学生们带着自豪的微笑展示他们的作业。老师报以“竖起大拇指”的微笑。老师走到最后一张长凳。一个学生搔着头,一脸担忧地说:“我今天忘记带作业了”。老师相信了他,说:“没关系。下次离家前别忘了检查你的包”。

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

萨姆·巴耶Unsplash 上拍摄的照片

学生的模式

几天过去了。坐在最后一张长椅上的学生总是不停地说她/他忘了他/她的家庭作业。她/他几次逃脱了老师的惩罚,但当遗忘原因一次又一次出现时,老师开始怀疑。老师的怀疑是对的,是的,这个学生在作弊。

日常生活中的显著性检验?怎么会?

不仅是老师,我们每天都在使用显著性测试的概念。我们来看看老师是如何下意识地(也可能是有意识地)使用它的。

学生和老师的故事

通常,学生不会忘记他们的家庭作业。他们要么在完成作业后把练习册(或复印件)放在书包里,要么在晚上(或早上)看到(或碰巧看到)自己的复印件放在某个地方,然后把复印件放在书包里。所以,一个学生把作业忘在家里的概率可能在 0.1 左右。对于我们的提议,让我们假设概率为 0.1

如果学生连续三次忘记他/她的作业,老师可能会开始怀疑。假设 0.1 的概率,学生连续三次忘记作业的概率为 0.001 。如果发生概率为 0.1% 的事件,我们认为不正常。我们有证据怀疑有可疑的事情发生。这就是老师的遭遇。老师有证据怀疑学生的理由。

这样,我们潜意识里(或者有意识地)一直在使用显著性检验这个概念。

这里假设是:
H_o =最后一个板凳学生说的是真话。

这是零假设,因为这是老师首先相信的。他认为一切都很好,很正常(没有可疑的事情发生)。站在零假设上,老师进行观察,看到很少发生的事件。这让他怀疑自己最初对那个学生的假设。所以,老师拒绝了这个假设,认为这个学生在撒谎。

因此,显著性检验的思想是对一些假设的检验,其中假设是用观察值来检验的。在我们老师的例子中,观察是学生连续说谎的次数,假设是学生说真话的本性。

假设检验

同样,假设检验是对关于总体参数的一些假设的检验。站在零假设上,我们看到样本统计发生的概率,如果它低于显著性水平,我们拒绝零假设。

显著性水平是拒绝零假设的严格程度的度量。显著性水平越小,我们的观察结果拒绝零假设的可能性就越小。如果师生案例的显著性水平非常非常低(即 0.01% ),那么即使在连续三次撒谎之后,学生的诚实度仍然很突出。

之前,我们估算了我的脸书朋友中有尼泊尔字体名字的比例,结果是 0.0335。最近,我在我的脸书聊天版块,故事版块,甚至在墙上看到了更多尼泊尔字体的名字。我想测试一下比例有没有增加。这可能是因为我添加了新的脸书朋友,他们有尼泊尔字体的名字,或者是因为现在的脸书朋友,他们有非尼泊尔字体的名字,把字体改成了尼泊尔。为了我们的研究,让我们取 0.05 的显著性水平。

所以,这里的零假设是:
H_o: p = 0.0335

我在这里测试的是比例是否增加了。所以,交替假设是:
H_a: p > 0.0335

因为我们只在一个方向上采用替代假设,所以这是一个单尾检验。如果另一个假设仅仅是一个不等式,测试将是双尾的。

我们通过抽取样本 n = 124 来随机抽取脸书朋友的名字。在 124 个好友中, 10 个有尼泊尔字体的名字。这给出了比例的估计值: p̂ = 0.08 。这个过程是随机的。预期成功和预期失败的数量至少为 10 。样本少于总人口的 10% ,因此事件是独立的。因此,样本满足所有比例推论的条件,因此,我们可以进行推论。

现在,让我们计算测试的 p 值。 p 值是在假设零假设正确的情况下,获得至少与测试期间实际观察到的结果一样极端的测试结果的概率。为了计算 p 值,我们有比例, p = 0.035 标准差可以计算为:
σ_p̂=sqrt(p̂(1-p̂)/n)= sqrt(0.0335(1–0.0335)/124)≈0.016

由于样本量大于 30 ,这里我们使用 z 统计量。让我们在这里计算 z 值。

z 值可以计算为:
z =(p̂-p)/σ_p̂=(0.08–0.0335)/0.016≈2.9

现在在 z = 2.9 对应的概率是: 0.998

因此,测试结果至少与实际观察值一样极端的概率为1–0.998 = 0.002。这是 p 值。

由于 p 值小于显著性水平(即 0.05 ,零假设被拒绝,替代假设被接受

这就是如何使用假设检验来检验假设。假设检验是统计推断的顶点,它被广泛应用于许多领域。统计学,一个极其重要的研究工具,有很多有用的、流行的方法,假设检验就是其中之一!

什么是图像分类?数据增强?转移学习?

原文:https://towardsdatascience.com/what-is-image-classification-data-augmentation-transfer-learning-689389c3f6c8?source=collection_archive---------15-----------------------

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

来源:图片由作者拍摄,并有他的注释

技术及其应用之间的差异

本文是关于计算机视觉的三篇文章的第一部分。第 2 部分将解释对象识别。第 3 部分将是关于图像分割。

随本文提供一个笔记本:此处在 GitHub 上

介绍

有什么比看世界更刺激的?能够看到我们周围最好的东西?日落之美,令人难忘的瀑布,还是冰海?如果进化没有赋予我们眼睛,一切都是不可能的。

我们认识事物是因为我们已经学会了物体的形状,我们已经学会了估计与我们所遇到的不同形状可以与同一物体联系起来。我们通过经验学习,因为我们被给定了所述物体的名称。就像需要一个标签来将形状、细节、颜色与类别相关联的监督算法。狗和狼只是在像素上非常相似。计算机视觉方法已经使机器能够破译这些形状,并“学习”对它们进行分类。

现在,算法,就像我们的眼睛可以识别图片或电影,物体或形状。方法不断进化完善,达到所谓的人的水平。但是,有几种方法,图像分类、对象检测或识别以及图像分割。在本文中,我们将探讨图像分类问题。第一部分将介绍从零开始训练模型,第二部分将介绍数据增强的训练,最后是预训练模型的迁移学习。

方法

图像分类从无到有

当你拥有的数据量足够大时,图像分类可以“T6”从零开始。想法是创建一个模型并从头开始训练它。

像任何分类问题一样,数据必须被注释。当涉及到图像时,如何进行?事实上很简单,同一类的数据必须存储在同一个文件夹中。有必要为所考虑的每个类或类别准备一个文件夹。像这样:

> train/
      ... forest/
            ... img_1.jpeg
            ... img_2.jpeg
            ...
      ... moutain/
            ... img_1.jpeg
            ... img_2.jpeg
            ...
      ... sea/
            ... img_1.jpeg
            ... img_2.jpeg
      ...
  validation/
      ... forest/
            ... img_1.jpeg
            ... img_2.jpeg
            ...
      ... moutain/
            ... img_1.jpeg
            ... img_2.jpeg
            ...
      ... sea/
            ... img_1.jpeg
            ... img_2.jpeg
  test/
      ... forest/
            ... img_1.jpeg
            ... img_2.jpeg
            ...
      ... moutain/
            ... img_1.jpeg
            ... img_2.jpeg
            ...
      ... sea/
            ... img_1.jpeg
            ... img_2.jpeg

这种简单的方法允许模型将标签与图片关联起来。

之后,你建立你的神经网络。从现在开始,标准是针对卷积神经网络( CNN )在处理图片时。所以你要建立一个 CNN 并用英特尔数据集训练它。您将添加一个卷积层,然后是一个汇集层,可能是一个下降层,以降低过度拟合的风险,并以密集的全连接层结束。最后一层会输出结果,或者说预测,这最后一层的单元数就是你要预测的类数。

***# building the model***
model = tf.keras.Sequential([
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Dropout(0.5),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Dropout(0.3),
  layers.Conv2D(32, 3, activation='relu'),
  layers.MaxPooling2D(),
  layers.Flatten(),
  layers.Dense(128, activation='relu'),
  layers.Dense(num_classes, activation='softmax')
])***# compile the model with adam optimizer and sparse cross entropy*** model.compile(
  optimizer='adam',
  loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['accuracy'])***# use early stopping to break the learning process if the model stop learning during 3 epochs*** es = tf.keras.callbacks.EarlyStopping(patience=3)
history = model.fit(
  train_x,train_y,
  validation_data=(valid_x, valid_y), callbacks=[es], batch_size=32,
   epochs=30
)

在这里,我提出了一个小的 CNN 架构,其中 num_classes 是类的数量。在本文的上下文中,我们将预测 6 个类,所以num_classes=6EarlyStopping 约束模型在过度拟合时停止,参数patience=3意味着如果在 3 个时期内模型没有改善,训练过程停止。

如果你有足够的数据,如果你的 CNN 不太深——但足够产生一个好的数据表示,你将获得好的结果。

不幸的是,这种情况很少发生,您需要尝试其他选项。

数据扩充

所以,如果你的模型不能获得良好的性能。你可以改变你的网络结构。您可以添加或删除隐藏层。您可以减少或增加每层的单元数。您可以更改激活函数或损失函数。或者,您可以更改预处理或您的数据。

但是,不够怎么办?

可以使用数据增强。这种技术允许您从内存中创建人工(合成)图像(这种方法不会影响您的原始数据)。它包括旋转等操作,相同的图片将被旋转不同的角度(创建新的图像)。移位,也就是说,图像的图案将从帧偏移,从而产生必须被内插的“洞”。这种操作可以水平进行,也可以垂直进行。缩放,新图像将是原始数据的一部分的缩放,等等…

完成这项工作的完美工具是 Keras[2] ( keras.preprocessing.image.ImageDataGenerator())提供的名为ImageDataGenerator 的对象。

from tensorflow.keras.preprocessing.image import ImageDataGenerator
data_gen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')
test_gen = ImageDataGenerator(rescale=1./255)

以下是我在笔记本中使用的示例值。

此工具将创建合成影像来增加数据集的容量。怎么用?

CNN 中数据扩充的快速实现。结果将显示在结果部分。

不幸的是,是的,你可以有太少的图像,以获得良好的结果。如果你的数据集非常小,即使数据扩充也救不了你。接下来你会做什么?

迁移学习【3】

不,现在不是逃避害怕转学的时候。什么是迁移学习?这是一种简单的方法,你可以将学到的知识用于一项任务,并将其输出到另一项任务中。

在我们的案例中,迁移学习发生在相当大的模型(有数百万甚至上亿个参数)上,这些模型已经在海量数据(Imagenet[4]数据集)上进行了训练以进行归纳。

当您有一个小数据集时,您构建的模型不能很好地表示数据。因此,您必须使用将根据您的数据进行训练的预训练模型。

方法很简单,取预先训练好的模型,冻结它们层的权重,只留下最后一层,或者最后几层,然后用你的数据训练它们。

神经网络根据其深度越来越专门化。第一层将检测一般模式,例如线条。然后形状会出现,直到你在最后一层达到非常精细的细节。这些是必须用来根据您的数据“调整”模型的。因此,使用迁移学习,您可以在几分钟/几小时内获得一个性能极佳的模型,而不是使用 ImageNet 数据集和您的数据重新训练完整的模型(这将花费数月时间,并需要大量资金投入)。

在笔记本上,我比较不同的预训练模型,看看哪个最适合我们的学习。为了轻松快速地更改预训练模型,下面的函数包含了根据数据调整预训练模型并使用指标对其进行评估的架构。返回的是一个包含度量结果的数据框,以及绘制学习曲线的模型历史。

下一个要点将告诉你如何使用该功能。

是的,你需要指标来评估不同算法的性能,你需要绘制学习曲线(准确性和损失)来观察你的训练行为。

度量

为了评估分类模型,可以使用不同的度量,例如准确度、精确度、召回率、f1 分数等。(这些指标的详细信息可以在这里找到)。下面的代码显示了如何建立一个度量字典和将用于评估神经网络的函数。

该函数可用于二值和多值分类问题。

绘制学习曲线

在训练深度学习模型时,查看学习曲线的行为以确定模型是偏差、过度拟合还是正常行为非常重要。为此,让我们看看下面的代码,它允许绘制训练集和评估集的准确度和损失曲线。

至此,您知道了用于评估模型的不同方法和指标。

数据

为了避免经典的 MNIST[5]或 FashionMNIST[6]进行分类,我们将采用英特尔提供的数据集(可在 Kaggle[1]上获得)。这些数据更为奇特,它们代表了来自世界各地的场景,代表了 6 个类别(建筑、森林、山脉、冰川、海洋和街道)。对于本地计算机上的项目,数据量也是可访问的,因为训练集由 14k 图像组成,验证集包含 3k 图像和 7k 图像用于测试。每个图像的形状为(150x150)像素。

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

从列车组构建图像

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

火车场景中的森林图像

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

火车场景中的冰川图像

比衣服好不是吗?

如何加载和准备数据?首先,您需要配置到达数据的不同路径。

***# creating paths to retrieve the data***
ROOT = "/mnt/d"
FOLDER = "INTEL_images_classification"
TRAIN = os.path.join(ROOT, FOLDER, 'seg_train/seg_train')
TEST = os.path.join(ROOT, FOLDER, 'seg_test/seg_test')
PRED  = os.path.join(ROOT, FOLDER, 'seg_pred/seg_pred')

然后你需要通过图片(。jpg)到 NumPy 值数组。

def prepare_dataset(path,label):
    x_train=[]
    y_train=[]
    all_images_path=glob(path+'/*.jpg')
    for img_path in tqdm(all_images_path) :
       img=load_img(img_path, target_size=(150,150))
       img=img_to_array(img)
       img=img/255.0   ***# here you normalize the data between 0 and 1***
       x_train.append(img)
       y_train.append(label)
    return x_train,y_train

该函数将生成一个包含所有图像和相关标签的矩阵。您可以看到像素值将在[0,1]之间重新调整。深度学习模型在这个值范围内表现得更好,因为范围 255 是为’ RGB ‘颜色制作的,一种算法不理解’颜色’。好了,是时候提取数据了:

***# Train dataset***
labels = os.listdir(TRAIN)
x = []
y = []
for label in labels:
    x_, y_ = prepare_dataset(os.path.join(TRAIN, label), label)
    x.extend(x_)
    y.extend(y_)
x = np.array(x)
y = np.array(y)***# Test dataset***
labels = os.listdir(TEST)
x_test = []
y_test = []
for label in labels:
    x_, y_ = prepare_dataset(os.path.join(TEST, label), label)
    x_test.extend(x_)
    y_test.extend(y_)
x_test = np.array(x_test)
y_test = np.array(y_test)

这里有一个训练集和一个测试集。接下来,您需要将训练集拆分为训练验证集(80/20 就足够了)。Scikit-learn 为我们带来了train_test_split功能:

# create a validation set 
from sklearn.model_selection import train_test_split
train_x, valid_x, y_train, y_valid = train_test_split(x, y, random_state=42, stratify=y, test_size=0.2)

几乎完美,还有一点,标签还是字符串类型。模型不欣赏这种数据,所以需要对它们进行编码(需要 int 值):

from sklearn import preprocessing***# create the label encoder***
encoder = preprocessing.LabelEncoder()
***# train it on the training labels set*** 
train_y = encoder.fit_transform(y_train)
***# apply it on the other corresponding labels*** 
valid_y = encoder.transform(y_valid)
test_y  = encoder.transform(y_test)

现在,它是完美的。您有方法、指标和数据。

结果

从零开始

方法 一节中呈现的简单 CNN 模型已经在数据集上进行了训练。在 10 个时期之后,训练停止,因为算法不再学习。

Epoch 1/30
351/351 [==============================] - 536s 2s/step - loss: 1.1578 - accuracy: 0.5443 - val_loss: 1.0311 - val_accuracy: 0.6138
...
Epoch 10/30
351/351 [==============================] - 649s 2s/step - loss: 0.2364 - accuracy: 0.9146 - val_loss: 0.6711 - val_accuracy: 0.7887

相应的曲线表明,在 3 个时期之后,在测试集上达到大约 75%的准确度。该模型在训练中继续学习,但是不能如验证准确性所示的那样进行概括。损失显示同样的事情,在 3 个时期之后,验证集上的损失没有改变。

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

“从头开始”模型的精确度和损耗曲线

相应的指标:

 accuracy          : 78.33%
  balanced_accuracy': 78.44%
  precision         : 78.94%
  recall            : 78.33%
  f1-score          : 78.31%
  cohens_kappa      : 73.97%
  matthews_corrcoef : 74.10%
  roc_auc           : 93.37%

在测试集上的结果并不坏,在准确度、精确度和召回率上达到了 78+%。这是分类的一个好的开始。

数据扩充

Epoch 1/50
62/62 [==============================] - 1116s 18s/step - loss: 2.0628 - accuracy: 0.1857 - val_loss: 1.7963 - val_accuracy: 0.1925...
Epoch 11/50
62/62 [==============================] - 984s 16s/step - loss: 0.9419 - accuracy: 0.6369 - val_loss: 0.9811 - val_accuracy: 0.5925

训练以糟糕的结果结束。学习曲线表明培训不够好。这可以通过调整模型来改变。

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

学习曲线数据扩充

如你所见,即使结果不是完美的,学习也是更好的。训练 et 和验证之间的曲线更接近。所以训练更稳定。

相关指标如下所示:

accuracy          | 68.60%
balanced_accuracy | 68.13%
precision         | 70.28%
recall            | 68.61%
f1-score          | 67.54%
cohens_kappa      | 62.18%
matthews_corrcoef | 62.76%
roc_auc           | 93.73%

转移学习

本研究中测试的模型如下:

Xception[7]           | ResNet50V2[12]  | InceptionV3[14]
VGG16[8]              | ResNet101V2     | 
VGG19                 | ResNet152V2     | 
InceptionResNetV2[9]  | DenseNet121[13] | 
MobileNetV2[10]       | DenseNet169     |
NASNetLarge[11]       | DenseNet201     |

是的,Keras 中实现了很多预先训练好的模型(这里只是其中的一部分)。他们每个人都在 ImageNet 数据集上进行了训练。下表显示了根据我们的数据训练的每个模型的结果。

使用不同的预训练模型获得的结果

由于 input_shape 的原因,NASNetLarge 模型尚未经过测试。该模型考虑了具有形状(331,331,3)的图片。

这些结果是用EarlyStopping(patience=1)获得的,这意味着如果模型没有从一个时期学习到另一个时期,学习过程就停止了。为什么一个?因为测试所有模型很费时间。这些结果也是通过仅调整每个模型的顶层而获得的。为了提高性能,可以调整更多的层。

讨论

数据扩充方法是最微妙的,结果不是预期的那样。为了提高性能,需要调整模型的复杂性。从头开始和迁移学习方法的实现是最容易建立的。

结论

使用迁移学习方法的预训练模型允许我们在数据集上获得最佳结果。通过减少对早期停止参数的限制和调整预训练模型的更多层,可以提高性能。显然,这会更费时间。
“从零开始的*”和数据扩充方法已经显示出有趣的结果,但是没有超过迁移学习。
resnet 101v 2 模型在 INTEL 数据集(测试集)上取得了 90.33%的准确率和 90.36%的精度。它是比较的赢家。*

我希望你会对这篇文章感兴趣,并对你将来的图像分类项目有所帮助。计算机视觉的下一篇文章将是关于图像中的物体检测。回头见。

参考

[1]https://www . ka ggle . com/puneet 6060/Intel-image-class ification
【2】keras . io
【3】Pratt,L. Y. (1993)。《基于区分度的神经网络间迁移》 (PDF)。NIPS 会议:神经信息处理系统的进展。摩根·考夫曼出版社。第 204-211 页。
[4] Olga Russakovsky 等《ImageNet 大规模视觉识别挑战赛》。IJCV,2015 年。
【5】勒村,y .等人,1998 年。"基于梯度的学习应用于文档识别."IEEE 会议录,86(11):2278–2324
【6】韩 x .,卡希夫 r .,罗兰 v .,2017。Fashion-MNIST:一个用于对标机器学习算法的新型图像数据集 arXiv 预印本
【7】Chollet f .,2016。例外:深度可分卷积深度学习 arXiv 预印本
【8】Simon Yan k .和 Zisserman A .,2014。用于大规模图像识别的极深度卷积网络 arXiv 预印本
【9】Szegedy c .等人,2016。Inception-v4,Inception-ResNet 和剩余连接对学习的影响 arXiv 预印本
【10】Sandler m .等人,2019。MobileNetV2:反演残差和线性瓶颈 arXiv 预印本
【11】Zoph b .等人,2018。可扩展图像识别的学习可转移架构 arXiv 预印本
【12】何 k 等,2016。用于图像识别的深度残差学习 arXiv 预印本
【13】黄 g .等,2017。密集连接的卷积网络 arXiv 预印本
【14】Szegedy c .等人,2016。重新思考计算机视觉的初始架构 arXiv 预印本

深度学习至高无上的原因

原文:https://towardsdatascience.com/what-is-inductive-bias-beac6ab1789b?source=collection_archive---------43-----------------------

嘶!这不是关于深入…

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

来自 Pexels 的 Rodolfo Clix 的照片

如果一件事不存在,它会导致曾经创建的每个深度学习模型的垮台,这是什么?

归纳能力是深度学习模型在技术领域占据主导地位的原因。

感应偏差的定义

让你的算法推断出它的推论的最小断言集。

我们来深入一下(双关,本意)。

你的模型所具有的假设,这使得它能够执行。

在狗与猫分类器的情况下,当新的狗照片遇到模型时,模型能够成功地识别它是猫还是狗。

为什么?

我们这么说是因为模型已经知道了猫和狗的样子。因为它创造了一个猫和狗的形状的内部表示。

这个模型所做的学习。是什么?

这是它的感应偏差,它的性能的基础。

深度学习模型是如何得出其归纳偏差的?

最初,当你创建一个神经模型时,在你给它输入数据之前,它逼近任何东西的能力是无限的。

因此,你输入的任何数据都开始限制无限的近似能力来完成某个特定的任务。你用数据来定义你的深度学习模型的边界。你告诉它:这就是你的工作;如果你偏离了它,你将受到惩罚。

你用数据来定义你的深度学习模型的边界。

模型开始收缩自己,并开始应用于它前面的数据。它开始发现一个一般假设(一个可以通过调查证实的尝试性解释)可以帮助它以最佳方式完成工作。本质上,模型开始寻找这个问题的答案。

我应该知道的那一件事是什么,其他的一切都应该知道?

最初,它可能会尝试学习一切,即它会尝试学习你给它的每个训练示例的特定假设。

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

来自佩克斯瓦莱里娅·博尔特涅娃的照片,来自佩克斯心理医生的照片,来自佩克斯埃里克·麦克林的照片

例如,在上面不同品种的狗的照片中,我们可以看到它们是多么的不同。如果我们试图创建特定的假设来对它们进行分类,例如:

第一个假设可以是如果有金色和白色的皮毛,脸上有很多皮毛,腿很小,等等,那么,它是一只狗。

第二个假设是,如果它有黑白相间的颜色,三角形的脸,等等,那么,它是一只狗。

第三个假设可以是,如果它的皮毛是棕色和白色混合的,以此类推,那么,它就是一只狗。

所有这些特定的假设根本不会帮助我们创建一个通用的分类器。因为这些特定的假设只对特定的训练图像有效。

深度学习模型的正向传递相当于这些特定假设的创建。

但是,这不是我们的目标。这就是我们进行训练的原因,即我们以拒绝这些特定假设的方式来修正模型。

如果模型倾向于特定的假设,我们会惩罚它,因为它们会导致我们使用的损失值更高,而性能度量值(比如,准确性)值更低。

深度学习模型的后向传递相当于对这些特定假设的拒绝。

向前和向后传递的每一个循环都导致对某个特定假设的拒绝,而接受一个更普遍的假设。随着更多这样的循环继续发生,模型达到越来越普遍的假设,这将允许它以最佳方式完成任务。

最后一个假设,即模型达到的最一般的假设是它的归纳偏差。最一般的假设是约束条件最少的假设。这里既有神经网络的辨别能力,也有神经网络的泛化能力。

该模型得出的最普遍的假设是它的归纳偏差

一般的假设是深度学习模型如何能够在看不见的数据上表现得非常好,因为导出的假设是如此普遍,以至于它几乎包含了问题网络被训练的所有排列和计算。

为什么深度学习模型需要大量数据?

这也暗示了为什么他们如此渴望数据,因为他们想为给定的问题推导出最佳的一般假设,所以他们需要看到越来越多的数据变化,以便他们可以将这些变化纳入其一般假设中。

简而言之,归纳偏差越好,神经网络的预测能力(对看不见的数据执行的能力)就越好。

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

来源:作者

旁注

归纳偏差的概念不仅适用于深度学习,它还驱动着现有所有学习算法的性能。

"眼睛只能看到头脑准备理解的东西。"罗伯逊·戴维斯

摘要

在这篇文章中,我们理解了归纳偏差的概念,以及它是如何成为深度学习模型统治的基础的。我们也了解了感应偏差是如何产生的。

聪明是一种怎样的体验?

原文:https://towardsdatascience.com/what-is-it-like-to-be-intelligent-ba0ffff8dd9c?source=collection_archive---------6-----------------------

探索人类意识的深处

让我首先声明我写一个我没有明确权威的主题的动机。到目前为止,我已经写了很多年了,既有我在公司工作的主题,也有我感兴趣的主题。我个人认为,写作是通过综合学习的一种强有力的形式。说你明白了一件事很容易,直到你不得不向别人解释它。以电梯推销的形式解释一些事情相对容易,但是演讲或博客文章需要你真正思考结构、有效性和一致性。它迫使你寻找参考资料来支持你的主张。基本上,这是一个很好的方法来确保你不会通过一系列的简化和错觉来欺骗自己。所以我这么做更多是为了我自己,而不是你,但是你可以一起来。

所以,我们来谈谈 C 字。意识。

我们一生中都有停下来思考一个大问题的难得时刻。我的蓝色和你的蓝色一样吗?为什么天空是蓝色的?外面有外星人吗?有来生吗?大爆炸之前发生了什么?宇宙的尽头是什么?这一切的意义是什么?

当然,这其中的一些,科学可以解答。天空是蓝色的,原因和海洋是蓝色的一样,它是我们用眼睛仍能看到的波长最短的光,因此从水和空气中的粒子散射到很远的距离,并逐渐支配其他颜色。有些问题我们还没有答案。有些问题我们可能永远不会知道。

虽然很容易陷入我们自己的思想和世界,但退一步想想简单的案例作为基本真理的来源是有帮助的。

你有没有…停下来想想当一只蝙蝠是什么感觉?

不是从飞行本身的意义上来说,而是从这一点上来说,它们是否也像我们一样有一种内在的体验?如果有轮回这回事,你变成了蝙蝠,灯还亮着吗?你有想法吗?自我意识?与视觉或声音相比,声纳的感觉如何?澄清一下,我选择蝙蝠的唯一原因是,这是托马斯·内格尔 1974 年关于意识的一篇著名论文的主题——这是科学遗留下来的最大谜团之一。

意识到底是什么?

嗯,我们也不清楚。我们知道当我们睡觉的时候,我们没有它。除了在梦里。当我们在高速公路上开车时,我们的车就少了。大多数关于意识的定义包括自我意识和我们经验的品质,或“感受性”。比如红色的发红。你不仅可以有情绪,而且你可以意识到你对情绪的体验及其微妙的内在品质。这是我们生活中永不停息的电影。嗯,通过冥想,有可能暂时暂停这部内在电影,并体验一种没有内在主体作为体验一部分的状态,在这种状态下,只有生命的原始输入,没有内省或判断。这可能与自我迷失有关。

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

冥想让我们更像人,还是事实上更不像人?骨灰堂Unsplash 拍摄的照片

当你入睡时,不管有没有梦,你的意识体验都会中断。从某种意义上说,这是一个小小的死亡。借助现代物理学,我们知道构成你身体和大脑的所有粒子都只是场中的激发,因此处于持续的微小流动中。在真正的意义上,你是一种能量模式。这两个观点证实了这样一种说法,即真正醒来的人不是你。事实上,你从来都不是你。没有你。每天早晨,一个新的生命出现,获得意识,带着对过去生命的记忆。每一天都是你的最后一天!

理解间断概念的一个简单方法是健忘症。我们大多数人从未有过临床健忘症,但可能有一两个晚上的酗酒。因为你对那些事件没有记忆,通常是负面的,你可以通过声明那不是我,在精神上把自己从那些事件中分离出来。有许多记录在案的因脑损伤而丧失短期记忆的案例,其中由于没有任何近期记忆作为参考,自我意识持续丧失。

所以如果意识从来不是连续的,我们真的会死吗?好吧,如果不说别的,似乎很难想象你大脑中代表你记忆的原子结构保持完整。当物质死亡时,复活有意识生物的可能性也就消失了。稍后,我们将再次讨论这个想法,但现在,对大多数人来说,克隆人、机器人或用你的电子大脑模式编码的模拟的想法不太像是值得过的生活。至少这不再是你的生活了。

所以我们回去吧。有一种东西叫意识。我们可以主观地把矛头指向它。据说我们都有。它在哪里?这个问题可以问吗?

意识在大脑里吗?

每个人都有一个人脑的心理图像,上面是有皱纹的部分。那是你的新大脑皮层,也就是思考的大脑。在那之下,你有我们从哺乳动物和爬行动物进化而来的各种各样的小部分。最古老的部分是脑干,它控制着我们的自主功能,如心跳和消化。那么哪些是有意识的部分呢?嗯,我们知道有些部分似乎很少表现出与意识相关的活动,而其他部分则表现出很多。小脑控制运动功能,似乎是无意识的。这就是你如何在不知道精确计时和运动所需的必要肌肉的情况下抓住棒球。从脑外伤和动物试验中,我们可以推断出大脑主要区域的一些具体特征。

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

Johannes Sobotta 博士——人体解剖学图集和教科书第三卷血管系统、淋巴系统、神经系统和感觉器官,公共领域,https://commons.wikimedia.org/w/index.php?curid=29135452

较新的灵长类动物新大脑皮层的某些部分处理世界的规划和感觉模型,而情绪和长期记忆由哺乳动物的边缘系统控制。似乎有意识的体验经常涉及计划、记忆、模型和情感之间的相互作用或反馈。所有这些都显示出作为进化驱动力在生存和繁殖方面的价值。例如,情绪是未来奖励的一种形式。如果某件事让你难过,你可以形成一个持久的记忆,你希望在未来避免这种悲伤。

意识有许多正式的模型,包括更高阶的意识理论。这似乎是说,意识的整体发生在新皮层的不同部分,从感觉皮层到工作记忆区有反馈回路。关键是,只有当你对自己的经历有了表征,你才是有意识的。你的大脑皮层接收到看到红色气球的视觉刺激是不够的,你必须有看到红色气球的特定表征才能意识到这种体验。

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

情绪作为意识的高阶状态,Joseph E. LeDoux,Richard Brown,美国国家科学院院刊 2017 年 3 月,114(10)e 2016-e 2025;DOI:10.1073/PNAS。56686.86868686666

意识的全球工作空间理论将意识活动定位为源于工作记忆,就像你电脑上的桌面一样。你只知道桌面上有什么,而不是任何时候整台电脑上成千上万的文件。意识因此被呈现为进入你大脑中表象的功能。表象可以是感官的,抽象的,或来自记忆的。

旧的理论将所有的意识置于杏仁核内的情感回路中,杏仁核是我们爬行动物边缘系统的一部分。另一个将脑干的唤醒与来自岛叶皮层和前扣带皮层的一般意识联系起来,有效地说明了我们的智能规划哺乳动物大脑是由我们的爬行动物大脑控制的。

如果这些看起来有点模糊和功能性,那么还有另一个新的理论需要权衡。著名物理学家罗杰·彭罗斯和麻醉师斯图亚特·哈默罗夫已经确定了脑细胞内的一种特殊结构是意识的潜在来源。但不仅仅是常规的,无聊的意识。这就是量子意识。排队 X 档案主题曲。

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

微管遍布神经元细胞,尤其是突触和轴突周围。来源:微管细胞骨架在神经发育障碍中的作用。米凯拉·拉塞尔,杰西卡·台伯,劳拉·安妮·洛维里。前面。细胞。神经科学。,2018 年 6 月 14 日|https://doi.org/10.3389/fncel.2018.00165

脑细胞内有真正微小的纳米级结构,称为微管。事实上,它们是如此之小,如此之有结构,以至于它们可以考虑到量子效应,如神经元群之间的纠缠和隧道效应。这可以解决另一个关于观察者在量子波函数坍缩中的作用的大谜团。意识于是变得有用,给了我们一个宏观尺度的宇宙,看起来是确定的,没有量子效应。哦,这也可以解释自由意志。因为量子纠缠会让你的神经元对刺激的反应比神经元启动的速度更快,即回到过去几毫秒来决定该做什么。这一切都很不可思议,但仍然是科学的。虽然已经在微管中检测到一些量子效应,但是实验学家对该理论的几个方面存在争议。

所以现在还没有定论。我们知道的一件事是,神经元是唯一不能有效地在你体内再生的细胞。所有其他类型的细胞都会定期更新,每 7 年你就能拥有所有新细胞。但是你几乎被你生来就有的脑细胞卡住了。突触不断变化,但神经元不会。这可能已经告诉我们一些关于意识的事情,因为扰乱结构对大脑的功能来说是一件坏事,大脑的功能显然包括意识。

意识是生命的意义吗?

从将某种形式的意识归因于所有生物,到将意识视为生命的必要条件,这是一个很容易的飞跃。但是让我们记住,细胞是活的。细胞有意识吗?细胞是智能的吗?

哲学家卡尔·弗里斯顿让我们考虑一滴油。它是活的吗?不,当然不是。但是一滴油和一个细胞到底有什么区别呢?两者都有一个生理边界,叫做马尔科夫毯。两者都在积极地对环境进行采样,否则,石油会与水混合,但它从来没有混合过。区别实际上在于运动。油滴只能在压力和重力等外力的作用下运动,而不会在内部运动。细胞能够移动是因为它有摄取和排出能量的能力。

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

Kirchhoff Michael,Parr Thomas,Palacios Ensor,Friston Karl 和 Kiverstein Julian,2018 年,《生命的马尔可夫毯:自主性、主动推理和自由能原理》, J. R. Soc。interface . 152017 07 92
http://doi.org/10.1098/rsif.2017.0792

人类是由活细胞组成的,当以正确的模式组合时,它们似乎会产生意识。如果没有意识,我们肯定会活着,但是这样的生活有意义吗?一个 Roomba 机器人真的会在乎关机吗?好像不是。显然,有某种进化的驱动力来增殖意识,因为它在不同程度上存在于动物中。也许,公平地说,意识赋予我们的生活以意义。我们可以体验,我们可以感受,我们可以希望,我们可以梦想。

所以我们都有,可以稍微摆弄一下,都在脑子里。太棒了。谁在乎呢。事情就是这样。这将如何影响我的生活?

为什么意识很重要

你可能会关心意识的原因有很多。一个当然是道德的实际问题。对于处于不可逆转的植物人状态的人来说,安乐死在道德上是可以接受的。然而,对于一个有意识的人来说,这将被认为是谋杀。所以这很重要。婴儿过去不用麻醉就可以割包皮,因为我们没有把真正的人类意识归于婴儿。哭只是一种本能。人们认为,婴儿还没有发展出意识能力,因为他们缺乏语言、记忆和运动控制能力。如果我们现在承认婴儿可以有有意义的有意识的内心体验,那界限在哪里?那条线是从卵子到胎儿再到婴儿的哪个发育阶段?动物呢?鸡被宰杀食用有意识吗?奶牛呢?

另一个原因更哲学,但本质上非常主观。意识在我们的发展中起什么作用?我们是因为有意识而成为人类,还是因为我们是人类而有意识?为什么人类会变成这样?这是什么意思?意识是生命的意义吗?如果宇宙中存在其他智慧生命,我们是否应该假设他们也是有意识的?如果我们开发出真正的人工智能,超越人类的智能,它会有意识吗?如果不是,又有什么关系呢?当你死后会发生什么,如果组织以某种方式保存下来,你会像从睡眠中醒来一样回来吗?

好吧,好吧,我们有问题,但真正的秘密或问题是什么?

意识的难题

好吧,考虑一下。大脑通过进化发展出了令人难以置信的智力和社会交往能力,并在繁殖人类基因组方面取得了惊人的成功。太棒了。我们拥有在身体和精神上统治地球上所有其他物种的所有必要功能。也许你从未停下来问一个简单的问题。为什么一点内心体验都没有?

为什么我们需要任何附加在我们经历上的品质?难道我们不能像一个功能性的人一样完成所有的任务吗,就像……一个机器人?如果有痛苦,为什么我们需要受苦?我们难道不能简单地学会不去做那种没有痛苦的本能的事情吗?为什么我们需要遗憾、渴望和爱?难道我们不能进化出所有相同的行为,而不附加任何品质吗?就像星际迷航里的瓦肯人。

如果你纠结于功能和质量的区别,就想想其他形式的生命,以及你能对他们的生命的内在体验说些什么。你的狗,有意识吗?也许你会认为是的,他们似乎有丰富的内心体验,即使他们不能告诉我们。猫,是的,但也许没那么好。仓鼠?鱼?苍蝇?虫子?细菌?冠状病毒?对大多数人来说,责任止于鱼类和爬行动物。他们似乎只是…存在,没有太多关于存在或不存在的大惊小怪。你看不到鱼在玩耍,或者展示任何人类可能会理解为主观体验的东西。海豚和鲸鱼会,但它们是哺乳动物。

等等,这不就是情报吗?

好吧,所以鱼并不特别聪明。Roomba 机器人是智能的还是有意识的?也许都不是。在国际象棋和围棋中击败所有人类的计算机程序 AlphaZero 怎么样?看起来超级聪明,但肯定不是有意识的?你可能会说 AlphaZero 没有和人类相似的智力。它在超人的水平上玩几个游戏,但没有其他功能,即使是在学习其他任务方面。它有学习和记忆,但有经验吗?它有模型,但没有感官输入。它看不到游戏板或它自己在玩,它只看到数字矩阵。所以也许,智力和意识之间有一个有用的区别?

看待智力和意识的一种方式是考虑功能输入和输出。我们通过感官感知事物,并将其转化为电信号传输到我们的大脑。同样,其他信号从我们的大脑进入我们的神经系统,触发像举起手指这样的动作。想象一下,如果某个邪恶的医生在你睡觉的时候小心翼翼地故意切断所有连接你大脑和身体的神经,毫无痛苦,然后你在早上醒来。你真的会醒来吗?这个邪恶的医生需要把所有的神经重新连接到人造器官上吗?奇怪的是,还没有人自愿参加这个实验。我们所知道的是,在事故中失去身体完整功能的人经常继续报告“幽灵”的感官体验。是的,即使是眼睛和大脑没有联系的盲人也能报告看到东西。大脑是你的意识体验的来源的证据是压倒性的,灵魂的存在,至少在大脑之外,似乎几乎是不可能的。

几千年来,这种灵魂和肉体的分离是科学家和哲学家的主要信仰。它被宗教和教会进一步强化,因为它服务于他们的世界观和创造观。这很难责怪他们,因为所谓的二元论相当直观。当你的身体在睡眠中脱离服务时,你的大脑仍然可以在梦中探索和玩耍。其他形式的意识改变似乎加强了这一概念,如灵魂出窍和幻觉。然而,目前的科学实验将灵魂放在更靠近背心的地方,很可能在你的新大脑皮层。具体来说,是大脑生成的自我模型给了我们一种自我意识,这是我们主观体验的核心。如果没有“我”,真的是一种体验吗?通过冥想练习,你可以暂时体验这种自我迷失。你可以放开自我的这一特征,只意识到原始的感官输入,如身体的感觉和声音。你仍然有意识,但不是以人类认为正常的方式。

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

勒内·笛卡尔身心二元论的例证。笛卡尔认为输入是通过感觉器官传递到大脑中的骨骺并从那里传递到非物质的精神。资料来源:https://commons.wikimedia.org/w/index.php?curid=1918592 勒内·笛卡尔公共领域

与似乎难以确定的智力不同,我们可以很容易地发现我们意识的局限性。试着积极地思考一些物体,比如立方体,同时注意你的呼吸。加上听听周围的声音。现在增加对你的腿的意识。你不能。大约在 2-3 步之间,你就下车了。你失去了第一个,最多只能在 2-3 个意识项目之间快速转换。所以你能意识到的是有限度的,至少对人类来说是这样。它确实为扩展人类意识或人工意识打开了一个有趣的可能性。想象一下同时意识到你的整个身体及其无数的功能。想象一下意识到互联网的存在?你能想象一下同时意识到整个星球吗?

所以都是信息,还有信息处理?没有特殊酱料,没有生物粘液,或者灵魂?

综合信息理论

意识纯粹是信息的功能这一观点被称为底物独立性。这意味着,它不受我们大脑和身体的物理系统的限制,而是可以在硅或金属中人工复制。这并不是说我们知道如何实现这样的壮举,或者这很容易,只是说这是可能的。

如果我们认为智能是输入和输出之间的处理功能,那么意识是从纯粹的信息处理中产生的吗?如果我们假设这是真的,难道我们不能用某种方式来形式化这个过程吗?这就是综合信息理论(“IIT”)的尝试,这是对意识进行科学而非哲学理解的最近和最初的尝试。

最有趣的是,它还提出了一种量化意识的方法。它叫做 Phi。更多的 Phi 意味着更多的意识。这个重要的步骤避开了迄今为止所有定义意识的主要尝试,所以 IIT 为这个领域提供了一个进行实验和验证意识假说的重要机会。

IIT 的前提是,具有整合性的信息表明因果力量,即信息中的抽象概念是因果相关的。这可能有一个进化的基础,通过对环境刺激的快速反应的要求。灌木丛中的尾巴没有任何意义,但它意味着狮子,意味着被吃掉。此外,IIT 说,所有的经历在你的物质大脑中都有相应的结构。电信号的特定模式是狮子尾巴的视觉线索,另一个是害怕被所述狮子吃掉。

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

从经验到大脑中的概念再到信息的整合。资料来源:托诺尼,朱利奥等人《整合信息理论:从意识到它的物理基础》。《自然评论神经科学》17(2016):450–461。

IIT 模型的一个主要好处是,它似乎可以解释小脑的无意识性质,小脑拥有所有大脑部分中最多的神经元,但与有意识的经历没有相关的大脑活动。那是棒球抓住了你大脑的一部分。假设你身体里有 600 块肌肉,每秒钟能发出 100 块,学习和复制运动模式需要大量带宽是有道理的。想象一个钢琴师在充满活力的交响乐的高潮部分。钢琴家用抽象的表达方式思考,比如音符和节拍,而不是手指的运动。因此,小脑是强大的,但缺乏在有意识的新大脑皮层中看到的高度连通性。这是 lo-phi ,双关语。

实验将向我们展示,IIT 有多少是由智力或功能而非意识单独造成的。在没有任何集成的情况下,您真的能执行需要智能的复杂任务吗?也许,这可能是一个线索,当你达到更高的智力水平时,意识会免费出现?

这一切说明了人工智能什么?

如果信息是唯一的游戏,那么你会认为神经网络是相关的考虑因素。毕竟,就我们所知,它们是我们大脑神经元如何工作的基本代表。人工智能最大的讽刺是,我们也不知道那些人工神经元是如何工作的。真的。事实上,它工作得非常好,但是我们不确定到底是怎么回事或者为什么。似乎有一些神奇的能力归因于简单算术运算的网络,非线性重复数千次。人造大脑学习的广度和速度都不如人脑,但它们仍能学到很多东西。仅仅通过显示大量标有可能输出的样本,即使是一个小的神经网络也可以学习从输入到输出的非常复杂的关系。有时甚至超出了人类的水平。

目前,进展的主要限制是围绕一般化。这意味着,如果你学习一件事,你不需要学习每一个例子才能在现实世界中有效。婴儿不需要看到所有类型的狗来识别一只狗,但计算机可以。人类可以学习玩任何类型的游戏,从网球到象棋,但计算机很难学习很多东西。他们在某一方面可能是超人,但是我们现在能做的最好的事情就是学习不同的 Atari 游戏或者从围棋到象棋。就是这样。没有网球。没有诗。少了什么?

令人惊讶的是,很少有人积极致力于这个问题。人工智能的大多数商业上可行的用途都不需要任何类似人类智能的东西。事实上,如果你只是需要控制化工厂的阀门,最好不要兼职做一点数独或爵士乐。聚焦算法在商业上非常有用。

少数积极思考这个问题的人之一是 Jan LeCun,他是图像识别领域现代机器学习技术的早期先驱之一。他的建议是强化学习才是正道。举例来说,这就是 AlphaZero 背后的算法类型。这是胡萝卜加大棒的学习方法。如果你做得好,你会得到一根胡萝卜。如果你做得不好,你会得到一根棍子。光是做大量的学习就能产生惊人的智能,比如举世无双的国际象棋算法。这让我们走了很远。然后呢?

嗯,LeCun 建议我们需要一个世界观。一个代表真实世界的框架。例如,当人类下棋时,我们看到的是棋子和棋盘。它们是有上下文和意义的对象。算法看不到这些。没有形状的骑士。棋盘上没有颜色。它只看到数字。D4 骑士。将死。

计算机可以学习规则,但对物体一无所知。移动棋盘上的一个棋子没有任何意义,因为它可以在移动苹果时重复使用。你甚至可能会争辩说,尽管计算机会下棋,但它不懂下棋。一点也不。准确地说,计算机可以学习一种函数近似,这种函数近似恰好与象棋中的好棋步有很强的相关性。这不是象棋。如果没有人类的胡萝卜加大棒,它实际上什么也学不到。计算机大脑必须是填鸭式的。这必须改变。必须给计算机一个建模世界的框架,就像人类一样。我们深刻理解我们生活的环境。如何移动,如何寻找食物,如何爬楼梯,如何开门,如何问路,如何寻找工作,如何写电子邮件,等等。

如果我们到了那里呢?如果计算机能做到这一切会怎么样?一个功能完全相同的人类复制品,但由硅和铜线制成?

但是灯还会亮着吗?

这又回到了我们的底物独立性问题。如果你克隆了你自己,这在技术上已经是可能的,那么克隆人是有意识的吗?似乎那会自动成为事实,即使它不再是你的意识。这是复制品。不过,你能做到什么程度呢?如果你只是将你的大脑在分子甚至量子水平上扫描成计算机模拟,那会是你,你的另一个副本,还是只是一个缺乏真实人类意识的虚拟僵尸?意识行为的函数近似值是否足以通过测试?

怎么才能知道呢?当艾伦·图灵在二战期间发明计算机时,他已经想到了这一点。他看到了从房间大小的计算器到人类智能的进化,这是可能的。他提出了图灵测试,该测试指出,一个人与另一个房间中的一个实体进行交互,仅仅通过书写的方式,应该能够辨别这个另一个实体是否是人。如果它们不能,结果应该是实体拥有了人类级别的智能。那么,聊天机器人呢?

已经有人声称用相对简单的算法就能通过图灵测试。通常的策略是试图引导人类朝着算法能够以人类的方式提供记忆答案的方向前进。但这不会长久。如果超过几分钟,它最终会分解。我们都和 Siri 一起经历过。随着聊天机器人可以进行更长时间、更有意义的对话,这一点将逐渐被进一步推广。即使他们对语言本身一无所知。然而,就像 AlphaZero 一样,对话只是人类智能的一个方面。一个隐士可以拥有丰富的内心生活,而不说一句话,同时创造出令人难以置信的智力或艺术成就。那么我们如何测试“真正的”智力甚至“真正的”意识呢?

有趣的是,科幻小说可能在几十年前就给了我们答案。《银翼杀手》引入了 Voigt Kampf 测试,用于从人类群体中识别类似人类的电子人。尤其是,当那些机器人变得狂暴的时候。该测试本身旨在激发情感反应,表明质量的特殊味道对人类体验至关重要。当测量学生的反应作为情绪反应的指标时,会提出困难的伦理和道德问题。有点像灵魂测谎仪测试。

然而,任何这样的测试都有一个根本性的问题。约翰·塞尔在他的中国房间实验中展示了这一点。它表明,人工智能系统可以完全像一个智能的、有意识的实体一样行事,但实际上对它所拥有的或属于它的体验的内容完全一无所知。

回到今天的世界,我们也可以看看 IIT 来衡量意识。根据该理论,信息的整合程度越高,或者说 Phi,意识就越高。通过设计,简单的前馈神经网络具有恰好为零的 Phi,并且不能是有意识的。有学习但没有融合。然而,更复杂的网络,如循环神经网络或强化学习,可以显示具有正的 Phi。这似乎意味着 AlphaZero 是有意识的。事实上,它正在进行大量的信息整合。像细菌或苍蝇一样多?由于在应用 IIT 和计算 Phi 时存在未决问题,我们还不能说这一点,但我们似乎不太可能立即对 Deepmind 将 AlphaZero 作为一个有意识实体的道德待遇产生道德担忧。

人工智能研究员 Joscha Bach 甚至声称只有模拟才能有意识,这意味着物理系统不能。请注意,由于大脑模拟世界和自我,我们的意识将属于这种模拟的定义,而岩石不会。这将是一个反对泛灵论的论点,泛灵论认为意识在宇宙中无处不在,只是在所有物质中的程度不同。AlphaZero 确实模拟了世界,但并没有真正模拟它自己,所以它现在可能还不够。

这难道不是突发现象吗?

让我们回到我们唯一能确定的有意识的存在,也就是我们自己。我们知道进化。难道这一切不能被解释为我们大脑进化过程中的突发现象吗?蚂蚁的神经元也许没有能力对死去的人感到后悔,但我们有。也许是痛苦和遗憾让我们来到这里。一旦火和武器允许我们聚集在更大的社会群体中,我们的大脑发展相对较快。如果你学会忍受痛苦,你就能学会避免一系列可能导致死亡本身最终痛苦的行为。智慧让你事后后悔,并计划未来以避免后悔的潜在来源。这一切都非常微妙,但人类互动的复杂性是无穷无尽的。

但是我们究竟是如何发展出这些细微差别的呢?猴子用棍子互相殴打,大脑是如何产生如此难以置信的深度复杂性的?如果智力和意识在人类进化中如此紧密地联系在一起,那么它在我们大脑内部是如何工作的呢?很遗憾,我们也不知道。从广义相对论到人类基因组计划,再到登上月球,我们已经用大脑做了很多事情,但我们似乎对所有这些智力进步的来源知之甚少。

我们当然知道大脑的各个部分,其中一些功能相关,它们如何从较小的物种进化而来,我们可以通过大脑各部分之间的电信号来测量大脑活动。就是这样。例如,我们不知道学习是如何进行的。没有人类的学习算法,即使我们现在可以教会神经网络在国际象棋中击败我们。当然,部分原因是我们进行实验的道德能力有限。汉尼拔·莱克特不会得到很多研究资助。另一个原因是这个系统非常复杂。一个人脑中的神经元比我们银河系中的恒星还要多,大约有 1000 亿个。每个神经元都与另外 10,000 个神经元相连。它令人困惑,一语双关。

揭示大脑输入和输出之间关系的一个有趣的新方法是千脑理论。根据这个框架,我们没有大脑。取而代之的是,我们有成千上万个相互连接的小大脑。这些是所谓的皮质柱,有些是独立的神经元堆叠,包括一种特殊类型的神经元,称为网格细胞,解释空间信息。没有一个专栏会单独做任何事情。

这个想法是,你有数百甚至数千个这样的单元接收相同的信号,就像在视觉皮层一样。然后它们都会产生某种输出。他们投票。是的,投票。这就是为什么你不用看就能知道地毯下面有地板。你的大脑可以利用各种感官和记忆输入来估计三维物体,比如杯子。这就是你如何准确地知道手指应该放在哪里才能够到并握住把手的背面。

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

传统(A)和 1000 个大脑(B)感知模型的比较。来源:Hawkins,Jeff 等人,基于新皮层网格细胞的智力和皮层功能框架,Front。神经回路,2019 年 1 月 11 日,https://doi.org/10.3389/fncir.2018.00121

这个模型(B)与传统模型(A)非常不同,传统模型(A)也启发了当前的深度学习技术。深度学习假设神经元的连接层的层次结构,每个层负责最终导致决策或识别的更高层次的细节。

也许这就是为什么婴儿对躲猫猫如此兴奋,因为他们的一千个大脑还没有获得记忆来说出手的幕后发生了什么,他们真的相信你在你的手背后消失了。这也适用于狗。也许这就是婴儿笨拙的原因。他们的上千个大脑仍然在练习实时投票的合唱表演,以产生正确的行动。

这整件事听起来像猪食

许多顶尖科学家都会同意。意识一直是介于哲学、心理学、物理学和神经科学之间的边缘科学,从未成为严肃的研究课题。直到现在,也许是由人工智能的快速进化引发的,以及关于对待动物的越来越多的伦理问题。我们需要这些问题的答案,压力越来越大。

然而,许多人,如肖恩·卡罗尔教授,只会说没什么特别的。华莱士说过也没有消化的物理学,这只是生物学,故事结束。然而,甚至像泛灵论这样相当古怪的概念也获得了一些支持,将意识更多地表现为一种像重力一样的自然力量,而不仅仅是一种生物功能。在这种情况下,即使是石头也是有意识的,只是……不那么有意识。

意识的未来

那么这里的最终游戏是什么?为了达到这个目标,你经历了大量的阅读和术语。让我们用一些有趣的东西来结束。

显然,年轻的埃隆·马斯克得出结论,生命的意义在于将意识传播到整个宇宙。这就是为什么探索月球、火星以及更远的地方是我们的特权。用生命和意识的礼物播种宇宙。人类的胚种。正如费米悖论似乎暗示的那样,如果那里没有外星人,这一点尤其正确。成为宇宙中生命的捍卫者取决于我们。

那么埃隆对我们的意识有什么计划呢?他想稍微修补一下。比如引入第三层。意思是互联网。可能还有人工智能。哦,这是个陷阱。它涉及到针头。但是不用担心,一个机器人会把成千上万个微米级的电极插入你的新大脑皮层。超级小心。只有一英寸左右深。哦,还有电池。我们需要取出一点头骨。没什么大不了的,你不会错过的,真的。像硬币大小的钻头。基本上是从母体中取出大脑,但可能是在全身麻醉下。不是你想意识到的事情。

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

保持绝对静止。Neuralink 电极插入机器人。来源:拥有数千通道的一体化脑机接口平台,Elon Musk,Neuralink,bioRxiv 703801https://doi.org/10.1101/703801

最初,像 Elon 的大部分宏伟计划一样,R&D 将通过商业用例获得资金。这对任何一个创业者来说都是一个很大的教训。在这种情况下,这意味着治愈大脑疾病,如阿尔茨海默氏症,癫痫症,自闭症或失明。是的,治愈失明在 2020 年就在菜单上了。这些都是主要的社会问题,因此也是数十亿美元的机会。它将直接帮助数百万健康状况不佳的人,同时资助健康人大脑第三层的真实愿景。

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

你大脑的 USB-C 插头。生产模型计划是无线的。来源:拥有数千通道的一体化脑机接口平台,Elon Musk,Neuralink,bioRxiv 703801https://doi.org/10.1101/703801

那么埃隆对 C 字的立场是什么?埃隆将落入紧急阵营。从 0 到 1 的一切。没有特别的调味汁。如果你可以通过踢电视来修复它,你可以通过这些电极来修复大脑。就是这样。恢复视力,停止癫痫。但是这些电极也可以下载。你的思想,你的记忆,你的情感。备份到云。先是通过 USB,然后是无线。

从那里,他提出也许你甚至可以恢复。就像你的手机或笔记本电脑,当它坏掉的时候。从最新备份恢复。可以走了。想抹去昨晚一些尴尬的记忆吗?向右滑动。对于人类从那里到真正永生的一小步来说,你真正需要的是一种新的生物基质。比如说像克隆人一样。

这个万亿美元的问题是:这是你吗?我的意思是,如果一个克隆人从你离开的地方开始,也许会打击你的自尊心,但是“你”仍然会永远死去。这里的区别在于睡眠和死亡。睡了一觉后你感觉像是同一个人,但死亡是一张单程票。如果我们真的分辨不出来,对你个人来说有关系吗?显然,醒来后的克隆人会说他们就是你,你的记忆完好无损。但那是同一个人在一个新的更年轻更性感的身体里醒来,还是只是你记忆的克隆?

迟早,我们都要做出自己的判断。

阿基拉宁 是两家创业公司的创始人,总部位于新加坡。Healthzilla是一家健康科技公司,也是 health zilla 健康分析应用(iOS)(Android)的创造者。Bambu是一家为金融服务公司提供数字财富解决方案的 Fintech 公司。可以关注我的 推特

Python 中的懒求值是什么?

原文:https://towardsdatascience.com/what-is-lazy-evaluation-in-python-9efb1d3bfed0?source=collection_archive---------5-----------------------

你不知道 Python 为你优化了多少代码

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

霍利·曼达里奇Unsplash 上拍摄的照片

如果你以前从未听说过惰性求值惰性求值 是一种求值策略,它将表达式的求值延迟到需要它的值时,同时也避免了重复求值(来自维基百科)。这通常被认为是一种优化代码的策略。

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

作者:高

让我们把这个理论变成一个例子。例如,你有一个简单的表达式sum = 1 + 2,Python 会试图理解这个表达式的真正含义并得出结论sum = 3。这个过程被称为评估,它需要某种计算能力。在这种情况下,评估立即完成,因此它有另一个名称:严格评估

另一方面,我们有一个不严格的评价,叫做*懒评价。*不同的是 **懒求值不会立即对表达式求值,而是只在需要结果时才求值。**有点像一个懒惰的学生,只在作业需要交给老师的时候才去做。

但是在这里偷懒不一定是坏事,它可以提高你代码的效率,节省大量资源。幸运的是,Python 已经悄悄地将惰性评估应用于许多内置函数,以优化您的代码。我敢肯定,即使没有意识到懒惰评估,您也必须熟悉这些功能。

在本文中,我将解释懒惰求值在 Python 中是如何工作的,哪些函数从中受益,以及背后的原因。最后,我将向您展示如何编写自己的惰性函数/类。我们开始吧!

范围()

很多时候 Python 还是会立即对 expression 求值。让我们看看这个例子。你觉得需要多长时间?

print([time.sleep(0), time.sleep(1), time.sleep(2)][0])

答案是 3 秒。这是因为当你创建一个列表时,Python 会立即评估列表中的每一项,即使你只需要第一个元素。

从 Python3 开始,在让这样的列表遍历更加内存高效和时间高效方面有了很大的改进,这就是range()函数。我敢打赌,每个 Python 开发人员一生中都至少使用过一次这个函数。在 Python2 中,range(5)将返回一个包含 5 个元素的列表。随着列表大小的增加,会使用更多的内存。

Python 2.7.16
>>> range(5)
[0, 1, 2, 3, 4]
>>> import sys
>>> sys.getsizeof(range(5))
112
>>> sys.getsizeof(range(500))
4072

然而在 Python 3 中,range(5)返回一个范围类型。这个对象可以被迭代以产生一个数字序列。无论范围有多大,对象总是具有相同的大小。这是因为range(5)只存储开始停止、步骤的值,需要时计算每一项。

Python 3.7.7
>>> range(5)
range(0, 5)
>>> import sys
>>> sys.getsizeof(range(5))
48
>>> sys.getsizeof(range(500))
48

如果你不熟悉生成器、迭代器及其好处,请继续阅读本节。否则,请随意跳过这一部分。

迭代器>生成器

简单来说,迭代器是一个比生成器更大的概念。迭代器是一个对象,它的类有一个__next____iter__方法。每次你调用迭代器对象时,你会得到序列中的下一个条目,直到迭代器对象用尽并引发StopIteration。然而,生成器是一个返回迭代器的函数。除了使用了yield而不是return之外,它看起来就像一个普通的函数。

当执行yield语句时,程序会暂停当前函数的执行,并将产生的值返回给调用者。这是惰性求值的关键思想,当需要调用者时计算并返回值,下一个值仍然是安静的,在程序中不做任何事情。

要创建生成器,有两种方法:

创建发电机的两种方法

然后,让我们用range()来改进第一个例子。在我们得出最终结果之前,还有另一个“陷阱”。下面的例子有两个功能:use_generator()use_list()。除了use_generator()islice()功能中使用(),而use_list()使用[]之外,它们看起来几乎一样。然而,这种微小的差异会对运行时间产生巨大的影响。

这种行为的答案已经存在于函数名中。(time.sleep(x) for x in range(3))是一个生成器,而[time.sleep(x) for x in range(3)]是一个列表,尽管它使用了range()。因此,使用 list 的函数比另一个函数花费更多的时间。

如果你理解了这部分,那么恭喜你,你已经对懒评了解了 50%。

Zip()

一个非常相似的用例是zip(),它合并两个可重复项来产生一个元组序列。在 Python2 中,zip(*iterables)将返回元组列表。

Python 2.7.16
>>> type(zip([1,2],[3,4]))
<type 'list'>
>>> import sys
>>> sys.getsizeof(zip([1,2],[3,4]))
88
>>> sys.getsizeof(zip([i for i in range(500)],[i for i in range(500)]))
4072

而从 Python3 开始,已经改进为返回一个类似于range对象的zip对象,可以迭代。

Python 3.7.7 
>>> type(zip([1,2],[3,4]))
<class 'zip'>
>>> import sys
>>> sys.getsizeof(zip([1,2],[3,4]))
72
>>> sys.getsizeof(zip([i for i in range(500)],[i for i in range(500)]))
72

原因我就不再重复了,因为它和range()的思路一样。但是如果你想了解zip的其他方面,可以随意看我的另一篇文章。

[## 理解 zip()—Python 中隐藏的瑰宝

有效地合并未知数量的列表

towardsdatascience.com](/understand-zip-a-hidden-gem-in-python-9488a255f45d)

打开()

这是另一个内置功能,我们可能每天都在使用它,并认为它是理所当然的。当我们打开一个文件时,我们通常会:

with open("file.csv", "r") as f:
    for line in f:
      print(line)

with open(...)不读取整个文件并将其存储在内存中,而是返回一个可以迭代的 file 对象。正因为如此,它能够有效地读取巨大的文件,而不伤害内存。

λ表达式

几周前,我收到了一位读者关于 Lambda 表达式的问题,这实际上引发了我写这篇文章。他的问题是:

为什么像 x = map(lambda x: x*2,[1,2,3,4,5])这样的 lambda map 对象不占用任何空间?但是如果你做了 list(x),它会打印所有的值并占用内存空间?

我希望到目前为止,你应该对这里发生的事情有所了解。map对象也是一个可以迭代的惰性对象。在每个循环中只对 1 个项目进行计算x*2。做list(x)的时候,基本上是一次性计算完所有的值。如果只是想迭代map对象,就不用做list(x)

lambda 表达式中的惰性求值

如何写一个懒惰的评价函数/类?

在文章的最后一部分,我想把我们带到下一个层次,在这里我们编写自己的懒惰评估函数/类。这有助于我们扩展内置功能之外的功能。

正如我们所理解的,惰性求值的一个关键部分无非是一个生成器。因此,我们可以简单地把函数写成一个生成器。

懒惰功能—生成器

惰性函数:生成器

懒惰属性—装饰者

自定义惰性计算的另一个常见用例是类属性的初始化。当我们初始化一个类时,某些属性可能需要很长时间来计算。在下面的例子中,属性cities花费了更长的时间,因为它需要调用一个 API 来获取城市名称列表。因此,如果我们对于一些国家对象实际上不需要这个值,那将是浪费时间。

这个博客中的一个好的解决方案是为这样的懒惰属性创建一个装饰器,这样昂贵的操作只有在需要这个属性的时候才会被执行。从控制台输出可以看到,cities property is called是在我们打印出china.cities之后打印出来的。

惰性属性:装饰者

我希望这篇文章能启发你对代码优化有一个新的看法。

参考:

[## Python 中延迟求值的属性模式

惰性求值是一种有用的模式,在许多情况下可以提高代码的效率。这方面的一个例子是…

stevenloria.com](https://stevenloria.com/lazy-properties/) [## Python 技巧:Python 中的惰性求值

虽然小数据集可能适合您的主内存,但不是所有的数据集都适合。有时您无法读取整个数据集…

sanjayasubedi.com.np](https://sanjayasubedi.com.np/python/python-tips-lazy-evaluation-in-python/)

作为一名对游戏充满热情的数据科学家是什么感觉…

原文:https://towardsdatascience.com/what-is-like-to-be-a-data-scientist-with-a-passion-for-gaming-43c067ad6415?source=collection_archive---------15-----------------------

英雄联盟:创建一个模型,根据表现预测获胜的球队

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

弗洛里安·奥利佛在 Unsplash 上拍摄的照片

摘要

在 2 个月的时间里,我做了一个关于英雄联盟的简短数据项目,因为我是这个游戏及其数据使用的忠实粉丝。该项目的重点是我们是否可以创建一个模型,根据表现来预测获胜的团队。我试图用逻辑回归和其他模型来预测比赛结果。特征是从Riot Games API公开的数据中提取的——包括为游戏挑选的冠军、玩家角色信息、玩家对冠军的掌握程度(赛前知识)以及游戏内玩家统计。我发现,从一开始只使用预赛知识(冠军、大师、角色、法术)只是比赛结果的一个弱预测器,但是使用游戏内统计,该模型成为一个强预测器。

介绍

1-游戏行业数据和分析简介:

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

安东尼·布洛林在 Unsplash 上拍摄的照片

正如他们对传统体育所做的那样,各种数据的收集、分析和使用正在开始改变在线竞技游戏的玩法和概念。如今,随着电子竞技越来越受欢迎,关于电子竞技游戏的数据分析也变得越来越常见。

在这个项目中,我选择了 2009 年由 Riot Games 开发的著名网游作为案例研究。主要原因是我从游戏的第五个赛季就开始玩并喜欢这个游戏,我想给这个项目带来一个比其他案例研究更有见识的观点。另一个重要的动机点是 Riot Games 的 API ,它允许公众轻松地进行查询并从他们的服务器上获取信息。

2-相关工作

由于英雄联盟是一款受欢迎的游戏,在数据分析领域已经有了一些应用。像 图盟MetaSrc 这样的网站从英雄联盟 API 中收集基本的统计数据和信息,并使用它来构建简单的分析,如最受欢迎的冠军是谁,两个冠军在一起比赛时的胜率是多少…这些现有的应用程序目前没有做的是预测当前正在进行的游戏,并记住该游戏的所有功能,这正是该项目试图填补的。

英雄联盟作为游戏的背景

1-游戏概述:

英雄联盟是由开发的一款 多人在线战场竞技场(MOBA) 风格游戏。每场比赛由两个队组成,每队有 5 名队员。每个队在竞技场的相对两侧开始游戏,目标是克服障碍(炮塔、抑制剂和敌方球员),以摧毁敌方基地( Nexus) 。全地图划分的团队玩家有 5 个标准位置:顶、中、丛林、攻击伤害搬运(ADC)和支援。每场比赛通常持续二十分钟到一小时。玩家可以从 140 多个具有不同特点和能力的冠军中选择一个独特的冠军。这款游戏也代表了一个蓬勃发展的竞争场景,拥有数百万的锦标赛奖金池和在线观众。****

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

链接:https://www.pinterest.com/pin/579697783257078372/?lp=true

每个游戏中有这么多的参数,不可能说一个因素将决定任何特定玩家的成功或失败。此外,英雄联盟背后有这么大的社区,预测休闲玩家和锦标赛游戏的比赛结果对玩家和粉丝来说都是有趣和有价值的。

2-游戏信息:

英雄联盟是一款复杂的游戏,需要掌握许多元素的知识才能玩得熟练。游戏中,两队各五名玩家在一个名为 召唤师裂谷 的战场上对战。还有其他不同目标和布局的战场,但在我们的项目中不会研究。 召唤师裂谷 由各队的基地、三条车道、丛林组成。英雄联盟的目标是摧毁对方队伍的 Nexus,一个位于敌方基地的建筑。

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

链接:shorturl.at/ktAK1

gold differential是一个原始统计数据的例子,可以一眼看出比赛的状态。通常当一个队比另一个队拥有更多的金牌时,这意味着他们的冠军携带更强大的物品,如果他们进入团队战斗,更有可能获胜。结合个人【KDA(杀死数、死亡数、助攻数)** 的数字和一个团队累计的总杀死数,这是一个让观众知道谁赢了的简单方法。如果我们看一下 LCS 的广播, 黄金微分 是我们在屏幕上方看到的第一组数字之一。但是像这样的统计数据并不能说明全部情况…****

数据收集

我试图从公共 Riot Games API 中提取数据,该 API 允许收集关于召唤师(LoL 对玩家的称呼)、冠军和过去比赛的数据。然后我用 把这些都收集到一个文件里。xlsx 格式,包含 2017 赛季每场比赛的所有可用数据。

备注:下载的数据集包含超过 75 个变量,其中一些没有意义。所以我决定去掉那些对我们的分析没有帮助的变量。

我在 Kaggle 上上传了数据,可以在这里随意下载

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

所以,我决定删除 25 个对我们的预测没有帮助的变量。现在,我们在 中有了一个数据集。csv 格式,其中包含 50 个变量。

为了解释下载的比赛数据文件,你可以在这里找到一个包含变量名及其描述的字典。

这是我们使用 Tableau Desktop 软件分析的数据集的预览:

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

文件预览:2017clean.csv

探索性数据分析(EDA):

a-英雄联盟的演变:

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

首先,我试图通过对比我们数据中的竞技游戏数量与前一年 2016 年的对比来说明游戏令人印象深刻的增长。

2016 年 2429 场比赛。联赛继续大幅增长,2017 年达到了令人难以置信的 3117 场职业竞技比赛。

我们还可以看到,联赛 LPL、纳尔茨、LCK尤尔茨 各有超过 350 场的比赛最多。

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

b 队:

计算胜率相当于估算胜率占游戏总数的比例。下面我们可以看到,有球队把 0%和 100%作为胜率,这是不连贯的。

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

问题是有些球队只打了几场比赛,有些甚至只打了一场。为了克服这个问题,我们需要计算在不同联赛中参加 60 场以上比赛的“出场最多的球队”的胜率。

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

我们可以看到, SK 电讯 T1闪狼三星银河 胜率最高。我首先计算了赢&输,然后我分别计算了每个团队的胜率:

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

因此,我们得出结论:

  • 一个职业队的平均胜率45%**
  • SK 电讯 T1 胜率最高。在 139 场比赛中,他们设法赢了 97 场**比赛,以 69,78% 的高胜率******
  • 闪狼93 场胜率64(68.82%)
  • 三星银河 胜率第三。他们设法赢得了 80 场比赛,胜率达到了 67.23%

c 级玩家:

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

这场比赛的另一个重要因素是 t 他的杀数,死亡数和助攻数 KDA(杀数,死亡数,助攻数)。公式:

KDA 比率= (K+A) / Max(1,D) 其中:K =死亡数| D =死亡数| A =助攻数

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

  • 职业玩家的平均 KDA 是 3.74
  • 詹森 & 比耶格森 是竞技联赛中 KDA 最高的两名球员,分别拥有 7、78&7、34

黄金和伤害

同时,我也试着用线性回归的方法来看看获得的金币和造成的伤害之间的相关性。如下图所示,黄金伤害之间有很强的线性相关性,也就是说玩家利用好游戏中获得的黄金,将黄金转化为对敌人的伤害。

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

另外,我研究了英雄联盟游戏的其他方面,这里不想解释,以免写长篇。也许我可以在未来写其他文章来呈现整个研究。现在让我们进入最重要的部分!

赢家预测:

我们能预测一场比赛的结果吗?

实际上,从一开始就只使用赛前知识(冠军,大师,角色,法术)只是比赛结果的一个弱预测器,但是使用游戏中的统计数据,该模型成为一个强预测器。这就是为什么我会试着根据游戏中的统计数据来建立我们的模型。

事实上,我们不确定哪些变量对预测结果有用。建立双变量模型通常很有帮助,双变量模型是使用单个独立变量预测结果的模型。但问题是,在双变量逻辑回归模型中,28 个变量中的哪一个是结果变量的重要预测因子?我们需要建立不同的模型,以便找到具有最高准确性的最佳模型,或者我们可以使用相关函数来了解与变量结果高度相关的变量。

首先,我开始排除游戏结束时统计数据的变量,因为在那种情况下预测胜利已经太晚了。此外,我决定忽略与个人统计数据相关的变量,因为这是一个团队游戏,一个球员不可能独自获胜。

我在同一个数据集上应用了逻辑回归随机森林。所以我得到了可变重要性(逻辑回归的绝对系数)(随机森林的可变重要性)。我试图将两者结合起来,得到一个最终的变量重要性。经过多次尝试,我设法建立了一个最终模型(叠加:逻辑回归&随机前沿)**,其重要变量如下:****

  • ****gdat 10:10 点黄金差
  • gdat15 : 金差 15:00
  • fb : 第一次血杀(1 是,0 否)
  • 团队杀戮,s : 团队杀戮总数
  • ****团队死亡:团队死亡总数
  • 游戏的第一座塔被杀死(1 是,0 否)
  • ****组队任务:组队杀死的塔总数
  • ****敌方死亡人数:被对方杀死的总塔数
  • fd : 游戏中第一条龙被杀死(1 是,0 否)
  • ****团队屠龙:团队屠龙总数
  • 被对方杀死的龙总数

混乱矩阵解释

  • 正确: 预测红队获胜,实际获胜:6318 次
  • 正确: 预测蓝队获胜,实际获胜:6351 次
  • 错: 预测红队赢但红队输了:95 次
  • 错: 预测蓝队赢但蓝队输了:106 次

准确率= 98.43 %

r 闪亮应用:

Shiny 是一个 R 包,它使得直接从 R 构建交互式 web 应用变得容易。我决定构建一个包含两部分的 web 应用程序:

  • 第一部分使用我们的最佳预测模型,其准确率为 98%;你可以填一张表格,然后得到你获胜机会的百分比。
  • 第二个用 Riot Games Api 对比英雄联盟冠军统计。一次可以比较两个冠军,补丁版本也可选。

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

讨论:

在这项研究中,我使用了与游戏的一个补丁相关的数据,因为 Riot Games 试图将冠军胜率保持在接近 50%。任何高于 50%的胜率意味着冠军给了玩家优势,而任何低于 50%的胜率意味着冠军给了玩家劣势。

为了保持平衡,暴动决定分别 nerfbuff 这些冠军。这意味着,如果团队选择相同的冠军,补丁的变化数量和胜率之间有很强的相关性。

结论:

我们希望将来能够看到更多的最新数据,但这是一个很好的演示,说明了数据如何能够推动任何人,从普通玩家,到暴乱游戏 专业广播,甚至团队寻找最佳方法来分析敌方团队的优势和劣势,以做出明智的决策。

通过 Riot API 挖掘数据并发布有趣的统计数据的现有网站中,没有一个能够有效地预测比赛中的冠军球队。这项研究使用与两个队的统计数据相关的不同变量来完成这项任务,以便预测获胜者。

我想提到的是, Riot API 还包含了更多我们忽略的信息,但这些信息可以用于许多其他目的。

参考资料:

什么是损失函数?

原文:https://towardsdatascience.com/what-is-loss-function-1e2605aeb904?source=collection_archive---------4-----------------------

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

来源:米里亚姆·埃斯帕奇

在关于激活功能的帖子之后,我们将潜入第二部分,将 【损失】目标 功能 用于神经网络

包含所有代码的笔记本可以在这里找到: GitHub 你可以找到代码来生成不同类型的数据集和神经网络来测试损失函数。

为了理解什么是*损失函数,*这里引用一下学习过程:

一种衡量算法是否做得很好的方法-这是确定算法的当前输出与其预期输出之间的距离所必需的。该测量被用作反馈信号来调整算法的工作方式。这个调整步骤就是我们所说的学习
Fran ois Chollet,Python 深度学习(2017),Manning,第 1 章,第 6 页

损失函数计算算法当前输出和期望输出之间距离的函数。这是一种评估算法如何对数据建模的方法。它可以分为两类。一个用于分类(离散值,0,1,2…),另一个用于回归(连续值)。

训练一个神经网络常用的损失函数有哪些?

内容

  • 交叉熵
  • 原木损失
  • 指数损失
  • 铰链损耗
  • Kullback Leibler 发散损失
  • 均方误差(MSE — L2)
  • 平均绝对误差(美-L1)
  • 胡伯损失

这些软件包是必需的:

%matplotlib inline
import keras.backend as K
import numpy as np
import matplotlib.pyplot as plt

分类

交叉熵

该函数来自信息论,其目标是测量信息分布比特数的两个平均值之差交叉熵作为对数损失函数(不相同,但它们测量相同的东西)计算两个概率分布函数之间的差异。

是传输从概率分布中随机选择的事件所需的比特数。偏斜分布具有低熵,而事件概率相等的分布具有较大的熵。

在信息论中,我们喜欢描述一个事件的惊喜。低概率事件更令人惊讶,因此有更多的信息。而事件同样可能发生的概率分布更令人惊讶,熵也更大。

-偏态概率分布 ( 不足为奇):低熵。

-均衡概率分布 ( 惊人):高熵。

交叉熵是机器学习中最常用的一类损失函数,因为它导致更好的泛化模型和更快的训练。

交叉熵可用于二元和多类分类问题(许多类具有一个标签,不同于许多类具有称为多标签分类的多标签)。

交叉熵的类型:

  • 二元交叉熵:用于二元分类问题
  • 分类交叉熵:二进制和多类问题,标签需要被编码为分类的,一键编码表示(对于 3 类:[0,1,0],[1,0,0]…)
  • 稀疏交叉熵:二元和多类问题(标签是整数——0 或 1 或… n,取决于标签的数量)

这类损失函数的取值范围:

  • 0.00 :完美概率
  • < 0.02 :大概率
  • < 0.05 :良好
  • < 0.20 :太好了
  • > 0.30 :不大
  • 1.00 :地狱
  • > 2.00 有些东西不工作

原木损耗

对数损失是高达 1 / log(2)因子的二进制交叉熵。这个损失函数是凸的,并且对于负值线性增长(对异常值不太敏感)。使用对数损失的常用算法是 逻辑回归

二元分类问题的负对数似然性通常简称为“对数损失”,作为逻辑回归的损失函数。

-对数损失=负对数似然,符合伯努利概率分布

对于分类问题,“对数损失”、“交叉熵”和“负对数似然”可以互换使用。

更一般地,术语“交叉熵”和“负对数似然”在分类模型的损失函数的上下文中可互换使用。

指数损失

指数损失被设计在 Adaboost 算法的开始,该算法贪婪地优化它。数学形式为:
exp _ loss = 1/m * sum(exp(-y * f(x)))

可以这样编码:

def exponential_loss(y_pred, y_true):
    return np.mean(np.exp(- y_pred * y_true))

结果如下所示:

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

指数损失与错误分类(如果 y<0,则为 1,否则为 0)

铰链损耗

在分类任务中,铰链损失函数被用来修正 SVM 算法的超平面。目标是在没有被正确预测或离超平面太近的点上进行不同的惩罚。

它的数学公式是 Hinge = max(0,1-y*f(x))和相应的代码:

def Hinge(y_pred, y_true):
    return np.max([0., 1\. - y_pred * y_true])

这个方程的结果是凸的,但不可微,需要一个次梯度算法来优化。

结果如下所示:

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

铰链损失 vs 误分类(1 if y <0 else 0)

Kullback Leibler Divergence Loss

The KL divergence is the score of two different probability distribution functions. The KL difference between a PDF of q(x) and a PDF of p(x) is noted KL(Q||P) where || means 散度(不是对称 KL(P||Q)!= KL(Q||P))。

KL(Q | | P)=-sum(Q(x)* log(P(x)/Q(x))或 sum(q(x)*log(q(x)/p(x))

求和是针对离散情况的,积分是针对连续情况的。这意味着,对于相同的数据,如果 q(x)的 PDF 大,而 p(x)的 PDF 小,则散度增加。在机器学习中,你可以将这表示为预测和基本事实之间的差异。

以下代码显示了如何将 KL 散度用于预测和地面实况:

def kl_divergence(y_true, y_pred):
    return y_true * np.log(y_true / y_pred)

这里可以显示一个简单的可视化:

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

来源:维基百科

因此,KL 散度通常被称为“相对熵

-交叉熵:用 Q 而不是 p 来表示一个事件的平均总位数

-相对熵 ( KL 散度):从 Q 而不是 p 来表示事件的平均额外比特数。

回归

均方误差损失(也称为 L2 正则化)

它是当前输出 y_pred 和预期输出 y_true 的平方差除以输出数。MSE 函数对异常值非常敏感,因为差值是给予异常值更多重要性的平方。如果我们必须预测所有目标的一个值,预测值应该是平均值。

这是这样表述的:

def mean_square_error(y_true, y_pred):
    return K.mean(K.square(y_true-y_pred), axis=-1)

我们可以将 MSE 函数的行为可视化,将一系列值(此处为-10000 到 10000)与一个常数值(此处为 100)进行比较:

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

均方误差损失的行为

该行为是对梯度下降算法特别有用的二次曲线。越接近最小值,梯度越小。如果异常值对问题很重要,则 MSE 非常有用。如果异常值是有噪声的、错误的数据或错误的测量值,则应使用 MAE 损失函数。

平均绝对误差损失(也称为 L1 正则化)

在前一个损失函数的差值处,平方被一个绝对值代替。这种差异对具有“V”形的损失函数的行为有很大的影响。每个点的梯度都是相同的,即使值接近最小值(可能会产生跳跃)。它需要动态修改学习速率,以减少接近最小值的步长。MAE 函数对异常值更稳健,因为它基于与 MSE 的平方相比的绝对值。这就像一个中位数,离群值不能真正影响她的行为。

您可以像这样轻松地实现它:

def mean_square_error(y_true, y_pred):
    return K.mean(K.abs(y_true-y_pred), axis=-1)

我们可以将一系列值(此处为-10000 到 10000)与一个常量值(此处为 100)进行比较,从而直观地了解 MAE 函数的行为:

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

平均绝对误差损失的行为

均方对数误差

胡伯损失

Huber 损失是 MAE 和 MSE(L1-L2)的组合,但它取决于一个影响损失函数形状的附加参数 delta。这个参数需要通过算法进行微调。当值很大(远离最小值)时,函数具有 MAE 的行为,接近最小值时,函数的行为类似于 MSE 。所以 delta 参数就是你对离群值的敏感度。胡伯损失的数学形式是:

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

我们可以用两种方式实现这个函数,这里我给出一个函数,其中所有的块都是显式的。

*# custom huber loss function* 
def huber_loss_error(y_true, y_pred, delta=0.1):
    res = []
    for i in zip(y_true, y_pred):
        if abs(i[0]-i[1])<=delta:
            res.append(0.5*((i[0]-i[1])**2))
        else:
            res.append(delta*((abs(i[0]-i[1]) )-0.5*(delta**2)))
 *# can also be write as:
 # np.where(np.abs(y_true-y_pred) < delta, 0.5*(y_true-y_pred)**2 , delta*(np.abs(y_true-y_pred)-0.5*delta))*
    return res # np.sum(res)

我们可以将一系列值(此处为-10 到 10)与一个常数值(此处为 0)进行比较,从而直观地了解 Huber 损失函数的行为:

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

胡伯损失行为

Huber 损耗允许对较大的数字有较大的梯度,但当值变小时梯度减小。但是,这个函数需要微调增量,但计算量很大。为了避免这种情况,您可以使用 Log-Cosh 损失(本文中没有解释,但您可以在下一个图中看到它们之间的差异)。

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

Huber 损失函数(δ= 1)和 Log-Cosh 损失函数的比较

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值