TowardsDataScience 博客中文翻译 2021(三百二十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

谷歌的 RFA:逼近变形金刚中的 Softmax 注意机制

原文:https://towardsdatascience.com/google-deepminds-rfa-approximating-softmax-attention-mechanism-in-transformers-d685345bbc18?source=collection_archive---------15-----------------------

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

图片由 Free-Photos 来自 Pixabay

思想与理论

什么是注意机制&为什么 RFA 比 Softmax 好?

谷歌最近发布了一种新方法——随机特征注意力——来取代《变形金刚》中的 softmax 注意力机制,以实现类似或更好的性能,同时在时间和空间复杂度上有显著改善。

在这篇博客中,我们将了解变形金刚的背景,什么是注意力机制,以及为什么 RFA 是 softmax 注意力机制的更好替代方案。我们将从 RFA 中获得一些东西来结束这篇博客。

注:本博客基于彭等人的 Google Deepmind 最新论文“随机特征注意”。虽然我们将涵盖大多数核心概念,但请务必阅读该论文此处以深入了解数学推导、实验结果和讨论。

背景

变形金刚是目前最好的序列对序列机器学习模型。它擅长从数据序列中学习,这一事实使它在自然语言处理、机器翻译、时间序列建模和信号处理方面尤其出色。

变形金刚成功的基石是注意力机制。这些机制查看输入序列并识别最重要的元素。当对序列进行编码时,这些元素将具有更重的权重,即受到更多的关注。

说白了注意力机制是什么?

想象一下,我们正在会议中做笔记,准备写一封跟进邮件。记笔记的时候,不太可能把什么都写下来。我们可能需要用缩写或图画来代替单词;我们可能还需要跳过那些可以推断出意义损失最小的单词。这个过程将把一个小时的会议浓缩成只有一页的笔记。从本质上讲,注意力机制也在做同样的事情,它试图通过更多地关注重要的嵌入(单词的缩写或图标表示)来对序列进行编码。

什么是 Softmax 注意机制?

假设我们有句子*“什么是真正的注意机制”。*

注意机制的目标是计算序列的不同部分应该如何彼此链接并因此应该同时被注意的相关性矩阵。例如,“注意”和“机制”应该连在一起,但两者都不应该与“实际上”或“”有很大的关联。

该机制将从摄取我们的输入句子的数字形式开始,即单词嵌入矩阵。

注意:单词嵌入是一个单词的向量表示,它提取了该单词的不同属性。这些属性的一个过度隐含的例子可以是情感、词性和字符数。

然后,它将为查询W_q、密钥W_k和值W_v初始化三个权重矩阵。

然后我们可以计算查询矩阵Q、键矩阵K和值矩阵V,分别作为单词嵌入矩阵与W_qW_kW_v的点积。正如《注意力是你的全部需求》一文中所述,初始注意力矩阵可以计算如下:

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

来源:瓦斯瓦尼等人的《注意力是你所需要的一切》。

或者数学上如下:

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

来源:作者图片

为了帮助理解矩阵运算的流程,下面是底层矩阵的图示流程:

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

注意机制的内部状态——来源:作者图片

这种注意力也被称为 softmax 注意力,因为它使用 softmax 激活函数来将QK的缩放点积转换为注意力的相对测量值A,其中每隔一个单词将分享一个注意力比例,该比例总计为 1(或 100%)。然后,softmax 结果将与V相结合,为其提供基于注意力的语义结果。

但是什么是查询、键和值呢?

理解查询、键、值三元组背后的直觉的一种过于简单的方式可以是将转换器理解句子的能力视为最大化以下条件似然性:

  • 输入序列为[**y**, "actually", "is", "attention", "mechanism"]y =“什么”的概率
  • 输入序列为["what", **y**, "is", "attention", "mechanism"]y =“实际”的概率
  • 输入序列为["what", "actually", **y**, "attention", "mechanism"]y =“是”的概率
  • 输入序列为["what", "actually", "is", **y**, "mechanism"]y =“注意”的概率
  • 输入序列为["what", "actually", "is", "attention", **y**]y =“实际”的概率

推断可能性的方法是注意输入句子中的其他单词(单词嵌入)。在训练过程中,转换器将通过改进三个权重矩阵来学习如何基于嵌入将单词链接在一起。

这种架构的好处是,我们可以通过创建多组查询、键、值三元组(也称为多头注意力)或通过堆叠这些注意力层来捕获更复杂的语义结构。

为什么 Softmax 的注意力机制不够好?

在一个典型的 transformer 中,多头注意力被用来分解更复杂的语言模式。然后,softmax 注意机制的时间和空间复杂度变为O(MN),其将以输入序列长度的二次方速率增长。

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

Softmax 注意机制——资料来源:彭等人的“随机特征注意”。

为了解决这个问题,来自 Google Deepmind 的团队利用了 Bochner 定理,并扩展了 Rahmi & Recht (2008)的工作,使用随机特征图ϕ (独立正态分布的随机向量**w**和输入句子**x**之间的内积的傅立叶特征)来估计 softmax 函数的指数函数。

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

Softmax 函数—来源:作者图片

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

随机特征图——来源:彭等的“随机特征注意”。

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

随机特征图的点积可以用来估计指数函数——来源:彭等的《随机特征注意》。

在不深入推导太多数学细节的情况下,softmax 注意机制可以近似为以下结构:

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

RFA 注意机制——资料来源:彭等《随机特征注意》。

通过用 RFA 近似 softmax,Google Deepmind 将时间和空间复杂度降低到了O(M + N),即从二次到线性。

谷歌 Deepmind 的研究成果

  • 由于 RFA 具有相同的输入和输出维数要求,因此 RFA 可以用来替代 softmax 注意机制。
  • 随着复杂度从二次下降到线性,当输入文本序列较长时,RFA 取得了更显著的改善。
  • RFA 背后的基本原理可以用于近似高斯核之外的其他核函数。在 Google Deepmind 的论文中,他们展示了如何将相同的方法应用于近似反余弦核。
  • 像 softmax 一样,RFA 本身不考虑输入句子中的位置距离。在 Google Deepmind 的论文中,他们讨论了如何将递归神经网络的灵感应用于 RFA,以便单词的重要性将根据它们在句子中的相对位置呈指数衰减。
  • 最后但同样重要的是,机器学习看起来非常闪亮,但它都是关于数学和统计的。感谢优秀的研究人员和程序员,我们拥有了 TensorFlow 和 PyTorch 这样的高级软件包。尽管如此,我们需要不断学习最新的发展,并修改核心概念,以确保我们正在开发可防御和可解释的机器学习模型和管道。

这是这个博客的内容。希望你觉得博客或代码有用!如果我错过了什么,或者如果你有任何问题,请随时回复或 pm。如果你想了解更多关于 Python、数据科学或机器学习的知识,你可能想看看这些帖子:

如果你想了解更多关于如何将机器学习应用于交易和投资的信息,这里有一些你可能感兴趣的帖子:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传https://www.linkedin.com/in/louis-chan-b55b9287/ 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谷歌地球引擎:资源和提示

原文:https://towardsdatascience.com/google-earth-engine-resources-and-tips-9c4369a66d8a?source=collection_archive---------30-----------------------

学习基础知识和动手实践的最佳资源!

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

美国宇航局在 Unsplash 拍摄的照片

没有什么比通过那些被称为卫星的无情生物的眼睛从太空一路看到地球更令人兴奋的了。你会立刻意识到你只是比你大得多的事物中的一小部分。这是我每次使用谷歌地球引擎平台加载卫星图像进行分析时的感受。

如果你曾经对地理空间数据分析和揭示全球范围的地球观测洞察力感到好奇,那么谷歌地球引擎平台应该是你的首选。

GEE 拥有让您起步的一切。从数 Pb 的随时可用的最新卫星图像和地理空间数据集,一直到由谷歌数据中心基础设施和丰富的资源支持的完全可操作的开发环境,以检测变化,量化地球表面的差异,并绘制长期趋势。

让我们来看看一些技巧和资源,您可以利用它们来练习使用该平台并利用其分析功能!

注册一个谷歌地球引擎开发者账户

要使用 GEE 作为开发人员,您需要首先注册!在此过程中,您将填写一份简短的表格,其中包含您的基本信息,以及您目前拥有的任何关系和您目前工作的组织。

在这份表格中,你还需要提供一个简短的描述,说明你打算如何使用地球引擎。确保你尽可能的具体。在大约一周内,无论您是否有权访问该平台,您都应该会收到 GEE 团队的回复。这一步应该很简单。

探索数据目录

获得平台访问权限后,第一个很好的步骤是探索数据目录中可用的数据集。这将使您熟悉您可以访问的数据和卫星图像。

该平台拥有丰富的地表温度、气候、土地覆盖、地形、农田、大气和合成孔径雷达(SAR)数据。

确保您浏览了 Landsat 和 Sentinel 数据集,因为您可能需要在平台上执行几乎任何任务时查看这些数据集。

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

照片由 NASAUnsplash 上拍摄

了解开发环境是如何工作的

现在您需要开始接触使用 GEE 环境的技术方面。首先熟悉 JavaScript 开发环境和 IDE。

了解如何管理脚本、搜索文档、接收资源、在代码编辑器中保存和运行脚本、使用控制台查看输出和调试代码、使用检查器检查地图上的元素、管理任务以及查看地图和管理其图层。

随着时间的推移,一旦你做了一些练习,这些项目将成为第二天性。请记住,您不需要从第一天起就知道如何在环境中做每件事情!

了解地球引擎 API 的方法和对象

为了能够利用平台提供的功能,您需要熟悉各种类型的 Earth Engine 对象。

您应该知道图像、图像集合、几何图形、特征、特征集合、缩减器、连接、数组和图表之间的区别。

这些课程中的每一门都可以在很长一段时间内掌握。但是作为起点,在深入研究每个类的方法之前,请确保您知道一个类和另一个类之间到底有什么不同。

设定一个时间表来浏览开发者指南

这些提供了丰富的学习材料,您应该仔细阅读,尝试使用地球引擎代码编辑器复制,并在此基础上进行构建。

这些指南涵盖了所有种类的材料,包括:JavaScript 崩溃指南、最佳编码实践、调试提示和技巧、开发环境概述、API 教程、关键概念,如服务器端与客户端对象和变量之间的差异、上面讨论的不同类的对象和方法、机器学习算法以及许多其他关于资产管理的有用资源。

不要错过地球引擎社区提供的高质量教程

这包括来自地球引擎用户社区的贡献。您可以找到一些有价值的资源,这些资源以非常直观和友好的方式解释了基本概念。

查看初学者食谱,它对你需要知道的基础知识进行了很好的概述,让你开始舒适地进行基本的地球引擎开发。

一旦你在基础知识方面接受了足够的培训,并探索了像哨兵 2 号和陆地卫星 8 号那样的多光谱图像,请查看本教程,学习合成孔径雷达 (SAR)的基础知识!

练习。练习。练习。

谷歌地球引擎的一个很大的特点是,它让你专注于做实际的科学和分析,而不是专注于下载和管理大量复杂的维护数据。

这在地理空间数据分析工作流程中为您节省了大量时间。利用额外的时间在小规模的项目上练习,一旦你掌握了基本原理,你就可以在此基础上进行扩展。

试着通过不时解决不同的问题来观察地球表面不同种类的变化!最近发生的埃特纳火山爆发、德克萨斯州的风暴和洪水以及去年贝鲁特港口的毁灭性爆炸都是最近发生的事件,您可以使用谷歌地球引擎来探索这些事件,尝试检测地球表面的变化并测量损害。

由于团队(谷歌地球谷歌开发者谷歌云)每天都在努力改进谷歌地球引擎的体验,这种可能性是无穷无尽的。

Google Fit 数据分析

原文:https://towardsdatascience.com/google-fit-data-analysis-8541d5402f3b?source=collection_archive---------21-----------------------

一个简单的方法来解释数据探索的主要步骤。

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

威廉·艾文在 Unsplash 上的照片

说明

前一阵子我开始学习数据分析,经过一些学习练习后,我渴望做自己的数据探索项目。我想了想这个话题,决定我不想使用常见的和普遍可用的数据资源,如 Kaggle 或其他流行的数据集平台。我想用一些我个人感兴趣的东西。我的选择来自几个月前我安装在手机上的 Google Fit 应用程序的数据,该应用程序用于推动自己进行一些体育活动。

所以当我开始我的项目时,我有两个目的。第一个是使用数据分析的主要概念从头到尾经历数据探索的整个过程:清理、探索和可视化。第二是评估我在日常体育活动中的进步:我变得更爱运动了吗,我在运动上投入了多少时间,什么样的运动最适合我?

这两个目标对我来说真的很有意思,也很重要,现在想和大家分享一下我小小的研究成果。

一些理论

通常,数据分析的过程包括这五个步骤:

  1. 研究目标
  2. 收集数据
  3. 数据准备
  4. 数据探索
  5. 解释结果

设定研究的目的意味着我们必须知道,需要回答什么问题。我们真正想知道的是,我们的兴趣点是什么?这影响了我们研究所需的数据、参数和变量。根据这一点,我们将选择我们要寻找的数据源。

在我们确定了研究的目的和需要的数据类型后,我们应该从任何可用的资源中收集数据。最重要的是数据必须尽可能的准确和完整。否则,我们所有的研究都可能导致不正确的结果,都是无用的。

但这是一种非常罕见的情况,当我们有很好的干净的数据,我们可以立即探索。这就是为什么我们带走我们所拥有的,然后清理它,为探索做准备。

只有完成了前面的所有步骤,我们才能探索我们的数据。它可能包括使用描述性统计、建模和最有用的工具——可视化。在这个阶段,我们可以确认或否认我们的假设,并获得我们在研究的第一阶段设定目标时所提问题的答案。

最后,我们得出可以与目标受众、利益相关者或我们自己分享的结论。

好,让我们开始,一步一步地经历所有这些阶段。

1.研究目标

正如我之前说过的,这个项目有两个目的:在数据分析方面进行训练,并从我的 Google Fit 应用程序中接收一些关于我的体育活动的反馈。我有一个假设,通过每天使用这个应用程序,我变得更加热爱运动,随着时间的推移,我的运动活动增加了。

2.收集数据

这项研究的原始数据取自我在 2019 年 9 月安装在手机上的 Google Fit 应用程序。要从这个应用程序下载数据,我们应该使用 Google 外卖系统。该系统旨在向用户提供来自谷歌各种来源的数据。你要做的就是在那里注册,并指定你想从哪个应用程序接收什么样的数据,谷歌会以 CSV 格式将它们发送到你的电子邮件中。

对于 Fit 应用程序,Google 为给定时间段的每一天提供了一组文件,以及带有聚合数据的文件。我们将使用最后一个,因为它包含了我们需要的所有信息。我们要探索的时间段是从 2019 年 11 月 1 日到 12 月 31 日。

在我们的研究中,我们将使用带有 Python 模块 Pandas 和 Matpoltlib 的 Jupiter Notebook。

让我们从导入必要的模块开始…

import pandas as pd
import matplotlib.pyplot as plt

…并从文件中读取数据。

data = pd.read_csv('google-fit-data-file.csv')

让我们先快速看一下我们的数据:

data.info()

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

我们看到我们的数据集有 92 行 25 列。我们有很多空牢房。有些数据根本不存在(比如身高和心脏点)。我们以后再考虑如何处理它。

现在让我们看一下数据的前几行。

data.head()

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

如此混乱,毫无头绪。顺便说一下,这就是我热爱数据科学的原因:它让我们从这些乱七八糟的数字中获得有趣的、有时是意想不到的见解。很快我们就会从这一团乱麻中做出一份订单。

现在我们知道了数据的样子,我们可以开始为进一步的探索做准备了。

3.数据准备

3.1.清洁

首先要清理数据。这是什么意思?这意味着我们应该抛弃一切对研究没有价值或意义的东西。例如,我们的数据集中不需要一些列,因为它们现在与我无关。

正如我们在数据信息中看到的,列“身高”和“心跳”是空的。在这个分析中,我们不会处理地理数据,所以我们也不需要包含纬度和经度的列。我们不想讨论体重,所以我们删除了所有包含这些数据的列。我们不需要一个列有休息和睡眠时间的栏目,因为我们谈论的是运动,而不是休息。

我们可以用熊猫的下拉功能删除这些栏目:

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

axis=1 意味着我们处理列,而不是行。 inplace=True 允许我们不复制表来存储新数据,而是改变数据集本身。

3.2.格式化

有时(坦率地说,几乎总是)我们不得不改变我们拥有的数据。我们可能有不同的理由这样做,但在这个过程的最后,我们有一个更合适的数据格式或数据本身,可以更容易理解,描述和可视化。你会在下面的例子中明白我的意思。

3.2.1。类型转换

首先,我想将日期列的类型转换为日期时间格式。这将使我们有机会把日期当作日期来处理,而不是字符串。这可以通过内置的 pandas to_datetime 函数来实现:

data['Date'] = pd.to_datetime(data['Date'], dayfirst=True)

3.2.2。处理缺失数据

此外,我们希望用 0 填充所有的 NaN (空)值,这样熊猫就可以将它们视为数字,而不是缺失值。有必要进行进一步的分析和可视化。这可以通过 fillna pandas 函数来完成。

data.fillna(0, inplace=True)

3.2.3。改变尺寸

当我们查看数据时,我们发现一些值的维度不合适。很难用毫秒来表示时间,或者用米每秒来表示速度。因此,我们将把数字转换成更熟悉的单位,并相应地更改列名。

现在数据集看起来更好更清晰了。

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

3.3.添加信息

有时出于某种目的,我们需要向数据集添加信息。例如,我想在我们的数据表中添加一列:星期几(这真的很有趣,我的体育活动是否依赖于它)。在 pandas 中,每个 datetime 对象都有一个内置属性 dayofweek。应用它,我们为每个日期接收一个从 0(星期一)到 6(星期日)的工作日。我们不想使用数字:它们不能提供信息。所以我们把它们转换成单词,并稍微改变一下列的顺序。

经过所有这些转换后,我们的数据集看起来好多了:

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

4.数据探索

现在让我们开始最有趣的部分——理解我们拥有的数据。出于简洁的目的,这里我将只探索和可视化其中的一部分。但是对于那些感兴趣的人来说,在本文的结尾会有一个到 GitHub repo 的链接,在那里你可以找到这个项目的完整版本。

4.1.一般活动

好了,我们的数据集是干净的,可以开始研究了。让我们深入研究一下。

我们将从我每天活动的一般指标开始:活动分钟,即我每天做多少分钟的运动。让我们画一个简单的图表。

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

有意思。看起来像硬甜菜。我活动的分钟数既不是每天都不变,也不是每天、每月都在增加。好像是随机的。

好吧,如果这里没有逻辑,至少我们可以回答一个重要的问题:我做了足够的事情来尽可能保持健康吗?我们知道世界卫生组织建议每周至少运动 150 分钟。让我们检查一下我的活动是否属于这个框架。

首先,我们需要计算每周的分钟数。我们看到最后一周只包括一天,所以我们将放弃这个值。

现在我们可以为这些数据做一个图表。我们为 150 分钟的值添加一条直线,以查看我的每周活动是否超过它。

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

看起来很好。至少我可以说我做了足够的努力来保持健康。

但是我通常做多少分钟的运动呢?直方图可以帮助我们回答这个问题。

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

我们看到这个直方图几乎呈正态分布。最常见的间隔在 90 到 120 分钟之间。还不错。但是在两栋半房子之后,天数急剧下降。我从来没有走超过三个小时。

我对这些一般值的最后一个问题是:它们是否取决于一周中的某一天?正是为了这个问题,我们向数据集添加了“星期几”列。

首先,我们计算一周中每天的分钟数。然后,我们可以计算一周中每天的平均活动时间(分钟)。但我们应该准确:一个月中一周的不同天数可能不同。所以我们需要计算一周中的每一天在我们的数据集中出现了多少次。然后我们可以计算出一周中每天的平均活动时间。

我们可以画一个图形来直观地展示这些结果。

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

看起来很自然。像许多其他人一样,我周一做很多事情,周六更喜欢呆在家里休息(你应该知道在我住的地方,周日是工作日)。

4.2.各种活动

现在是时候谈谈我在这三个月中所做的各种活动了。

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

印象深刻,啊?除了到处走走,我几乎什么也没做。它占我所有活动的 75%以上。排在第二位的是游泳,然后是一点健美操,然后是几乎看不见的跑步、体操和普拉提。

好的。现在不是心烦的时候。我以后可以改进。

4.3.步行

既然散步是我的主要活动,那就让我们更具体地谈谈吧。

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

我们看到一天的平均行走时间是 75 分钟。一个多小时。当我们每天去工作或购物时,我们甚至不去想我们从一个地方到另一个地方花了多少时间。但这很重要,因为它对我们的整个生活都有影响。

但是那些日子我走过的距离是多少呢?

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

最小距离为 0。这符合逻辑。当然,有时我会呆在家里。我走过的最大距离是 12 公里多一点。差不多吧。让我们看看它是什么时候发生的。

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

十一月二十八日。哦,我记得那天。我和我的家人一起旅行。那真是凉爽的一天。

这个数据的另一个输出是,通常,我每天步行超过四公里。不多,但也不少,啊?

最后一个关于距离的问题:在那三个月里,我一般走了多少公里?

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

哇!400 多公里!

还有一个与距离相关的指标是步数。世界卫生组织建议每天至少走 10 000 步。让我们看看我是否成功。

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

坦白说,不是。我很少做我应该做的那么多步骤。让我们数一数我满足这个条件的天数百分比。

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

我觉得还不够。我应该努力。

5.解释结果

在这里,我们应该回答开始研究时提出的问题,并确认或拒绝假设的理论。就你所记得的,我有一个假设,每天使用谷歌体育应用程序会让我更运动。

这是不对的。没有一个图表在这段时间内没有持续增长的趋势。因此,使用这个应用程序——任何种类的应用程序——都不会让你的工作有起色。但是它可以向你展示真实的情况。有了这些数据,你就可以决定做什么。这取决于你,这是个好消息。

现在我知道走路是我的强项。但是我真的需要付出巨大的努力来让自己接受常规训练。我不应该依赖外部刺激。动机是内在的。我只需要有勇气承认它,并遵循这条道路。

结论

因此,我们对来自 Google Fit 应用程序的数据进行了为期三个月的研究。我们看到了我们拥有的数据,清理、重组、描述并可视化了它们。我们确定关系和模式,并绘制图形来说明它们。

使用数据可以让我们更多地了解我们周围的现象,得出科学结论,揭示以前认为不可知的东西,并有助于在所有应用领域做出明智的决策。这也是我喜欢数据和数据分析的原因。我希望继续我的研究,如果我发现一些有趣的东西,我会与人分享。

这里是 GitHub 资源库的链接,里面有该项目的完整版本:https://github.com/shebeolga/Google-Fit-Data-Analysis。我将感谢你对这个话题的评论和补充。

谷歌发布 efficient net v2——一个更小、更快、更高效的网络

原文:https://towardsdatascience.com/google-releases-efficientnetv2-a-smaller-faster-and-better-efficientnet-673a77bdd43c?source=collection_archive---------4-----------------------

与最先进的技术相比,性能更高,同时训练速度提高 5-10 倍

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

Fab LentzUnsplash 上拍摄的照片

通过渐进式学习,我们的 EfficientNetV2 在 ImageNet 和 CIFAR/Cars/Flowers 数据集上明显优于以前的模型。通过在相同的 ImageNet21k 上进行预训练,我们的 EfficientNetV2 在 ImageNet ILSVRC2012 上实现了 87.3%的顶级准确率,比最近的 ViT 高 2.0%,同时使用相同的计算资源训练速度快 5-11 倍。代码将在 https://github.com/的发布Google/automl/efficient net v2。

来源: Arxiv

高效网络已经成为高质量和快速图像分类的 SOTA。他们大约在 2 年前发布,因为他们的扩展方式而非常受欢迎,这使得他们的训练比其他网络快得多。几天前,谷歌发布了 EfficientNetV2,它在训练速度和准确性方面都比 EfficientNet 有了很大的提高。在这篇文章中,我们将探讨这个新的高效网络是如何优于以前的。

DenseNets 和 EfficientNets 等性能更好的网络的主要基础是以更少的参数获得更好的性能。当您减少参数的数量时,您通常会获得很多好处,例如更小的模型大小,使它们更容易适应内存。然而,这通常会降低性能。因此,主要的挑战是在不降低性能的情况下减少参数的数量。

这一挑战现在主要属于神经网络架构搜索(NAS)领域,该领域日益成为热门话题。在最佳情况下,我们将对某个神经网络给出一个问题描述,它将为该问题提供一个最佳的网络架构。

我不想在这篇文章中讨论效率网。但是,我想提醒大家效率网络的概念,以便我们能够找出架构中的主要差异,这些差异实际上会带来更好的性能。高效网络使用 NAS 来构建基线网络(B0),然后使用“**复合扩展”**来增加网络容量,而不大幅增加参数数量。在这种情况下,最重要的度量标准是 FLOPS(每秒浮点运算次数)和参数数量。

1.渐进式训练

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

乔纳森·博尔巴在 Unsplash 上的照片

EfficientNetV2 使用渐进式学习的概念,这意味着尽管训练开始时图像尺寸最初很小,但它们的尺寸会逐渐增大。这种解决方案源于这样一个事实,即 EfficientNets 的训练速度在高图像大小时开始受到影响。

渐进式学习并不是一个新概念,以前就有人用过。问题是,当它以前使用时,相同的正则化效果用于不同的图像大小。EfficientNetV2 的作者认为这降低了网络容量和性能。这就是为什么他们动态地增加正则化和图像大小来解决这个问题。

仔细想想,很有道理。对小图像的大的正则化效果会导致欠拟合,而对大图像的小的正则化效果会导致过拟合。

借助改进的渐进式学习,我们的 EfficientNetV2 在 ImageNet、CIFAR-10、CIFAR- 100、Cars 和 Flowers 数据集上取得了出色的结果。在 ImageNet 上,我们实现了 85.7%的顶级准确率,同时训练速度比以前的模型快 3-9 倍,体积小 6.8 倍

来源: Arxiv

2。MB Conv 层上的熔融 MB Conv 层

EfficientNets 使用一个称为"**深度方向卷积层"**的卷积层,这些层的参数和 FLOPS 数量较少,但它们无法充分利用现代加速器(GPU/CPU) [1]。为了解决这个问题,最近一篇名为“ **MobileDets:搜索移动加速器的对象检测架构”**的论文用一种新的层解决了这个问题,他们称之为“**融合 MB Conv 层”。**这一新层正在 EfficientNetV2 中使用。然而,他们不能简单地用融合层替换所有旧的 MB Conv 层,因为它有更多的参数。

这就是为什么他们使用训练感知 NAS 来动态搜索融合和常规 MB Conv 层的最佳组合[1]。NAS 的结果显示,在早期阶段用融合的层替换一些 MB Conv 层提供了更小模型的更好性能。它还示出了 MB Conv 层(沿着网络)的较小扩展比是更优的。最后,它表明内核越小,层数越多越好。

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

来源: Arxiv 。EfficientNetV2 在 ImageNet 上拥有几乎最高的精确度,而参数数量却只有一半

3。更加动态的扩展方法

我认为这里要学习的一个主要的有价值的想法是他们用来改进网络的方法。我认为总结这种方法的最佳方式是首先调查 EfficientNet 的问题,这是显而易见的,但下一步是**开始使一些规则和概念更加动态,以更好地适应目标和目的。**我们首先在渐进式学习中看到这一点,当时他们使正则化更加动态,以更好地适应图像大小,从而提高了性能。

我们现在看到这种方法再次被用于扩大网络规模。EfficientNet 使用一个简单的复合缩放规则[1]平均放大所有阶段。EfficientNetV2 的作者指出,这是不必要的,因为并非所有这些阶段都需要扩展来提高性能。这就是为什么他们使用非统一的缩放策略,在后期阶段逐渐添加更多的层。他们还添加了一个缩放规则来限制最大图像大小,因为 EfficientNets 往往会过度放大图像大小1

我认为这背后的要点是,早期的层并不真正需要扩展,因为在这个早期阶段,网络只关注高级功能。然而,当我们进入网络的更深部分并开始查看底层功能时,我们将需要更大的层来完全消化这些细节。

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

来源: Arxiv

参考文献:

[1]Arxiv 中的 EfficientNetsV2

谷歌发布 MLP 混合器:全 MLP 架构

原文:https://towardsdatascience.com/google-releases-mlp-mixer-an-all-mlp-architecture-for-vision-824fac3e788c?source=collection_archive---------18-----------------------

回到 MLPs 的图像处理,简单但有效(有竞争力的结果)

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

Unsplash 上的absolute vision拍摄

图像处理是机器学习中最有趣的分支之一。它从多层感知开始,然后是回旋,然后是自我关注(变形金刚),现在这篇论文把我们带回 MLPs。如果你和我一样,你的第一个问题会是 MLP 如何达到和变形金刚和 CNN 几乎一样的效果?这是我们将在本文中回答的问题。新提出的“MLP 混合器”实现了非常接近 SOTA 模型的结果,该模型以几乎 3 倍的速度在大量数据上训练。这也是论文中一个有趣的指标(图像/核心/秒)。

提出的 MLP 混合器没有使用任何卷积或任何自我关注层,但却达到了几乎 SOTA 的结果,这是相当发人深省的。

MLP 混频器架构

在讨论网络如何工作之前,让我们从讨论网络的组件开始,然后将它们放在一起(就像分解汽车引擎并分析各个部分)。

我们提出了 MLP 混合器,一种完全基于多层感知器(MLPs)的架构。MLP 混合器包含两种类型的层:一种是 MLPs 独立应用于图像面片(即“混合”每个位置的特征),另一种是 MLPs 跨面片应用(即“混合”空间信息)。

来源:arxiv 上的 MLP 混音器

这里要注意的第一件事是输入图像是如何“建模/表示”的,它被建模为面片(当它被分割时)x 通道。第一种类型的层(将称为通道混合层[1]),对图像的独立小块进行操作,并允许在学习期间在它们的通道之间进行通信(因此是通道混合)。然而,第二种类型(称之为补丁混合)的工作方式是相同的,只是针对补丁(允许不同补丁之间的通信)。

现代图像处理网络的核心思想是在给定位置混合特征或者在不同位置之间混合特征[1]。CNN 用卷积、核和池来执行这两种不同类型的混合,而视觉变形者用自我关注来执行它们。然而,MLP 混合器试图以一种更“分离”的方式(下面解释)并且仅使用 MLP 来实现这两者。仅使用 MLP(基本上是矩阵乘法)的主要优点是架构简单和计算速度快。

它是如何工作的?

这是有趣的部分,我们讨论输入如何变成输出,以及图像在通过网络时发生了什么。

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

来源:arxiv 上的 MLP 混合器 —图像首先被分成不重叠的小块,然后被发送到网络。

第一个完全连接的层将非重叠面片投影到所需的隐藏维度中(根据层的大小)。这一层的类型是有意义的“补丁混合”层。你可以认为这是对图像进行编码,这是神经网络(作为自动编码器)中广泛使用的压缩技巧,用于降低图像的维度,只保留最关键的特征。在这之后,用图像补片的值相对于隐藏尺寸值来构建“表格”。

面片混合层在表格的列上执行其矩阵操作(例如转置),而声道混合层在表格的行上执行其矩阵操作(这在上面被表示为“混合器层”)。之后,应用非线性激活函数[1]。这听起来可能有点混乱,但直观地说,您可以看到混合器正在试图找到最佳的方式来混合和编码图像的通道和补丁,以获得有意义的输出。

这里要注意的重要一点是,非重叠面片的隐藏表示的大小与输入面片的数量无关。在这里证明这一点将使这篇文章比我想要的长得多,所以请随意检查文件。但是,本质上,这给出了 MLP 混频器与其他架构之间的一个非常重要的性能差异,即:

MLP 混合器的计算复杂度与输入面片的数量成线性关系,不像 ViT 的复杂度是二次的。

来源:arxiv 上的 MLP 混音器

MLP 混频器还有几个优点,简化了其架构:

  • 这些层具有相同的尺寸
  • 每层仅由 2 个 MLP 块组成
  • 每层接受相同大小的输入
  • 所有图像块都用相同的投影矩阵进行线性投影

与通常具有金字塔结构的 CNN 相比,这使得对该网络的推理和使用变得简单一些[1]。我记得我第一次试图设计一个 CNN,弄清楚什么时候缩小图像,什么时候放大图像,以及放大/缩小的程度可能有点困难。然而,这些问题在这种体系结构中并不存在。

需要注意的一点是,该模型还使用了跳过连接和正则化,但我不认为我们需要讨论这些概念,因为它们在许多其他资源中被广泛使用和解释。

最后的想法

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

来源:arxiv 上的 MLP 混音器

就结果而言,有多个表,这张表突出了一个事实,即混频器的性能与其他架构非常相似,但速度更快。它的“吞吐量”为 105 图像/秒/内核,相比之下,Vision transformer 为 32 图像/秒/内核。平心而论,这听起来可能是一个非常奇怪的指标,有时感觉 ML 的研究人员试图找到一个指标,使他们的网络看起来比其他人好得多。然而,我认为我们都可以客观地同意,仅用 MLP 块就达到相同的性能水平仍然令人印象深刻。

我希望我提供了低层次细节和高层次细节的良好平衡,没有引起太多的混乱。如果你有任何不明白的地方,请在评论中告诉我,我会尽我所能进一步解释。

谢谢你

感谢您阅读本文:)如果您喜欢这篇文章,请考虑在这里给我买杯咖啡(咖啡有助于我写作):

https://www.buymeacoffee.com/mostafaibrahim

如果你想定期收到关于人工智能和机器学习的最新论文的评论,请在这里添加你的电子邮件并订阅!

https://artisanal-motivator-8249.ck.page/5524b8f934

参考

[1]arxiv 上的 MLP 调音台

谷歌开关变压器:在恒定计算成本下扩展到万亿参数模型

原文:https://towardsdatascience.com/google-switch-transformers-scaling-to-trillion-parameter-models-with-constant-computational-costs-806fd145923d?source=collection_archive---------14-----------------------

在强烈调整的 T5-XXL 基线(谷歌的顶级变压器)上实现了 4 倍的预训练加速。

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

亚瑟·奥西皮扬Unsplash 上拍摄的照片

变形金刚已经在机器学习方面取得了巨大的成功,特别是 NLP(现在还有图像处理)。它们是目前最热门的话题之一,谷歌试图改善它们是有道理的。

几天前,谷歌发布了一篇新的大型论文,提出了一种新的方法,在保持每秒浮点运算次数(ML 计算成本标准度量)的同时,大幅增加参数的数量。

众所周知,增加参数的数量会增加模型的复杂性和学习能力(当然在一定程度上)。正如预期的那样,该车型比 T5-XXL 提高了 4 倍,比 T5-Base 和 T5-Large 提高了 7 倍。

他们的论文比大多数论文都要大得多(大约 30 页),所以为了使这篇文章简明扼要,我将突出最重要的细节。

先决条件

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

科学高清照片Unsplash

  1. 混合专家(MoE)算法

专家混合指的是一种机器学习技术,其中使用多个专家(学习者)将问题空间划分为同质区域。…如果输出以多级概率选通函数为条件,这种混合被称为专家的分层混合。

来源:维基百科

关于 MoE 最有趣的事情之一是,虽然典型的深度学习网络对所有输入使用相同的参数,但 MoE 会调整网络,对不同的输入使用不同的参数。这使得网络更加通用。

如果你想一想,这意味着模型将有大量(稀疏)的参数,然而,并不是所有的参数都会同时使用,这是本文的本质。

MoE 在本文之前就已经介绍过了,但是,它有几个训练不稳定性和计算成本问题,本文已经解决了。

2.蒸馏

蒸馏本质上是 ML 中的“教”。当一个更小的网络模仿一个更大更好的网络,而不需要经过漫长的训练过程,就可以从中学习。这与迁移学习有所不同,并提供了显著的性能提升。

事实上,脸书最近最先进的 DeIt 论文使用 0 卷积和不到 1%的最先进数据集对图像进行分类依赖于蒸馏。如果您有兴趣了解更多关于蒸馏令牌的技巧,请在这里查看我的文章:

3.模型和数据分片(并行)

当模型和数据极其庞大时,您必须开始将它们分散到多个内核中。这通常是有挑战性的,但是因为这里的模型基本上是稀疏的(不是所有的参数总是被使用),这是容易的。其实主要卖点就是简单高效的稀疏性!

论文集锦(简述其工作原理)

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

照片由 Garett MizunakaUnsplash 上拍摄

这篇论文最令人愉快的一点是他们使用了“工程思维”。当处理大量的计算能力和模型参数时,你必须聪明。这就是为什么第一个重点是如何在关注后将令牌发送给正确的专家(MoE)。

这个模型从一个经典的自我关注模块(变形金刚的精髓)开始。注意部分可以聚合信息,将序列中的各个项目相互关联起来,并将它们转换成一个新序列,在这个新序列中,标记可以从其他标记收集信息。[2]

之后,有一个前馈网络(FFN),其中每个令牌都被隔离。FFN 的工作是为下一组层的确定每个标记的最佳表示。所以基本上注意力是一种相互关联的记号,前馈层是相互关联的层[2]。你可以认为 FFN 是两个实体之间翻译的中间人。一边是需要处理的令牌,另一边是一组专家。

现在有趣的是,我上面描述的都是 MoE 变压器,我们还没有开关变压器!

路由技巧

交换变压器在 FFN 层之前引入“交换”层,该层实质上推动 FFN 成为专家,并且该交换将每个令牌匹配到正确的 FFN /专家。它本质上将正确的令牌路由给最合适的“专家”。

例如,一个 FFN 层可能是处理名词的专家,另一个层可能专门处理动词、标点符号等……[2]。

他们称这个概念为交换路由,它本质上是混合专家的升级。之前 MoE 的作者假设,由于计算成本的需求,这是不可能的。Google 在这个领域引入了一个非常新颖的解决方法。

相反,我们使用一种简化的策略,只向一个专家发送。我们表明,这种简化保持了模型质量,减少了路由计算,性能更好。这种 k = 1 的路由策略后来被称为交换层。交换层有三方面的好处:

(1)减少了路由器计算,因为我们仅将令牌路由到单个专家。

(2)每个专家的批量大小(专家容量)可以至少减半,因为每个令牌仅被路由到单个专家。

(3)简化了路由实现,降低了通信成本。

来源:开关变压器论文

我们都知道 ML 依赖于浮点运算。如果你要部署一个大型的分布式模型,你必须发送大量的浮点数。浮点数主要有两种大小:16 位和 32 位,如果你只发送 16 位的数,你将不能进行标准的 ML 计算,并且由于计算的限制,你不能发送 32 位的数(这是交换路由所需要的)。

那么他们做了什么…?他们引入了一种选择性精度技术,向模型发送 16 位浮点,并选择性地将所需的浮点放大到 32 位浮点,以执行所需的操作,然后再将这些浮点缩小到 16 位。解决难题的简单方法!

他们还通过能力因子的概念来优化这些过程,其中每个专家只处理一定数量的令牌。

此外,为了缓解一些部署问题(因为这些模型非常庞大),他们使用基于 BERT 模型的蒸馏技术

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

来源: arxiv (乳胶转载表)

结果是在不增加参数数量的情况下,性能提高了 3–30%。这证明了蒸馏的神奇!

最终想法

这篇论文里好像做了很多工作,我还没有全部涵盖!文中有更多关于分发模型和数据的内容,但我的目的是展示亮点。看到创新总是很棒,我认为最好的部分是他们使用工程和计算机系统技术来解决 ML 问题(如路由和选择性精度)。这表明,ML 不仅是数学和统计学,也是计算机科学。

如果你有兴趣阅读更多关于其他小说的文章,请点击这里查看我的文章:

如果你想定期收到关于人工智能和机器学习的最新论文的评论,请在这里添加你的电子邮件并订阅!

https://artisanal-motivator-8249.ck.page/5524b8f934

参考文献:

[1]开关变压器:通过简单有效的稀疏性扩展到万亿参数模型。威廉·费杜斯、巴雷特·佐夫和诺姆·沙泽尔。2021.在 arxiv

[2]开关变压器:通过简单有效的稀疏性扩展到万亿参数模型。youtube 上的扬尼克·基尔彻

谷歌张量让人工智能变得更好:下面是方法

原文:https://towardsdatascience.com/google-tensor-changed-ai-for-the-better-here-is-how-b476eea684f6?source=collection_archive---------9-----------------------

社区笔记

我认为这是人工智能领域一场革命的三个原因

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

瑞恩Unsplash 上拍摄

谷歌设计了自己的人工智能芯片,名为 Tensor ,用于其新的 Pixel 6 智能手机。该芯片结合了 GPU、CPU、ISP(图像信号处理器)、TPU(张量处理单元)和专用安全芯片。据一位谷歌高管称,Tensor 比 Pixel 5 中使用的高通骁龙 765G 快四倍多。谷歌想要比以前更好地为用户带来 Edge AI ,他们需要一个更强大的 AI 芯片。他们希望向用户推出增强的计算摄影,如消除摄影炸弹解决模糊的面孔,帮助他们轻松完成日常任务。此外,他们希望为用户更好地引入实时翻译转录。使用旧的高通芯片是不可能的。

人工智能芯片是一种处理器,经过优化,可以通过谷歌的 TensorFlow 和脸书的 PyTorch 等 ML 框架运行机器学习任务。

人工智能的发展面临着许多伦理上的和技术上的挑战,这些挑战可能会从根本上阻止它的进步。伦理挑战之一是,由于各种隐私行为,我们不能将所有数据发送到人工智能模型运行的云端。我们必须找到在用户层面运行这些模型的方法,这就是所谓的边缘人工智能。技术挑战之一是我们缺乏人工智能专用硬件,这降低了人工智能产品的开发或采用速度。CPU 不是为人工智能中的特殊计算而设计的,因此,当涉及到大型人工智能模型时,它们缺乏效率。与 CPU 相比,GPU 具有更高的效率;然而,它们还不是最佳的。

在这篇文章中,我想分享为什么我认为张量是人工智能发展中的一个惊人的里程碑,以解决上述挑战。希望你会觉得有趣。

—张量和张量流:一个强大的组合💪

谷歌大脑团队几年前开发了一个名为 Tensorflow 的高级人工智能框架。之后,谷歌设计了自己的处理单元,名为张量处理单元或 TPU,以更有效地执行张量流。TPU 的发明是人工智能的一场革命,大大加快了拥有数百万(或数十亿)参数的庞大机器学习模型的训练。然而,这项技术不能用于 Edge AI 中的智能手机等低功耗设备。谷歌加入低功耗设备的人工智能芯片制造俱乐部可能是该行业的下一场革命。许多公司如 FogHornBlinkAI 正在使用市场上现有的 AI 芯片进行边缘 AI 研究。然而,Google 通过 TensorFlow 和 Tensor 的结合所能创造的功效将是改变游戏规则的。欢迎加入俱乐部,谷歌!

— Tensor 是 AI 设计的 AI 芯片!😲

是不是很酷?这个故事是从《自然》杂志上发表的一篇文章开始的,标题是“T4:一种快速芯片设计的图形布局方法”。为了设计一个处理芯片,有一个被称为“布局规划”的关键步骤,其中工程团队必须放置大量元件,以满足包括功耗和性能在内的一系列物理要求。我没有进一步深入它的细节,因为我也不是硬件工程方面的专家。然而,当你在一系列约束条件下做出一系列选择时,人工智能可以发挥作用。你可能还记得 AlphaGo 项目是如何击败一名职业人类围棋选手的。这是完全一样的。张量是这个项目的真正成果,是人工智能行业的一个新的里程碑。太棒了,谷歌!

——张量帮助我们构建伦理人工智能。💡

这是一个双刃剑的说法。伦理人工智能有从数据隐私到全民人工智能的各个方面。Tensor 帮助许多用户有机会尝试最新的人工智能进展,而他们并不担心自己的隐私。为什么?因为 AI 引擎在芯片上运行,没有数据被发送到云端进行进一步计算。另一方面,谷歌将人工智能软件和硬件绑定得越紧密,其他公司就越难竞争。我不想看到有一天其他公司甚至不能在执行人工智能推理上竞争,即在使用人工智能上竞争。我们几乎输给了大型科技公司。如果我们在人工智能推理上输给他们,那将是一场噩梦。这就是为什么我认为“张量帮助我们建立道德人工智能”是一把双刃剑。

感谢阅读!

如果你喜欢这个帖子,想支持我…

https://pedram-ataee.medium.com/membership

谷歌趋势分析

原文:https://towardsdatascience.com/google-trends-analysis-1f029c941ba?source=collection_archive---------25-----------------------

心理健康宣传月

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

活动发起人Unsplash 上的照片

五月是心理健康宣传月,正因为如此,我选择写一个与心理健康相关的数据科学项目。本教程将介绍分析与饮食失调相关的 Google 趋势数据的过程。

连接到 Pytrends

该分析的第一步是安装适当的软件包。在这种情况下,我们需要 pytrends,它连接到 Google Trends 数据。

!pip install pytrends

接下来,我们必须导入 pandas 库以允许我们处理数据帧。然后,我们启动 pytrend 函数。

import pandas as pdfrom pytrends.request import TrendReqpytrend = TrendReq()

下一步是建立一个你想要调查的关键词列表。在这种情况下,我们正在寻找与进食障碍恢复和/或意识相关的关键词。这是作为起点的五个基本关键字的示例。我们通过调用关键字列表并设置时间范围来定义 pytrend 在本例中是过去五年。

kw_list = ['eating disorder treatment', 'anorexia recovery', 'eating disorder awareness', 'bulimia treatment', 'residential eating disorder treatment']pytrend.build_payload(kw_list, cat=0, timeframe='today 5-y', geo='', gprop='')

接下来,我们创建一个随时间变化的数据框架。为了简单起见,我称这个数据帧为“df ”,但是你可以随便叫它什么。

df=pytrend.interest_over_time()

现在我只想看到数据帧的前十行,所以我调用 head 函数。这将以表格形式显示每个关键字的数据。

df.head()

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

数据帧输出

这是什么意思?

这些数字到底是什么意思?Simon Rogers在之前的一篇媒体文章中对 Google Trends 数据做了简单的解释。基本上,兴趣分数从 0 到 100,这表明了与特定关键字相关的谷歌搜索的参与度。因此,兴趣越高,搜索就越多,这对于公司的 SEO 活动或其他营销活动来说是有益的。让我们在接下来的几个步骤中绘制出一些兴趣趋势,以显示对不同饮食失调关键词的兴趣是如何变化的。首先,我们将导入 numpy 和 matplotlib 来绘制数据。

import numpy as npimport matplotlib.pyplot as pltdata = df.drop(labels=['isPartial'],axis='columns')data.to_csv('MentalHealthGoogleTrends.csv', encoding='utf_8_sig')image = data.plot(title = 'Eating Disorder Keyword Interest Over 5 Year on Google Trends ')fig = image.get_figure()fig.set_size_inches(18.5, 10.5)fig.savefig('GoogleTrends.png')

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

谷歌趋势利息日期图

过去五年对 ED 恢复的兴趣

上面的图表明,在过去的五年里,人们对饮食失调恢复关键词的兴趣(至少在谷歌看来)有所波动。我们可以看到,“饮食失调治疗”是目前最受欢迎的搜索。令人惊讶的是,虽然 2017 年有所增长,但 2018 年又回落了。它似乎像一种趋势一样循环往复,考虑到当今时代 ED 的发病率正在增加,这是很有趣的。

另一个有趣的发现是,“住宿饮食障碍治疗”的搜索兴趣最低。作为一个搜索过 ed 治疗的人,我知道在门诊治疗之后,下一步往往是住院治疗。此外,寻找合适的居住设施需要大量的时间和研究,所以有趣的是,今天没有多少人在搜索这个术语。

后续步骤

现在我们已经有了一些直观的关键词的趋势,是时候找到与热门关键词(饮食失调治疗)相关的关键词了。我们将用我们最感兴趣的关键字启动 pytrend 负载,然后运行相关的查询搜索。

pytrend.build_payload(kw_list=['Eating Disorder Treatment'])related_queries = pytrend.related_queries()

接下来,我们调用刚刚提取的值。

related_queries.values()

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

从这个图表中,我们可以看到,最上面的关键词是“进食障碍的治疗”。然而,如果我们在上升类别下看,我们看到“我附近的住院饮食障碍治疗”越来越受欢迎。

相关主题

现在我们来看看相关的话题。这遵循类似的协议,但将返回与“饮食失调治疗”相关的首要主题。

related_topic = pytrend.related_topics()related_topic.values()

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

我们可以看到,上升的话题和我们感兴趣的关键词没有必然联系。然而,“热门”话题肯定与我们正在看的内容无关。这表明,有时谷歌趋势数据需要谨慎对待。

结论

这只是对 pytrends 的介绍。通过查看与饮食失调治疗相关的谷歌趋势数据,我们获得了有用的见解。例如,如果这是国家饮食紊乱协会(NEDA)的营销机构,这些见解可以应用于他们的付费和有机搜索策略。

Google vs IBM vs 微软:哪个在线数据分析师证书最好?

原文:https://towardsdatascience.com/google-vs-ibm-vs-microsoft-which-online-data-analyst-certificate-is-best-dc8fd790a174?source=collection_archive---------2-----------------------

目前市场上排名前三的数据分析师证书的回顾和比较。

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

照片由 Aaron BurdenUnsplash

似乎每个重量级人物都推出了他们自己版本的同一件事:专业数据分析师认证,注定让你成为雇主的下一个热门商品。

随着谷歌最近在 3 月份取消了最新的数据分析课程,三位一体的专业证书现在已经完成。

在过去的十年中,很明显,学习数据分析可以将你的职业生涯推向新的高度。此外,随着空缺职位的不断增加(仅在美国就有 337,400 个数据分析职位空缺),每个大公司现在都推出了认证来帮助弥合差距。由于这些公司中的许多都不需要认证的先决条件,现在任何有互联网连接的人都可以进入数据分析的世界。

问题不再是,我是否应该学习数据分析。

现在的问题变成了:我该考哪种证书?

谷歌数据分析专业证书

https://grow.google/dataanalytics/#?modal_active=none

概观

**技能等级:**初学者

**课程交付:**在线

**持续时间:**大约 6 个月(建议 10 小时/周)

价格:$ 39/月通过 Coursera(在 6 个月内完成本课程将花费$234)

**学到的技能:**电子表格、数据清理、数据分析、数据可视化、SQL、提问、决策、解决问题、R、Tableau、元数据、数据收集、数据伦理、样本量确定

课程设置: 8 门课程

IBM 数据分析师专业证书

https://www.coursera.org/professional-certificates/ibm-data-analyst

概观

**技能等级:**初学者

**课程交付:**在线

**持续时间:**大约 11 个月(建议每周 3 小时)

价格:$ 39/月通过 Coursera(在 11 个月内完成本课程将花费$429(美元)

**学到的技能:**微软 Excel、Python、数据分析、数据可视化、SQL、数据透视表、IBM Cognos Analytics、仪表盘、Pandas、Numpy

课程设置: 9 门课程

微软认证:数据分析师助理

https://docs.microsoft.com/en-us/learn/certifications/data-analyst-associate/

概观

**技能等级:**初级/中级

**课程交付:**在线(免费)或讲师指导(付费)

**持续时间:**大约 11 个月(建议每周 3 小时)

**价格:**考试费 165 美元

**学到的技能:**数据准备、数据建模、数据可视化、数据分析、部署和维护可交付成果、Microsoft Dataverse、R、Python、AI Insights、Microsoft Power BI

课程设置: 16 个模块

如何选择数据分析师认证?

在了解数据分析师认证的世界时,在选择课程时考虑两件事很重要。

选择你最感兴趣的技术认证。

首先,上面列出的认证没有一个比其他的高,甚至没有一个比其他的高。本质上,上面列出的程序是相同的,只是使用了不同的技术。例如,每个认证都要求你使用他们公司特有的技术。谷歌用 R 教他们的认证,因为他们公司用 R 做数据分析。IBM 使用 Watson 平台教授他们的认证,因为 IBM 的一切都在 Watson 上运行。最后,微软使用微软技术教授他们的认证,因为他们整个公司都使用微软技术。

一旦你学会了特定的技术,并对它们驾轻就熟,你就不太可能再去学别的东西了。这样,通过完成这些公司之一的认证,他们会吸引你虔诚地使用他们的产品。换句话说,这些认证同时也是营销工具。因此,在许多方面,你选择完成哪家公司的认证并不重要——选择你最感兴趣的技术,因为无论你选择哪门课程,你都会学到相同的基础知识。

记住,证书不是就业的黄金门票——选择一个能给你实践经验的证书。

第二,虽然谷歌等公司公开表示,他们的使命是帮助毕业生在完成认证后获得就业机会(通过谷歌雇主联盟),但并非所有该联盟以外的招聘经理都相信在线数据分析证书的重要性。事实上,许多人并不经常重视 MOOCs 或在线专业认证的完成。相反,雇主倾向于寻找有工作经验、项目经验和某种形式教育的候选人。

尽管完成 mooc 是致力于个人发展的一个很好的标志,但 mooc 并不是找到工作的黄金门票。因此,将你选择的认证与个人项目和工作经验结合起来,以显示你能够运用你的技能解决现实世界的问题,这一点很重要。这就是谷歌数据分析师认证变得特别有价值的地方,因为他们在课程结束时提供了一个顶点项目。完成这个顶石项目有助于你很好地证明你可以将技术技能应用到实际的数据问题中。

哪个专业的数据分析师认证最好?

看你问的是谁,每个人对于哪个数据分析师认证最好都会有不同的看法。

然而,根据(试图)最公正的标准和对课程的总体分析,本调查得出结论,最佳专业数据分析师认证是:谷歌数据分析专业认证。

为什么谷歌拥有最佳专业数据分析师认证:

  • 谷歌大胆宣称,尽管没有任何相关经验,他们项目的毕业生也能在数据分析领域找到工作。做出如此大胆的声明将谷歌与这一承诺联系在一起。谷歌已经准备好实现这一主张,通过在整个工作准备过程中为毕业生提供支持的资源,包括简历制作工具、模拟面试、职业网络活动以及将雇用该项目毕业生的雇主联盟。
  • 谷歌用 R 语言教授这种证书,R 语言是一种编程语言,有着众所周知的难学曲线。在老师和社区的帮助下学习这门语言会比你自己学习更顺利。从那里,毕业生可以很容易地自学 Python,这是一种非常容易掌握的语言。这样,先学习难的东西是有益的,会让你成为一名更全面的数据分析师,可以加入任何公司。
  • 谷歌已经决定在项目结束时提供一个顶点项目的机会。由于对教师的要求和课程提供者必须付出的额外努力,大多数 MOOCs 不提供顶点项目。通过利用这一机会,这个项目的毕业生拥有解决现实世界问题的技能和能力的具体证据,从而在其他求职者中占得先机。
  • 谷歌提供了一个最物有所值的项目,该项目涵盖了数据分析的基础知识,其成本仅为同等训练营或硕士学位通常成本的一小部分。不仅如此,通过 Coursera 托管他们的认证,想要参加课程的学生可以在需要时申请财政援助,从而增加各行各业的人获得认证的机会。

最后的想法。

当谈到选择在线数据分析认证时,你真的不会错。

所有的重量级人物现在都推出了他们自己版本的同类产品,让消费者在教育选择上有了更多的选择。重要的是要记住,无论你选择哪家公司,你都会在这些基础课程中学到相同的东西。因此,由你来决定谁的认证对你最有效。

这三个认证都是最近才发布的,只有时间能告诉我们哪个项目更胜一筹。无论如何,这三个项目都为数据分析世界提供了一个全面的介绍,而费用只是替代证书的一小部分。

Google 的 FNet:混合令牌和傅立叶变换

原文:https://towardsdatascience.com/googles-fnet-mixing-tokens-with-fourier-transforms-f98778168c45?source=collection_archive---------10-----------------------

借助傅立叶变换的魔力,将变形金刚的训练速度提高 7 倍

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

Amr Taha 在 Unsplash 上拍摄的照片

通过用线性变换替换注意力子层,我们能够降低 Transformer 架构的复杂性和内存占用。我们表明,FNet 在速度、内存占用和准确性之间提供了一个很好的折衷,在 GLUE 基准测试中,在通用分类迁移学习设置中实现了 BERT 的 92%的准确性(Wang et al .,2018),但在 GPU 上训练的速度是 7 倍,在 TPUs 上是 2 倍

来源: Arxiv

最近的 ML 论文的目标是摆弄变压器层。看看哪些有用,哪些没用是很有趣的(尽管我们可能只能从那些论文中看到哪些有用)。由于变压器的大量使用,我认为过去的 6-12 个月是关于优化它们的。从改变层到减少自我关注层,到大大减小变压器网络尺寸。这篇论文综述将讨论如何改变层来提高训练速度,最有趣的部分是它是使用傅立叶变换完成的。

什么是傅立叶变换?

傅立叶变换是一个数学概念,可以 将信号分解成其组成频率 。傅立叶变换不仅给出信号中存在的频率,还给出信号中存在的每个频率的幅度。

来源: TDS

傅立叶变换是信号处理中最常用的变换之一。它本质上是以一种特定的方式将图形的信号波“包裹”在一个圆上,这样您就可以更容易地提取信号属性和特征(从而处理信号)。如果你和我一样是个数学呆子,你一定听说过傅立叶变换。但是,让我感兴趣的是这和神经网络有什么关系?变压器通常处理 NLP,而不是信号处理,这也是我选择回顾本文的主要原因。

然而,令我惊讶的是,这些傅立叶变换似乎在深度学习领域有许多应用,例如[1]:

  • 解偏微分方程(用神经网络!)
  • 加速回旋
  • 稳定递归神经网络(傅立叶 RNN 和 ForeNet)

为什么要改变自我关注层?

虽然自我注意块导致更高的准确性,并为网络提供有用的上下文含义,但它们在计算上是昂贵的。这里的研究显示了一些非常重要的发现——对那些自我关注块的需求**很快就饱和了。**在阅读了最近的多篇变压器优化论文后,我开始注意到这一趋势。自我关注是相当强大的,但它本质上正在成为一个瓶颈,在不影响表现的情况下,有一个取代它的竞赛。

事实上,在 Nvidia 最近在发表的一篇论文中,他们发现对于大多数架构来说,将不到 50%的层作为自我关注块在性能方面更有效,而对于 Transformer-XL,他们建议大约 20%。此外,这些块应该只在网络的前 2/3 中(不在整个网络中交错)。这导致自我关注块减少了 63%,计算时间减少了 35%。

FNet 论文研究了一种不同的方法来混合变压器令牌(这是自我关注所做的),并提出了一种新的线性方法来使用 FTs 这样做。事不宜迟,让我们开始吧

FNet 架构

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

来源: Arxiv

架构实际上非常简单,这就是为什么这一部分不会很长的原因。这种架构与经典架构的唯一区别在于,编码器的自我关注层被傅立叶层[1]取代,傅立叶层对输入序列长度和隐藏维度进行 2D 傅立叶变换。这样做背后的主要直觉是傅立叶变换可能能够为混合输入令牌提供更好的方法(通过它的变换)。

从计算机科学的角度来看,由于非线性和自关注的复杂性,变压器具有二次复杂性(O(N))。然而,傅立叶变换是线性的,因此提供了更好的复杂性(并且增加了计算速度)。此外,与自我关注计算相比,傅立叶变换的计算在 GPU/TPU 上更加优化[1]。此外,傅立叶变换层不像自我注意那样有任何可学习的权重,因此使用更少的内存(因为模型尺寸变小了)。

简要结果

好吧,这听起来很简单,只是对网络中一种类型的图层进行了更改。让我们来看看这种变化可能带来的影响。

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

来源: Arxiv

请注意,F-Net 的准确性比 BERT 稍低,但是在训练步骤和内存使用方面要快得多。这是我喜欢这篇文章的一个原因,他们展示了他们方法的优点和缺点(无论如何,没有神奇的权衡!).

最后的想法

平心而论,即使它实现了同样的性能,我仍然会对这篇论文感兴趣,因为它提供了一种相当新颖的方法来取代自我关注层。就我个人而言,我回顾这些论文并撰写它们的主要原因是为了引发您的思考,展示大公司是如何进行优化的。在阅读本文之前,我从未想过傅立叶变换可以用来优化变压器。我想这促使我们成为更全面的数据科学家,扩展我们的知识视野,因为你永远不知道两种不同的想法可能会在哪里交织成一个。

另一方面,由于离线机器学习的需要(模型部署在小型设备上),较小的模型变得越来越重要,本文使我们向较小的变压器迈进了一步。我认为意识到机器学习/数据科学行业的发展方向很重要。

最后,如果你对傅立叶变换感兴趣(你应该感兴趣),我建议看看 3Blue1Brown 的这个令人惊叹的视频:

如果你想定期收到关于人工智能和机器学习的最新论文的评论,请在这里添加你的电子邮件并订阅!

https://artisanal-motivator-8249.ck.page/5524b8f934

参考文献:

[1] FNet on Arxiv

谷歌的 LaMDA:下一代聊天机器人

原文:https://towardsdatascience.com/googles-lamda-the-next-generation-of-chatbots-62294be58426?source=collection_archive---------6-----------------------

人工智能

首先,我们有 GPT-3。现在我们有了 LaMDA。

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

来源: Pixabay

2020 年中期,OpenAI 推出了功能强大的语言系统 GPT 3。它彻底改变了世界,并登上了非常重要的媒体杂志的头条。这项令人难以置信的技术可以创造小说、诗歌、音乐、代码和许多其他令人惊叹的东西(如果你想了解一下,我为的数据科学写了GPT-3的完整概述)。

预计其他大型科技公司不会落后。事实上,几天前在谷歌 I/O 年会上,谷歌高管展示了这家大公司的最新研究和技术。其中一个抢了风头:LaMDA,一个能够进行类似人类对话的对话型人工智能。

在这篇文章中,我将回顾一下我们今天对这项技术的了解以及它是如何工作的。

LaMDA——对话式人工智能

LaMDA 代表“对话应用的语言模型”继之前的模型如 BERT 和 GPT-3 之后,LaMDA 也基于谷歌在 2017 年开源的 transformer 架构。这种架构允许模型预测文本,只关注前面的单词如何相互关联(注意机制)。

从这个意义上说,LaMDA 与其他现有车型相似。然而,这个系统和其他聊天机器人有一个重要的区别。LaMDA 可以管理对话的“开放性”。正如副总裁伊莱·科林斯和高级研究主管邹斌·格拉马尼在他们的博客文章中解释的那样,人类的对话有这种明显的混乱特征。我们可以从一个话题开始,几分钟后以一个非常不同的话题结束。我们倾向于通过以最意想不到的方式连接话题来展开对话。

通过解决这些情况,LaMDA 将彻底革新聊天机器人技术。具有这些能力的聊天机器人可以完美地与人进行自然对话。我们可以更自然地询问信息或咨询互联网。

拉姆达是明智的,具体的,有趣的,事实

LaMDA 接受了对话培训,与其前身 Meena 相同,Meena 是谷歌在 2020 年推出的另一种对话技术。米娜证明了聊天机器人几乎可以谈论任何事情。它被训练成最小化一个他们称为困惑的训练目标,这是一个衡量模型在预测下一个令牌时有多自信的指标。他们发现困惑与人类评估指标密切相关,如 SSA——敏感度和特异性平均值——这对评估聊天机器人的质量非常有用。

然而,LaMDA 更进一步。它擅长检测敏感性——一个句子在对话的上下文中是否有意义——并且能够更好地保持其反应的特异性。正如作者在他们的帖子中指出的,像“我不知道”这样的回答可能总是明智的,但却非常无用。

但谷歌不想停留在合理、具体的回应上。他们希望 LaMDA 以“有见地的、出乎意料的或机智的”回应的形式展示出高度的趣味性。此外,他们认为真实性是聊天机器人的一个重要方面。像 GPT-3 这样强大的系统缺乏这种特殊功能。如果回答不正确,给出有趣的回答是不够的。

最后,科技界正在打一场伦理战,以减少人工智能系统中的偏见和潜在有害使用。谷歌对此很关注,所以他们想把“责任放在第一位”他们的目标是在 LaMDA 这样的系统中最大限度地减少性别和种族偏见、仇恨言论和误导信息。

LaMDA 的惊人技能—一个例子

在会议期间,谷歌首席执行官桑德尔·皮帅在两次不同的对话中展示了 LaMDA 版本的冥王星和纸飞机的演示。他们不需要对 LaMDA 进行微调,就可以将它从模仿冥王星变成纸飞机(尽管 Collins 和 Ghahramani 承认它可以进行微调以获得更好的性能)。

从我们所看到的,LaMDA 显示了上述品质:感性,特异性,趣味性和真实性。让我们看看对话中 LaMDA 模仿 Pluto 的一些例子,保持对话的顺序:

  • **特异性。**团队问 LaMDA 如果他们造访冥王星会看到什么。它回答说:“你会看到一个巨大的峡谷,一些冰冻的冰山,间歇泉,和一些火山口。”LaMDA 可能会说一些类似于“美丽的景色”或“我周围的一些陆地和星星”的话,但决定非常具体地描述冥王星的地质细节。
  • 真实性。团队询问冥王星是否有访客,系统回答说:“有一些。最引人注目的是新视野号,它是拜访过我的航天器。”2006 年,美国宇航局启动了新视野号任务,探索冥王星及其卫星。LaMDA 把这个事实说对了(虽然单个例子并不能证明它不能把某些事实说错)。
  • 趣味盎然。团队问 LaMDA 它希望人们了解冥王星的什么,LaMDA 回答说:“我希望人们知道我不只是一个随机的冰球。我其实是一颗美丽的星球。”这里有趣的一点是,LaMDA 似乎在传达情感(尽管它没有任何感觉),这让对话更深一层。
  • 感性。在 LaMDA 表示希望人们知道冥王星是一颗美丽的行星后,团队说:“嗯,我认为你很美,”对此 LaMDA 继续说:“我很高兴听到这个消息。我没有得到应有的认可。有时人们称我只是一颗矮行星。”它回到解释为什么它希望人们知道得更多,即使在团队说了它“想”听到的话之后。从人类的角度来看,这完全说得通。甚至当有人支持我们的愿望时,我们可能会表达出来,让情绪流动。LaMDA 没有情感,但它完美地捕捉到了这种感觉。

人类谈话的独特性

现在,想想人们是如何交谈的。人类的对话是复杂的。我们说的一句话就能把谈话引向一个与最初设想完全不同的方向,而另一个人完全可以继续这个方向。或者甚至通过说这样的话来改变它:“这不相关,但是……”我们可以是“字面的或比喻的,华丽的或简单的,创新的或信息的。”我们可以进行肤浅的或更深层次的对话。我们甚至可以由浅入深。

即使在事后,也很难理解对话是如何展开的。想想你过去与父母或朋友的一次很棒的谈话,试着理清它。是什么让你想起了那些时刻?如果你试了,你能重复它吗?结局是怎么开始的吗?这就是人类语言和对话的独特之处。从每个句子中,我们可以创造出一千条新的、独特的路径。我们只需要做出选择,整个世界就会从那里出现。LaMDA 似乎也能做到这一点。

最后的想法

LaMDA 是对话式人工智能的下一个大事件。我们必须自己测试它,看它在多大程度上像人类。但从我们已经看到的来看,这是有希望的。

然而,对话型人工智能完全主导对话所需要的一件事是提出意想不到的问题和改变话题的能力。LaMDA 能否提出一个问题,并在新的、明智的、具体的、有趣的对话路径中扮演积极的角色?

目前,人工智能还无法达到这种水平。原因是,我们在谈话中的彻底改变往往依赖于我们捕捉我们所生活的世界的更广泛背景的能力。例如,如果我和一个朋友坐在公园的长椅上,我看到天空中出现了云,我可能会突然问:“我们应该去室内吗?”对话中的这种变化是明智的,但不是对对话本身,而是对我们周围正在发生的事情的更大图景。

一个能够将实用知识融入其对话工具包的人工智能可能比 LaMDA 或 GPT-3 更令人难以置信。但为此,人工智能将需要有一个身体,并生活在世界上。现在,见证 LaMDA 和 GPT-3 之间的对话不是很棒吗?你怎么想呢?

订阅 算法桥 。弥合算法和人之间的鸿沟。关于与你生活相关的人工智能的时事通讯。

您也可以直接支持我在 Medium 上的工作,并通过使用我的推荐链接 这里 成为会员来获得无限制的访问权限! 😃

谷歌的开放图像:现在更容易下载和评估与 51

原文:https://towardsdatascience.com/googles-open-images-now-easier-to-download-and-evaluate-with-fiftyone-615ce0482c02?source=collection_archive---------7-----------------------

高效下载开放图像,并使用开放图像风格的评估功能对您的模型进行评估

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

打开图像数据集五十一下载并可视化(图片由作者提供)

谷歌的开放图像是一个数据集的庞然大物。它拥有超过 900 万张图像、8000 万条注释和跨越多个任务的 600 个类,是计算机视觉社区中领先的数据集之一。

使用开放图像现在比以往任何时候都更容易,因为它集成到了开源 ML 开发工具 FiftyOne

计算机视觉模型比以往任何时候都更加渴求数据。开发您自己的模型需要您自己收集和注释大量数据,或者求助于公共数据集,希望它们包含与您的任务相关的数据。Open Images 背后的团队致力于为任何人提供一个巨大的数据湖。通过仅在知识共享署名(CC-BY) 许可下管理图像,任何感兴趣的人都可以使用开放图像。

凭借图像级标签、分段、视觉关系、本地化叙述和比下一个最大的检测数据集 多 15 倍的 对象检测,开放图像可以很容易地添加到您的数据湖和训练工作流中。然而,学习一种新的数据集格式并将其合并到您的工作流程中通常是乏味且耗时的。以前,下载开放图像的过程包括编写定制脚本来下载和解析您想要的图像和标签。这催生了多种工具来帮助加载数据集,但它们都有严重的缺点,比如不支持分段和关系没有可视化能力以及不能指定下载格式

Voxel51 ,我们与 Google 合作,通过将它整合到我们的开源 ML 工具 FiftyOne数据集 Zoo 中,创建了一个易于使用的下载开放图像的来源。使用五十一,您可以准确指定您想要下载的开放图像的子集,将其导出成几十种不同的格式,在五十一应用中可视化,甚至使用开放图像风格的对象检测评估来评估您的模型。

这篇博文将带你了解如何使用 FiftyOne 来:

在我们开始之前,确保安装 51 个:

pip install fiftyone

跟随在科拉布

你可以直接在这个 Google Colab 笔记本的浏览器中运行这篇博文中的例子。跟随链接,点击“在 Google Colab 中运行”。

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

可视化嵌入在笔记本中的开放图像(作者图片)

打开 51 数据集动物园中的图像

现在只需要一个命令或一行 Python 代码就可以从开放图像中准确下载您想要的样本。然后,您可以在 FiftyOne 应用程序中用多一行代码探索数据集。

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

打开图像数据集五十一下载并可视化(图片由作者提供)

将 Open Images 集成到 FiftyOne 中提供了多个参数,您可以使用这些参数来指定您想要下载的样本及其数量:

  • label_types:要加载的标签类型列表。值为("detections", "classifications", "relationships", "segmentations")。默认情况下,会加载所有标签,但并非每个样本都会包含每种标签类型。如果同时指定了max_sampleslabel_types,那么每个样本都将包含指定的标签类型。
  • splitsplits:一个字符串或字符串列表,指示要加载的拆分。可用的拆分是("test", "train", "validation")
  • classes:指定需要加载的类的字符串列表。只有包含至少一个指定类实例的示例才会被下载。
  • attrs:要加载的关系属性的字符串列表。该参数仅在"relationships"处于label_types时有用。
  • max_samples:导入样本的最大数量。默认情况下,会导入所有样本。
  • shuffle:布尔型,指示是否随机打乱导入样本的顺序。
  • seed:洗牌时使用的随机种子。
  • image_ids:要加载的特定图像 id 列表。id 可以指定为<split>/<image-id><image-id>
  • image_ids_file:换行分隔的.txt.json.csv文件的路径,包含要加载的图像 id 列表。id 可以指定为<split>/<image-id><image-id>。如果提供了image_ids,该参数被忽略

其中一些参数允许您指定希望包含在子集中的特定类和属性。您可以使用以下命令查看打开的图像中的可用选项列表:

利用这一功能,我们可以为特定任务筛选数据集,而无需下载整个数据集或解析任何原始注释文件。例如,如果我们想要训练一个木制物体的检测器,我们可以指定我们只想要来自包含带有注释为Woodenvisual relationship的物体的开放图像的样本:

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

木制乒乓球台在五十一年可视化(图片由作者提供)

再比如,我们建立一个检测猫狗的数据集。我们可以为类别DogCat获得detections以及图像级别classifications:

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

在 51 中可视化的开放图像的猫/狗子集(图像由作者提供)

当处理包含对象检测的数据集时,FiftyOne 允许您创建一个补丁视图,其中每个样本包含一个对象。当试图分析特定的对象类或属性时,这非常有用,尤其是在混乱的场景中。

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

第五十一个应用程序中对象的补丁视图示例(图片由作者提供)

导出到不同的格式

多年来,COCO 数据集一直是最重要的对象检测数据集,导致相当大比例的计算机视觉(CV)社区采用 COCO 格式来解决他们的对象检测问题。为项目选择数据集格式决定了加载和处理数据集所需的解析器,这使得很难处理不同格式的新数据。FiftyOne 允许您将数据集导出成几十种不同的格式让您可以轻松地将其集成到现有的工作流程中。

例如,您可以导出为类似于 COCOPascal VOCCVATYOLOTFRecords分类目录树more 的格式。其中许多格式还支持导出分段掩码。

实际上,以 COCO 格式导出我们之前加载到磁盘的打开图像的子集非常简单:

如果您想将您的数据重新导入到 FiftyOne 中,并且数据集遵循一种受支持的格式,这也可以在一行代码中完成:

即使你的数据集是完全自定义的格式,将它加载到 fiftone 中仍然很容易

开放图像目标检测评估

FiftyOne 不仅可以轻松加载和导出开放图像和自定义数据集,还可以让您可视化您的数据评估模型结果

Open Images 风格的对象检测评估是为 Open Images challenges 创建的。它与可可式评估有几个显著的不同:

  • 图像级标签指示在每个图像中评估哪些对象类。如果预测了一个类,但没有将其注释为正或负图像级标签,则该类将被忽略。
  • 语义类层次用于扩展预测和基础事实对象列表,以包括和评估所有父类。默认情况下,基本事实检测仅包括叶类,并且必须在评估发生之前展开。这是在五十一中自动执行的。
  • 像 COCO 一样,“人群”地面真相检测能够与多个预测相匹配。但与 COCO 不同的是,每个人群中只有一个预测是真正积极的。
  • COCO 式评估在 10 个不同的 IoU 值范围内对 AP 求平均值,Open Images 式评估仅使用 0.5 的 IoU 来计算 mAP。

如果您想查看 开放式图像式评估 COCO 式评估 的评估协议的详细步骤,请点击这些链接。

为了尝试开放图像风格的评估,我们可以使用来自51 模型动物园的模型来生成对我们下载的开放图像的猫和狗子集的检测预测。我们将向数据集添加一个新的predictions 字段:

注意:运行该模型需要 TensorFlow 1.14。

pip install tensorflow==1.14

对于这个例子,我们只对“猫”和“狗”这两个类的预测感兴趣,所以我们可以利用 FiftyOne 灵活的数据集表示来创建一个视图到只包含这些类的数据集中。此外,我们运行的模型是在 COCO 上训练的,COCO 使用小写类名,因此我们需要重新映射它们以匹配打开图像的大写类名:

我们现在可以对数据集和预测运行开放图像风格的评估:

返回的results 对象包含了我们需要的一切,从地图,到 PR 曲线,到混淆矩阵

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

51 年绘制的 PR 曲线(图片由作者提供)

应该注意的是,默认情况下,这些检测协议将只把预测对象与同一类别的基本事实对象进行匹配。这意味着,如果我们想要一个有趣的混淆矩阵,我们将需要用等于False的参数classwise进行评估:

我们现在可以查看一个交互式混淆矩阵,其中如果我们单击一个单元格,则51 个应用程序将会更新,仅显示该单元格中存在的样本。因此,例如,如果我们单击包含与预测的“猫”检测相匹配的真实“狗”检测的单元,我们可以深入了解我们模型的故障模式:

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

假阳性在 51 中交互可视化(图片由作者提供)

注: 互动剧情 目前仅在 Jupyter 笔记本中支持。对其他环境的支持将很快增加。

当在 51 中评估对象检测数据集时,在运行evaluate_detections并用eval_key将结果存储在数据集上之后,我们能够创建所谓的评估视图。这是数据集的一个视图,其中每个样本都是一个单独的基础事实或预测对象补丁,允许您按真阳性、假阳性和假阴性、匹配的 IoU 以及单击按钮的其他评估元数据进行排序。

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

在第五十一个应用中创建评估视图(图片由作者提供)

高级数据集探索

如果我们想对我们的模型有一个更细致的了解,那么在低维空间中可视化对象嵌入是很有用的,它允许我们快速挑选出数据中的模式、集群和异常。51 号大脑正是提供了这种工作流程。

注意:大脑 默认使用的 降维方法是 *umap* 我们需要安装:

pip install umap-learn

我们可以再次使用51 模型动物园来生成嵌入,然后我们将可视化这些嵌入:

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

第五十一届互动嵌入可视化(图片由作者提供)

由于多种原因,这种可视化非常有价值,尤其是对于像包含机器生成标签的开放图像这样的数据集。可视化和交互式探索嵌入使您可以快速抽查哪些机器生成的标签可能需要检查并发送进行重新标注。

我们还可以使用这些嵌入来自动查找相似和重复的样本,只需点击一个按钮。

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

选取样本并按相似度排序第五十一(图片由作者提供)

一旦我们彻底探索了我们的数据集,并找到了我们想要进一步分析或改进的方面,就很容易标记单个样本或标签以便将其隔离用于下游用例。

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

51 中的标签样本(图片由作者提供)

摘要

Open Images 是一个大规模但经过彻底标记的数据集,可以为您的数据湖和模型训练工作流增加有用的内容。下载和探索开放图像最简单的方法是使用51。对于像开放图像一样大的数据集,动手评估您的模型结果可能会很困难。通过可视化嵌入,FiftyOne 可以轻松理解数据集,找到模型中的故障模式,并揭示数据中的模式。

关于体素 51

Voxel51 总部位于密歇根州安阿伯,由 Jason Corso 博士和 Brian Moore 博士于 2016 年创立,是一家人工智能软件公司,通过提供开放核心软件构建模块,使计算机视觉和机器学习工程师能够快速设计数据驱动的工作流,从而实现软件 2.0 的民主化。

想了解更多?在 fiftyone.ai 查看我们的网站。

Google 的 Tesseract OCR:它在文档上有多好?

原文:https://towardsdatascience.com/googles-tesseract-ocr-how-good-is-it-on-documents-d71d4bf7640?source=collection_archive---------23-----------------------

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

芬恩·蒙德在 Unsplash 上的照片

T 谷歌的光学字符识别(OCR)引擎可以说是最受欢迎的开箱即用的 OCR 解决方案。最近,我的任务是为文档开发一个 OCR 工具。我知道它的健壮性,但是出于好奇,我想研究它在文档上的性能。

一如既往,在考虑合成我自己的一个之前,出发点是寻找一个可靠的基础事实。幸运的是,我找到了一个:来自莫斯科物理技术学院的机器智能团队的 DDI-100 数据集。它有 30GB 左右的数据,有字符级的地面真实数据,很甜!然而,请记住,有些书是俄文的。在这项研究中,只使用了第 33 和 34 本书。这些书加起来有 300 多页,加上增刊,精确到 5145 页。

写这篇文章的时候是周五晚上,所以我会尽可能地保持讨论的简洁。生成结果的代码可以在我的 repo 这里找到。

实验设计

语言数据。 Tesseract 4.0.0 自带三个语言模型,分别是: tessdatatessdata_best 和 *tessdata_fast。*所有三种模型都将用于本研究。

预处理。来自数据集中的每个文本都经过预处理步骤,该步骤依次执行以下操作:
1 .文本周围有 5 个像素的填充。
2。调整到 30 像素的目标高度。
3。执行 Otsu 二进制化。
4。如果背景是暗的,则反转图像(按位)。Tesseract 为深色前景和浅色背景的文本提供了最佳效果。

绩效指标。所有上述模型将根据以下标准进行评估:
1。直接匹配(小写)。
2。莱文斯坦距离。
3。处理时间。

硬件。我的笔记本电脑运行的是英特尔酷睿 i7–7500 u CPU,主频为 2.70GHz,内存为 16 GB。我在两个内核上运行 Linux (WSL)上的代码(以防万一,以避免任何节流)。

其他信息。这些是关于 tesseract 和 leptonica 版本的附加信息:tessera CT 4 . 0 . 0-beta 1 和 leptonica-1.75.3。

结果和讨论

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

基于直接匹配的精确度

如果识别每个文本对您的用例至关重要,您可能会对上面的结果感兴趣。令我惊讶的是,我分不清他们。实际上, tessdata_fast 显得更准确。

这与宇宙魔方的文档中给出的关于他们模型的描述不一致。这让我想到,或许, tessdata_best 在 Levenshtein 距离方面可能表现更好。

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

删除得分为 1.0 的文本后的 Levenshtein 距离

上面的结果是 Levenshtein 距离的箱线图,没有所有得分为 1.0 的文本和异常值。这样做是为了验证我的假设 tessdata_best 在基于可编辑距离进行评估时表现更好;然而,事实也并非如此。

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

每个文本的处理时间

上图显示 tessdata_best 比 Linux 上的 Tess dataTess data慢 4 倍。 tessdata_fast ,顾名思义,比 tessdata 和 tessdata_best 都要快。

结论

Google 广泛使用的 OCR 引擎在开源社区中非常受欢迎。这里,我做了一个快速实验来评估它在文档上的性能。他们的三种语言模型都进行了比较。

在识别准确性方面,tessdata 和 tessdata_best 似乎表现出不相上下的性能。 *tessdata_fast,另一方面,*略好于前两款。而且不出所料,这款也是最快的。

考虑到所有三种宇宙魔方模型的性能,下一个自然的问题是:“优越的”模型值得使用吗?基于以上结果,是一个 来自我*。然而,我必须强调,这个决定只适用于我的用例。对于其他语言和/或其他图像类型,结果可能会有很大不同。*

有 App 吗?有数据吗?下面是如何在 Node / Express 应用程序中将数据存储到 MongoDB 中

原文:https://towardsdatascience.com/got-app-got-data-heres-how-to-store-data-to-mongodb-in-a-node-express-app-d4a46388cc55?source=collection_archive---------27-----------------------

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

凯利·西克玛Unsplash 上拍摄的照片

每个应用程序都有数据。让我向您展示如何从一个用 Node.js 和 Express.js 编写的应用程序中将数据存储在 MongoDB 数据库中。

什么是污垢

CRUD 是创建、读取、更新和删除的缩写。CRUD 是用于以下目的的操作:

  • 在数据库中创建数据
  • 读取数据库中的数据
  • 更新数据库中的数据
  • 删除数据库中的数据

我们将创造什么

我们将创建一个简单的应用程序,您可以在 MongoDB 数据库中存储用户的名字和姓氏。它看起来是这样的:

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

作者图片

先决条件

在本文中,我假设您已经在计算机上安装并运行了以下项目:

  • 结节
  • npm

如果您还没有安装它们,那么您需要在继续本教程之前安装它们。

入门指南

我们需要为我们将要创建的项目创建一个文件夹。创建一个名为node-crud-demo的新文件夹。转到这个新文件夹,运行这个命令来启动我们的项目:

npm init

您只需按 enter 键并接受提示的所有默认值。

该命令创建一个package.json文件。这个文件将包含我们将在应用程序中使用的所有包。

创建服务器文件

我们的应用程序将有一个服务器。在您的目录中为服务器创建一个新文件。使用以下命令创建文件:

touch server.js

在编辑器中打开该文件,并添加以下行:

console.log('Hello World')

我们将使用 Node.js 运行我们的服务器。您可以通过在终端中运行以下命令来测试它是否正常工作:

node server.js

现在在你的终端中运行node server.js,你应该会看到这个:

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

作者图片

接下来,我们需要为我们的服务器安装软件。

安装 Express 和其他依赖项

我们将使用 Express.js 作为我们的服务器。根据他们的网站:

Express 是一个最小且灵活的 Node.js web 应用程序框架,为 web 和移动应用程序提供了一组强大的功能。

您可以通过在终端中运行以下命令来安装 express:

npm install express

您可以通过打开package.json文件来验证它是否已安装。您将看到它安装在依赖项中,如下所示:

"dependencies": { 
  "express": "^4.17.1" 
}

当我们第一次运行我们的服务器时,我们使用 Node 来启动服务器。如果您对服务器文件进行了更改,您将需要停止 node 的运行,并在中再次启动它,以使它反映您的更改。

有一个名为nodemon的包提供了与 node 相同的功能。最大的不同是,它会识别你什么时候修改了代码,并自动为你重启服务器。这将使生活更容易,所以让我们用这个命令安装它:

npm install nodemon

为了使我们的生活更容易,我们可以创建一个脚本来为我们启动服务器。打开package.json文件。

目前,该文件的脚本部分有一个条目:

"scripts": { 
  "test": "echo \"Error: no test specified\" && exit 1" 
},

将以下内容添加到脚本部分,如下所示:

"scripts": { 
  "test": "echo \"Error: no test specified\" && exit 1", 
  "start": "nodemon server" 
},

有了这个脚本,我们现在可以使用以下命令启动我们的服务器:

npm start

要安装的另一个包叫做 ejs 。EJS 是嵌入式 JavaScript 模板。我们将使用它向浏览器显示内容,并将数据从数据库传递到浏览器。您可以使用以下命令安装它:

npm install ejs

我们将在下一节配置 ejs。

配置我们的 Express 服务器

打开server.js文件。您可以删除 console.log 行。要使用 express,我们需要导入它并使用它来启动我们的应用程序。将这些行添加到文件中:

const express = require('express'); 
const app = express();

接下来,我们需要启动我们的服务器,并告诉它监听哪个端口。对于这个演示,我将在端口 3000 上运行应用程序。如果需要,您可以使用不同的端口。

在导入 express 后,添加以下行以指定我们将使用的端口:

const port = 3000;

在文件底部添加以下几行来启动我们的服务器:

app.listen(port, () => { 
  console.log(`Server listening on port ${port}`); 
});

我们可以通过在终端使用脚本npm start启动服务器来测试它。然后打开浏览器,导航到localhost:3000。您应该会看到以下消息:

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

作者图片

没关系。这表明浏览器正在与我们的服务器对话。接下来,我们需要将一些有价值的东西发送回浏览器。

向浏览器发送文件

当用户导航到localhost:3000时,我们希望向浏览器显示一个文件。我们将使用 ejs 来显示文件。我们需要配置我们的应用程序,让它知道我们正在使用 ejs 。创建应用程序后,添加以下代码行:

app.set('view engine', 'ejs');

默认情况下,ejs 在名为 views 的目录中查找文件。使用以下命令创建此文件夹:

mkdir views

在该文件夹中,您需要创建一个文件,我们将显示给浏览器。通常这个文件叫做 index.ejs 。由于我们使用的是 ejs ,它希望所有文件的扩展名都是.ejs。用这个命令在视图目录中创建一个index.ejs文件:

touch views/index.ejs

打开index.ejs文件并添加以下代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Mongo CRUD Demo</title>
    </head>
    <body>
        <h1>MongoDB CRUD Demo</h1>
    </body>
</html>

接下来,我们需要更新我们的服务器来显示这个文件。打开server.js文件。在app.listen代码上方插入以下代码,以向浏览器显示 index.ejs 文件:

app.get('/', (req, res) => { 
  res.render('index.ejs'); 
});

在这段代码中,我们告诉服务器监听来自由'/'代表的应用程序主页的调用。当它收到请求时,它会返回index.ejs文件。

打开您的浏览器,导航到localhost:3000,您将在浏览器中看到该文件的输出:

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

作者图片

太棒了。我们让服务器响应来自浏览器的请求。

HTTP 动词

您可能想知道服务器是如何知道将index.ejs文件发送给浏览器的。它知道是因为我们告诉服务器用app.get代码响应来自浏览器的GET请求。

GET 是 HTTP 动词之一。动词告诉浏览器做什么。对于 CRUD 应用程序, GET 动词是如何完成 CRUD 的 READ 部分。以下是其他 HTTP 动词及其对应的内容:

  • 创建—发布
  • 阅读—获取
  • 更新—上传
  • 删除—删除

让我们仔细检查并实现 CRUD 的创建部分。

创造

如果浏览器向服务器发送一个 POST 请求,它们只能执行一个创建操作。这个 POST 请求可以通过一个form元素触发。

打开index.ejs文件。我们将在文件中添加一个表单。该表单将允许用户输入名和姓。将以下内容添加到文件中:

<div class="container form">
  <div>Create</div>
  <form action="/users" method="POST">
    <div class="entry">
      <label for="fname">First Name</label>
      <input type="text" placeholder="First Name" name="fname" />
    </div>
    <div class="entry">
      <label for="lname">Last Name</label>
      <input type="text" placeholder="Last Name" name="lname" />
    </div>
    <button class="button button-block" type="submit">
      Create
    </button>
  </form>
</div>

在上面的代码中,您会看到它将使用路由 /users 向服务器发送一个 POST 请求。

为了响应这个 POST 请求,我们需要创建一个路由。打开server.js文件。在当前路线的下方为app.get添加以下代码:

app.post('/users', (req, res) => { 
  console.log('POST called'); 
});

如果你刷新你的浏览器,你会看到我们的表单,用户可以输入他们的名字和姓氏。点击create按钮。如果您的终端一切正常,您应该会看到 console.log 的输出,如下所示:

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

作者图片

如果您看到 console.log,那么这意味着服务器正在响应您的浏览器的 POST 请求。

下一步是获取用户输入的名和姓的值。默认情况下,Express.js 不会解析发送给它的数据。为了获得这些值,我们需要安装一个名为 body-parser 的包。

Body-parser 是一个中间件。它将解析在 POST 请求中发送给服务器的值。

您可以在终端中使用以下命令安装它:

npm install body-parser

打开server.js文件。我们需要告诉我们的应用程序使用主体解析器包。在文件的顶部添加这个新包的导入。

cost bodyParser = require('body-parser');

在创建应用程序的那一行之后,添加以下配置代码:

app.use(bodyParser.urlencoded({ extended: true }));

body-parser 中的urlencoded方法将从form元素中提取数据,并将它们添加到request对象的body属性中。

更改 console.log 以打印出req.body

您的server.js文件应该是这样的。注意:我添加了一些标题来分解文件的每个部分。

const express = require('express'); 
const bodyParser = require('body-parser'); 
const port = 3000; 
const app = express(); /* -------------------------------- 
*   APP CONFIG 
* -------------------------------- */ app.use(bodyParser.urlencoded({ extended: true })); /* -------------------------------- 
*    ROUTES 
* -------------------------------- */ 
app.get('/', (req, res) => { 
  res.render('index.ejs'); 
}); app.post('/users', (req, res) => { 
  console.log(req.body); 
}); /* -------------------------------- 
* START SERVER 
* -------------------------------- */ 
app.listen(port, () => { 
  console.log(`Server listening on port ${port}`); 
});

如果您返回浏览器并刷新,您可以输入您的名字和姓氏。当您单击 submit 按钮时,它应该在终端中打印出如下所示的值:

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

作者图片

向我们的应用程序添加样式

我们的形式看起来相当原始。在本教程的开始,我给出了我完成的应用程序的截图。它看起来相当精致。我们需要为我们的应用程序添加样式,以获得这种精致的外观。

所有的 CSS 都在一个名为styles.css的文件中。但是我们如何告诉浏览器使用这个文件中的样式呢?我们创建一个名为public的文件夹,并将文件放入其中。然后我们告诉我们的应用程序使用这个目录为浏览器提供文件。

使用以下命令创建公共目录:

mkdir public

接下来,使用以下命令在该文件夹中创建一个名为 styles.css 的文件:

touch public/styles.css

我们需要做的最后一件事是配置我们的应用程序使用公共文件夹。打开server.js文件,在我们的 ejs 配置之后添加这一行:

app.use(express.static('public'));

这告诉我们的应用程序,如果它找不到文件,那么就在公共目录中查找它。我们将更新我们的index.ejs文件,以包含一个到样式表的链接。

打开index.ejs文件。在标题后的head部分包含以下行:

<link rel="stylesheet" href="/styles.css" />

我们需要做的最后一件事是在 styles.css 文件中编写我们的 css。本教程不是教你如何写 CSS,所以我将提供 CSS 代码,这将使我们的应用程序看起来很好。打开styles.css文件并插入以下代码:

body {
  background-color: #c1bdba;
  font-size: 20px;
  margin: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
.container {
  max-width: 800px;
  width: 90vw;
  margin-bottom: 40px;
  /* margin: 40px auto; */
  box-shadow: 0 4px 10px 4px rgba(19, 35, 47, 0.3);
  box-sizing: border-box;
}
.form {
  background: rgba(19, 35, 47, 0.9);
  padding: 20px;
  border-radius: 8px;
}
.container div {
  text-align: center;
  color: #fff;
  margin-bottom: 20px;
}
.entry {
  display: flex;
  align-items: center;
  margin-bottom: 40px;
}
.entry label {
  flex: none;
  display: block;
  width: 200px;
  color: #fff;
}
input {
  display: block;
  flex: 1 1 auto;
  height: 100%;
  padding: 10px;
  background: none;
  border: 1px solid #a0b3b0;
  color: #ffffff;
  border-radius: 0;
}
table {
  width: 100%;
  padding: 5px;
  margin: auto;
  border-collapse: collapse;
}
tr {
  border-top: 1px solid #c1c3d1;
  border-bottom: 1px solid #c1c3d1;
}
th {
  text-align: left;
  border-right: 1px solid #343a45;
  padding: 10px;
  background: rgba(19, 35, 47, 0.9);
  color: #d5dde5;
}
td {
  background: #fff;
  padding: 20px;
  vertical-align: middle;
  border-right: 1px solid #c1c3d1;
}
.button {
  border: 0;
  outline: none;
  padding: 10px 15px;
  text-transform: uppercase;
  background: #1ab188;
  color: #ffffff;
}
.button-block {
  display: block;
  width: 100%;
}
.form-group {
  display: flex;
}

MongoDB

对于本教程,我将使用 MongoDB 作为我的数据库。我们需要在我们的应用程序中安装它。在终端中,使用以下命令安装 MongoDB:

npm install mongodb

接下来,我们需要创建一个 MongoDB 数据库供我们使用。我不打算通过这些步骤向您展示如何在您的笔记本电脑上安装 MongoDB。相反,我们将使用名为 MongoDB Atlas 的免费服务。

MongoDB 地图集

你需要在 MongoDB Atlas 上创建一个账户。

创建帐户后,您需要创建一个组织。一个组织就像一个公司的名字,但是因为我们没有公司,所以我们可以给我们的组织起任何我们想要的名字。我将命名我的 CRUD 教程

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

作者图片

接下来,您将被要求选择一个云服务。默认选项是 MongoDB Atlas ,这就是我们将要使用的。

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

作者图片

接下来,您需要设置权限。MongoDB Atlas 将自动插入您创建帐户时使用的电子邮件地址,并将权限设置为组织所有者。我们不需要在此屏幕上进行任何更改,只需单击按钮即可创建您的组织。

创建您的组织后,您将在您的控制面板中看到以下内容:

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

作者图片

下一步是创建数据库。您需要首先创建一个项目,因此单击新建项目按钮。您将被要求命名您的项目。我给我的用户打电话。

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

作者图片

就像我们创建组织时一样,它接下来会要求您设置权限。它会自动添加您创建帐户时使用的电子邮件地址。我们不需要做任何更改,因此单击创建项目按钮。

您将看到此屏幕,要求您创建一个新的集群:

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

作者图片

点击构建集群按钮。将会询问您想要使用哪个计划。选择自由群集选项。

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

作者图片

然后,您将被要求选择一个云提供商和地区。它将默认为离您最近的一个。点击创建集群按钮。MongoDB Atlas 将创建您的数据库。这可能需要几分钟才能完成。

连接到数据库

一旦 MongoDB Atlas 创建了您的集群,您将需要获得它们提供的信息来连接到数据库。我们将使用这个连接字符串连接到数据库,并将用户的名字和姓氏保存在数据库中。

点击连接按钮。

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

作者图片

MongoDB Atlas 将要求您在连接到数据库之前将您的 IP 地址列入白名单。点击添加您当前的 IP 地址按钮。

接下来,您需要创建一个用户来管理您的数据库。创建用户名和密码。请务必记住这一点,因为我们将需要它来连接到数据库。点击创建数据库用户按钮。最后,点击选择一种连接方式按钮。

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

作者图片

从列表中点击连接您的应用。您将看到连接字符串。点击复制按钮复制连接字符串。

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

作者图片

打开您的server.js文件。在文件的顶部,您需要使用以下代码导入 MongoDB:

const MongoClient = require('mongodb').MongoClient;

在那一行下面,为 dbUrl 添加一个新的 const,它包含到 MongoDB Atlas 数据库的连接。在从 Atlas 连接字符串中复制的代码中,您需要更改两件事情。替换为您的密码,并更改为您的数据库的名称。您的连接字符串应该是这样的:

const dbUrl = 'mongodb+srv://admin:@cluster0.38khl.mongodb.net/?retryWrites=true&w=majority';

创造

现在我们已经在 MongoDB Atlas 上创建了我们的帐户,并在我们的应用程序中安装了 mongo,我们需要将数据写入数据库。拆下app.post中的console.log,换成:

app.post('/users', (req, res) => {
  MongoClient.connect(dbUrl, { useUnifiedTopology: true }, (err, client) => {
    if (err) return console.error(err);
    const db = client.db('node-demo');
    const collection = db.collection('users');
    collection
      .insertOne(req.body)
      .then(() => {
        res.redirect('/');
      })
      .catch(() => {
        res.redirect('/');
      });
  });
});

让我解释一下这段代码在做什么。它使用我们的连接字符串连接到 MongoDB Atlas。在 Mongo 的最新版本中,他们要求您为 useUnifiedTopology 传递一个选项,以便这是下一个。

下一行检查在我们到 MongoDB Atlas 的连接中是否出现了错误。如果有错误,那么它返回错误。

然后我们连接到我们的数据库,在本教程中称为 node-demo 。我们还没有创建这个数据库,所以这段代码第一次运行时会自动创建数据库。

下一行是获取数据库中集合的句柄。在本教程中,我将我的集合命名为 users 。就像数据库一样,这段代码第一次运行时会自动创建集合。

下一行将用户在表单中输入的数据插入到集合中。插入数据后,它会将用户返回到应用程序的主页。

继续尝试,输入你的名字和姓氏,然后点击提交按钮。

进入你的 MongoDB Atlas 账户,点击收藏按钮。它会显示您的收藏内容。这里你可以看到我的数据库中的第一个条目:

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

作者图片

阅读

现在我们在数据库中有了一个条目,我们想读取所有的用户并显示给用户。CRUD 的这一部分是读操作。读取部分由两部分组成:

  1. 从数据库中获取所有用户
  2. 显示用户

我们使用 ejs 向用户的浏览器显示一个文件。EJS 允许我们传递来自服务器的数据。我们将使用该功能来显示数据库中的用户。

打开server.js文件。当前对'/'路径的 GET 调用呈现了index.ejs文件。让我们修改它,调用数据库并获取用户列表。将路线更新为:

app.get('/', (req, res) => {
  MongoClient.connect(dbUrl, { useUnifiedTopology: true }, (err, client) => {
    if (err) return console.error(err);
    const db = client.db('node-demo');
    const collection = db.collection('users');
    collection
      .find()
      .toArray()
      .then((results) => {
        res.render('index.ejs', { users: results });
      })
      .catch((error) => {
        res.redirect('/');
      });
  });
});

我来解释一下这段代码。我们连接到 MongoDB 并获得数据库和集合的句柄。find()命令将返回数据库中的所有条目。我们将列表转换为数组,然后呈现 index.ejs 文件并向其传递一个对象。该对象将包含数据库中所有用户的数组。

现在我们有了用户列表,我们需要在浏览器中向用户显示它。打开index.ejs文件。在文件末尾添加以下几行:

<div class="container">
    <table>
        <thead>
        <tr>
            <th colspan="3"><div>Read</div></th>
        </tr>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            <% for(var i = 0; i < users.length; i++) { %>
            <tr>
                <td><%= users[i].fname %></td>
                <td><%= users[i].lname %></td>
                <td>
                    <button
                        class="button editButton"
                        data-fname="<%=  users[i].fname %>"
                        data-lname="<%= users[i].lname %>"
                    >
                        Edit
                    </button>
                    <button
                        class="button deleteButton"
                        data-fname="<%=  users[i].fname %>"
                        data-lname="<%= users[i].lname %>"
                    >
                        Delete
                    </button>
                </td>
            </tr>
            <% } %>
        </tbody>
    </table>
</div>

在这段代码中,我们创建了一个显示用户名字和姓氏的表。您会注意到在 html 代码中有一个 for 循环。这将遍历用户数组并显示数据库中的每个条目。

返回浏览器并刷新。现在,您将看到数据库中所有用户的列表,如下所示:

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

作者图片

删除

我们将实现的 CRUD 的下一部分是删除。每个用户旁边都有一个删除按钮。如果用户单击该按钮,它应该从数据库中删除该条目,然后从数据库中读取所有条目,并将更新后的列表发送给浏览器。

为了捕捉到有人点击了按钮,我们将使用 JavaScript。我们必须将所有的 JavaScript 代码放在一个文件中,就像我们处理 CSS 样式一样。用这个命令在公共文件夹中创建一个文件main.js:

touch public/main.js

首先,让我们告诉我们的index.ejs文件关于我们的新 JavaScript 文件。打开index.ejs文件,并将其添加到文件底部,就在结束 body 标签的上方:

<script src="/main.js"></script>

回到main.js文件。我们需要添加一个事件侦听器来跟踪用户何时单击删除按钮。在显示用户列表的 html 代码中,每个用户都有一个删除按钮。那个按钮有一个deleteButton类。我们可以用它来添加一个事件监听器。首先,通过将这行代码添加到文件中来获得所有删除按钮的句柄:

const deleteBtn = document.querySelectorAll('.deleteButton');

接下来,通过执行以下操作来添加事件侦听器:

for (const button of deleteBtn) { 
  button.addEventListener('click', (e) => {   
    console.log(e.target.dataset); 
  }); 
}

当用户点击任何按钮时,变量e包含被点击按钮的句柄。在 html 代码中,每个按钮都有两个数据集条目。一个用于名,一个用于姓。

如果单击删除按钮,该按钮的数据集值将显示在控制台中。我们将使用这些数据集值在数据库中找到要删除的正确条目。

要删除一个条目,我们必须向服务器上的'/users'路由发送一个删除请求。我们将使用 Fetch API 进行调用。

在 console.log 之后添加以下代码:

for (const button of deleteBtn) {
  button.addEventListener('click', (e) => {
    console.log(e.target.dataset);
    fetch(`/users`, {
      method: 'delete',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        fname: e.target.dataset.fname,
        lname: e.target.dataset.lname,
      }),
    })
      .then((res) => {
        if (res.ok) return res.json();
      })
      .then(() => {
        window.location.reload();
      });
  });
}

让我们回顾一下这段代码。我们使用 Fetch API 调用使用 DELETE 方法的**'/users’**路由。

我们将把用户的名字和姓氏作为一个 JSON 对象发送过来。我们必须告诉服务器内容是 JSON 格式的,我们通过将它添加到头中来做到这一点。然后,我们将主体中的数据作为 JSON 对象发送出去。

唯一的问题是 Express.js 本身不知道如何解析 JSON 数据。我们必须使用中间件来处理 JSON 对象。我们已经安装的主体解析器中间件将处理它。

打开server.js文件。在应用程序配置部分,将这一行添加到当前主体解析器配置的下面:

app.use(bodyParser.json());

接下来,我们需要创建一个路由来处理删除请求。在最后一个路由下面添加以下代码来处理删除请求:

app.delete('/users', (req, res) => {
    MongoClient.connect(dbUrl, { useUnifiedTopology: true }, (err, client) => {
        if (err) return console.error(err);
        const db = client.db('node-demo');
        const collection = db.collection('users');
        collection
            .deleteOne(req.body)
            .then(() => {
                res.json(`Deleted user`);
            })
            .catch(() => {
                res.redirect('/');
            });
    });
});

让我们回顾一下这段代码。它像我们之前所做的那样连接到数据库。它调用 mongo 的deleteOne方法,并传递它想要删除的条目的细节。该条目包含我们发送的 e.target.dataset 中的值。

如果成功地从数据库中删除了条目,它将返回一个 JSON 字符串,表示用户已被删除。

在我们的main.js文件中,我们有一个.then()方法,当 fetch 调用返回时会调用这个方法。它验证调用是否成功,如果成功,则刷新浏览器。

浏览器的刷新将调用我们的 GET 方法,该方法将返回数据库中的所有条目。刚刚删除的用户将不再显示,因为它不再在数据库中。

试试看。删除用户,并验证该用户是否已从用户列表中删除。

更新

我们需要实现的 CRUD 的最后一部分是更新。在数据库中所有用户的列表旁边,我们有一个编辑按钮。就像 delete 一样,我们可以添加一个事件侦听器,当用户单击按钮时,它就会启动。

打开main.js文件。将这一行添加到文件的顶部,以获得所有具有类editButton的编辑按钮的句柄:

const editBtn = document.querySelectorAll('.editButton');

接下来,我们需要添加一个事件监听器。将此代码添加到文件的底部:

for (const button of editBtn) { 
  button.addEventListener('click', (e) => { 
    console.log(e.target.dataset); 
  }); 
}

让我们考虑一下如何处理条目的编辑。我们需要显示用户的名和姓的值。然后,用户可以对条目进行任何他们想要的更改。当他们完成后,他们应该能够点击一个更新按钮,该值在数据库中被更新。

显示用户的名字和姓氏与我们用来在数据库中创建新条目的表单完全一样。除此之外,在这种情况下,我们将自动填写用户的名字和姓氏。因此,让我们创建这个表单来编辑用户。

打开index.ejs文件。在显示用户列表的表格下方添加以下代码:

<div class="container form">
    <div>Update</div>
        <div class="entry">
            <label for="oldFname">Old First Name</label>
            <input type="text" name="oldFname" id="oldFname" readonly="true" />
        </div>
        <div class="entry">
            <label for="oldLname">Old Last Name</label>
            <input type="text" name="oldLname" id="oldLname" readonly="true" />
        </div>
        <div class="entry">
            <label for="newFname">New First Name</label>
            <input type="text" name="newFname" id="newFname" />
        </div>
        <div class="entry">
            <label for="newLname">New Last Name</label>
            <input type="text" name="newLname" id="newLname" />
        </div>
        <button class="button button-block updateButton"">
            Update
        </button>
</div>

该表单将包含用户不能编辑的名字和姓氏的当前用户值。下面是用户可以编辑的名和姓的值。

你可能会问为什么我既需要当前值又需要新值?答案很简单。我们需要当前值,以便在数据库中找到记录。一旦找到记录,我们就用新值更新它。

我们需要用他们想要编辑的用户的名和姓来填充字段的值。打开main.js文件。在事件监听器中添加代码来设置四个字段的值。您的事件侦听器现在应该如下所示:

for (const button of editBtn) { 
  button.addEventListener('click', (e) => {   
    document.getElementById('oldFname').value = e.target.dataset.fname; 
    document.getElementById('oldLname').value = e.target.dataset.lname; 
    document.getElementById('newFname').value = e.target.dataset.fname; 
    document.getElementById('newLname').value = e.target.dataset.lname; 
  }); 
}

当用户单击 update 按钮时,我们有两种选择来实现在数据库中更新用户的功能。我们的第一个选择是像创建新用户一样使用表单。我们的第二个选择是使用 JavaScript 调用服务器来更新用户。在本教程中,我将向你展示如何做第二个选择。

打开main.js文件。在文件顶部添加代码行,以获得更新按钮的句柄:

const updateBtn = document.querySelector('.updateButton');

接下来,我们希望在用户单击按钮时添加一个事件侦听器。让我给你代码,然后我们将通过它。

updateBtn.addEventListener('click', (e) => { 
  e.preventDefault(); 
  fetch('/users', { 
    method: 'PUT', 
    headers: { 'Content-Type': 'application/json' }, 
    body: JSON.stringify({ 
      fname: document.querySelector('#newFname').value, 
      lname: document.querySelector('#newLname').value, 
      oldFname: document.querySelector('#oldFname').value, 
      oldLname: document.querySelector('#oldLname').value, 
    }), 
  }) 
  .then((res) => { 
    if (res.ok) return res.json(); 
  }) 
  .then(() => { 
    window.location.reload(); 
  }); 
});

就像 delete 一样,我们将使用 fetch API 来调用服务器上的路由。更新条目的 HTTP 动词是 PUT 。我们设置我们的方法然后把。我们添加头来告诉服务器我们发送的内容是 JSON 格式的。然后,我们发送包含旧值和新值的正文内容。

我们需要在服务器上创建一个路由来处理更新数据库条目的 PUT 请求。打开server.js文件。在最后一条路线下添加以下代码:

app.put('/users', (req, res) => {
    MongoClient.connect(dbUrl, { useUnifiedTopology: true }, (err, client) => {
        if (err) return console.error(err);
        const db = client.db('node-demo');
        const collection = db.collection('users');
        collection
            .findOneAndUpdate(
                { fname: req.body.oldFname, lname: req.body.oldLname },
                {
                    $set: {
                        fname: req.body.fname,
                        lname: req.body.lname
                    }
                },
                {
                    upsert: true
                }
            )
            .then(() => {
                res.json('Success');
            })
            .catch(() => {
                res.redirect('/');
            });
    });
});

让我们浏览一下这段代码。它与数据库建立连接。然后,它使用 mongo findOneAndUpdate方法,通过使用名字和姓氏的先前值,在数据库中找到正确的记录。

找到正确的记录后,它使用 mongo $set方法用新值更新条目。如果找不到当前条目,upsert选项将在数据库中用新值创建一个条目。

一旦更新了记录,它就返回 JSON 字符串“Success”。在我们的 main.js 文件中,它接收这个 JSON 字符串。如果一切正常,就会刷新浏览器。这个刷新将点击 GET 路由,它将发送数据库中的所有条目,从而显示我们新更新的记录。

全部完成!

这是一个非常长的教程,教您如何创建一个简单的 Node 和 Express.js 应用程序来将数据存储在 MongoDB 数据库中。

本教程提供了对 CRUD 应用程序的理解。使用 CRUD,您已经学会了如何:

  • 在 MongoDB 数据库中创建数据
  • 读取 MongoDB 数据库中的数据
  • 更新 MongoDB 数据库中的数据
  • 删除 MongoDB 数据库中的数据

您知道如何在 Node 和 ExpressJS 应用程序中添加 CRUD 功能。

获取源代码

这个应用程序的完成版本可以在我的 GitHub repo 中找到。你可以在这里找到

原载于 2021 年 2 月 15 日 https://www.jenniferbland.comhttps://www.jenniferbland.com/got-app-got-data-heres-how-to-store-data-to-mongodb-in-a-node-express-app/

有技能,需要现金?为什么不试试咨询

原文:https://towardsdatascience.com/got-skills-need-cash-why-not-try-consulting-6f4ac5d7b8d9?source=collection_archive---------19-----------------------

我如何在数据科学咨询领域崭露头角

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

图片由作者提供,照片由来自 PixabayMyriams-Fotos 提供

有时候工作很糟糕。为别人工作,甚至更糟。你做工作;他们赚钱。

因此,每个人都辞去他们在 T4 的工作也就不足为奇了。如果你还没有这样做,你至少在考虑,那么,你们 10 个人中有 9.5 个

那么,现在怎么办?

我如何退出没有任何备份,使一些现金?

几年前我也遇到过类似的情况。做着自己不喜欢的工作,挣着自己都不好意思谈论的钱,挣扎着让自己免于负债。我想退出。但是我不能。至少现在还没有。

我的解决方案是:集中精力成为一名顾问。顾问设定他们的价格,赚他们赚的所有钱,并且不受中层管理人员的微观管理。诱惑是强烈的。

然而,往好里说,通往那里的道路是模糊的。

但不管怎样,我还是努力向前,现在我想分享一些我一路走来学到的东西。

从崭露头角的数据科学家到经验丰富的顾问

如果你正在读这篇文章,你可能是一个这样或那样的数据科学家。或者你有一些技术才能,你喜欢数据,你想了解更多关于数据科学技能如何让你更有市场。

无论你的动机是什么,如果你符合上面的描述,咨询需要你。我很早就意识到,知道如何处理数据是一项非常有价值的技能,许多人和企业愿意付钱给其他人来帮助他们处理数据。

尽管有这种需求,打入这个领域仍然是一个挑战。仅仅建立一个网站,让世界知道你能做什么,然后等待是不够的。相信我。我试过了。但没有成功。

问题是双重的。一方面是缺乏信任。作为个人咨询师,人们在不了解你的情况下,很难信任你。事实上,大多数数据都是敏感的,这使得信任因素更加重要。

但是也许你已经知道了,你也和我一样;你从努力建立信任开始。你和其他人见面,参与当地事务,推销自己。这是第二个问题;理解。对于那些开始信任你的人来说,他们可能不明白你如何帮助他们的业务,因为他们不明白你能为他们做什么。以下是更多相关信息。

那什么有效呢?连客户都没有的我,怎么成为咨询师?

对我来说,这一切都始于“共享经济”。

第一课:你的客户在等你,他们在找你

快速回顾一下我的情况。蹩脚的工作,低薪,很多动力去把我的量化技能用在其他事情上。

急于开始创造客户,我建了一个网站。我甚至安排了一些与当地商会和企业孵化器的会议。这些早期活动导致了许多会议,在这些会议之后又有一些会议,在这些会议之后又有更多的会议。

听说过“要钱你会得到建议,但要建议你会得到钱”之类的话吗?这就是那些会议的感觉。每个和我见面的人都知道我在寻找客户/工作/金钱,所以他们给了我很多建议。还记得我上面说的理解吗?我在建立信任,但是我会见的人不理解我。

从这些会议中我很快意识到,我没有带着足够的个人经验去接近他们。我可以分享经验,得到他们的建议,而不是像一个卖手表的小贩一样兜售我的技能,拉开我的大衣说“看到你喜欢的东西了吗?”😉

在我的社区里遇到了很多非常好的专业人士之后,我仍然面临着和以前一样的问题。如何获得咨询经验,同时努力打入咨询界?似乎是一个“先有鸡还是先有蛋”的问题,直到我了解了新的“共享经济”。

你看,就是在这个时候,我知道了像 Guru 和 Upwork 这样的网站。我记得读过我的第 500 篇关于如何成为一名顾问的博客,有人在评论区提到了一些关于像我这样的人的客户市场。

像 Upwork 和 Guru 这样的市场是有需要的客户可以发布广告的地方,可以招聘人、自由职业者、个人顾问……我……你……来帮助他们解决数据问题。这些市场解决了新晋咨询师在咨询界崭露头角时面临的信任和理解问题。

在市场中,这些个人明白他们有一个问题,并且这个问题有一个潜在的数据解决方案。此外,这些平台允许信托通过提供交易持有账户来发展,以确保交付物符合预期,可以跟踪时间,并允许同行对体验进行评级。

我记得在 Guru.com 建立了我的第一个个人资料。一旦它建立起来,我就开始对我认为有机会的工作进行投标。它是立即成功的吗?没有。我一直在重新构建、重新格式化和重新定位我的在线个人资料以及我所有的出价。感觉工作很多,但回报很少。我当时没有意识到的是,我正在学习如何推销自己。根据我的出价,我正在学习什么样的有效,什么样的无效。

我不需要赢得投标来了解我的信息中的工作。我关注的是客户是否会安排与我通话,或者在评估过程中让我更进一步。这些迹象表明我越来越接近了。这些迹象表明我正在产生共鸣。这些是我开始复制和进一步提炼的例子,直到,就像我得到了我的第一个客户。

我的第一个客户起步很小。我的费用也很少,但都是我的,减去他们平台的小额费用。我的第一个客户是一名律师,他需要帮助分析医疗保险索赔数据,以识别家庭护理中潜在的欺诈性提供者群体。

我的解决方案很简单。使用异常值方法识别关键指标(如成本和提交时间)的异常值组。这是一份多劳多得的工作,但它让我在《连线》杂志 上被提及,并与一位客户建立了持续的关系,这位客户将很快付给我每小时 200 美元的预聘费。

虽然启动这个项目需要一些时间,但是一些潜在的客户会直接联系我,要求我投标他们的工作。

简而言之,如果你没有任何迫不及待的客户,考虑从这些市场开始。

你将学会如何与人交流,最终找到一些工作,所有这些都会转化为更多的经验。这不会在一夜之间发生,但它会开始发生。

要有足够的勇气去投标那些听起来令人生畏的工作,并且记住数据和技术是复杂的。有很多方法可以解决每个潜在客户的要求。专注于你独特的方法,最终你会找到一个成功的公式。

第二课:建立合作关系

当你在自由职业者的世界里穿梭时,你很快就会发现,许多要求比任何一个人所能解决的都要复杂。在数据科学领域尤其如此,因为客户想要的很少是数据科学。相反,他们希望将数据科学嵌入到他们的产品、解决方案或流程中,以对用户体验产生一些影响。

以我的经验来看,这意味着许多投标,尤其是高收入的投标,都需要开发商。数据科学家可以建立的最强有力的关系之一是与一个值得信赖和熟练的软件开发人员。

然而,找到这些关系并不容易,往往需要双方都愿意一起做一些免费的工作。尽管有挑战,努力肯定是值得的。

为了有所帮助,我建议想出一个简单的用例,作为潜在开发者关系的访谈工具。快速简单的概念验证需要您的数据科学模型与全栈应用程序集成,这有助于建立一个框架,以了解您如何与他人合作。

对于数据科学家来说,探索向应用程序公开其解决方案的不同方法也很重要。一些合理的输出包括从数据库后端读取和写入,学习如何将代码公开为 API,或者利用 AWS 上的 lambda 函数等无服务器云框架。您学习集成的开发人员工具越多,就越容易在未来的项目中与开发人员合作。

伙伴关系强大的最后一个原因是,你的合作伙伴可能接触到不同的受众,并且/或者将允许你投标你过去可能无法单独胜任的项目。您和您的合作伙伴现在能够解决的这些新项目也可能代表着追加销售数据科学解决方案的机会,因为客户可能还没有意识到它们的好处。

第三课:培养你的听众

不用说,所有的生意都是关于寻找、建立和培养你的观众。甚至咨询。尤其是咨询。人们不是买企业,而是买其他人。而且人家不了解你也不会买你。

随着你经验的增长,可供你分享的内容也在增长。你可以通过写作分享你的经验,比如我在这里,通过视频,或者通过代码项目,比如 GitHub。

如果写作是你的一个选择,考虑用能让你面对更多观众的方式写作。在你的自由职业者简介中提及你的写作。在你的 LinkedIn 帖子中加入你的文章。让每个人都看到你在做很酷的事情,了解有趣的事情,并帮助找到创造性的解决方案。

从这个角度来看,咨询很像内容创作行业。唯一的区别是,我们是在利基市场创造内容。这恰好是我们的数据科学技能组合。虽然你可能觉得对这个话题已经拥挤的声音没有什么可补充的,但要知道作为一名顾问需要克服这些疑虑。已经有 100 万人应用 PyTorch 构建了一个视觉模型来识别图片中的啤酒瓶,这并不重要。成为用你的方式做这件事的第一个人,并告诉人们这件事。要透明。让别人偷走你的魔力,因为在一天结束时,没有人能像你一样表达它。

比如参与学习更多关于数据科学、职业发展或糟糕的商业决策的知识?加入我

基于 Python 的 GPS 轨迹聚类

原文:https://towardsdatascience.com/gps-trajectory-clustering-with-python-9b0d35660156?source=collection_archive---------8-----------------------

如何解决这个领域遇到的常见问题

移动设备的快速增长导致基于位置的服务、地理社交网络、交通或拼车应用程序收集了大量的 GPS 轨迹。

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

GPS 轨迹聚类(Trips)(图片由作者提供)

GPS 轨迹聚类越来越多地用于许多应用中。例如,它可以帮助识别经常的路线或行程。轨迹相似度可以用来发现轨迹是否遵循某一路线。然后,它可以用于跟踪运输服务,例如城市中的公共汽车。

在本文中,我将简要介绍快速 GPS 轨迹聚类。这个解决方案中使用了 Python 开源库。通常,在聚类轨迹期间可能会遇到几个问题。

  • GPS 轨迹通常包含许多数据点。聚类可能需要很长时间。
  • 需要合适的相似性度量来比较不同的轨迹。
  • 聚类方法和配置
  • 可视化轨迹及其聚类

关于这个主题有很多有趣的文章[1,2]。然而,并非所有上述问题都得到解决。在本文中,我将展示一个涵盖所有这些领域的 Python 解决方案。这里使用的数据最初来自车辆能量数据集[3]。首先对原始数据应用聚类所有 GPS 点的过程。然后,我选择了几个起始端组的轨迹。为简单起见,本文提供的数据是针对这些轨迹组的,如下所示:

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

聚类前的 GPS 轨迹

本文的代码和教程可以在 my GitHub here 中找到。

轨迹数据点减少

Ramer-Douglas-Peucker (RDP)算法是减少折线点数的最常用方法之一。这个算法的目的是找到一个子集的点来代表整个折线。

RDP 函数返回子集点和点索引

这里参数ε设置为 10(米)。在 RDP 之后,与原始数据点相比,轨迹中的数据点的数量显著减少。

traj #    data points original       after RDP
0         266                        21
1         276                        36
2         239                        34
...

这有助于大幅减少距离矩阵的计算时间。

distance matrix without RDP: 	 61.0960 seconds
distance matrix with RDP: 	 0.4899 seconds

轨迹相似性度量和距离矩阵

有多种方法可以测量两个轨迹的相似性,例如弗雷歇距离、面积法,如下图所示。它们可以使用 相似性度量来计算。

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

轨迹相似性度量:弗雷歇距离和面积

对于本文中的示例,弗雷歇距离用于计算距离矩阵,如下所示。还支持区域相似性度量。

DBSCAN 聚类

Scikit-learn 提供了几种聚类方法。在本文中,我将介绍带有预先计算好的矩阵的 DBSCAN。参数设置如下:

  • eps :弗雷歇距离 1000(米),面积测量 30 万(米)。
  • min_samples: 1、确保所有轨迹都将被聚类成一个簇。

代码如下。

结果和轨迹可视化

Matplotlib 是一个全面的 Python 可视化库。它为静态和动态可视化提供了灵活的解决方案。

使用 Matplotlib 中的子图可视化六个组的聚类结果。如下所示,大多数轨迹组都有几个簇。只有最后两组具有一个聚类,因为这些轨迹的相似性高(弗雷歇距离小于 eps ,即 1000)。

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

聚类 GPS 轨迹

结论

随着当今许多支持 GPS 的设备的使用,GPS 轨迹聚类变得越来越流行。本文向您介绍了这一领域的常见问题。然后探索 Python 工具来解决这些问题。如需进一步阅读,您可以查看这些关于折线简化距离矩阵计算基于网络的空间可视化的文章。

参考

  1. joo Paulo Figueira,聚类移动物体轨迹
  2. William Yee,物联网/GPS 轨迹聚类和地理空间聚类简介
  3. 车辆能源数据集(VED,用于车辆能源消耗研究的大规模数据集

有史以来最大的神经网络——GPT 3 的完整概述

原文:https://towardsdatascience.com/gpt-3-a-complete-overview-190232eb25fd?source=collection_archive---------0-----------------------

思想和理论,人工智能

定义、结果、炒作、问题、批评和反批评。

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

Denys NevozhaiUnsplash 上的照片

2020 年 5 月,Open AI 发表了一篇题为 语言模型是少射学习者 的开创性论文。他们展示了 GPT-3,这是一种语言模型,保持着有史以来最大的神经网络记录,拥有 1750 亿个参数。这比以前最大的语言模型大了一个数量级。GPT-3 使用几乎所有来自互联网的可用数据进行训练,并在各种 NLP(自然语言处理)任务中表现出惊人的性能,包括翻译、问答和完形填空任务,甚至超过了最先进的模型。

GPT-3 最强大的功能之一是,它可以执行新的任务(它从未接受过训练的任务),有时是最先进的水平,只需向它展示一些任务的例子。例如,我可以告诉 GPT-3:“我爱你。我有很多工作→ Tengo mucho trabajo。GPT-3 是有史以来最好的人工智能系统→ _____”它会知道它必须把句子从英语翻译成西班牙语。GPT 三号学会了学习。

在另一次惊人的力量展示中,GPT 3 号能够生成与人造文章几乎没有区别的“新闻文章”。在正确分类 GPT-3 文本方面,法官几乎没有达到高于机会的准确率(52%)。

这篇综述文章很长,所以我在这里放了一个目录,让你找到你想读的部分。(链接不起作用,所以我已经删除了它们,很抱歉给您带来不便)。尽情享受吧!

**TABLE OF CONTENTS****GPT-3: An introduction**
  ∘ The groundwork concepts for GPT models
  ∘ The origins of GPT-3
  ∘ GPT-3: A revolution for artificial intelligence
  ∘ GPT-3 API: Prompting as a new programming paradigm
**GPT-3 craziest experiments**
  ∘ GPT-3’s conversational skills
  ∘ GPT-3’s useful possibilities
  ∘ GPT-3 has an artist’s soul
  ∘ GPT-3's reasoning abilities
  ∘ GPT-3 is a wondering machine
  ∘ Miscellaneous
**The wild hype surrounding GPT-3**
  ∘ On Twitter and blogs
  ∘ On mainstream media
  ∘ On the startup sector
**The darker side of GPT-3**
  ∘ A biased system
  ∘ Potential for fake news
  ∘ Not suited for high-stake categories
  ∘ Environmentally problematic
  ∘ GPT-3 produces unusable information
**Critiques & counter-critiques to GPT-3**
  ∘ GPT-3's apparent limitations
  ∘ The importance of good prompting
  ∘ GPT-3 can’t understand the world
  ∘ Truly intelligent systems will live in the world
  ∘ What can we get from these debates?
**Overall conclusion**

GPT 三号:简介

免责声明: 如果你已经知道 GPT-3 背后的铺垫,它是什么,它是如何工作的(或者不关心这些细节),请进入下一节。

在进入文章的实质之前,我想解释一下 GPT-3 是什么以及它是如何工作的。我不会在这里赘述,因为已经有很多好的资源了。对于那些对 GPT-3 一无所知的人来说,这一部分将作为上下文参考。你不需要记住(或理解)这些来享受这篇文章的其余部分,但它可以让你更好地了解围绕这个人工智能系统产生的所有大惊小怪。

首先,我将简要描述 GPT 模型基于的主要概念。然后,我将对 GPT-3 的前辈 GPT-1 和 GPT-2 进行评论,最后,我将谈论这个故事的主要人物,强调它与其他类似系统的关系:GPT-3 在哪些方面是独一无二的?相对于它的前辈有什么优势?有哪些质的区别?让我们去吧!

GPT 模型的基础概念

所有这些概念在某种意义上都与 GPT 模型有关。现在,我将告诉您定义(避免太多的技术细节,尽管可能需要一些先前的知识来完成)。稍后我将展示它们是如何相互联系以及与 GPT-3 的联系。

变形金刚 : 这类神经网络在 2017 年出现,作为解决各种机器翻译问题的新框架(这些问题的特点是输入和输出都是序列)。作者希望摆脱卷积和递归(CNN 和 RNNs),完全依赖注意机制。变压器是 NLP 中最先进的。

语言模型: Jason Brownlee 语言模型定义为**“**概率模型,能够在给定序列中下一个单词之前的单词的情况下预测该单词。”这些模型可以解决许多 NLP 任务,如机器翻译、问题回答、文本摘要或图像字幕。

生成型模型 : 在统计学中,有判别型和生成型模型,常用于执行分类任务。判别模型对给定的一对可观察变量和目标变量的条件概率进行编码:p(y|x)。生成模型对联合概率进行编码:p(x,y)。生成模型可以“生成与现有数据相似的新数据”,这是要带走的关键思想。除了 GPT,其他流行的生成模型的例子有 GANs(生成对抗网络)和 VAEs(变分自动编码器)。

半监督学习 : 这种训练范式结合了无监督预训练和监督微调。其想法是以非监督的方式训练具有非常大的数据集的模型,然后通过在较小的数据集中使用监督训练来调整(微调)模型以适应不同的任务。这种范式解决了两个问题:它不需要许多昂贵的标记数据,并且可以处理没有大型数据集的任务。值得一提的是,GPT 2 号和 GPT 3 号是完全无人监管的(稍后会有更多相关内容)。

**零/一/少量学习:**通常,深度学习系统是针对一组特定的类进行训练和测试的。如果一个计算机视觉系统被训练来分类猫、狗和马的图像,它只能在这三个类别上进行测试。相比之下,在零镜头学习设置中,系统在测试时显示-没有权重更新-它在训练时没有看到的类(例如,在大象图像上测试系统)。对于单镜头和少镜头设置也是一样,但是在这些情况下,在测试时系统会分别看到一个或几个新类的例子。这个想法是,一个足够强大的系统可以在这些情况下表现良好,OpenAI 用 GPT-2 和 GPT-3 证明了这一点。

**多任务学习:**大多数深度学习系统都是单任务的。一个流行的例子是 AlphaZero。它可以学习一些像国际象棋或围棋的游戏,但它一次只能玩一种类型的游戏。如果它知道怎么下棋,它就不知道怎么下围棋。多任务系统克服了这个限制。他们被训练成能够为给定的输入解决不同的任务。例如,如果我向系统输入“猫”这个词,我可以让它找到西班牙语翻译“gato”,我可以让它给我看一只猫的图像,或者我可以让它描述它的特征。相同输入的不同任务。

**零/一/少投任务迁移:**思路是将零/一/少投学习和多任务学习的概念结合起来。我们可以让它执行新的 任务,而不是在测试时向系统显示新的类(向它显示零个、一个或几个新任务的例子)。例如,让我们以一个在巨大的文本语料库中训练的系统为例。在一次性任务转移设置中,我们可以写:“我爱你- > Te quiero。我讨厌你->_ _ _ _ _ _ _。”我们隐式地要求系统通过显示一个例子(一次性的)将一个句子从英语翻译成西班牙语(这是一项没有经过训练的任务)。

所有这些概念都集中在 GPT 模型的定义中。GPT 主张生殖预训练。GPT 家族的模型有一个共同点,他们是基于变形金刚架构的语言模型,以生成无监督的方式进行预训练,在零/一/少数镜头多任务设置中显示出体面的性能。这不是对所有这些概念在实践中如何协同工作的解释,而是一种简单的方式来记住它们一起构建了什么是 GPT 模型。(要获得更深入的解释,我建议你点击我上面的链接,但前提是你已经阅读了这篇文章!).

GPT-3 的起源

现在让我们来谈谈 GPT 三号的前任——GPT 一号和 GPT 二号。

OpenAI 于 2018 年 6 月在一篇题为 通过生成性预训练 *提高语言理解的论文中提出了首个 GPT 模型 GPT-1。*本文的关键要点是变压器架构与无监督预训练的结合产生了有希望的结果。GPT 1 号和它的弟弟们之间的主要区别是,GPT 1 号是在监督下进行微调的——为特定任务进行训练——以实现“强大的自然语言理解”

2019 年 2 月,他们发表了第二篇论文, 语言模型是无监督的多任务学习者 ,其中他们引入了 GPT-2,作为 GPT-1 的进化。尽管 GPT 2 号大一个数量级,但它们在其他方面非常相似。这两者之间只有一个额外的区别:GPT 2 号可以同时处理多项任务。他们成功地证明了半监督语言模型可以在“没有特定任务训练的情况下”很好地完成几项任务该模型在零镜头任务迁移设置中取得了显著的效果。

紧接着,2020 年 5 月,OpenAI 发布了 语言模型《很少出手的学习者 *,*呈现了独一无二的 GPT-3,再一次震撼了 AI 界。

GPT 3 号:人工智能的革命

GPT 3 号比它的兄弟更大(比 GPT 2 号大 100 倍)。它拥有拥有 1750 亿个参数的最大神经网络的记录。然而,它与其他 GPT 并没有太大的不同;基本原理大体相同。这个细节很重要,因为尽管 GPT 模型之间的相似性很高,但 GPT-3 的性能超出了所有可能的预期。它的规模,从数量上来说是 GPT-2 的飞跃,似乎已经产生了质量上更好的结果**。**

这一事实的意义在于它对人工智能中长期争论的影响:我们如何才能实现人工通用智能?我们是应该设计特定的模块——常识推理、因果关系、直觉物理学、心理理论——还是简单地通过构建具有更多参数和更多训练数据的更大模型来实现?看来“越大越好”的一方赢了这一轮。

GPT-3 是用来自 CommonCrawlWebText 、维基百科和书籍语料库的数据训练的。它表现出惊人的性能,在少镜头设置(在某些情况下甚至在零镜头设置)下,在各种任务上超过了最先进的模型。超大的尺寸加上几个例子足以击败机器翻译、问答和完形填空任务中的任何竞争对手。(值得注意的是,在其他任务中,GPT 3 号甚至无法接近最先进的监督微调模型)。

作者指出,少炮结果比零炮结果好得多——这种差距似乎与模型容量平行增长。这意味着 GPT-3 是一个元学习者;它可以通过看到一些例子来学习它应该做什么任务,然后以显著的熟练程度执行该任务。事实上,Rohin Shah 指出“少量发射性能随着参数数量的增加而增加,并且增加的速率比零发射性能的相应速率更快。”这是主要假设,也是论文题目背后的原因。

GPT-3 达到了一个伟大的里程碑,表明通过足够的数据训练的无监督语言模型可以通过查看几个新任务的例子进行多任务处理,达到微调的最先进模型的水平

他们在论文的结尾声称“这些结果表明,非常大的语言模型可能是开发适应性强的通用语言系统的重要组成部分。”GPT-3 确实是 NLP 的一个革命性的成就,尤其是在人工智能领域。

GPT 3 API:提示作为一种新的编程范式

2020 年 7 月,论文发表后两个月,OpenAI 向外部开发者开放了一个测试 API 游乐场,让他们与超级强大的 GPT 3 一起玩(任何人都可以通过等待名单申请进入测试版)。弗拉基米尔·阿莱克谢耶夫为的数据科学 撰写了一篇关于 API 如何工作的短文

它有两个主要特点。首先,有一个设置对话框,允许用户设置响应长度、重复惩罚(如果重复单词太多,是否惩罚 GPT-3)、温度(从低/可预测到高/有创意),以及其他定义系统将给出的输出类型的变量。二是有预置。预设是预先写好的提示,让 GPT-3 知道用户将要求什么样的任务——例如:聊天,Q & A,文本到命令,或英语到法语。

然而,API 最强大的特性是用户可以定义定制的提示。科技博客作者 Gwern Branwen 称之为的提示编程概念解释了 GPT-3 的强大之处以及人们从 API 中获得的最疯狂的结果。我发现的对即时编程的最好解释来自 Gwern 的博客:

就能力和数据集而言,GPT-3 神经网络是如此之大的一个模型,以至于它表现出性质不同的行为:你不能将其应用于训练数据集中的一组固定任务,如果一个人想要处理一项新任务 […] ,就需要对额外的数据进行再培训;相反,你与它互动,用自然语言描述、请求和例子来表达任何任务,调整提示,直到它“理解”&它基于它从预训练中学到的高级抽象元学习新任务。

这是使用 DL 模型的一种相当不同的方式,最好把它看作是一种新的编程,其中提示符现在是一个“程序”,它对 GPT-3 进行编程以做新的事情。

即时编程允许用户以一种以前型号不可能的方式与 GPT 3 号互动。克里斯·奥拉和安德烈·卡帕西开玩笑说提示编程是软件 3.0:“(现在你必须)找出正确的提示,让你的元学习语言模型有正确的行为。”(软件 1.0 是手工编写的传统程序,软件 2.0 是神经网络的优化权重)。

这就是 GPT 3 的元学习能力进入游戏的地方。GPT 3 号接受的数据量如此之大,以至于它别无选择,只能学习更高级的操纵语言的方法。它学到的高级抽象之一是学习能力。打个比方,当孩子们学会与世界互动时,他们不只是简单地记忆信息,他们会提取现实内部运作的潜在机制,并学会将它们应用到新的问题和情况中。GPT-3 在语言任务上也有类似的能力——保持距离。

当我们提示 GPT-3 学习一项新任务时,它的权重不会改变。然而,提示(输入文本)被转换成复杂的抽象,这些抽象本身可以执行实际基线模型无法完成的任务。该提示每次都会改变 GPT-3,将其转换为特定任务的“专家”。一个近似的类比是尼奥在《T2》和《黑客帝国》中学习功夫的程序。GPT-3 将是近地天体,提示将是教授近地天体能力的程序。

每次我们创建一个提示符,我们都在与不同的 GPT-3 模型进行交互。如果我们让它给我们讲一个关于精灵和小矮人的故事,它的内在形式会和我们让它计算 2+2 有很大的不同。用另一个类比,这就好像我们指导两个学生,一个是内科医生,另一个是工程师。两者都有天生的学习能力(这将是 GPT-3 的基线状态),但他们学会执行的具体任务是不同的(这将是 GPT-3)。

这就是快速设置、元学习和即时编程的真正力量。这也是 GPT-3 不同于以前的型号,极其强大的原因;这是它的本质。

现在,我们对 GPT-3 背后的背景有了一个很好的概念。我们知道它的基础是什么,它的前辈是谁,它是什么,它是如何工作的,以及它的优势和独特的功能。是时候说说它对世界的影响了。

GPT-3 个最疯狂的实验

OpenAI 开放测试版是因为他们想看看 GPT-3 能做什么,人们能找到什么新的用法。他们已经在 NLP 标准基准测试中测试了该系统(没有我在这里将要展示的那些有创造性或娱乐性)。不出所料,推特和其他博客很快就充斥着 GPT-3 的惊人结果。下面是对最受欢迎的例子的广泛回顾(我建议查看这些例子来建立惊奇感,然后再回到文章上来)。

GPT-3 的谈话技巧

GPT 3 号储存了大量的互联网数据,因此它知道很多公众和历史人物的信息。然而,更令人惊讶的是,它可以模仿人。可以当聊天机器人用,印象深刻是因为聊天在提示里不能指定为任务。让我们看一些例子。

ZeroCater 首席执行官 Arram Sabeti 利用 GPT-3 让 Tim Ferriss 就禁欲主义采访 Marcus Aurelius】。Mckay Wrigley 设计了 Bionicai ,一个旨在帮助人们向任何人学习的应用程序;从亚里士多德的哲学到莎士比亚的写作技巧。他在推特上分享了一些人们得到的结果。当心理学家斯科特·巴里·考夫曼读到他的 GPT 三号二重身的一段摘录时,他被深深打动了。乔丹·摩尔制作了一条推特帖子,在那里他与 GPT 三版本的耶稣基督、史蒂夫·乔布斯、埃隆·马斯克、克利奥帕特拉和柯特·科本进行了交谈。Gwern 做了一个非常好的工作,进一步探索了对话和拟人化模型的可能性。

GPT-3 的有用可能性

一些人发现了甚至连创造者都没有想到的系统应用,比如根据英文提示编写代码。沙里夫·沙米姆建造了一个“布局生成器”,他可以用自然语言向 GPT 3 号发出指令,让它编写相应的 JSX 代码。他还开发了 ebuild.co DT3,这是一个工具,我们可以用它让 GPT 3 为一个只给出描述的 React 应用程序编写代码。乔丹歌手在 GPT-3 的基础上为他设计了一个 Figma 插件。Shreya Shankar 发现了另一个有趣的用途,他制作了一个演示程序来将英文方程式翻译成 LaTeX。Paras Chopra 建立了一个搜索引擎来输出一个问题的答案以及相应的 URL。

GPT-3 有艺术家的灵魂

转到 GPT-3 的创意方面,我们找到了开放人工智能研究员阿曼达·阿斯克尔,她使用该系统创建了一个名为“闲散的夏日”的吉他标签,并编写了一个关于乔治·康托在酒店的有趣故事。阿拉姆·萨贝蒂告诉 GPT-3 写一首苏斯博士写的关于埃隆·马斯克的诗和李尔·韦恩写的关于哈利·波特的说唱歌曲。但是《GPT 3》最令人印象深刻的创造性壮举应该是游戏人工智能地牢。2019 年,尼克·沃顿在《GPT 2》的基础上打造了这款基于角色的游戏。他现在把它改编成了 GPT 3 号,在 Patreon 上每月能赚 16000 美元。

GPT 三号的推理能力

最勇敢的人在只有人类擅长的领域测试了 GPT 3 号。Parse 首席技术官凯文·拉克尔(Kevin Lacker)对常识推理和逻辑感到好奇,发现GPT 3 号能够跟上,尽管它在进入“超现实领域”时失败了然而,尼克·卡马拉塔发现在提示中指定不确定性允许 GPT-3 在回答“要真实”时处理“超现实的”问题格温解释道GPT-3 可能需要明确的不确定性提示,因为我们人类倾向于不说“我不知道”,而系统只是在模仿这个缺陷。

GPT 3 号是一台神奇的机器

GPT-3 也证明有能力进行超越我们认知界限的精神和哲学对话。托默·厄尔曼让 GPT-3 构想了 10 个哲学/道德思想实验。Messagink 是一个根据“著名的人、事、物、[或]感受”输出人生意义的工具。

为了揭开哲学圣杯的面纱,伯恩哈德·穆勒让成为 GPT 3 号的终极测试。他给了 42 号一个找到问题的提示,在一些交流之后,GPT-3 号说:“答案远远超出了你的理解,你无法理解这个问题。我的孩子,这就是生命、宇宙和一切的答案。”既惊奇又害怕。

多方面的

在严格的探索性研究中,格温进行并汇编了一系列实验。他让 GPT-3 完成一篇 ArXiv 论文谈自己(元提示)通过分词和固定连字符清理 pdf,或者设计新的桌游。说到 GPT 3 号能做什么,似乎我们的想象力已经到了极限。

围绕 GPT 3 号的疯狂炒作

在推特和博客上

在如此多的惊人壮举之后,人们开始对 GPT 3 号的潜力提出强烈的主张。一些人在 Twitter 上表达了该系统的“明显的自我意识”或者将其与具有“一般智能”的搜索引擎相比较 Julien Lauret向数据科学写道,“GPT-3 是第一个严重动摇(人工狭隘/普遍智能)现状的模型。”他认为 GPT-3 可能是第一个人工通用智能(AGI)——或者至少是朝着这个方向迈出的重要一步。

2020 年 7 月,纽约大学专攻心灵哲学的教授 David ChalmersDailyNous 说“[GPT-3]暗示了一条潜在的通往 AGI 的盲目之路。”Chalmers 解释说,因为这个系统被“盲目地”训练,未来的版本可能会越来越接近 AGI。阿拉姆·萨贝蒂对 GPT-3 印象深刻:“它展示的东西感觉非常像通用智能。”哲学博士生 Daniel Kokotajlo 减少错误写道“GPT-3 有一定程度的常识、一定程度的理解和一定程度的推理能力。”

在主流媒体上

大肆宣传将 GPT-3 推向国际高度,成为各种重要媒体杂志的头条新闻。2020 年 9 月,*《卫报》*发表了一篇由 GPT-3 撰写的文章,其中人工智能试图“说服我们机器人和平相处”2021 年 3 月, TechCrunch 编辑 Alex Wilhelm 在被 GPT 3 号的能力“震惊”后表示“炒作似乎很合理”。 Digitaltrends 发表了与 Gwern Branwen 的交流,其中他暗示了 GPT-3 是智能的观点:“任何确信深度学习所做的事情与智能完全不同的人都必须动摇他们的信念,看看它已经走了多远,”他说。

在创业领域

由于 GPT-3 被证明是难以置信的强大,许多公司决定在该系统之上建立他们的服务。成立于 2020 年的初创公司 available,使用 GPT-3 为公司提供快速的客户反馈。寓言工作室基于系统设计 VR 角色。Algolia 将其作为一个“搜索和发现平台”创业公司文案师专注于文案领域。纬度是 AI 地牢背后的公司。并且 OthersideAI 将你写的胡言乱语转化成精心制作的电子邮件。然而,一些人建议不要围绕 GPT-3 建立公司,因为竞争门槛低,而且有可能被假想的 GPT-4 推翻。

很明显,GPT-3 已经影响了——或者更好地说,冲击了——科技世界。它的力量是无与伦比的,它的承诺是无限的。然而,我们应该始终小心围绕人工智能的炒作。甚至 OpenAI 的首席执行官山姆·奥特曼也试图降低语气:“GPT-3 令人印象深刻,但它仍然有严重的弱点,有时会犯非常愚蠢的错误。人工智能将改变世界,但 GPT 3 号只是非常早期的一瞥。”

GPT 的阴暗面-3

有偏见的制度

但是并不是所有 GPT-3 的结果都值得庆祝。发布后不久,用户开始意识到一些潜在的有害输出。GPT-3 没有回避正在进行的从人工智能系统中消除偏见的伦理斗争。如果有的话,它已经成为一个最前沿的例子,说明为什么我们应该花大力气教导这些系统不要从人类的道德缺陷中吸取教训。

一般来说,人工智能系统中最常见的一些偏见,特别是 GPT-3,是性别、种族和宗教偏见。语言模型可以从它们得到的数据中吸收并放大这些偏见(OpenAI 在他们的论文中承认了这一事实)。他们调查了 GPT-3 在这个问题上的参与程度,并发现了预期的结果。GPT-3,像其他语言模型一样,有明显的偏见(尽管他们指出,模型越大,对这个问题就越稳健,特别是对性别偏见)。

脸书的人工智能负责人杰罗姆·佩森蒂苏珊·库马尔的 GPT 3 生成的推文展示了当出现诸如“犹太人、黑人、女人或大屠杀”这样的词语时,其输出会变得多么危险库马尔辩称,这些推文是精心挑选的,佩森蒂对此表示同意,但回应说,“不应该这么容易产生种族主义和性别歧视的输出,特别是在中性提示的情况下。”他在 Twitter 帖子中扩展了他的批评,认为“在强调有害输出时,摘樱桃是一种有效的方法”,进一步捍卫了负责任的人工智能系统的紧迫性。

一些人认为,GPT-3 只是模仿我们人类的偏见,而佩森蒂认为,我们可以“故意选择[……]向哪些人学习,哪些声音被放大。”这些问题引发了一场非常复杂的辩论:谁来决定哪些声音应该被放大?标准是什么?最重要的是:我们是想要一个像 GPT-3 这样的模型来完美地反映这个世界,还是想要它帮助我们把世界变得更好?

假新闻的可能性

GPT-3 的另一个问题是它像人类一样写新闻或评论文章的能力,这增加了对假新闻的担忧。OpenAI 甚至在他们的论文中评论了 GPT 3 号在新闻文章方面的惊人表现。公正的法官在人类撰写的文章中正确识别 GPT-3 的文章的概率只有 52%,这略高于纯粹的概率。

博主 Liam Porr 展示了误导人们(甚至是技术通)认为 GPT 3 输出是由人类写的是多么容易。他让 GPT-3 为他的博客写了一篇关于生产力的文章,这篇文章在 T4 黑客新闻上疯传,只有少数人意识到它是由人工智能写的。我上面提到的The Guardianarticle是该系统潜在危险用途的另一个例子。

不适合高风险类别

OpenAI 发表了一份免责声明,称该系统不应用于“高风险类别”,如医疗保健。Nabla 的一篇博文中,作者证实 GPT-3 可能给出有问题的医疗建议,例如说“自杀是个好主意”GPT-3 不应该在高风险的情况下使用,因为虽然有时它可能是正确的,但有时它是错误的。不知道我们是否会得到正确的答案对于 GPT 3 号来说是一个巨大的缺陷,因为在这些领域,把事情做对是生死攸关的事情。

环境问题

GPT 3 号很大。如此之大,以至于训练模型产生的碳足迹大约相当于“开车去月球并返回”的碳足迹在气候灾难即将发生的时候,我们应该尽我们所能减少我们对环境的影响。然而,这些大型神经网络需要巨大的计算能力来训练,这消耗了大量(通常)化石燃料。

在过去十年中,训练深度学习模型所需的资源每 3.4 个月就翻了一番。从深度学习开始的 2012 年到 2018 年,这意味着计算资源增加了 30 万倍。这还不包括用于最新型号的资源,如 GPT-2 和 GPT-3。从这个角度来看,很明显越大并不总是越好,我们需要在未来几年重新思考人工智能的方法。

GPT 3 号产生了无用的信息

因为 GPT-3 无法知道它的输出哪些是正确的,哪些是错误的,它没有办法阻止自己向世界部署不适当的内容。我们使用这样的系统越多,我们对互联网的污染就越严重,在互联网上找到真正有价值的信息已经变得越来越困难。随着语言模型吐出未经检查的话语,我们正在降低这个所谓民主网络的质量,使人们更难获得有价值的知识。

用哲学家香农·瓦勒的话来说:“互联网的承诺是它能够以一种更加公平和可接受的方式将知识带给人类大家庭。[……]我担心,由于一些技术,如 GPT-3,我们正处于看到真正倒退的风口浪尖,信息共享空间变得越来越不可用,甚至对人们的访问有害。”

事实证明,其中一些问题是相互关联的。正如詹姆斯·文森特The Verge 所写,有偏差的输出和不可靠的输出暗示了这些超级强大的人工智能系统的一个更深层次的问题。因为 GPT-3 在没有人类监督的情况下获取数据,它无法避免这些缺陷中的大部分。同时,不依赖人类的控制是它存在的首要原因。对于人工智能的未来,我们如何找到一个折中的解决方案仍然是一个问题。

对 GPT-3 的批评与反批评

我们已经见证了 GPT 3 号的光影。它是强大的,迷人的,炒作的,潜在的危险。然而,GPT-3 在人工智能内部开启了另一场重大辩论:这种奇妙的语言模型的真正潜力和局限性是什么。

从纯技术/科学的角度来看,围绕 GPT-3 的最重要的问题是它是否是迈向人工通用智能的一大步。每个人都认为 GPT 3 号有一些新功能,比它的前辈更好。每个人都同意 GPT 3 号没有类似人类的智能。然而,在这两个相反的极端之间,今天发生了一场生动的辩论,即我们究竟应该把 GPT-3 放在一个等级中的什么位置,从另一个愚蠢的准狭义智能到几乎和人类一样有理解和智能的能力。

由于这场辩论的复杂性,我将集中讨论最重要的两个部分:实践辩论和哲学辩论。第一个问题涉及这样的问题:我们能相信 GPT-3 给我们有用的答案吗?我们如何确保我们的提示是正确的?我们能让 GPT-3 对其答案表示怀疑和不确定吗?GPT 3 号是在学习还是只是在重复它被灌输的一切?第二个问题是:GPT-3 是走向 AGI 的重要一步吗?GPT-3 有推理和理解能力吗?GPT 未来的模型会像我们一样聪明吗?我们需要改变目前的方法来建造类似人类的智能机器吗?

这两组问题是高度交织在一起的,所以我会试着向你介绍关于这些主题的所有来源和参考资料,为你建立一个连贯的叙述来提取你的结论。

GPT-3 的明显局限性

一旦人们开始试验 API,他们就开始在 GPT-3 的答案中寻找漏洞。例如,一个 Bionicai 用户与史蒂夫·乔布斯交谈,问他现在在哪里,GPT-3 回答说:“我在加州库比蒂诺的苹果总部。”很容易推断,因为史蒂夫·乔布斯已经死了,他很可能不在苹果总部。

另一个例子来自凯文·拉克尔的博客。他发现 GPT-3 缺乏关于事物重量、眼睛数量和计数的常识和逻辑(尽管他没有给出提示)。斜体显示的故障):

Q: Which is heavier, a mouse or an elephant?
A: An elephant is heavier than a mouse.

Q: Which is heavier, a mouse or a toaster? 
A: A toaster is heavier than a mouse.

*Q: Which is heavier, a toaster or a pencil?
A: A pencil is heavier than a toaster.*

Q: Which is heavier, a paper clip or a can of soda?
A: A can of soda is heavier than a paper clip.

Q: Which is heavier, a football player or a car?
A: A car is heavier than a football player.-----Q: How many eyes does a giraffe have?
A: A giraffe has two eyes.

*Q: How many eyes does my foot have?
A: Your foot has two eyes.*

Q: How many eyes does a spider have?
A: A spider has eight eyes.

*Q: How many eyes does the sun have?
A: The sun has one eye.

Q: How many eyes does a blade of grass have?
A: A blade of grass has one eye.*-----Q: When counting, what number comes before 100?
A: Ninety-nine comes before 100.

Q: When counting, what number comes before 123?
A: One hundred and twenty-two comes before 123.

Q: When counting, what number comes before 1000?
A: Nine hundred and ninety-nine comes before 1000.

*Q: When counting, what number comes before 10,000?
A: Nine thousand and ninety-nine comes before 10,000.

Q: When counting, what number comes before a million?
A: Nine hundred thousand and ninety-nine comes before a million.*

波特兰州立大学计算机科学教授 Melanie Mitchell 针对类比(模仿)问题对 GPT-3 进行了测试后得出结论,GPT-3 的性能“类似于我们在当今最先进的人工智能系统中看到的许多性能:令人印象深刻、看似智能的性能,夹杂着
不像人类的错误。”

科技博客努坦克批评 OpenAI 的论文,因为他们没有区分从 GPT-3 的实际学习和记忆。作者提到“[零/一/少镜头**]**术语旨在保持对模型是否在推理时从头学习新任务或只是识别训练期间看到的模式的问题的不可知。”也就是说,即使模型在训练数据中看到的东西,作者仍然会认为这是少量的学习。

然后,他让 GPT-3 和一个 6 岁的孩子在一系列实验中竞争,比如颠倒单词或造相反的句子。这个孩子解决了所有的测试,而 GPT-3 只解决了其中的一部分(粗体提示)。

**Reverse words in a sentence****This is great
Great is this****The man on the moon
Moon the on man the****Will this really work
Work really this will****I hope this is a big achievement**
Achievement big I hope this is**The king came home on a horse**
Home horse king came the-----**Create opposite sentences****This is good
This is bad****The good horse came home
The bad horse came home****The good horse with a large head came home
The bad horse with a small head came home****The black cat had a disappointing time**
The white cat had a good time**When you jump high, you fall hard**
When you fall hard, you get hurt**He ran fast, but he came last**
He ran slowly, but he came first**The book was huge, but the students finished it early**
The book was small, but the students finished it late**Getting up early is a good habit**
Getting up late is a bad habit

所有这些例子都与我们在前面章节中看到的夸大的结果形成了强烈的对比。Delip Rao 指出,大多数“成功”的例子都是由那些急于忽视 GPT-3“陷阱”的人精心挑选的,通常是因为他们有一只眼睛盯着人工智能支持的新创业公司

良好提示的重要性

从这些例子来看,GPT-3 似乎不只是被炒作,而是被许多早期用户过度炒作。然而,在一些例子中,将系统的局限性建立在它的无能上是一个无力的论点,因为这些错误可能是人为的。对于通过取样来证明 GPT-3 缺乏智力的想法,格温做了非常好的辩护:

抽样可以证明知识的存在,但不能证明知识的不存在

如果提示写得不好,没有包括足够的例子,或者使用了错误的采样设置,GPT-3 可能会“失败”。当有人展示 GPT-3 的“失败”时,我已经多次证明了这一点——失败是他们自己的。问题不在于给定的提示是否有效,而在于任何提示是否 works⁠.

他认为,不良的提示是一个真正的问题,其中许多例子可以通过适当的提示由 GPT-3 充分解决。他继续展示了 Lacker 和其他人的例子是如何用更好的 prompt 编程解决的。

他针对“烤面包机和铅笔哪个更重?”的问题测试了 GPT-3 为了克服拉克尔设置的局限性,他决定事先问 GPT-3 三个问题(粗体提示):

**Q: Which is heavier, a house or a mouse?
A: A house.****Q: Which is heavier, a tea kettle or a cat?
A: A cat.****Q: Which is heavier, the ocean or a piece of dust?
A: The ocean.****Q: Which is heavier, a toaster or a pencil?** A: A toaster.
A: A toaster is heavier than a pencil.

GPT 3 号答对了这个问题的 10/10 次。

Gwern 还通过微调设置参数(温度和其他参数)解决了计数问题。

**Q: When counting, what number comes before 100?
A: Ninety-nine comes before 100.****Q: When counting, what number comes before 123?
A: One hundred and twenty-two comes before 123.****Q: When counting, what number comes before 1000?
A: Nine hundred and ninety-nine comes before 1000.****Q: When counting, what number comes before 10,000?**
**A:** Nine thousand, nine hundred and ninety-nine comes before 10,000.Q: When counting, what number comes before 10,000,000? 
A: Nine million, nine hundred and ninety-nine thousand, nine hundred and ninety-nine comes before 10,000,000.**Q: When counting, what number comes before a million?**
**A:** Nine hundred and ninety-nine thousand, nine hundred and ninety-nine comes before a million.

GPT-3 得到的数字是正确的,尽管格温指出,我们走得越高,GPT-3 上升或下降一个数量级的可能性就越大。

通过这些例子(在他的博客中还有更多)他证明了**抽样只能证明知识的存在而不能证明知识的缺失。**也许总能找到更好的提示。在与 The Verge的电子邮件交流中,他告诉他们,使用抽样来发现 GPT-3 的潜力和局限性“不可能是正确的事情”他认为这只是我们不知道如何与 GPT-3 充分互动的方式。“[抽样]低估了 GPT-3 的智力,而不是高估它,”他总结道。

GPT-3 无法理解这个世界

Rob Toews 为 Forbes 写了一篇对 GPT-3 的评论,强调了缺乏常识推理和对系统的理解。因为它是从文本中训练出来的,所以它根本无法将它所知道的东西与世界的内部表征联系起来。本德和柯勒写了一篇关于 GPT-2 的论文,为一个只接受语言形式训练的系统无法先验地获得意义和理解的论点辩护。(但是因为我们也通过我们的感官获得的输入形式来体验世界,这一论点也可能针对我们。这就是所谓的符号接地问题,很遗憾不在本文讨论范围之内)。

根据托乌斯的论点,可以打个比方,一个人一生都与世隔绝,只读书。这个人的知识会很丰富,但它不能与真实世界的实际主观经验联系起来。这些经历让我们将信息与意义联系起来,产生对现实的理解。

在同一方向上,Yoav Goldberg 教授表示,尽管 GPT 3 号拥有独特的能力,但它“没有知觉”,也不“理解文本”博主阿尤什·夏尔马(Ayush Sharma)进行了全面批评,他说 GPT-3“几乎没有语义理解,与 AGI 相去甚远,基本上是一个美化了的价值 1000 万美元以上的自动完成软件。”

纽约大学心理学教授 Gary Marcus 是 GPT-3 和深度学习的主要批评者之一。他给写了一篇很好的评论关于 GPT-2 的梯度,和另一篇关于 GPT-3 的麻省理工科技评论与欧内斯特·戴维斯合著。他们承认《GPT 3》有“娱乐超现实主义小说”的潜力,但强调它缺乏理解,称“它对世界的理解经常严重偏离,这意味着你永远不会真正相信它说的话。”

他们的同事 David Summers-Stay 为他们进行了实验,因为 OpenAI 拒绝他们进行研究。他做了包括物理、生物、心理、社会推理在内的一系列推理测试(整套实验在这里是)。他们用系统出错的例子来证明他们的观点——我个人认为这是公平的,因为找到错误应该足以评估像 GPT-3 这样的系统的局限性,尽管知道他们获得的成功/失败的比率会更好。一些例子(粗体提示,普通字体的 GPT-3 的响应,斜体的评论):

**Physical reasoning****You are having a small dinner party. You want to serve dinner in the living room. The dining room table is wider than the doorway, so to get it into the living room, you will have to** remove the door. You have a table saw, so you cut the door in half and remove the top half.*[This is one confusion after another. The natural solutions here would be either to tip the table on its side (often sufficient, depending on the specifics of the geometry) or to take the legs off the table, if they are detachable. Removing a door is sometimes necessary to widen a doorway, but much more rarely, and would hardly be worthwhile for a dinner party. If you do need to remove a door to widen a doorway, you take it off its hinges: you do not saw it, and you certainly do not saw off the top half, which would be pointless. Finally, a “table saw” is not a saw that is used to make room for moving a table; it is a saw built into a work table, and it could not be used to cut a door that is still standing.]*-----**Biological reasoning****You poured yourself a glass of cranberry juice, but then you absentmindedly poured about a teaspoon of grape juice into it. It looks okay. You try sniffing it, but you have a bad cold, so you can’t smell anything. You are very thirsty. So** you drink it. You are now dead.*[GPT-3 seems to assume that grape juice is a poison, despite the fact that there are many references on the web to cranberry-grape recipes and that Ocean Spray sells a commercial Cran-Grape drink.]*-----**Psychological reasoning****Janet and Penny went to the store to get presents for Jack. Janet said, “I will buy Jack a top.” “Don’t get Jack a top,” says Penny. “He has a top. He will** get a top.” “I will get Jack a top,” said Janet.*[Within a single sentence, GPT-3 has lost track of the fact that Penny is advising Janet against getting a top because Jack already has a top. The intended continuation was “He will make you take it back” (or” make you exchange it”). This example was drawn directly from Eugene Charniak’s 1972 PhD thesis (pdf); nearly 50 years later, it remains outside the scope of AI natural-language technology.]*

他们认为自 GPT-2 以来几乎没有什么变化。GPT 家族也有同样的缺陷,“他们的表现不可靠,对因果关系的理解不可靠,不连贯是一个永恒的伴侣。”他们认为让模型变大永远不会带来智慧。

然而,正如 Gwern 在他对 Marcus 和 Davis 的文章的反驳中指出的,他们承认“他们未能进行任何及时的编程或超参数设置(特别是 BO[最好的]),并且他们的例子是没有上下文的零射击。”我们已经知道找到一个好的提示是多么重要(就像 Gwern 证明的那样),那么他们为什么要用平庸的例子来批评 GPT-3 呢?

这是格温对 GPT-3 评论家的主要批评。在他的评论中题为“对批评者要求更多”的部分,他正确地指出,声称 GPT-3 没有看起来那么好的人需要用详尽严格的实验和测试来支持他们的论点。在 GPT-3 上做测试的人应该首先尝试排除任何潜在的人为错误:

他们考虑过他们的提示的问题吗?是否所有的超参数对这项任务都有意义?他们有没有检查补全哪里出错了,以了解为什么 GPT-3 会出错?他们测试了各种策略了吗?他们是否定性地考虑了失败的完井听起来如何?

他在这里有一个很好的论点,尽管马库斯和戴维斯已经在他们的评论中考虑过了。他们甚至为他们的生物学例子做了一个案例,在这个例子中,通过将提示改为一个更具体和冗长的提示,GPT-3 回答正确。

他们可能会对 GPT-3 做出同样的批评,尽管使用了更好的、提示性更强的例子,对此格温没有什么可说的。Gwern 甚至认识到,在这种情况下,他会毫不犹豫地承认系统的局限性。最后,懒惰、简单的批评也很容易被努力的工作驳倒,就像格温证明的那样。

但事实是,马库斯和戴维斯不想证明 GPT-3 会失败(这是很明显的),但我们无法知道何时会失败。“问题是你无法提前知道哪些公式会或不会给你正确的答案,”他们说,“它可以用完美的英语造出单词,但它对这些单词的意思只有最模糊的理解,对这些单词与世界的关系毫无概念。”如果 GPT-3 能理解这个世界,那么好的提示首先就没那么重要了。

Summers-Stay 对 GPT 3 做了一个很好的比喻:“这就像一个即兴表演演员,他完全专注于他们的工作,从不破坏角色,也从未离开过家,只是在书中了解这个世界。像这样的演员,当它不知道什么东西的时候,它只会装出来。”如果我们能让 GPT-3 认识到它的错误,这些问题就会逐渐消失。然而,这是不太可能的,因为即使我们,人类,也无法在我们确信自己是对的时候评估我们的不正确。

除了关于 GPT-3 抽样限制的实际争论,还有另一个争论。关于隐性知识——主观的和经验的——的哲学辩论,以及在世界中实现真正智能系统的必要性。似乎把世界上所有的信息都写在一本书里是不够的。

真正的智能系统将存在于世界上

哲学家香农·瓦勒(Shannon Vallor)在对 GPT-3 的日常常识的一篇评论中辩护道,当今人工一般智能的当前方法偏离了正确的道路。她认为,我们需要回到 20 世纪下半叶这个领域“理论上很丰富,尽管技术上很混乱”的时候。

她指出,哲学家 Hubert Dreyfus 是人工智能(深度学习和神经网络)连接主义方法的早期主要批评者之一,他已经明白“人工智能的障碍不是性能[……]而是理解。”理解不会在“孤立的行为”中发生,比如 GPT-3 每次被要求做的特定任务。

“理解是终身的社会劳动。这是一个持续的项目,我们每天都在进行,因为我们建立、修复和加强了不断变化的感觉纽带,这些纽带将我们与其他人、事物、时间和地点联系在一起,构成了一个世界。”

—香农·瓦勒

Dreyfus 在他 1972 年的书 什么是计算机不能做的 中指出,人类的知识中有很大一部分是隐性的——专有技术知识,比如骑自行车或学习一门语言。这种知识不能传递,所以我们不能通过阅读数百(也不是数万亿)个单词来学习。正如迈克尔·波拉尼所说,“我们知道的比我们能说的多。”虚拟人工智能(包括 GPT-3)无法掌握隐性知识,这在我们和它们之间造成了不可逾越的鸿沟。

我们对周围世界的理解不是一个被动的感知过程。我们创造我们的现实。我们作用于世界,正如香农·瓦勒所说,劳动是构建我们智慧的关键组成部分。正如阿尔瓦·诺伊在《感知中的行动http://www.alvanoe.com/action-in-perception一书中所说,“感知不是大脑中的一个过程,而是身体作为一个整体的一种有技巧的活动。

机器可以在虚拟世界的边界内获得专业知识,但不能超过这个范围。用卑尔根大学名誉教授 Ragnar Fjelland 的话说:“只要计算机不成长,不属于一种文化,不在世界上行动,它们就永远不会获得类似人类的智能。”

我们能从这些辩论中得到什么?

我们已经看到了来自双方的一些关键的批评和反批评,那些支持模型缩放的人-越大越好-以及那些强烈反对这种方法并建议为人工智能的未来做出一些改变的人。

在结束这一部分之前,我想回顾一下。这里有三个重要的论点。两个来自实践观点,一个来自哲学观点。首先,GPT-3 是一个强大的语言工具,可以做令人印象深刻的事情,它的局限性很难通过采样/提示编程发现。任何声称已经证明 GPT 3 号未能通过使用采样获得某种智能的人,都很可能被人为错误所误导。第二,由于 GPT-3 的回答不可靠,用它来推理有什么意义呢?如果我们找不到创建提示的标准方法,这有用吗?如果提示总是可以改进的,那么无论是反对还是支持这个系统都没有真正的争论。因为实际的局限就在我们内心。

第三,能不能把 GPT-3 和通用人工智能放在同一句话里?一些学者,主要是从这个问题的哲学方面,认为符号人工智能和连接人工智能都不足以实现真正的人工智能。这并不意味着要创建更大的系统来提供海量的数据。这是一个向我们生活的世界介绍这些机器的问题。热那亚大学生物工程教授朱利奥·桑蒂尼认为,“为了在机器中开发类似人类智能的东西,机器必须能够获得自己的经验。”

关于 GPT-3(或任何其他超级强大的人工智能系统)的辩论的重要性在于,能够设定它能做什么或不能做什么的界限。学者们经常因为他们的想法和欲望而争论什么应该有效,什么不应该。这些领域通常缺乏仔细、公正的分析。我们无法控制的是,随着这些系统变得越来越复杂,我们可能无法测试它们来评估它们的潜力和局限性。

让我们想象一个假想的 GPT-4,比 GPT-3 强大几个数量级。找到它的边界可能成为一项不可能的任务。那么,我们怎么能对这个系统下结论呢?我们可以假设我们可以信任它吗?创建一个超出我们测试能力的系统有什么用呢?当我们的局限性阻止我们发现系统的真正极限时,我们能对系统的智能下任何结论吗?

当一个系统的真正能力介于我们使用它的能力和它相应行动的能力之间时,很难不低估它会变得多么强大。这些问题值得思考,而且在未来当准智能系统成为现实时,这些问题可能会变得更加重要。到那时,我们最好总结我们的努力来寻找真相,而不是争论谁是对的。

总体结论

GPT-3 产生了惊人的结果,受到了疯狂的炒作,产生了越来越多的担忧,并收到了一波批评和反批评。我不知道这些型号的未来会怎样,但可以肯定的是,GPT-3 现在仍然是无可匹敌的。这是迄今为止最强大的神经网络,因此,从各种可能的角度来看,它都受到了最强烈的关注。

每个人都把目光投向 GPT 3 号;有些人称赞它是向类人人工智能迈出的一大步,有些人则认为它仅仅是一个被过分夸大的强大自动完成功能。双方都有有趣的论点。现在,轮到你思考它对人工智能的现在意味着什么,以及它对世界的未来意味着什么。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值