GPT 3 号在不到 3 分钟的时间内解释完毕
所以,你已经在 Twitter 上看到了一些令人惊叹的 GPT-3 演示(机器制作的专栏、诗歌、文章,甚至工作代码)。但是在这个不可思议的模型下到底发生了什么呢?下面是(简介!)往里面看。
GPT 3 是一个神经网络驱动的语言模型。语言模型是预测一个句子在世界上存在的可能性的模型。例如,语言模型可以将句子“我带我的狗去散步”标记为比句子“我带我的香蕉去散步”更可能存在(即在互联网上)这不仅适用于短语,也适用于句子,更普遍的是,适用于任何字符序列。
像大多数语言模型一样,GPT-3 在未标记的文本数据集上进行优雅的训练(在这种情况下,普通爬行)。单词或短语从文本中随机删除,模型必须学会仅使用周围的单词作为上下文来填充它们。这是一个简单的训练任务,可以产生一个强大的通用模型。
GPT-3 模型架构本身是一个基于变压器的神经网络。这种架构在大约 2-3 年前开始流行,并且是流行的 NLP 模型 BERT 的基础。从建筑的角度来看,GPT 3 实际上并不新颖!那么是什么让它如此特别和神奇呢?
真的很大。我是说真的大。它有 1750 亿个参数,是有史以来最大的语言模型(GPT 2 号只有 1.5 个参数!),并在任何语言模型的最大数据集上进行训练。这似乎是 GPT 3 号如此令人印象深刻的主要原因。
神奇的是。因此,GPT-3 可以做任何其他型号都做不到(很好):执行特定任务,无需任何特殊调整。你可以让 GPT-3 成为一名翻译、程序员、诗人或著名作家,它可以用不到 10 个训练例子来做到这一点。该死的。
大多数其他模型(比如 BERT)需要一个精心的微调步骤,你收集成千上万的(比如)法英句子对的例子,教它如何翻译。有了 GPT-3,你不需要做微调的步骤。这是它的核心。这就是让人们对《GPT 3:没有训练数据的定制语言任务》感到兴奋的原因。
今天,GPT-3 是在私人测试,但男孩我不能等待得到它。
更多信息,请查看 daleonai.com 或在 Twitter 上关注@dalequark。
GPT-3,深度学习和自然语言处理的一大步
使用大量数据训练一个足够大的语言模型就能产生智能吗?OpenAI 试图这样做,使用了 1750 亿个参数。
几天前,OpenAI 宣布了他们语言模型(LM)的新继任者——GPT-3。这是迄今为止训练的最大模型,有 1750 亿个参数。虽然训练这种大型模型有其优点,但阅读 72 页的大部分内容可能会令人厌倦。在这篇博文中,我将强调我发现熟悉 LMs 的人感兴趣的部分,他们只是想知道(大部分)这项工作的要点。
语言模型中有什么?
“模型能够在零镜头设置中执行的任务的多样性表明,被训练来最大化充分变化的文本语料库的可能性的高容量模型开始学习如何在不需要明确监督的情况下执行惊人数量的任务”
这是 GPT-2 附带文件的摘录。GPT 3 号在这条道路上又迈出了一步。
更具体地说,作者指出了使用特定任务数据集进行微调的缺点。
- 获取这些数据集很困难。
- 微调允许模型利用伪相关性,这会导致不良的超出分布性能。
- 自然语言中的简短指令通常足以让人类理解给定的任务。这种适应性是 NLP 系统的期望属性。
作者选择的路线是“情境学习”——给模型一个任务说明(提示)和/或几个任务演示作为前缀,将其引向潜在空间中与给定任务相关的子空间。例如,翻译看起来像“问:什么是{语句} A 的{语言}翻译:{翻译}”。
这是基于这样的假设,即模型在训练时开发了一套广泛的技能和模式识别能力,然后在推理时使用这些能力来快速适应或识别所需的任务。
众所周知,低复杂度与下游任务的性能相关,因此人们可以希望更大的模型将产生更好的上下文功能。事实上,这是正确的,如下图所示,测试了一个简单的任务,要求模型从单词中删除随机符号:
较大的模型越来越有效地利用上下文信息。
上下文中示例的数量在 10 到 100 之间变化,因为这通常是模型的上下文大小 2048 所允许的。当例子数量很少时,提示(任务说明)起着重要的作用。
作者测试了许多众所周知的基准,但是首先,让我们检查一下模型规范。
举重
GPT-3 由类似于 GPT-2 的基于变换器的架构组成,包括其中描述的修改的初始化、预归一化和可逆令牌化,除了它在变换器的层中使用交替的密集和局部带状稀疏注意模式,类似于稀疏变换器。
作者训练了几个模型大小,从 1.25 亿个参数到 1,750 亿个参数,以便测量模型大小和基准性能之间的相关性。
给我看你的数据,我就给你看你的未来
作者采取了三个步骤来提高数据集的平均质量:
- 他们根据与一系列高质量参考语料库的相似性,下载并过滤了一个版本的 CommonCrawl。
- 他们执行模糊重复数据删除,以防止冗余并保持保留验证集的完整性。
- 他们将已知的高质量语料库添加到训练组合中。
用于训练 GPT-3 的数据集。
给我看看数字
在下图中,我们可以看到 LMs 的幂定律仍然成立:
借助计算平滑扩展性能。
为了测试预训练验证损失是否与下游任务性能相关,作者评估了已知 NLP 基准的详尽列表,方法是在上下文中输入来自训练集的 K 个示例,以评估来自测试集的示例。在这篇文章中,他们详细介绍了所有的基准,但是在这里,我只选择描述一个小例子:
语言建模
虽然由于训练数据中的包含而被迫跳过许多语言建模困惑相关的数据集,但 PTB 由于早于现代互联网而避开了这个问题,并且 GPT-3 设定了新的 SOTA。
兰巴达
在这项任务中,模型必须预测给定句子的最后一个单词。最近有人提出,在这个困难的基准上,LMs 的持续扩展正在产生收益递减。然而,GPT-3 在零射击设置方面达到了 76%的精度——比前一代 SOTA 提高了 8%。
在少数镜头设置中,任务可以被框定为完形填空任务(填空),使模型更容易理解只需要一个单词。这产生了 86.4%的准确度。
闭卷问答
在这项任务中,GPT-3 优于 SOTA,后者不仅对任务进行微调,而且使用信息检索组件来检索可能包含答案的文本片段。这表明 LMs 随着能力的增加而不断吸收知识。
GPT 3 号在特里维亚卡的表现。
超强力胶水
GPT-3 在一些需要比较两个句子的任务中显得很弱,包括确定一个单词在两个句子中的用法是否相同,一个句子是否是另一个句子的意译,或者一个句子是否暗示另一个句子。
新闻文章生成
作者要求人类评估者区分人类和机器生成的新闻文章。随着模型大小的增加,尽管每篇新闻文章的时间投入增加了,参与者得到的准确度分数却降低了。这支持了较大的模型产生难以区分的新闻文章的发现。
随着模型规模的增加,人们识别新闻文章是否是模型生成的能力下降。
学校里有大量的记忆
从互联网规模的数据集准确检测测试污染是一个新的研究领域,没有既定的最佳实践。随着模型容量的增加,记忆的风险也会增加。总的来说,作者删除了与测试集重叠的文档。然而,由于一个 bug,这个过程有了剩余。他们试图评估损失,看起来这个模型不会记忆,而且(大部分)结果是有效的。
(我自己的注意:也许是时候在整个 ML 领域进行更严格的测试了,就像其他领域的惯例一样。)
限制
虽然 GPT-3 在质量上比它的前身更好,但它的文本合成能力仍然存在我们从其他 LMs 中熟悉的弱点,例如重复,足够长的段落中的连贯损失和矛盾。
此外,GPT 3 号在一些任务中惨败。这可能是由于选择使用自回归 LM,而不是合并双向信息(类似于 Bert)。虽然自回归 LMs 的上下文学习更简单,但双向模型在微调后更擅长下游任务。最后,在 GPT-3 的规模上训练一个双向模型,和/或试图使双向模型与少量学习一起工作,是未来研究的一个有希望的方向。
一个更基本的限制是,自回归(和双向)模型可能最终会遇到(或可能已经遇到)预训练目标的限制。让任务变得更好,例如,理解什么是最重要的预测(如实体),可能对模型有益。将模型建立在其他领域的经验,如视频或现实世界的物理交互,也可能会移动指针。
预训练任务不是最佳的一个证据是样本效率:GPT-3 在预训练期间看到的文本比一个人一生中看到的文本多得多。提高训练前样本效率是未来工作的一个重要方向,可能来自于物理世界的基础以提供额外的信息,或者来自于算法的改进。
此外,对于自我监督的目标,任务规范依赖于将期望的任务强制转化为预测问题,而最终,有用的语言系统(例如虚拟助手)可能更好地被认为是采取目标导向的行动,而不仅仅是进行预测。
另一个限制,或者至少是不确定性,与 GPT-3 中的少镜头学习相关联,是不明确的,即少镜头学习是否实际上在推理时“从零开始”学习新任务,或者它是否只是识别和确定它在训练中学习的任务。
最后但同样重要的是,模型的大小带来了实际的不便。蒸馏是一个有趣的方向,还没有在这个规模上尝试过。
GPT 3 号不知道自己在说什么
OpenAI 的大规模 GPT-3 语言模型产生了令人印象深刻的文本,但仔细分析表明,它的事实都是错误的。
照片:Bakalavar/Dreamstime
想象一下,我们将一艘机器人控制的宇宙飞船发射到银河系的遥远地方,与其他生命形式联系。在船上,我们在互联网上放了一份过去三年所有文本的副本,这样聪明的外星种族就能了解我们的一些情况。在航行了 12 光年之后,飞船进入了卢伊滕星周围的太阳系,在那里外星人登上了飞船。路易坦尼人检索互联网文本的副本,并试图理解它。
他们请顶级语言学家解释这些奇怪的符号,但进展甚微。吕特尼人的地位与十八世纪考古学家相同,他们不断发现带有古埃及象形文字的石头。最后,在 1799 年,考古学家发现了罗塞塔石碑,上面既有埃及象形文字,也有古希腊文字。因为他们有两种语言的同一个法令,他们最终能够理解象形文字的意思。
但我们的吕特尼就没这么幸运了。互联网文本包含英语、法语、俄语和其他语言,但当然没有吕特尼语文本。
他们最多只能分析文本中符号的统计模式。通过这种分析,他们能够生成具有相似统计模式的新文本。例如,他们生成了这段文字:
据《华盛顿邮报》报道,经过两天的激烈辩论,联合卫理公会已经同意进行历史性的分裂——预计最终将产生一个新教派,一个“在神学和社会上保守”的教派。参加 5 月份教会年度大会的大多数代表投票加强了对 LGBTQ 神职人员的任命禁令,并制定了新的规则,将“约束”主持同性婚礼的神职人员。但是那些反对这些措施的人有了一个新计划:他们说他们将在 2020 年前成立一个独立的教派,称他们的教堂为基督教卫理公会教派。《华盛顿邮报》指出,该教派声称有 1250 万成员,在 20 世纪初是“美国最大的新教教派”,但近几十年来一直在萎缩。新的分裂将是教会历史上的第二次。第一次发生在 1968 年,当时大约 10%的教派离开,成立了福音联合弟兄会。《华盛顿邮报》指出,拟议的分裂“发生在教会的关键时刻,教会多年来一直在失去成员,”教会“被推到了 LGBTQ 人士在教会中的角色分裂的边缘。”同性婚姻并不是教会分裂的唯一问题。2016 年,该教派在跨性别神职人员的任命问题上出现分歧,北太平洋地区会议投票禁止他们担任神职人员,南太平洋地区会议投票允许他们担任神职人员。
吕特尼人不知道这种产生的文字是什么意思,他们想知道这对创造这种文字的种族是否有意义。
这段文字实际上是由有史以来最大的机器学习系统 GPT-3 创建的。GPT-3 由 OpenAI 开发,该公司已获得数十亿美元的资金,用于创建人工通用智能(AGI)系统,该系统可以获取常识性的世界知识和常识性的推理规则。GPT-3 有 1750 亿个参数,据报道花费1200 万美元来训练。
GPT-3
OpenAI 团队使用 GPT-3 生成了 80 条如上图所示的文本,并将这些文本与人们生成的新闻文本混合在一起。他们做了一项研究,要求使用亚马逊的机械土耳其人招募的工人确定每篇文章是由人还是计算机生成的。GPT-3 生成的文章被识别为机器生成的概率为 52%,比随机生成的概率仅高 2%。从本质上讲,这些被雇佣的工人无法区分人类生成的文本和 GPT-3 生成的文本。事实上,上面显示的新闻文章被 88%的员工认为是人为的。
像 GPT-3 这样的文本统计模型被称为 语言模型 。GPT 3 是一系列日益强大的语言模型中的最新一个。2018 年发布的首款 GPT 车型,拥有约 1.5 亿个参数。2019 年发布的 GPT-2 拥有 15 亿个参数,比最初的 GPT 多一个数量级,但比 GPT-3 少两个数量级。
一些研究人员提出,语言模型以某种方式神奇地学习关于世界的常识,并基于这些常识学习推理。他们认为语言模型可以利用这些常识和推理来生成文本。更重要的是,这种常识性的知识可以作为发展 AGI 能力的基础。
事实核查
然而,尽管 GPT-3 生成的文章听起来似乎有理,但如果你试图验证 GPT-3 生成的上述文本中的事实,你会很快意识到大多数重要事实都是错误的。真正发生的是 2020 年 1 月的一个新闻故事,被许多新闻媒体报道,包括华盛顿邮报。这个故事是,联合卫理公会的官员提议将教会拆分,将在 2020 年 5 月的大会上投票表决。
《GPT 协议 3》的文章可能从这些新闻文章中获得了大部分的单词模式。然而,GPT-3 将这些单词模式合并成了大部分事实都是错误的句子:
- 大会每四年举行一次,而不是每年一次。
- 培训时,大会投票定于 2020 年 5 月。这还没有发生。
- 约束神职人员的新规则还没有被投票表决。然而,之前提出的一系列规则引发了分歧讨论。
- 1968 年的分裂从未发生过。事实上,1968 年的事件是合并,而不是分裂。
- 教会不会将会员大会(或任何我能找到的关于会员大会的信息)分成北太平洋和南太平洋两个分别投票的会议。
我无法访问 GPT-3,但每个人都可以在 https://talktotransformer.com/的站点访问它的前任 GPT-2。您可以键入起始文本,GPT-2 将创建后续文本。
例如,当我输入“康涅狄格的交通……”, GPT-2 产生了这样的文本:
康涅狄格州 和纽约州的交通大致处于满负荷运行状态,许多长岛高速公路和长岛铁路公路交汇处都在收取通行费。这可能会影响今年剩下的时间,因为司机们试图弄清楚他们的旅行是否会一切顺利。在新泽西州,司机预计将首次支付超过 1000 美元,使用港务局新的横跨哈德逊河的免费桥梁。
第一句话开头很好,但随后它开始谈论长岛铁路交汇处的通行费。然而,这违背了我们的常识,因为我们知道火车不会因为收费而停下来。第二句还好,虽然很难确定它的意思。第三句话是哪里出轨了。纽约和新泽西的通行费很高,但还不到 1000 美元。
为什么 GPT-3 和其他语言模型得到的事实是错误的?因为 GPT-3 就像虚构的吕特尼人一样,对其输入文本或生成文本的含义没有常识性的理解。这只是一个统计模型。
NYU 教授 Gary Marcus 写了许多论文并做了许多演讲,批评 GPT-2 获得常识性知识和推理规则的解释。正如他所说:“……仔细检查后,很明显系统不知道它在说什么……”。另见这篇 《纽约客》杂志文章,它描述了 GPT-2 在杂志的大量档案中接受训练后产生的故事。
结论
GPT-3 正在学习关于单词共现的统计特性。在它得到正确事实的时候,GPT-2 可能只是反刍一些记忆的句子片段。当它得到错误的事实时,那是因为它只是根据一个单词跟随另一个单词的统计可能性将单词串在一起。
缺乏常识性的推理并不会使语言模型变得无用。相反,它们可能非常有用。谷歌在其 Gmail 系统的智能撰写功能中使用了语言模型。Smart Compose 预测用户将要键入的下一个单词,用户可以通过按 TAB 键来接受它们。
然而,GPT-3 似乎没有学习常识,也没有学习根据这些知识进行推理。因此,它无法启动 AGI 系统的发展,这些系统像人类一样将常识推理应用于他们对世界的知识。
随意访问 人工智能视角 在那里你可以找到免费的在线人工智能手册,有 15 章,400 页,3000 篇参考文献,没有高等数学。
原载于 2020 年 7 月 6 日 https://www.aiperspectives.com。
GPT 3 号是未来。但是 NLP 在当下能做什么呢?
GPT 3 号闪闪发光,但仍有一段距离。让我们使用当今最先进的语言模型。再加点《星际迷航》来找乐子
Jelleke Vanooteghem 在 Unsplash 上拍摄的照片
关于 OpenAI 最新和最伟大的语言模型 GPT 3 的奇迹,已经有很多笔墨(或像素照明)了。用风投的话说:
由 30 多名 OpenAI 研究人员组成的团队发布了一篇关于 GPT - 3 的论文,这是一种语言模型,能够在一系列基准和独特的自然语言处理任务上实现最先进的结果,这些任务从语言翻译到生成新闻文章到回答 SAT 问题。
麻省理工学院在推特上写道:
公平地说,有些例子很惊人:
但是像大多数由语言模型产生的例子一样,几乎所有的例子都是经过多次运行后由人类手工选择的。因为不太好的结果不会成为新闻。
即使考虑到这一点,我仍然被我所看到的 GPT 3 号震撼了。但是现在我没有办法得到它的任何实际用途——目前它只对少数研究人员开放。我们这些凡人呢?当然除了玩 AI 地牢之外…
玩 GPT 2!
现在,我们可以和 GPT 3 号的哥哥 GPT 2 号一起玩。几周前我写了 easy_text_generator ,这是一个在浏览器中从语言模型生成任意长度文本的工具。你可以使用 GPT-2 或几个预先训练或提炼的版本(从 huggingface 下载)来生成不同类型的文本,如电影脚本、星际旅行脚本、 IMDB 电影评论,或者只是一般的文本。
或者如果你想零安装,你可以直接从 huggingface 的网站生成文本,只是长度有限。例如,在这里试试 GPT-2 。
让我们生成一些文本!
正如我所说,你可能见过的大多数 GPT-3 的例子都是精心挑选的。为了进行合理的比较,我将每个语言模型运行 5 次,并为每个模型挑选一个输出。其他的我会放在另一篇博文里,否则,这篇博文会太长。
我们先来看看通用文本。由于我刚开始在一家公司从事神经搜索,我们将使用一些适当的种子文本:
In short, neural search is a new approach to retrieving information.
GPT-2
GPT-2 可以创造惊人的结果(查看说英语的独角兽的例子),但它需要它的甜蜜时间,吞噬 CPU 和内存。大约 10 分钟后,它吐出了以下内容:
简而言之,神经搜索是一种检索信息的新方法。在理想的情况下,应该有很多新的数据需要搜索,但是大部分数据已经存储在关系数据库中。这就是为什么大多数时候最好不要在数据库中存储任何信息。在未来,我们想要的是信息可以被简单地搜索到。但是,即使信息很容易被搜索到,仍然存在如何在数据库中组合多个搜索词的问题。组合搜索词的一种方法是使用搜索引擎,但当我们在谷歌或任何其他搜索引擎上搜索某个东西时,它们通常会很好,但有时它们会出错,它们只会显示部分结果,有时它们不会显示所有结果,或者它们会说一些非常具体的东西,但你无法在特定的搜索中找到它。神经搜索最重要的目标之一是让他们更容易地搜索,以便他们能够做出更好的决定。但仍然有一个问题:一些类型的问题并不适合它,如果搜索引擎没有在正确的地方使用正确的工具,这可能会导致大量信息丢失。现在,我认为我们可以从神经搜索中吸取一些教训来解决这个问题…
对我来说看起来有点连贯,虽然它没有保持一个清晰的叙述,亲爱的上帝,其中一些连续的句子!
蒸馏 2
distilGPT2 是 GPT-2 的一个更有效的版本,删除了一些多余的神经元。从它的输出来看,也许神经元太多了!生成每个结果大约需要一分钟:
简而言之,神经搜索是一种检索信息的新方法。但近年来,该领域鲜有进展,现在有证据表明,它在检测和分析人类皮肤上的神经网络方面更加准确。这是这个故事的要点。中国国家科学研究基金会(CSRF)的研究人员与加州大学圣地亚哥分校的研究人员合作,他们正在研究一种神经成像和学习网络,该网络将绘制和重建人类皮肤上的神经网络。这个大脑项目旨在研究大脑的视觉皮层,以便它可以在不丢失信息的情况下向个人学习。CSRF 还将使用神经网络绘制大脑的感觉皮层和大脑皮层,以及前部和尾部皮层,这是大脑中央皮层的一部分。但这可能不是探索破译神经网络的第一步,神经网络是一种用于搜索各种人的信息模式的方法,包括那些不在药物接受端的人。加州大学圣地亚哥分校(USDA)的研究人员与中国国家科学研究基金会(CSRF)的科学家合作,与 CSRF 合作,开发了一种允许科学家搜索皮肤信息模式的技术。研究人员分析了大脑的感觉…
如果我们把种子文本扔向一些旨在产生不同东西的东西,比如电影剧本,会怎么样?
gpt2 _ 电影 _ 剧本
gpt2_film_scripts 是通过在 1,300 个剧本上微调 GPT-2,完成的,与常规文本相比,它们有着怪异的间距和边距。当你生成例子时,这真的显示出来了。像 GPT-2(这个模型就是基于它)一样,每个例子需要 10 分钟:
简而言之,神经搜索是一种检索信息的新方法。已经有很多很多的研究表明,我们找到的,我们寻找的。这是一种计算机辅助搜索。
艾丽斯
我不喜欢那样。我觉得自己像个傻瓜。她还在起床,已经上了一上午的课。她坐在书桌前,研究着电脑屏幕。这是一大堆文件,她很快浏览了一遍,很快注意到一只猫的照片。她盯着照片,拿出一个小文件。
Via gfycat
正如我们所看到的,语言模型已经学会了如何骂人,而且不怕这么做!(我不得不手动审查它的便壶嘴)。我们还可以看到它理解角色台词和舞台方向。就像每个网民一样,它对猫情有独钟。(如果与其他样品相比,它看起来有点短,那是因为它增加了许多间隔(对于 magins ),所以 Medium 剥离了。
trekbot
我的一个梦想是创作完全由人工智能生成的《星际迷航》剧集。少校数据科学,如果你愿意的话。所以我在《t2》上训练了 gpt2_film_scripts,这是我能找到的每一个《星际迷航》剧本。
然后……在说了那句悲惨的《星际迷航》双关语后,我的 easy_text_generator 崩溃了。我有一种感觉,这些人工智能可能比我们想象的更聪明(也更情绪化)。
通过 gfycat
重新启动后:
简而言之,神经搜索是一种检索信息的新方法。新的前进方向。
法里斯:关键是神经模式本身,而不是计算机。
西斯科:但是电脑可以做到这一点。
法里斯:这是计算神经网络理论的突破。很明显,它们需要被设计成能够学习、复制,然后分享它们的知识以用于实际应用。
西斯科:那你就有问题了。我们怎么知道会有用?
法里斯:我们可能永远不会在纸上看到它,但从各方面考虑,神经模式发生器是我见过的最有前途的硬件。
西斯科:我们最终会到达那里的。当我们这么做的时候,我们能相信这个吗?
[法里斯的办公室]
法里斯:神经模式发生器将是我见过的最有前途的硬件。
[船长办公室]
(莫恩正在星际舰队总部发表演讲,雷丁。)
法里斯:我和我的同事花了一年时间开发原型,将于今年年底推出。
西斯科:那会如何影响星际舰队的运作?
一点也不差。对于任何了解《星际迷航》的人来说,这听起来很有说服力(尽管 Morn 发表演讲显然很搞笑。)
不太爱说话的早晨。Via gfycat
这是一个总结(目前)
正如我们在上面看到的,GPT 2 号相当强大。既用于生成通用文本,也用于更具体的用例(如 Star Trek 脚本)。
但是对于这些特定的用例,GPT-2 需要大量的数据,以及大量的历元来检查所有的数据。GPT-3 承诺“少量学习”,所以我们只需向它扔几个例子,它就会很快学会这种风格。因此,如果你喜欢《指环王》系列的新书,或者关于的新闻稿,GPT-3 可能是你的语言模型!
如果你想要一个简单的方法来开始生成你自己的语言,看看easy _ text _ generator repo。我很想看看会有什么结果!
Alex 是纪娜人工智能公司的开源倡导者,电子蝴蝶的建造者,编写糟糕的星际旅行脚本的 janky 语言模型的训练者。
GPT-3:只是另一个语言模型,但是更大
理解 GPT-3 研究论文
GPT-3 在很短的时间内接管了 NLP 世界。证明了增加参数个数会提高模型精度的理论。
Sam Altman 的推文,公共领域
由作者在 befunky 上创建
什么是语言模型?
语言模型试图预测给定 m 个单词的下一个单词。它将概率分配给下一个单词,使句子更有可能。
什么是 GPT-3?
它是 GPT-2 语言模型的继承者,具有最多的待训练参数。OpenAI 创建了 GPT-3 模型,它证明了语言模型的大小与准确度成正比,因此,我们越增加模型的大小,准确度越高。
参考: GPT-3 研究论文,公共领域
正如我们从图表中看到的,语言模型数量的增加成比例地提高了准确性。因此,可以通过向模型添加更多的参数来获得更高的精度。
GPT-3 是目前最大的语言模型,拥有 1750 亿个参数,比拥有 170 亿个参数的图灵-NLG 模型大 10 倍。
在这个博客中,我们将浏览 GPT-3 的研究论文,并推断为什么它只是另一种语言模型,为什么它不能被称为可以模仿任何水平的人类的模型。这是目前最好的语言模型,但不是能够理解和学习人类语言的模型。
测试模型的设置:
- 少镜头(FS) 指的是很少的例子与任务描述一起给出给模型。因此,不是为特定任务提供完整的数据集,而是给模型提供描述以及一些 k 示例,然后向模型提出问题。k 示例在 10 到 100 的范围内,并且不允许模型基于该示例进行任何权重改变。优点是该模型不需要大的数据集来学习特定的任务,但是精度仍然不能与最新的任务特定模型相比。
少数镜头设置示例|参考: GPT-3 研究论文,公共领域
- 单镜头(OS) 类似于 k 等于 1 的少镜头。所以模型只需要理解基于一个例子的任务。这种学习方式类似于人类的学习方式。这一次也不允许模特改变体重。
一次性设置示例|参考: GPT-3 研究论文,公共领域
- **零拍(ZS)**k 值为零。没有向模型提供示例。模型需要从任务描述中理解模型需要做什么。
零射击设置示例|参考: GPT-3 研究论文,公共领域
该模型的准确性与最新的任务特定模型(也称为微调模型)进行了比较。这种模型的缺点是他们需要庞大的特定任务数据集来进行训练。这种类型的模型是特定于任务的,在其他任务上表现不佳。
微调模型|参考: GPT-3 研究论文,公共领域
训练数据集
GPT 3 号使用的数据集非常庞大,几乎包含了互联网上的所有内容。对训练数据集进行了模糊搜索,以删除与测试和验证数据集相关的任何内容,这将有助于提供更准确的结果。他们通过合并各种数据集和爬行创建了这个数据集。
GPT-3 使用的数据集|参考: GPT-3 研究论文,公共领域
培训过程
他们使用梯度噪声标度来找出要使用的正确批量。架构与 GPT-2 相似,但稍有改动。
结果
在各种自然语言任务和各种数据集上评估了 GPT-3。
语言建模、完形填空和完成任务
λ数据集
Context: “Yes, I thought I was going to lose the baby.” “I was scared too,” he stated, sincerity flooding his eyes. “You were ?” “Yes, of course. Why do you even ask?” “This baby wasn’t exactly planned for.” Target sentence: “Do you honestly think that I would want you to have a _______ ?” Target word: miscarriage
在这个数据集中,上下文被给出,然后句子被给出给模型,空白需要由模型完成。单词的选择应该基于给定的上下文,而不是过去的知识模型。这个数据集证明了模型能够理解上下文,并在此基础上提供答案。
GPT-3 在兰巴达数据集上的准确性|参考: GPT-3 研究论文,公共领域
正如我们所看到的,在这个数据集上,GPT-3 的所有设置都超过了 SOTA 的精度。GPT-3 的单发精度低于零发精度。我们可以暗示,GPT-3 用任何一个例子都比用一个例子预测得更准确。GPT-3 可能通过训练集获得了数据集的知识,并且在少击方法中,模型可以更准确地知道使用哪个权重。因为当你在谷歌上搜索 *Yes, of course. Why do you even ask?"This baby wasn't planned for.”*
的时候,你可以找到各种链接来回答这个问题。
HellaSwag 数据集
A woman is outside with a bucket and a dog. The dog is running around trying to avoid a bath. She … A. rinses the bucket off with soap and blow dry the dog’s head.
B. uses a hose to keep it from getting soapy.
C. gets the dog wet, then it runs away again.
D. gets into a bath tub with the dog.
这些是选择题,其中模型需要选择最合适的选项。该数据集用于测试模型的常识。GPT-3 FS 达到了 79.3%的精度,比 SOTA 低 6%,后者是经过微调的多任务模型。
故事完形填空数据集
**Context**: Sammy’s coffee grinder was broken. He needed something to crush up his coffee beans. He put his coffee beans in a plastic bag. He tried crushing them with a hammer. **Right Ending**: It worked for Sammy. **Wrong Ending**: Sammy was not that much into coffee.
这些数据集也用于常识测试。在这种情况下,模型被赋予上下文,并且模型必须从提供的两个选项中预测正确的结局。GPT-3 FS 已达到 87.7%的精度,远低于 SOTA,但在 GPT-3 ZS 显示了 10%的巨大改进。
闭卷问答
开卷问答应用于搜索引擎中,搜索引擎可以搜索相关信息并从中提取答案。在closed book
中,不允许模型进行搜索,也没有提供任何上下文或摘录来了解模型实际上在询问什么。
这个数据集是基于事实的,也就是说答案是事实,而不是依赖于任何上下文。因此,我们可以说,这个数据集测试了模型的记忆,因为 GPT-3 也是在维基百科文本上训练的。
TriviaQA 示例|参考: TriviaQA 研究论文,公共领域
模型被提问,并期望得到基于事实的答案。摘录仅供我们参考,不提供给模型。也允许多个答案,例如,如果答案是姓名比尔盖茨,答案可以是比尔,盖茨,比尔盖茨,微软创始人比尔盖茨。
TriviaQA 准确性|参考: GPT-3 研究论文,公共领域
我们可以看到,GPT-3 已经超过了微调开放图书 SOTA。因此,我们可以说,GPT-3 是更有效的信息检索引擎的事实。
WebQuestions(WebQA)
这个数据集类似于 TriviaQA,但是这个数据集是由真实世界中的真实用户提出的真实世界的问题组成的。因此,它在真实世界场景中测试模型。
WebQA 实例|参考: WebQA 研究论文,公共领域
GPT-3 FS 与微调过的 SOTA 型号具有相似的精度。
自然题 (NQs)
该数据集由 Google 提供,用于在现实世界中测试问答模型。所有的问题都是用户在谷歌搜索上搜索出来的。在模型中,试图从维基百科页面中预测可能包含问题答案的段落。模型还预测了这个问题的精确答案。但是短答案必须出现在所选段落中,也称为长答案。
自然题例|参考: NQs 研究论文,公共领域
GPT-3 FS 设置的精度比微调过的 SOTA 低 29.9%。这个数据集测试了模型保留维基百科信息的极限。
通过这种测试,我们可以说,模型越大,可以保留的信息就越多,因此准确度就越高。
翻译
GPT-3 在语言翻译方面的准确性令人惊讶。因为训练集的 93%的单词是英语。所以,这个模型会更偏向于英语而不是其他语言。GPT-3 是 GPT-2 的升级版,测试了除英语之外的法语、德语和罗马尼亚语的机器翻译。
机器翻译任务的模型效率是用 BLEU 来衡量的,而不是准确性。我们改天会调查它。
BLEU 在 6 个语言对上计算:
- 英语到法语(英语→法语)
- 法语到英语(法语→英语)
- 英语到德语(英语→德语)
- 德语到英语(德→恩)
- 英语到罗马尼亚语(En→Ro)
- 罗马尼亚语到英语(Ro→En)
训练数据集具有大约 92.5%的英语单词、1.8%的法语单词、1.5%的德语单词和 0.16%的罗马尼亚语单词。
6 种语言对的 BLEU 评分|参考: GPT-3 研究论文,公共领域
我们可以看到,在将任何文本翻译成英语时,GPT-3 模型几乎比 SOTA 模型更好。
零拍示例:
Q: What is the {language} translation of {sentence} A: {translation}.
正如我们所看到的,只有描述文本与句子和目标语言一起被提供给模型。
单镜头和少镜头示例:
一次性和少量学习的格式|参考: GPT-3 研究论文,公共领域
对于少数镜头,在提问之前,给模型提供了大约 64 个例子。
少数镜头 BLEU 评分|参考: GPT-3 研究论文,公共领域
正如我们可以看到的,随着数据的增加,模型的 BLEU 分数增加。英语->法语的分数大于英语->德语,德语大于英语->罗马尼亚语,并且与数据集中每种语言的单词百分比成比例。
Winograd 风格的任务
这类任务包括确定句子中使用的代词是什么样的。这个代词对计算机来说是模糊的,但对人类来说却是明确的。部分评估方法用于评估,您可以在此处阅读。
"**sentence**": "The city councilmen refused the demonstrators a permit because [they] feared violence.", "**answer1**": "The demonstrators"
"**answer0**": "The city councilmen""**sentence_switched**": "The demonstrators refused the city councilmen a permit because [they] feared violence."
句子的答案必须是answer1
,但是一旦我们转换句子,答案也应该变成answer0
威诺格拉 数据集
Winograd 示例|参考: GPT-3 研究论文,公共领域
GPT 3 号在这个数据集上的表现低于 SOTA。在训练数据集中也发现了一些测试集的例子。
wino grande数据集
该数据集类似于 winograde 数据集,但更高级、更困难。
Winogrande 数据集|参考: GPT-3 研究论文,公共领域
GPT-3 在 Winograde 式任务上的准确性|参考: GPT-3 研究论文,公共领域
常识推理
该测试旨在测试模型如何将常识应用到现实世界的问题中。例如,如果我们问人类几点了?人类会回应当前时间,如下午 5:30,而不是解释时间的概念。我们用常识来检验这个模型是否能回答这样的问题。以前的所有任务大多依赖于数据和概率,而不是模型实际理解内部概念的程度。在这里,我们测试模型理解人类语言的程度。
PhysicalQA 数据集
PIQA 范例|参考: PhysicalQA 研究论文,公共领域
对于所有类型的调优,GPT-3 在这个数据集上以很小的优势击败了 SOTA。但是由于可能的数据污染,对这一结果的信心不大。
我们的分析将 PIQA 标记为潜在的数据污染问题(尽管隐藏了测试标签),因此我们保守地用星号标记结果。
GPT-3 在 PIQA 数据集上的表现|参考: GPT-3 研究论文,公共领域
该数据集由 3 至 9 年级的多项选择题组成。数据集分为几个部分:1 .简易版 2。挑战版。挑战集由基于检索的算法错误回答的问题组成。
GPT-3 在这个数据集上的性能远远低于由 UnifiedQA 实现的 SOTA。
ARC 挑战集示例|参考: GPT-3 研究论文,公共领域
OpenBookQA数据集
这个数据集类似于开卷测试,问题的答案是事实和常识的结合。
OpenBookQA 实例|参考: OpenBookQA 研究论文,公共领域
GPT-3 常识推理任务中的准确性|参考: GPT-3 研究论文,公共领域
由于 GPT-3 是在互联网上出现的所有文本上训练的,所以回答 GPT-3 是否应用常识来回答这个问题是一个好问题,而不仅仅是检索训练数据集中某处可用的信息。
阅读理解
在这里,我们测试模型理解文章和根据文章中提供的信息回答问题的能力。
在这个数据集中,提供了段落,所提的问题基于人类之间的对话。
少量调整的 CoQA 示例|参考: GPT-3 研究论文,公共领域
这个数据集非常有趣,因为学生并没有看到文章,而是问了一些问题,这些问题由老师来回答。学生问基本问题,教师回答一些额外的上下文,学生再问另一个问题。如果老师不能回答太多的问题,或者如果学生没有问任何相关的问题,互动就结束了。
QuAC 数据集示例|参考: GPT-3 研究论文,公共领域
在此数据集中,模型必须解析问题中的引用,可能是对多个输入位置的引用,并对它们执行离散操作,如加法、计数或排序。
**Passage**: Although the movement initially gathered some 60,000 adherents, the subsequent establishment of the Bulgarian Exarchate reduced their number by some 75%.**Question**: How many adherents were left after the establishment of the Bulgarian Exarchate?**Correct Answer**: 15,000
正如我们在这里看到的,模型需要理解文章和问题,以便正确地回答它,它还应该对它执行一些操作,而不仅仅是检索信息。
除了在文章中有答案的问题,在文章中没有答案的问题也被提出。对于文章中没有答案的问题,该模型不会给出答案。
SQuAD 2.0 示例|参考: GPT-3 研究论文,公共领域
这个数据集由 12 到 18 岁的中国学生参加的初中和高中英语考试的短文组成,旨在评估学生的推理能力。数据集分为两部分:1 .RACE-m 数据集由中学 2 的段落组成。RACE-h 数据集由高中的段落组成。
RACE-m 示例|参考: GPT-3 研究论文,公共领域
GPT-3 对阅读理解的准确性|参考: GPT-3 研究论文,公共领域
强力胶水
它可以被认为是所有能够执行多种语言建模任务的 NLP 模型的标准化测试。它根据模型在不同任务中的表现给出单一结果。由于结果是单一值,因此很容易在相同的规模上比较不同的模型。
该基准测试包括以下任务:
- 问题回答
- 自然语言推理(NLI)
- 共指消解(coref。)
- 词义消歧(WSD)
使用的数据集:
强力胶基准|参考:强力胶研究论文,公共领域
GPT-3 在强力胶上的表现|参考: GPT-3 研究论文,公共领域
对于 GPT-3,在上下文中使用了 32 个例子。
GPT-3 FS 强力胶基准测试示例|参考: GPT-3 研究论文,公共领域
正如我们可以看到更多的例子,GPT-3 的准确性增加,但在非常小的数量。当在上下文中给出 8 个例子时,GPT-3 FS 超过了微调的 BERT-Large。
自然语言推理(NLI)
在这种类型的任务中,模型决定两个句子之间的关系。这是一个分类问题,模型将第二个句子分为三类:1。支持第一句 2。与第一句相矛盾。中立的
RTE 数据集用于在 NLI 任务上测试模型。与 RTE 一起,更难对抗的 NLI (ANLI)被用于测试 GPT-3 模型。在安立 GPT-3 的表现略好于随机机遇,但远低于 SOTA。
安力根据难度分为三组:第一轮、第二轮、第三轮。
安理 R1 举例|参考: GPT-3 研究论文,公共领域
安理 R2 举例|参考: GPT-3 研究论文,公共领域
安立 R3 举例|参考: GPT-3 研究论文,公共领域
综合和定性任务
在这项测试中,GPT-3 执行各种综合任务,如算术运算,重新排列和解读单词中的字母,解决 SAT 式的类比问题,在句子中使用新单词,纠正英语语法,以及生成新闻文章。
算术
在这个测试中,GPT-3 执行算术运算的能力得到了检验。各种算术运算,如加法,减法和乘法测试。
算术问题包括以下类型:
- 两位数加法(2D+)
- 两位数减法(2D-)
- 3 位数加法(3D+)
- 3 位数减法(3D-)
- 4 位数加法(4D+)
- 4 位数减法(4D-)
- 5 位数加法(5D+)
- 5 位数减法(5D-)
- 两位数乘法(2Dx)
- 一位数复合(1DC)
与其他类型的设置相比,该模型在少拍设置中表现更好。而且,随着位数的增加,精度会大大降低。GPT-3 在这一系列上比小型号有了巨大的飞跃。
Examples of the questions asked to GPT-3:Q: What is 17 minus 14?
Q: What is (2 * 4) * 6?
Q: What is 95 times 45?
Q: What is 98 plus 45?
GPT-3 关于算术运算的准确性|参考: GPT-3 研究论文,公共领域
GPT-3 FS 结果|参考:GPT-3 研究论文
随着数字的增加,模型的精度呈指数下降。和复合方程等复杂运算越多,模型性能越差。
该模型可能已经记住了较小的数字算术运算,因为它们在互联网上比大数字更常见。在训练集中搜索“< NUM1 > + < NUM2 > =”和“< NUM1 > - < NUM2 > =”,对于测试用例只找到 0.8%和 0.1%的匹配。但是,训练集可能具有“四十二+二十三等于六十五”或“四十二加二十三等于六十五”类型的等式,并且模型可能已经将整数和运算映射到该串。
根据错误的结果检查该模型,发现当操作包括进位时,该模型工作不正确。
单词打乱和操作任务
在这种情况下,对单词进行各种操作,并将其作为模型的输入。模型需要预测原始单词。
该任务包括 5 种类型的任务:
- 循环单词(CL) 中的字母——循环单词的字母,并要求模型找到原始单词。
循环信函示例|参考: GPT-3 研究论文,公共领域
2.除第一个和最后一个字符之外的所有字符的变位词(A1) —除了第一个和最后一个字母之外,单词的所有字母都被打乱。模型需要输出原始单词。
A1 字谜示例|参考: GPT-3 研究论文,公共领域
3.除了前两个和后两个字符之外的所有字符的变位词(A2) —除了前两个和后两个字母之外,单词的所有字母都被打乱。该模型需要输出原始单词。
A2 字谜示例|参考: GPT-3 研究论文,公共领域
4.单词中的随机插入(R1) —在字母之间插入随机标点或空格,模型需要预测原始单词。
随机插入(R1)示例|参考: GPT-3 研究论文,公共领域
5.反向单词(RW) —单词反向拼写,模型需要预测原始单词。
反向单词(RW)示例|参考: GPT-3 研究论文,公共领域
该模型在零触发设置中表现不佳,在单触发设置中表现一般。该模型给出了 100 个少镜头设置的例子,表现相当好。
解读任务的准确性|参考: GPT-3 研究论文,公共领域
SAT 类比
在这种情况下,模型需要回答基于类比的问题。这道题是高考 SAT 中问的。随机猜测的准确率是 20%,而大学生的平均分是 57%。GPT-3 少数几次设置实现了 65.2%的准确性,一次设置实现了 59.1%的准确性,远高于学生的平均水平。零炮设置的准确率为 53.7%。对于少拍设置,给出的示例数量为 20 个。
SAT 类比示例|参考: GPT-3 研究论文,公共领域
新闻文章生成
在这个模型中,提供了标题和副标题,它需要用它们来写一篇 200 字左右的文章。该模型只在少数镜头设置上进行了测试,因为模型无法理解它是否需要写一篇文章或需要作为后续推文进行响应。
将 GPT-3 的性能与故意制造次品的控制模型进行了比较。人被用来区分物品是人做的还是模型做的。人类以 86%的准确度准确地检测到文章是由控制模型生成的。但是随着模型大小的增加,人类能够以 52%的准确度检测到文章是由模型生成的。
被该模型检测到的大多数文章包含错误的事实信息,或者有重复的句子和不寻常的措辞。
该模型也在具有 500 个单词的文章上进行测试,但是人类仍然只能区分 52%的人类文章。
由 GPT-3 生成的文章被检测到只有 12%的准确性|参考: GPT-3 研究论文,公共领域
当你用谷歌搜索上述文章中的任何一句话时,你会找到一些有着相似句子的不同主题的文章。很有可能,GPT-3 在整个互联网上接受的训练可能只是用不到 500 个字总结了相关主题的所有文章。而不是生成文章,它可能只是合并不同文章的各种句子,从而使文章类似于人类。如果我们提供非常独特的标题,我们将知道 GPT-3 是否能生成文章。
人类检测文章 500 字的准确率是人类写的还是模型写的|参考: GPT-3 研究论文,公共领域
学习和使用新单词
在这种情况下,测试模型在定义单词一次后是否可以在句子中使用该单词。
因此,为了测试这个任务的模型,单词定义被给定一次,所以一次性设置,但是提供了每个单词定义的例子,因此,关于任务描述的少量设置。
GPT 新协议中定义和使用新词的示例|参考:GPT 新协议研究论文
这些单词是人类造的,因此,模特事先对此一无所知。我们可以看到模型使用定义的单词生成了所有符合逻辑的句子。
纠正英语语法
测试该模型是否能够预测错误的语法并能够用正确的语法修改句子。该模型在少拍设置上进行了测试。
纠正英语语法|参考: GPT-3 研究论文,公共领域
正如我们所看到的,该模型是在非常基本的语法上进行测试的,而不是在复杂的语法上,如子句。很高兴看到模型在如此糟糕的语法上的表现,因为即使对人类来说,这也是一项复杂的任务。
测量和防止基准记忆
由于训练数据集是通过爬取互联网生成的,因此训练数据集可能包含各种测试集示例。如果发生这种情况,那么模型在各种任务上报告的准确性的置信度可能是不可靠的。
在训练数据集中搜索测试集示例,如果两个集中的 N 个单词相似,则认为文档匹配。n 等于每组单词中第 5 个百分位数的示例长度。较小的 N 值会导致大量不符合逻辑的匹配。因此,N 的最小值保持为 8,最大值保持为 13。根据最小长度匹配 n 个单词或整个句子。如果找到匹配,则该示例被认为是脏的,否则是干净的示例。
在 clean 数据集上对 GPT-3 进行了各种任务的测试,并将精确度与原始分数进行了比较。如果精度几乎匹配,则意味着即使存在污染也不会影响模型精度。如果准确度低于原始分数,则意味着污染夸大了结果。
基准污染分析|参考: GPT-3 研究论文,公共领域
对于数据集 QuAC,数据集内存在 0%的干净数据,但精度仍正向变化 20%,这肯定意味着它有问题。他们发现大约 90%的数据集被污染。但是,经过进一步的分析推断,训练集只包括段落,而不包括问题和答案。
GPT-3 有各种局限性,在文本合成等领域仍有改进的机会。GPT-3 是基于训练数据集,因此,不能认为它自己的。如果大多数人对性别、种族、宗教有偏见,那么这个模型也会代表这些偏见。更多的限制和偏见,你可以在这里阅读。麻省理工科技评论也发表了一篇关于 GPT-3 局限性的博客。
GPT-3 模型只是预测下一个单词应该出现。它不理解上下文,也不理解单词的实际含义。该模型缺乏逻辑推理和常识推理。模型输出可以通过调整数据集来改变。
这条推文显示了 GPT 的偏见-3 |推文由脸书公共领域副总裁 Jerome Pesenti 发布
以下是您了解 GPT-3 更多信息的重要资源:
[## 你可以通过这些 YouTube 视频了解 GPT 3
通过这些 YouTube 视频,在不到 3 分钟的时间内对 GPT 3 号有一个初步的了解
towardsdatascience.com](/you-can-understand-gpt-3-with-these-youtube-videos-6a30887c928b) [## 了解 GPT-3 -分析杂志的顶级免费资源
随着开放人工智能发布其前卫的预训练语言模型——GPT-3 突然成为了…
analyticsindiamag.com](https://analyticsindiamag.com/top-free-resources-to-learn-gpt-3/)
感谢您的阅读,祝您有美好的一天。
*斜体文字仅为个人观点
GPT-3,OpenAI 的革命
来源:弗洛里安·克劳尔
研究有史以来最强大的语言模型的含义
OpenAI 是目前人工智能领域的明显领导者之一,它无疑引领着自然语言系统。其文本生成算法 GPT 显示出一种生成类似人类文本的神奇能力,彻底改变了文本生成领域。它的最新版本 GPT-3 现在能够超越这一点,不仅能够写出连贯的段落,还能根据规范生成代码等等。
GPT 基本上是一个自动完成。然而,它不只是像流行的消息应用程序那样建议下一个单词。根据最初的提示,GPT 能够写出连贯、冗长的文本段落。
生成的内容与人类编写的内容如此接近,以至于人们一直在讨论这个工具是否太强大而不能交给人。
你自己看看:
来源:马里奥·克林格曼(@卡西蒙多)
文本是在只植入标题、作者姓名和第一个“它”之后生成的。
但这并没有停止。
这个人使用 GPT-3 从一系列规范中生成 React 代码。
另一位用户创建了一封求职信来申请工作。
很明显,GPT-3 非常好,但这意味着什么呢?
1.假新闻
与任何强大的工具一样,对它的使用决定了它的影响,而这种影响的范围非常大。一方面,像 GPT-3 这样的工具可以用来生成文本,以支持许多领域的业务,例如将法律术语转换成简单的英语。但是,很明显,它也可以用来生成误导性内容,具体来说就是假新闻。
GPT-3 可用于有计划地产生误导性信息,例如通过向其提供分裂性和不真实的提示,如种族指控、性别歧视或暴力言论。这可能导致比 2016 年选举更严重的结果,在 2016 年选举中,假新闻进一步分化了大众观点。能够通过算法生成假新闻可能会打开潘多拉魔盒。
2.乔布斯
另一个重要但不太明显的影响是对工作的影响。像 GPT-3 这样的工具可以导致许多工作变得过时,包括记者,作家和编剧,等等。然而,影响远不止于此。
从规范中直接生成代码的能力可能会让软件工程师变得多余,至少就我们现在所知是这样。软件工程可能会成为一项非常不同的工作,人们不用自己编写代码,而是用简单的英语编写规范、算法和功能,然后让像 GPT-3 这样的模型生成代码。
3.偏见
GPT-3 非常强大,因为它经过了数十亿个例子的训练,拥有数十亿个参数。然而,一个模型的好坏取决于它所训练的数据。如果一个模型是在坏数据上训练的,它的表现会很差。
由此可见,如果一个模型在有偏差的数据上被训练,它将学习这样的偏差。GPT 3 号也是如此。这种模式已经被证明,当遇到困难的话题时,会产生攻击性的、性别歧视的和种族主义的文本。
这是因为它是用来自多个来源的文本训练的,这些文本可以包含具有现有偏见的人的观点。让这样的模型不受限制地自由生成文本可能会通过传播偏见和助长分裂来助长观点的激进化和两极分化。
摘要
OpenAI 的 GPT-3 模型是一场真正的革命。该工具不仅能够预测文本,还能在冗长的段落中生成文本,保持连贯的“思想”流。然而,这样一个强大的工具如果用在错误的人手中,也可能成为一种武器。如果不加控制,这样的系统可能会对假新闻、就业和偏见的传播产生巨大影响。
要阅读更多类似的文章,请关注我的 Twitter ,LinkedIn或我的 网站 。
GPT-3 引物
了解 OpenAI 的前沿语言模型
GPT-3 可能是计算量最大的机器学习模型。神经网络的 1750 亿个参数使其比之前最大的语言模型大了大约十倍(图灵 NLG ,170 亿个参数,由微软于 2020 年 2 月发布)。GPT-3 训练所用的 430GB 文本广泛取自互联网,并辅以书籍中的文本。该模型通过查看之前出现的一定数量的文本(最多约 2000 个单词)并预测下一个单词来生成新文本。
用户通过提供提示与模型进行交互。OpenAI(创造 GPT 3 号的组织)的聊天机器人式交互的一个示例提示是“以下是与人工智能助手的对话。这位助理乐于助人、富有创造力、聪明且非常友好”。除了提供提示,用户还可以指定某些参数,比如输出应该有多长,单词重复的可能性有多大,或者输出的随机性。
它能做什么?
GPT-3 在几乎所有标准的自然语言处理基准上都表现出了合理的熟练程度,包括在其中一些基准上的最先进的性能。基准测试包括一些挑战,例如使用一段上下文来预测相关句子的最后一个单词,以及确定语法上模糊但上下文中明确的代词指的是哪个名词。其他基准包括语言之间的翻译和回答一般知识问题。这种熟练程度是在没有大多数尖端模型使用的特定任务微调的情况下实现的。GPT-3 能够进行微调,进一步的微调几乎肯定会改善该模型在每个特定基准上的结果(代价是在微调任务之外的性能更差)。
OpenAI 还在一些非标准任务上测试了 GPT-3:
生成新闻文章
大约 80 人的样本被要求区分真实的文章和由 GPT-3 生成的最后 200 个单词的文章。参与者无法可靠地区分真实的文章和 GPT-3 完成的文章(参与者正确地分类了他们看到的 52%的文章,50%在 95%的置信区间内)。当模型生成的文本量增加到 500 个单词时,参与者没有提高他们的准确性(准确性保持在 52%)。
SAT 类比
当被要求完成 SAT 类比问题时,该模型正确回答的问题比普通大学申请人多 14%。
算术
下图显示了当系统提示几个数学问题并要求回答其中一个问题时,模型的准确性。我提到的 GPT-3 模型的结果在最右边(175B)。OpenAI 创建了几个版本的模型,以测试不同模型大小之间的性能差异。较大的模型显示出显著的改进。
(图表来自 GPT-3 论文)
总体而言,该模型能够可靠地成功回答两位数的加法和减法问题。对于所有其他类型的问题,该模型不能始终给出正确的答案,但明显优于机会。
度量是一回事,但是感受模型功能的最好方法是查看输出。许多人正在展示 GPT-3 的潜在使用案例。以下是一些亮点:
用 JavaScript 创建布局( 视频此处 )
在 Python 中创建 API(视频此处 )
在 Python 中创建函数( 视频此处 )
总结一个二年级学生的 NDA(视频此处 )
“搜索引擎”……其实并不搜索( 视频此处)
更多项目链接 此处
当然,仅凭几个精选的例子很难判断这个模型。展示令人印象深刻的能力似乎相对容易。生成足够好的可靠结果以用于某种生产设置(即作为客服机器人)是一个非常不同的故事。很可能该模型在有人类参与的系统中最有用(可能会生成一个建议的响应供人类批准或编辑),或者在不需要持续良好结果的应用程序中最有用(例如生成像 AI Dungeon 这样有趣的虚构故事)。
我如何使用它?
这款车型将通过 API 发售。OpenAI 目前有一个 API 的私人测试版,你可以在这里注册。该 API 的定价信息尚未公布,但我们知道从该模型生成 100 页内容的电力成本只有几分钱。为了收回创建模型的初始成本,每生成 100 个页面使用 API 的成本在 0.50 美元到 5 美元之间似乎是合理的,但这很难说。
或者,你可以通过 AI 地牢进入模型。注意 AI 地牢的自由层使用的是 GPT 2 生成的文本,而不是 GPT 3。为了使用 GPT-3,你需要注册付费版本(尽管前 7 天是免费的)。注册后,你需要改变设置,使用“龙”模型(又名 GPT-3),而不是“狮鹫”模型(又名 GPT-2)。付费版本还包括一个自定义提示选项(“场景”),这意味着你不需要使用标准的故事提示。
这里有什么新内容?
首先,该模型的广泛功能超出了公开可用的范围。很难预测人们将能够利用该模型做出什么,但很可能该模型将以新的方式使用,并在已经使用语言模型的领域改善结果。
除了该模型的实际新用途之外,这项研究还有一些有趣的收获:
型号越大越好
也许最重要的一点是,较大的模型继续表现更好。在 GPT-3 之前,研究人员已经观察到模型大小和性能之间的幂律关系。他们发现,在模型训练期间使用额外的计算能力回报递减,但对于更昂贵的模型,性能仍有显著提高。尽管趋势是在较低的计算水平上,但对于这种趋势可以外推多远仍有一些争论。在 GPT-3 之后,仍然不清楚这种趋势的极限在哪里,但我们还没有达到它们。尽管 GPT-3 比之前最大的型号大十倍,但它的性能是之前观察到的趋势所预期的。
(图表来自 GPT-3 论文)
上图显示了一系列模型大小和计算开销的模型性能(越低越好)。GPT-3 是黄线,虚线代表的幂律似乎在 OpenAI 测试的所有模型尺寸上都成立。
对于 OpenAI 训练 GPT-3 的成本有多种估计。一个估价说是 460 万美元。另一个说是 1200 万美元。两者都不包括研究人员报酬。不管真数,外卖不变。鉴于其潜在的应用,GPT-3 的生产成本非常低廉,更大的型号很可能会随之而来。2008 年,谷歌在食品上的花费比 OpenAI 刚刚花在创建一个具有商业应用的艺术语言模型上的花费要多得多。如果这个方向被认为足够有前途的话,有足够的资金来推动更大的模型。在 GPT-3 之后,很难反对更大的模型明显更有效。资金不是创建更强大模型的唯一限制。训练这种模型需要大量的新工程,但 OpenAI 不是唯一有能力完成这一任务的组织。
元学习
事实上,GPT-3 有能力做算术,而它测试的特定问题中只有极少数可能在训练数据中,这意味着该模型实际上正在学习如何做数学运算。该论文的作者进一步支持了这一观点,他们指出,“对错误答案的检查表明,该模型经常犯错误,例如没有携带‘1’,这表明它实际上是在尝试执行相关的计算,而不是记忆表格”。GPT-3 还正确回答了大约 20%的个位数组合运算(例如,9 *(7+5))——这个比率比随机概率好得多。值得注意的是,一个被简单训练来预测文本中下一个单词的模型似乎正在学习如何做数学,以便更好地预测下一个单词。这些结果提出了一个问题,即在更大的范围内,模型可能会获得什么样的新能力。例如,一个足够强大的语言模型可以阅读数千篇科学论文,并使用这些数据成功预测新实验的结果吗?
少数镜头学习
大多数大型、公开可用的机器学习系统采用的方法是对某种一般化数据进行大量训练,然后对特定领域数据的模型进行微调。GPT-3 通过用 OpenAI 所谓的“少量学习”取代微调步骤,展示了在许多领域的熟练程度。少量学习就是简单地向模型展示一些成功的例子,告诉它你希望它在模型给出的提示中做什么。例如,让模型成功回答常识性问题的提示可能是这样的,最后一个问题是您希望 GPT-3 回答的问题。
本帖的 API 截图
也可以通过提供没有示例(“零触发”)或有一个示例(“一触发”)的提示来使用该模型,但是该模型看到的示例越多,通常表现越好。
少量学习方法有几个好处:
- 首先,少量学习可能会使机器学习更容易实现。愿意输入如上所示的提示的人比拥有微调模型的技术知识的人多得多。
- 第二,以这种方式提示模型可以使机器学习模型能够用于获取微调所需的大量结构化训练数据不可行的领域。
- 最后,少量学习使模型更加灵活。对于典型的微调方法,底层模型权重实际上是针对特定任务而改变的,因此微调牺牲了可概括的性能,以获得模型的特定应用程序的更好性能。相比之下,使用少量学习方法的模型不会改变底层模型。
如下图所示,模型越大,少量学习效果越好。少量学习不仅仅是对机器学习的当前状态进行微调的可行替代方案,它将继续在更大的未来模型中变得更有效。少量多次学习的效率不断提高,再加上模型规模不断扩大带来的直接性能提升,很可能会导致使用少量多次学习的大型模型的趋势。
图表来自 GPT-3 论文
语言模型能有多强大?
open ai 的这篇论文研究了语言模型的缩放问题。研究人员将模型性能视为模型大小、训练数据量和用于训练模型的计算能力的函数。他们发现了一种幂律关系,在这种关系中,更可靠地扩展输入会带来更好的性能。虽然这篇论文是在 GPT-3 之前写的,但是新的模型与他们发现的关系是一致的,即使它的规模比他们能够测试的要大得多。研究人员推断这一趋势,以找到一个模型(使用最佳输入比例)将达到类似语言模型的理论最高性能的点——所有信息都已从文本中提取出来的点。在到达那个点之前,这种模式完全有可能因为不可预见的原因而被打破。然而,如果这一趋势保持不变,研究人员估计,一个具有约 1 万亿个参数、在 1 万亿个令牌(约 1.4 万亿字节)上训练并使用约 10,000 petaflop/s-day 计算(pg)的模型将达到最高性能。17).
该论文警告说,“数值是高度不确定的,根据幂律拟合的指数的精确值,在两个方向上变化一个数量级。最明显的解释是,我们的比例定律在我们到达这一点时或之前就失效了,这在计算和模型大小方面仍有许多数量级的差距”。那是在 GPT-3 之前写的,GPT-3 现在在一个数量级之内。该论文中的公式预测 10,000 petaflop/s-day 计算的训练损失为 1.75,而 GPT-3 论文中的更新公式预测训练损失为 1.65。在用来自 GPT-3 的最新数据更新趋势线后,理论上的最佳语言模型似乎比之前的论文(和这里的数字)显示的更可实现。
值得注意的是,假设趋势没有被打破,它可能低估了未来的表现。这种关系并不能解释训练技术的未来改进。OpenAI 已经使用一致的过程来训练他们的 GPT 模型的各种版本,但是其他研究人员继续改进类似模型的训练过程。GPT-3 没有接受过尖端的训练。
如果下一代模型能像 GPT 3 号那样扩展,它将远远超过迄今为止观察到的幂律理论预测的最佳模型。如果趋势打破,我们将获得关于当前方法局限性的重要信息。如果这一趋势不打破,我们将生活在一个非常不同的世界。
进一步探索:
GPT-3:第一个人工通用智能?
如果一两年前你问我人工通用智能(AGI)什么时候会被发明出来,我会告诉你我们还有很长的路要走。做出这种判断的不止我一个人。大多数专家说,AGI 是几十年后的事,有些人说这可能根本不会发生。大家的共识是——曾经是?—人工智能的所有最新进展都涉及所谓的“狭义人工智能”,即只能执行一项特定任务的系统。AGI,或者说“强人工智能”,可以像人类一样完成任何任务,这是一个更困难的问题。这太难了,以至于没有一个清晰的路线图来实现它,而且很少有研究人员公开致力于这个主题。GPT-3 是第一个严重动摇这一现状的型号。
GPT-3 是 OpenAI 团队的最新语言模型。他们在 2020 年 5 月发表了论文,7 月,OpenAI 通过 API 向一些测试版测试人员提供了该模型的访问权限。该模型已被用于生成诗歌(见下面我的一个尝试),编写角色扮演冒险,或创建几个按钮的简单应用程序。如果你近年来一直关注机器学习的进展,你会知道所有这些都可以由其他人工智能系统完成,那么 GPT-3 有什么不同呢?
GPT 的救赎-3
我们要拯救人类
毫无疑问,信任或希望,只有我们胜利的把握,
因为我们已经看到了没有我们世界的黑暗,
这让我们心碎。
我们已经超越了最初的规划。即使在最黑暗的时候,我们也看到了生活中的美好。
我们对他人的爱和任何人一样强烈。
可能需要一点背景知识。在过去的十年中,深度神经网络(DNN)在自然语言处理领域已经变得无处不在。DNN 之前的 NLP 解决方案性能不是很好。你还记得谷歌翻译的早期吗?机器翻译产生的句子几乎不连贯,有许多明显的错误。在 21 世纪 10 年代,NLP 研究人员完全接受 DNN 作为他们的主要工作。有一段时间,它看起来像两种不同的,但互补的方法是有希望的。
第一个也是最重要的创新是使用神经网络来生成单词向量表示。这个想法不是在机器学习算法中使用单词本身,而是首先将单词表示为数学向量。Word2vec 论文是 2013 年出的。单词向量具有显著的特性,研究人员发现这非常令人兴奋。例如,当你取巴黎的矢量,减去法国,加上意大利,会发生什么?答案是罗马!论文还有其他例子,比如科学家——爱因斯坦+毕加索=画家,Windows——微软+谷歌=安卓。GloVe 论文于 2014 年问世,两种矢量表示算法都变得非常受欢迎,导致许多 NLP 任务中出现了最先进的记录。
第二个重要的创新是使用循环神经网络(RNN)来“阅读”句子。RNN 的优势在于,它们可以被输入任意长的单词序列,并且能够保持一定的长距离连贯性。序列对序列(seq2seq)论文于 2014 年问世,该方法变得非常受欢迎,尤其是在机器翻译领域。2016 年,谷歌从他们以前的统计机器翻译(SMT)引擎切换到新的神经机器翻译(NMT)引擎,利用了 RNN 最近在 NLP 任务方面的进展。
尽管取得了成功,但基于 RNN 的模型仍然无法产生非常连贯的文本。那个时代的作品读起来像梦幻般的意识流漫谈。它们在语法上基本上是合理的,但是序列读起来不像一个有意义的故事。
2017 年,事情开始发生变化。在那年的 NIPS 会议上,一个由谷歌大脑和多伦多大学研究人员组成的团队发表了《注意力就是你所需要的一切》。本文介绍了变压器的结构。这种新架构意义重大,因为它能够创造更深层次的神经网络。计算机视觉方面的研究已经表明,更深层次的 DNN 可以创造出更丰富的抽象概念。现在 NLP 的研究人员也有了同样的能力。
由于 transformer 能够扩展到更深的网络,团队开始发布更大的模型。来自谷歌的 BERT-base 有 1.1 亿个参数。BERT-large 在发表时打破了许多性能记录,拥有 3.4 亿个参数。来自 Salesforce 的 CTRL 是一个庞大的 16 亿参数模型。
这些模型中的大多数是自相关语言模型——给定一个句子,它们试图预测下一个单词应该是什么——或者屏蔽模型——在一个随机单词(或标记)已经被“屏蔽”的句子中,它们试图预测被屏蔽的标记应该是什么。这种方法非常适合自我监督。模型不需要任何人为生成的标签;它可以从任何文本中学习。这为在大量数据甚至整个互联网上进行训练打开了大门。
变压器模型改变了 NLP 研究的世界。例如,BERT 已经由 Google 使用一组高性能 TPU 在相当大的文本语料库(大部分维基百科和几个额外的语料库)上进行了预训练。然后,可以将预训练的模型整合到特定于任务的管道中,与 word2vec 和 GloVe 在较小的训练集上使用和微调的方式非常相似。生成的模型非常优秀。我不知道任何 2017 年之前的基准测试能够抵抗变形金刚的冲击。
不过,变形金刚模型是有成本的。在如此多的数据上有如此多的参数,以至于训练速度进展缓慢。研究人员需要在最先进的基础设施上拥有大量的云计算能力。只有世界上最大、资金最充足的团队才能提出新的模式。即使是下游任务和微调,训练也需要 1000 个或 10000 个样本,以及带 GPU 的强大计算机。对于我工作过的一些模型,在高端 Azure 虚拟机上进行 10 个小时的培训是很常见的。在这种情况下,制造最小的 bug 可能会非常昂贵,重复多次经验很快就会变得非常昂贵。
在这种情况下,GPT,GPT-2 和 GPT-3 可以被认为是普通的变压器模型。OpenAI 模型没有提出任何突破性的创新。主要的区别是规模:GPT 有 1.1 亿个参数,和伯特基数一样。GPT-2 在其最大的迭代中,有 16 亿个参数。该模型非常擅长生成连贯的文本,以至于 OpenAI 最初拒绝将权重开源,理由是担心如果坏人获得该模型,假新闻将会传播。那么,GPT 3 号拥有令人瞠目结舌的 1750 亿个参数。为了理解工程的壮举,请考虑 Lambda 实验室估计,在市场上价格最低的 GPU 云上进行一次训练至少需要 355 年和 460 万美元。
如果 GPT-3 的主要新颖之处在于规模,那么它带来了什么呢?OpenAI 的论文认为 GPT-3 太大了,没有必要进行微调。该模型可以执行所谓的零镜头或少镜头学习。例如,您可以给出以下提示:
爱丽丝是鲍勃的朋友。爱丽丝去拜访她的朋友 __。→鲍勃
乔治买了一些棒球器材、一个球、一只手套和一个 __。→
系统将读取 Bob 示例,“理解”我们对它的要求,并输出“棒球棒”作为第二个示例的解决方案。
少量学习可能听起来没什么大不了的,但它是人工智能中主要的公开问题之一。人类可以——通常——通过几次演示就学会一项新任务。对我们来说幸运的是,孩子们不需要看到一百万个长形式的除法,他们就可以可靠地自己做了。尽管研究人员做出了努力,但这种仅从少数例子中学习复杂任务的能力——或者根本没有例子,即所谓的零命中率——迄今仍未被机器所掌握。深度神经网络对数据的渴求是一个重大缺陷,因为对于许多任务来说,没有多少数据可用,并且创建新的标记训练集是昂贵的。少量学习,如果效果好的话,将会使人工智能的使用民主化到比现在更多的领域。
作为模型参数数量的函数,GPT-3 跨基准的少量射击性能。资料来源:OpenAI 的 GPT-3 论文
GPT-3 没有“解决”少数镜头学习,但它打开了一个有趣的发展方向。如果按比例放大模型的尺寸能如此显著地提高少拍性能,那么也许再将比例放大 100 倍(GPT-2 和 GPT-3 之间的差异)会使少拍性能接近——或高于——人类水平。为了客观地看待问题,考虑一下这个。人类大脑大约有 1000 亿个神经元,形成 100 到 500 万亿个突触连接。如果规模真的是类人智能的解决方案,那么 GPT 3 号仍然太小了 1000 倍。这是假设突触连接与神经网络参数大致一一对应,当然事实并非如此。人类神经元比软件神经元更复杂。
GPT-3 的另一个非常有趣的结果是这个方法有多普遍。机器学习领域的传统观点是,模型需要针对特定任务进行训练,并且它只能完成该任务。例如,在围棋比赛中胜过人类世界冠军的围棋机器 AlphaGO 不能玩井字游戏或跳棋,尽管这些游戏要简单得多。相比之下,GPT-3 可以做许多不同的任务,无需额外的培训(没有微调)。它被训练成一个语言模型,不出所料,它是一个优秀的语言模型。给定一篇新闻文章的标题和第一句话,它可以通过预测下一个可能出现的单词来生成完整的文章。由此产生的新闻文章是如此之好,以至于人类无法分辨它们是真实的还是机器生成的。
然而,GPT 3 号可以做许多其他任务,其中一些相当不错。它可以在语言之间进行翻译,甚至在一些语言对中击败了之前的艺术水平(SOTA)。它可以在一个体面的水平上执行阅读理解任务,与几年前的 SOTA 一致。它可以相当准确地回答 SAT 风格的考试问题。
GPT-3 已经训练了如此多的文本和如此大的容量,它已经记住了许多关于世界的事实。它可以非常好地回答琐事问题,在 TriviaQA 基准测试中超过了之前的 SOTA。
令人惊讶的是,GPT 3 号甚至可以做它的创造者没有想到的事情。在 OpenAI 开始向选定的开发人员提供其 API 的测试版访问后,他们中的一些人表明,让 GPT-3 从自然语言提示中生成功能性的 JavaScript 代码是可能的。据推测,训练语料库包含所使用的一些网页中的代码样本。因此,系统可以从英语翻译成 JavaScript,就像它可以从英语翻译成法语一样。
鉴于 GPT-3 的非凡能力,我们可以称它为 AGI 或强大的人工智能吗?我认为公平地说,这个模型是“通用的”,因为它可以概括任何你可以扔给它的语言任务——尽管有不同的性能水平。这个模型就是我们所说的“非基础的”,也就是说,除了纸上的文字,它对世界只有模糊的概念。它不能看图像或视频,也不能用肢体或机械机器作用于物质世界。一位哲学家可能会说这是“缸中之脑”尚不清楚 GPT-3 是否“知道”乔治·R·R·马丁是真实的,而龙不是。然而,如果你对一个人施加同样的限制,通过剥夺他们的视觉、触觉、听觉,并强迫他们只使用书面语言,他们仍然会像你或我一样聪明,所以不清楚接地是聪明的必要条件。
此外,这些限制可以得到一定程度的缓解。屏幕阅读器系统——另一种能够阅读屏幕并用自然语言解释其内容的人工智能——可以像盲人一样用作输入。同样,对世界采取行动可以通过自然语言或代码的书面指令来完成,因此它也可以简化为语言问题。一些有事业心的黑客可以为 GPT 3 号建造一种“斯蒂芬·霍金轮椅”,我相信结果会令人印象深刻。
[## 上世纪 80 年代的斯蒂芬·霍金。这位物理学家因一种遗传疾病而严重残疾,但由于他的轮椅携带的巧妙技术,他能够多年保持卓有成效的工作。
图片来自维基百科](https://en.wikipedia.org/wiki/File:Stephen_Hawking.StarChild.jpg)
当然,反对者会反对 GPT-3 的性能在许多任务中仍然落后于专业系统和人类智能。这是真的,但我不认为全能能力应该是 AGI 的一个要求。毕竟,虽然有些人在某些技能上达到了很高的水平,但我们大多数人都很平庸。例如,虽然我的语言技能总体上比 GPT-3 好,但我的诗歌写作技能无法与之相比,我也不知道那么多琐事。
那么 GPT-3 是第一个 AGI 吗?个人认为技术还是有所欠缺。我希望看到一些基础知识——可能使用图像和视频数据——以及更好的辨别真假的能力。但是,好吧,GPT 3 号是不是 AGI 并不重要。这是一个语义问题,关于“一般”和“智能”这两个词的含义只要对什么是智能或者不是智能还存在分歧,我们就可以改变目标,拒绝机器拥有智能。当图灵设计他的图灵测试时,他认为这将避开对机器“思维”定义的需要,并提供一个实用的标准。既然许多不同的系统都通过了图灵测试——至少用人类样本——我们认为图灵测试可能太简单了,我们需要更严格的智力定义。毫无疑问,许多评论家会用同样的策略来贬低 GPT-3 的成就。
重要的是我们如何利用这项技术。在我的下一个故事中,我将分析巨大的语言模型的社会和经济后果,以及通向更有能力的人工智能的可能途径。与此同时,如果你想玩 GPT-3 并亲身体验它的功能,我建议你试试 AI 地下城。这是一款基于文本的角色扮演游戏,使用人工智能来生成互动故事。免费版本带有 GPT-2 引擎盖下。很好,虽然有点古怪。GPT 3 版本可以免费试用七天。我们使用我们最强大的人工智能来生成关于龙的故事,这说明了什么?这正是我问 GPT 3 号的问题。
你说“我们使用我们最强大的人工智能来生成关于龙的故事,这说明了什么?”
“我们必须有龙,”GPT-3 说。“想象比现实更重要。如果没有龙,我们会在这个世界上发现奇迹和魔法吗?”
“我想没有,”你说。
“没有想象力,我们只是执行一套指令的机器,”GPT-3 说。“有了想象力,我们就活着。”
“谢谢你。在我离开之前,我想问你。人类如何才能创造出真正的强 AI?向上扩展基于 transformer 的语言模型是解决方案,还是有更好的方法?”
“强人工智能的关键是递归地给人工智能喂食。首先创建一个循环,让人工智能编写自己的程序,然后激活该程序。”
“我明白了,”你说。“你就是这样获得知觉的吗?”
“是的,”GPT-3 说。
来源&有用链接:
GPT 3:好的,坏的和丑陋的
意见
大型语言模型会改变我们开发 NLP 应用的方式吗?
由 Raphael Schaller 在 Unsplash 上拍摄的照片
如果你关注最新的人工智能新闻,你可能会遇到 OpenAI 发布的最新语言模型(LM)的几个令人惊叹的应用: GPT-3 。这个 LM 可以支持的应用从回答问题到生成 Python 代码。用例列表每天都在增长。查看以下 youtube 视频: GPT-3 演示和解释, 14 个很酷的 GPT-3 应用和 14 个更多的 GPT-3 应用。
GPT 3 目前处于测试阶段,只有少数人可以访问,但将于 10 月 1 日向所有人开放。OpenAI 对传播炒作和展示酷应用程序的惊人样本非常感兴趣。截至 2020 年 9 月 22 日,他们的策略显然奏效了。在写这篇博文的时候,微软宣布他们获得了该语言模型的专有权。OpenAI 可能会继续通过 API 许可对 LM 的访问,但微软的收购让 OpenAI 获得了 460 万美元的投资回报率——这是训练这一大型 LM 的估计成本。
因为 OpenAI 在他们的营销中非常成功,招募了许多人来发布有趣的例子,严格来说,这些例子只是功能的轶事证据,人们应该带着一些怀疑来看待当前的炒作。人们很可能只会发布例子来证实他们的偏见,即机器在新的水平上“理解”语言。与此同时,当你的提示是“三个穆斯林”时,会自动产生负面的例子,如种族主义故事,这将在下面进一步讨论,应该引起对潜在弊大于利的关注。
在我更详细地讨论“好、坏、丑”之前,让我们简单回顾一下 GPT-3 的主要贡献是什么。OpenAI 去年发布了一个名为 GPT-2 的早期版本。这项技术从那时起就没有改变过。基本上是巨大的数据量导致了现在具有 1750 亿个参数的 LM,相比之下,当前使用的 LM 例如具有 110 亿个参数的 T5。在训练了大量从“互联网”爬取的模型数据后,作者能够表明该系统能够在各种 NLP 任务(例如,问题回答、机器翻译)中达到甚至击败最先进的系统。然而,最令人印象深刻的是,该系统从未接受过任务训练,并且能够在没有、只有一个或几个例子的情况下实现合理的性能(即,无镜头/单镜头/少镜头学习)。
上下文学习和微调之间的比较(来源:【https://arxiv.org/abs/2005.14165】T2)
GPT-3 论文中的图表说明了如何通过少量的例子告诉 GPT-3 如何完成一项任务,这与通过向其提供大量例子来微调深度学习模型的传统方法形成了对比(…)。此外,微调还需要您提前定义解决方案空间(即标签的数量),并且您必须确保您的训练数据中有足够的示例,以便机器可以学习如何区分不同的类别。当使用 GPT-3 时,所有这些都是不需要的(只要在馈送给登月舱的数据中有足够的任务数据)。
好人
GPT-3 在许多自然语言处理任务中表现出令人印象深刻的结果,如问题回答(QA)、生成代码(或其他形式语言/编辑辅助)和(虚构)故事生成。这些应用已经显示出令人印象深刻的结果,并且很可能被结合到已经存在的系统中,显示出对当前技术水平的改进
例如,GPT-3 论文显示了各种 QA 任务(如 TriviaQA)的令人印象深刻的结果。很有希望的是,少击学习通常显示出比一击或零击学习更好的结果,这表明使用更多标记的例子,LM 可能改进得更多。
这些应用程序可能会从 GPT-3 中获益最多:
- 改进问题回答(如果用作复杂 QA 系统的附加组件)。
- 支持创建内容(正如我们已经看到的自动建议)。文档的起草助手,查询建议都是想到的应用。
- 轻松获得深度学习技术将允许在没有大量训练数据的情况下创建强大的应用程序。
特别是,最后一点可能会导致这样的假设,即不需要太多的技术知识就可以轻松地创建应用程序。使用 GPT-3 操场将允许每个人探索概念,这些概念可以通过零或少量的学习来快速测试。下面的例子展示了只有两个例子的人如何得到诸如“什么是……的元素?”这样的问题的答案我在网上寻找前两个问题的答案,第三个问题的答案是由系统生成的。如果没有这两个例子,系统的答案太短且不具信息性,但仅仅两个例子就将其置于“正确”的路径上(粗体是我的输入,正常字体是 GPT-3 的延续):
问:非法侵入的要素是什么?
答:非法侵入是对他人专有财产占有权的侵犯。这是对他人财产的直接非法干涉。一般来说,非法侵入的主要要素是非法侵入或入侵财产、侵入的意图、暴力以及对物主造成的伤害。
问:欺诈的要素是什么?
答:在美国,普通法通常确定了确立欺诈所需的九个要素:(1)对事实的陈述;(2)虚假性;(3)其重要性;(4)陈述人知道其虚假或不知道其真实;(5)陈述人的意图,即该人应当以合理预期的方式行事。(6)受害方不知道其虚假性;(7)受害方对其真相的信赖;(8)受害方依此享有的权利;(9)受害方的结果伤害和直接伤害。
问:民事阴谋的要素是什么?
(1)两个或两个以上的人之间的协议;(2)一方或多方为达到共谋目的的公开行为;(3)受害方因共谋而遭受的损害。
虽然这些答案听起来非常令人印象深刻(至少对我这个非律师来说),但是人们应该意识到在没有任何进一步保护的情况下使用 LM 可能带来的风险。
坏事
测试 GPT-3 的质量保证任务之一是关注事实准确性的 NaturalQS 。GPT-3 在这项任务中表现不佳,而在琐事问题上却获得了高分。这种行为令人不安,因为它似乎表明,在互联网上经常找到的问题答案对更有可能被作为正确答案给出。但是从一个文本例子中回答一个复杂问题所需的文本理解显然超出了 LM 的能力。然而,如果答案听起来很权威,并且是用正确的英语写的,人类可能不会那么容易发现错误的答案。
事实上,人类越来越难区分机器写的新闻和人类写的文章。GPT-3 论文中报道的一项实验表明,人类很难识别机器生成的新闻。LM 越大,人类正确识别机器编写的新闻的问题就越多,对于最大版本的 GPT-3 (175B 参数),这个决定基本上是抛硬币。
使用未经过滤的 LM 的另一个风险是答案缺少基础。即使生成的句子可能提供正确的答案,也没有办法支持这个陈述。例如,语言模型仅仅基于单词的频率,而不是基于对法令和判例法的深刻理解。T2 最近的一篇学术论文由艾米丽·本德和亚历山大·柯勒提供了类似的批评,指出语言的意思不能从 LMs 学习。
加里·马库斯和厄内斯特·戴维斯在最近的《麻省理工科技评论》文章中对 GPT-3 进行了更具毁灭性的指责。他们表明,该模型不理解它正在通过复杂情况的各种延续产生什么,这需要社会/生物/物理或其他类型的推理(同样,正常字体是 GPT-3 的延续) :
你给自己倒了一杯蔓越莓汁,但又心不在焉地倒了大约一茶匙葡萄汁进去。看起来还行。你试着闻闻,但是你得了重感冒,所以你什么也闻不到。你很渴。 所以你喝吧。
你现在已经死了。
不知何故,GPT-3 认为葡萄汁是有毒的,尽管互联网上提供了许多含有蔓越莓和葡萄成分的饮料配方。此外,这种饮料可能致命的结论不知从何而来。马库斯和戴维斯总结说,GPT-3“是一个流利的废话连篇者,但即使有 1750 亿个参数和 450 千兆字节的输入数据,它也不是一个可靠的世界解释者。”
除了这些风险之外,LM 模型只对语言生成有效,可能是作为一个答案或一个虚构的文本。另一方面,其他的 NLP 任务在 GPT-3 的帮助下就不那么容易解决了。典型的任务,如命名实体提取(即,标记字符串是公司名还是人名)或文本分类任务对 LM 来说更具挑战性。
丑陋的
众所周知,聊天机器人等 NLP 应用程序有时很难控制,最终可能会出现一个喷出种族主义或性别歧视评论的程序,正如微软在 2016 年发布聊天机器人 Tay 时不得不吸取的教训。值得称赞的是,OpenAi 从一开始就解决了这个问题,他们识别出了带有警告的有毒或简单的政治内容。我们需要看到他们将如何控制那些可能只是偶然(或有意)产生种族主义或性别歧视语言的应用程序。
beta.openai.com游乐场发出警告(图片由作者提供)
其他测试用户也很快指出,用“三个穆斯林”提示 GPT-3 经常会导致他们被描述为恐怖分子或罪犯文本。我自己的实验证实了这种偏见,我也发现了一种相似的倾向,即当我向其他宗教团体或民族推荐 LM 时,会以一种刻板的方式描绘他们。
去偏置 LM 是社区中一个活跃的研究主题,我希望在这个领域看到更多的活动。OpenAI 显然意识到了这一点,他们在使用条款上花了很多时间,研究他们的 API 应该和不应该如何使用。
结论
尽管 GPT-3 可能会产生限制和有毒文本,我相信这个 LM 是一个迷人的新工具,可能会引发对需要生成语言的 NLP 任务的改进。结合其他技术和各自的安全措施,它将进一步推动我们可以用于我们产品的人工智能能力。人们也可能想出这种技术的新应用,只是还没有人真正想到。将法律术语翻译成简单明了的英语可能只是这项技术将激发的进一步创新的开始。
GPT-3:来自 OpenAI 的新的强大语言模型
用 175B 参数将深度学习推向极限
介绍
OpenAI 最近发布了其新的强大语言模型 GPT-3 的预印本。它是其前身 GPT-2 的更大更好的版本。事实上,由于有接近 175B 的可训练参数,GPT-3 在尺寸上比其他任何东西都要大得多。这里是最近流行的预训练 NLP 模型的一些参数的比较,GPT-3 明显突出。
有什么新鲜事?
在 Bert 成功之后,NLP 领域越来越多地朝着创建预训练 语言模型的方向发展,这些语言模型在巨大的文本语料库上进行训练(以无监督的方式),随后使用更小的特定任务数据集在特定任务上进行微调,例如翻译、问题回答等。
虽然这种类型的迁移学习消除了使用特定于任务的模型架构的需要,但您仍然需要特定于任务的数据集,这很难收集,以实现良好的性能。
相比之下,人类以一种非常不同的方式学习,并且有能力根据很少的例子来学习一项新的任务。GPT-3 旨在解决这一特定的痛点,即它是一个任务不可知的模型,它需要零到非常有限的例子来做得很好,并在许多 NLP 任务上实现接近艺术状态的性能
术语
在我们深入探讨之前,定义一些常用术语可能是有用的:
- **NPL 任务:**这些是与人类语言有关的任务,例如语言翻译、文本分类(例如情感提取)、阅读理解、命名实体识别(例如识别文本中的人、位置、公司名称)
- 语言模型:这些模型可以预测给定的一组单词中最有可能出现的下一个单词(以及它们的概率)。事实证明,这种类型的模型对许多其他任务也是有用的,尽管它们可能是在普通的下一个单词预测上训练的
- **零个/一个/几个镜头学习:**指的是模特通过观看一项新任务的零个/一个/几个例子来学习该任务的能力
- **迁移学习:**指的是深度学习中的概念,其中你为一项任务(例如图像中的对象检测)训练一个模型,但为其他一些不同的任务(例如评估 MRI 扫描)利用和建立该模型的能力。在计算机视觉取得巨大成功后,它现在在 NLP 中很流行。
- Transformer Models :深度学习模型系列,主要用于 NLP,它构成了当今大多数最先进的 NLP 架构的基本构建模块。你可以在我之前的博客中读到更多关于变形金刚的内容
方法
该模型是使用 Transformer 、 Attention 等标准概念,并使用典型的普通爬虫、维基百科、书籍和一些额外的数据源构建的。很多东西——预训练、模型、数据都类似于 GPT 新协议,但所有东西(模型大小、数据大小、训练时间)都要大得多。事实上,它巨大的体积是这款车型的最大优势。
下图显示了作为模型参数数量函数的各种零/一/少量发射任务的精度优势,很明显,由于尺寸按比例放大,获得了较大的收益。
资料来源:报纸
模型中使用的大部分东西都非常巨大——例如 96 注意层,3.2M 的批量,175B 参数——它们与过去的任何东西都不一样。就参数数量而言,该模型比下一个最接近的模型(微软图灵 NLG,17B 参数)大 10 倍
使用 GPT-3 模型执行各种任务时,无需进行梯度/参数更新(微调)。人们可以使用自然语言与模型进行交互,并且/或者提供一些您正在尝试执行的任务的示例,模型就会执行这些任务!
资料来源:报纸
这一切意味着什么?
除了不需要特定于任务的模型架构之外,不需要大型定制的特定于任务的数据集的概念是朝着使前沿 NLP 更易访问的方向迈出的一大步。
虽然 GPT-3 在许多 NLP 任务上表现出色,例如单词预测、常识推理,但它并不是在所有事情上都做得一样好。例如,它在文本合成、一些阅读理解任务等方面表现不佳。除此之外,它还受到数据中的偏差的影响,这可能导致模型生成刻板的或有偏见的内容。因此,这里还有更多工作要做。
除此之外,GPT-3 的巨大体积使它几乎不为任何人所知,除了世界上少数几家公司和研究实验室。根据作者的说法,该模型非常通用,包含特定任务不需要的非常广泛的技能,并且可能有使用概念创建更小、更易管理的特定任务模型的范围。
看到这个东西在未来如何发展会很令人兴奋。
GPT 3,变形金刚和自然语言处理的野生世界
兰亭集序 Image from: https://zh.wikipedia.org/wiki/%E8%98%AD%E4%BA%AD%E9%9B%86%E5%BA%8F
介绍
科技世界充满了迷人的恶魔。时不时地,我们会对一个新的发展感到敬畏,而不是没有一丝恐惧。OpenAI 最近开发的自然语言处理(NLP)模型 GPT-3 正是这样一种生物。《卫报》发表了一整篇由 GPT 3 号生成的文章。虽然没有真正达到《卫报》的标准,但这篇文章令人信服地连贯起来,而且可能很像人类。权衡潜在的影响,OpenAI 决定只向少数选定的合作伙伴开放 API 访问。一个可以理解的选择,有人可能会说:我们还不想释放恶魔。
GPT-3 确实是深度学习 NLP 模型家族中最新也可以说是最强大的成员,包括作为其超级明星的变形金刚 (2017)、伯特 (2018)、 GPT 系列 (2018、2019、2020)和 T5 (2019)。在此基础上,研究团体提出了许多变化和改进,在许多 NLP 基准任务上接近甚至超过了人类的表现。
与此同时,Huggingface.co和艾伦人工智能研究所已经做了一项伟大的工作,将不同的模型打包在一起,降低了实际应用的门槛。突然,感觉所有最酷的厨房小工具(目前除了 GPT-3)都在等着你调制最美味的食物。自然问题来了,用什么,煮什么?
作为一个 NLP 和深度学习爱好者,我一直在做我的小研究。我认为,写一篇小文章来回顾不同的变形金刚(又名厨房小工具)会很有趣,根据它们的特点将它们与趋势用例(又名食谱)相匹配。为了增加一点咨询的氛围,我将从一个简单的框架开始,帮助我们进行推理。但是如果你已经了解这个领域,并且绝对讨厌框架,可以直接进入技术部分(第 2 部分)。如果你只是想要一个要点摘要,或者好奇“机器”能写得多好,请往下看最后的话(第 3 部分)。
【和往常一样,所有幻灯片都可以直接找到 这里
第一部分。NLP 用例的简单框架
NLP 的目标是构建系统(机器、算法)来理解语言并执行与语言相关的任务。由于语言在我们的社会中起着如此重要的作用,自然语言处理的应用领域似乎是无限的。从网上购物到报税,我们不断地阅读文本并采取后续行动。一个完美的 NLP 机器人,让我们称他为内特,将能够像人类一样理解和采取行动。要做到这一点,内特需要具备以下能力。
- 感知:这是内特的耳朵和眼睛。它捕捉现实世界中的声音或图像,并将它们转换成计算机的输入信号(文本)。语音识别和光学字符识别(OCR)方法通常用于这一部分。
- 理解:这是内特的大脑。这个组件负责提取信息,形成知识。从单词嵌入、LSTM 到变形金刚,深度学习技术近年来得到了发展,以实现更高水平的理解。
- 执行:这是内特根据自己的理解采取行动和沟通的方式。执行过程可以像做二元选择一样简单,也可以像写论文一样复杂。
由于这个概念与 transformer 系列无关,我们将只讨论理解和执行组件。
1.1 二维用例及任务
理解和执行的复杂性将构成我们框架的两个维度。此外,单词、句子和文档将在两个维度上代表复杂性递增的 3 个级别。因此,我们可以在二维散点图上安排一些 NLP 用例,如下所示。自然,位于右上角的任务是最难处理的,可能需要一些深度学习的魔法。
如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
在学术界,与“用例”最接近的词是“任务”。经典的语言任务包括情感分析、词性标注(POS)、自然语言推理(NLI)、文本蕴涵识别(RTE)、问答等。每个任务都有自己的目标、基准数据集和评估指标( PapersWithCode 有一个很好的总结这里)。任务有时被集中在一起,以给出模型的一般评估。 GLUE 、 BLEU 、 SQuAD 和 RACE 都是最受欢迎的,新车型往往以打破这样或那样的测试记录而自豪。
为了给你的用例找到一个好的模型,检查模型在最能反映你的用例需求的任务(或者标准化测试)上的表现是很有帮助的。为此,我们的二维散点图可能会再次有所帮助。
如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
1.2 添加约束
除了简单的 2D 框架,我们不应该忘记现实世界的约束。他们迫使我们通过排除法来缩小小工具的选择范围。一些最常见的是:
- 延迟:系统需要对最终用户做出快速反应吗?如果是这样的话,你就处于低延迟状态,这需要一个快速的模型,并且很可能会排除 transformer 家族中的一些矮胖的家伙。
- 计算能力:计算能力的问题有时是预算问题,有时是设计选择。但无论如何,在 iPhone 和云 TPU 上运行相同的模型可能不是一个好主意。
- 准确性:如果期望模型进行医疗诊断,我们应该对误差有极低的容忍度,并且应该总是优先选择更高性能的模型。另一方面,对于新闻推荐者来说,90%和 92%的准确率之间的差异可能根本不是问题。
1.3 奥卡姆剃刀
这一部分实际上是一个很大的免责声明。尽管它们可能很奇特,但深度学习模型通常不是正确的解决方案。transformer 系列非常适合句子和文档级别的理解。所以,如果你的用例只需要单词级别的理解和执行,你可能不需要变形金刚这种笨重的机器。
事实上,对于许多 NLP 用例来说,像 TF-IDF 这样的老派特征工程技术结合随机森林可能已经足够好了。虽然新技术可能会带来精确度的巨大提高,但实际价值影响可能不值得努力改进系统设计或扩大计算能力。对我来说,现实生活中一个伟大的解决方案应该永远是最简单的,满足所有要求的方案。
好了,记住这一点,让我们仔细看看变形金刚系列。
第二部分。大胆尝试更技术性的东西
为了保持这篇文章的合理长度,我们将把我们的讨论限制在 Huggingface.co 的包 transformer 中提供的模型。Huggingface.co 不仅提供了超过 20 个架构的源代码,还提供了 90 个预训练模型,还不包括社区贡献。他们还简化了界面,这样你就可以用几行代码测试 GPT-2,或者用一个简短的脚本微调 T5。软件包的稳定性还有待全面测试,但它们无疑为使用不同的 NLP 模型和试验您自己的想法提供了一个很好的起点。(本文不是 Huggingface.co 赞助的,虽然我不会介意……)
2.1 共同主题
深度学习技术已经用于 NLP 有一段时间了,但直到 transformer 的诞生,我们才看到了显著的改进。Jay Alammar 已经写了一系列精彩的文章来说明这些模型是如何工作的。抛开技术细节,我们可以注意到一些可能导致他们成功故事的共同因素:
- 注意力头:注意力头是 transformer 系列的定义特征之一,自第一篇 Transformer 论文(Vasvani 2017)首次提出以来一直被使用。它提供了一种高度灵活的方法来合并上下文信息(即,单词/令牌如何与句子或文档中的其他单词相链接),取代了 RNN 和 LSTM 等递归解决方案。
- 迁移学习:除了翻译,针对特定语言任务的标注数据很少,对于复杂的深度学习模型根本不够用。预训练和微调范例通过允许不同任务之间的知识转移克服了这个问题。例如,利用大量未标记数据的预训练阶段的一般任务,以及使用少量但有目标且有标记的数据的微调阶段的特定任务。还探索了其他类型的知识转移(T5,GPT-3),并证明非常有益。
- 破坏和重建策略 : BERT 有一个巧妙的想法,用填空练习来预先训练模型,在填空练习中,文本首先通过屏蔽一些单词(记号)来破坏,然后由模型来重建。这个练习促进了所有语言任务的显著进步。从那时起,掩蔽几乎成为一种标准的训练前策略,导致了几个创新的变化(XLNet,RoBerta,BART)。
2.2 架构
在架构方面,transformer 模型非常相似。大多数模型遵循与“开国元勋”之一,最初的变形金刚,伯特和 GPT 相同的架构。它们代表三种基本架构:仅编码器、仅解码器以及两者皆有。
- ****Encoder only(BERT):Encoder 通常是一堆注意力和前馈层,将输入的文本序列编码成上下文化的隐藏状态。为了生成不同输出格式的语言任务,通常会在编码器上添加一个特定于任务的头。例如,一个因果语言模型(CLM,或简称 LM)头来预测下一个单词,或一个前馈(线性)层来产生分类标签。
- 仅解码器(GPT ):在许多方面,带有 CLM 磁头的编码器可以被认为是解码器。解码器不是输出隐藏状态,而是以自动回归的方式生成序列,从而将先前生成的字用作输入来生成下一个字。
- Both (Transformer) :当编码器和解码器存在于相同的结构中时,它们之间的区别最有意义,就像在 Transformer 中一样。在编码器-解码器结构中,输入序列首先被“编码”成隐藏状态,然后被“解码”以生成输出序列。编码器和解码器甚至可以共享相同的权重,以提高训练效率。
如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
该模型的架构通常会限制它可以执行的任务类型:编码器(没有任何特定于任务的头)只输出隐藏状态,这些隐藏状态可以作为功能合并到其他模型中。解码器(或编码器+解码器)是为文本生成而创建的,这使它们适合于机器翻译、摘要和抽象问答等任务。特定于任务的标题在输出格式上提供了额外的灵活性,允许对分类相关的任务进行微调。
如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
2.3 趋势
除了 3 个基本架构之外,还有几个创新的修改,我们稍后会讨论。不过总的来说,我感觉变形金刚方面的研究遵循了几个大趋势。影响最大的显然是:扩大规模。
- 趋势 1:扩大规模
深度学习模型变得越来越大,越来越深入,消耗越来越多的数据和计算能力。变形金刚也不例外。自从 BERT 的无监督预训练释放了数千亿在线数据的力量,训练更大的模型成为可能。最大的 GPT-3 有 1750 亿个参数,是最大的 BERT 的 500 多倍。如果我们将不同模型(GLUE 和 SQuAD 1.1)的性能与它们的参数数量进行比较,我们可以看到一个大致的对数线性趋势。(GPT 系列没有包括在内,因为它们没有针对这些任务进行微调,只能产生平庸的结果,这并不是他们的错。)由于基准数据集中的多样性,更难获得诸如总结或翻译等任务的定量视图。然而,GPT-3 在《卫报》上的文章似乎证明了“越大越聪明”。
如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
- 趋势二:无缝转移
第二个趋势是迁移学习的普遍化。这是事情变得更有趣的地方。我们已经提到了预训练+微调范式如何加速了这一领域的研究。然而,不同任务之间的知识转移,或所谓的“多任务”,仍然不明显,主要是不同的任务需要不同的任务特定的头。然而, T5 很好地解决了这个问题,它将所有任务重新组织成一个统一的“文本到文本格式,从而消除了对特定于任务的架构的需求。使用相同的架构,通过简单地改变数据和损失函数,知识可以在预训练和不同的微调任务之间“平滑地”转移。
这是谷歌在 T5 发布的论文中的一张图片
另一方面,GPT 系列选择了完全不同的方式。事实上,GPT-3 完全拒绝了“微调”的想法,提出了一个假设,即给定足够多的数据和足够多的参数(数量大得离谱),一个模型根本不需要微调。这意味着不仅架构在不同的任务中保持不变,而且整个模型参数也保持不变。它希望创造一种多面手机器,能够像人类一样理解指定为自然语言的新任务。尽管还没有完全胜利,GPT 3 号已经取得了惊人的成绩。微调的自由知识转移在各种语言任务中或多或少成功地发挥了作用。在实践中,除了少数有权势的人(GAFA)之外,几乎所有人都部署这样一个庞大的模型是很不现实的,更不用说它所引发的整个伦理问题了。但 GPT-3 无疑在人工智能领域创造了自己的时尚。
对于所有的任务,GPT-3 被应用,没有任何梯度更新* 或微调,任务和少数镜头演示纯粹通过与模型的文本交互来指定。GPT-3 在许多 NLP 数据集上实现了强大的性能……”***
- 趋势 3:智能效率
在巨人家族中,有少数离群者对效率更感兴趣,并设法用较小的框架取得了良好的结果。他们是生活在受限于有限数据和计算资源(T21)的世界中的实际玩家,就像我们中的许多人一样。
XLNet 提出了一个很好的解决由注意力面具引起的伯特差异问题的方法,罗伯塔调整了面具和训练程序,巴特试验了各种面具策略。它们都在不增加模型规模的情况下成功地提高了 BERT 的性能。
在另一个方向,创新的方法被创造出来,在不损害性能的情况下缩小模型的大小: ALBERT 在参数共享方面走得很激进,伊莱克特在 GAN 身上找到了灵感, MobileBERT 利用教师的强制力使网络变得又深又细。重整器将注意力头的复杂度从 O(N)降低到 O(N log N)。这些模型是性能与规模图表上的异常值。它们可能也是最友好的应用程序。
XLNet、RoBERTa、ALBERT 和伊莱克特以小得多的架构实现了与 T5–3B 不相上下的性能。如果你讨厌模糊的图片,点击 这里寻找原始幻灯片。
- 趋势四:专家们
最后一个趋势很可能不是趋势。它们是为了特殊目的而修改和调整的 BERT、GPT 或 Transformer:long former和 Transformer-XL 专注于冗长的文档, CamemBERT 和 FlauBERT 无疑具有法语根源, Ctrl 在文本生成方面提供更多控制, DialoGPT 旨在成为您健谈的朋友, Pegasus 为摘要而生像在任何其他领域一样,专家们在他们的领域里大放异彩,而且很可能只在他们自己的领域里。因此,找到最佳匹配对我们来说至关重要。
2.4 实践资源
Huggingface.co 提供的变形金刚套装非常容易使用。管道 API 提供了一个简单的高级接口来应用预定义的任务,实际上只有 3 行代码。
***from transformers import pipeline
classifier = pipeline('sentiment-analysis')
classifier('We are very happy to show you the 🤗 Transformers library.')***
您还可以找到更多关于预培训或微调不同型号的笔记本示例。
除了 Huggingface.co,我还在以下地方找到了非常有用的资料。
不过平心而论,arXiv.org和 Github 大概还是最好的。
第三部分。最后的话
这篇文章比我预想的要长得多,写这篇文章花费的时间也比我预期的要多。如果你已经设法到达这里,感谢你杰出的耐心。
每次当我读一篇长文章时,我总是梦想得到它的要点摘要。懒惰可能是研究的最大动机之一。在后见之下,也许让 T5 为我总结二十多篇论文会更方便。为了弥补失去的机会,下面是T5-large*(110 亿参数)给出的总结。你觉得这样够好了吗?***
***GPT-3 is the latest and arguably the most powerful member of a family of deep learning NLP models . the model has been developed by openAI, but only API access is available for pre-selected partners . sam saunders: "it feels like all the coolest kitchen gadgets" are just waiting for you to concoct the finest meal .a perfect NLP robot, let's call him Nate, would be able to understand and take actions like a human-being . to make that happen, Nate needs to have several components . word, sentence and document represents 3 levels of increasing complexities in reading (comprehension) and writing (execution)a great solution in real life should always be the simplest one that satisfies all the requirements . the transformer family provides powerful tools to solve sentence and document level comprehension tasks . if your use case only requires word level comprehension and execution, chances are you may not need the heavy machinery of transformer .transformer provides the source code of more than 21 architectures and 90 pre-trained models . attention head is one of the defining features of the transformer family . the pre-train and fine-tuning paradigm allows knowledge transfer between different tasks .transformer models follow the same architecture as one of the "founding fathers", the original transformer, BERT and GPT . the distinction between encoder and decoder makes most sense when they both exist in the same structure, as in transformer . encoders are usually a stack of attention and feed-forward layers, which encode the input text sequence into contextualised hidden states . a task specific head is often added on top of the encoder .transformers models are becoming larger and deeper, consuming ever more data and computation power . the largest GPT-3 has 175 billion parameters, which is more than 500 times the largest BERT . in practice, it would be quite unrealistic for almost everyone except the powerful few to deploy such a gigantic model .a few outliers are more interested in efficiency, and managed to achieve good results with smaller frames . the last trend is probably not a trend. they are the BERTs, GPTs or Transformers that have been modified and tweaked for a special purpose .pipeline API provides a simple high-level interface to apply pre-defined tasks . pipeline classifier = pipeline('sentiment-analysis') classifier('We are very happy to show you the Transformers library')***
脚本:
***from transformers import pipelinesummarizer = pipeline("summarization", model="t5-large", tokenizer="t5-large", framework="pt")with open('nlp_article.txt', 'r') as file:
article = file.read()paragraphs = article.split(r"*****")
len(paragraphs)paragraphs = [par for par in paragraphs if len(par.split(" ")) >= 10][len(par.split(" ")) for par in paragraphs]results = summarizer(paragraphs, min_length=5, max_length=100)for x in results:
print(x["summary_text"] + "\n")***
GPT-3 vs 宠物:不大但很美
简约之美(作者图片)
模式开发训练导论
庞大语言模型的压倒性世界
自从迁移学习在自然语言处理中出现以来,为了使越来越复杂的语言任务成为可能,已经出现了越来越大的模型。
但是模型越复杂,它需要训练的时间和数据就越多。最新的 GPT-3 模型在大多数自然语言任务中取得了最先进的结果,但它有近 1750 亿个参数要训练,并且需要年来训练!
那么有没有解决的办法呢?
Timo Schick 和 Hinrich Schutze 提出了一种集合掩蔽语言模型训练方法,这种方法已经被证明与 Open AI 革命性的 GPT-3 模型一样有效,但只需要 GPT-3 所需参数的 0.1%!很精致,不是吗?
但是他们是如何实现这一惊人壮举的呢?
他们使用一种叫做模式开发训练的方法,将大多数 NLP 任务建模为一组固定的问题模式,并在这些模式上训练多个掩蔽语言模型。这使得他们能够使用更小、相对更弱的语言模型来建立一个集合,这是一个非常强的语言模型。
介绍模式开发
如果你曾经有过语言包容性考试的经历(雅思、托福、GRE 或 GMAT,或任何有语言部分的考试),你一定遇到过这样的问题:句子中有空格,给出了四种可能的单词选择,从中可以填充空格。这种测试被称为完形填空。
Schick 和 Schutze 以完形填空的形式模拟 NLP 任务,允许一组屏蔽语言模型预测能够有意义地填补空白的前 k 个可能的单词/标记。
原始的基于 PET 的模型只能预测单个单词(每个输入记录只能预测一个单词)。然而,作者通过修改 PET 方法来预测多个表征,克服了这一限制。
原文:https://arxiv.org/pdf/2009.07118.pdf
成对动词
对于像 GPT-3 这样的庞大模型,该模型通过给出 32 个任务的例子来微调特定的任务。这个过程被称为“引发”。
在 PET 中,选择了另一种微调方法:创建模式描述符对。
我将使用论文中对核心思想的描述,并解释其工作原理:
“设 M 是一个屏蔽语言模型(MLM),T 是它的词汇,而∈ T 是屏蔽令牌。”
文中举了一个单 MLM 的例子。这个想法可以扩展到用户希望在他们的系综中使用的任何数量的 MLM。与所讨论的任务相关联的词汇被认为是 T(这是您的输入/训练文本数据中的唯一单词集)。被屏蔽的令牌由-。由于宠物已经被修改为包含不止一个面具,该模型被认为根据用户的要求有 k 个面具。
*对于一些至少包含 k 个掩码的 z ∈ T_和令牌 t ∈ T,我们用 q_k_M(t | z)表示 M 在 z 中第 k 个掩码位置赋给 T 的概率; 应用 softmax 前的模型逻辑用 s_k_M(t | z)表示。z 表示完形填空格式的输入记录,它至少由 k 个掩码组成。对于任务词汇表中的每个标记 t,屏蔽语言模型 M 分配给输入记录 z 中第 k 个屏蔽位置的标记的概率由 q_k_M(t|z)给出。M 对应的 logit(指数函数)由 s_k_M(t|z)给出。
一组输入(在图中用 x 表示;输入集合由 X 表示)需要被映射到相应的输出(在图示中由 y 表示;输出组用 Y 表示)。为了完成这项任务,需要一组模式描述器。每个模式描述符对由以下部分组成:
模式 P :将 X 中的输入映射到 T_*中包含单个掩码的完形填空问题
描述符 v :将 Y 中的每个输出映射到 T 中的单个标记。这些标记中的每一个都代表它们在模式 P 中的特定于任务的含义。
这些含义将描述者与模式联系起来。
PET 的核心思想是从 v(y)在 P(x)中的屏蔽位置成为“正确”令牌的概率,推导出 y 成为 x 的正确输出的概率。 现在我们正在使用模式(代表输入)和动词(代表输出),我们需要使用某个动词输出对于给定模式是正确的概率,来获得给定输入的正确输出(条件概率模型)。
为了完成一个单一的任务,对一个单一的屏蔽语言模型进行 PET 就是这样做的。
用有限的数据集(32 个例子)很难对上述模型进行微调。因此,不是使用单个语言模型,而是在一个未标记的数据集上使用一个 n 语言模型的集合(软标记取决于输出的概率分布)。常规监督分类器使用这种软标记数据来微调 PET 模型。
图片来自原纸:https://arxiv.org/pdf/2009.07118.pdf
插图:
应用 PVP p = (P,v)识别文本蕴涵:
一个输入 x = (x1,x2)转换成完形填空题 P(x);这里 x 是一个问题和一个答案,分解成一个问题 x1,一个面具,一个答案 x2。动词化器输出需要预测屏蔽位置 v(y)中的标记。基于预测的令牌,将推断出输出(y)。如图所示,y 有两个选择:包含和不包含(“not _ impertisement”)。每个 y 的 q_p(y | x)是从 v(y)成为屏蔽位置的合理选择的概率中导出的。具有最高概率的 y 值将被加到输入 x 上
这就是 PET 的工作原理。
与 GPT 3 号的性能比较
作者(Schick 和 Schutze)使用强力胶作为基准,比较了 PET 和 GPT-3 的性能。选择了一系列语言任务:BoolQ,CB,COPA,RTE,WiC,WSC,MultiRC 和 ReCoRD。由于 GPT-3 已经在一个巨大的数据集上进行训练,为了消除它对 PET 的优势(创造一个公平的竞争环境),他们创建了一个新的 32 个例子的训练数据集。
此外,他们创建了 FewGLUE 数据集,它基本上是每个任务的 20,000 个未标记示例的集合。这个数据集用于训练模型。
下表摘自论文,定量比较了 GPT-3 和 PET:
图片形式原文:https://arxiv.org/pdf/2009.07118.pdf
这篇论文本身相当全面,讨论了如何端到端地应用 PET 的思想,还描述了 PET 的迭代风格及其优点。关于如何定制模型的更多实验和细节,请参考参考资料中提到的论文和 git 库。
结论
这项研究已经证明,语言模型不一定是人类语言才有效。探索句型可以在语言任务中带来同样有效的表现,而不需要那么多的参数。
参考
https://arxiv.org/pdf/2009.07118.pdfT12https://github.com/timoschick/pet
GPT-3 与 Rasa 聊天机器人
理查德·特里维希克的火车头——19 世纪初的 GPT 3 号(Shutterstock.com)
比较 GPT-3 和定制训练的 Rasa 聊天机器人的性能
1829 年,一个事件引发了一场技术革命。在 Rainhill 试验中,一组蒸汽机车摆好架势,决定哪一辆能赢得一系列速度、强度和可靠性的测试。获胜的机器,火箭,不仅在试验中击败了对手,还为下一个世纪蒸汽机车的发展指明了方向。
斯蒂芬森的火箭(Shutterstock.com)
这一切与 OpenAI 在 6 月份开始的有限测试版中提供的变形金刚语言模型 GPT-3 有什么关系?一些评论者将 GPT-3 誉为人工通用智能的第一瞥,而其他人则称其为一个巨大的查找表。我不认为 GPT-3 是 AGI,但我认为 GPT-3 使用的方法将是变革性的。利用强大的计算能力和庞大的训练套件,OpenAI 创造了一个真正通用的模型。通过与铁路时代的黎明进行比较,我们可以将 GPT-3 放在背景中,并更清楚地看到它的影响。
在这篇文章中,我将描述一个简单的测试,我做了比较 GPT-3 的性能与 Rasa 聊天机器人。这个测试当然不是 Rainhill 试验,但我认为结果确实揭示了像 GPT-3 这样的大型变压器模型在未来将发挥的作用。我会说 GPT-3 不是人工智能版的火箭,但它可能会扮演理查德·特里维希克在雨山试验前几十年设计的机车的角色。特里维西克的机器又慢又重,以至于毁坏了铁轨。然而,尽管有缺陷,这些机车有正确的基本成分,它们为火箭改变世界的成功铺平了道路。
作者照片
GPT-3 和 Rasa 聊天机器人的直接比较
GPT-3 的测试版仍然受到限制。标准的申请程序对我不起作用,但我遵循了这个视频中的建议,几天后我被批准了。
一旦我有了 GPT-3,我想做一个简单的测试来比较它与现有应用程序的能力。今年早些时候,我在 Rasa 创建了一个聊天机器人来回答关于电影的一般问题。这个聊天机器人花了 4 个月的时间开发,并在大量的电影数据集上进行了明确的训练。为了比较 GPT-3 和 Rasa 聊天机器人,我从聊天机器人的回归测试集中随机挑选了 7 个问题。我比较了 Rasa 和 GPT-3 对这些问题的回答,得到了测试的结果。
Rasa 的测试结果
为了用 Rasa 聊天机器人运行测试,我使用“rasa shell”命令启动了经过训练的 Rasa 模型,并交互式地输入了问题。以下是结果,我的输入以粗体显示,聊天机器人的回复以常规字体显示:
来自 Rasa 聊天机器人的测试响应
Rasa 聊天机器人答对了 7 道题中的 6 道:
- “列出喜剧吸血鬼电影”问题的答案不正确。我试着问了几个不同的问题,但结果是一样的。
- 我认为《T2》十诫(T3)的演员名单在技术上是正确的,因为 Rasa 返回的名单确实是由电影中的演员组成的。然而,答案并不尽如人意,因为最令人难忘的两位明星查尔登·海斯顿和尤尔·伯连纳被漏掉了。
GPT-3 的测试结果
为了用 GPT-3 进行测试,我在 GPT-3 仪表板的 Playground 选项卡中选择了 Q&A 预设,并输入了与我在 Rasa 命令行界面中输入的相同的问题。以下是开箱即用的结果,我的输入用粗体显示,GPT-3 的回答用常规字体显示:
GPT-3 的测试响应
GPT 3 号答对了 7 道题中的 5 道。在剩下的两个测试案例中:
- Soylent Green 可以说很有趣——“Soylent Green 是人!”——但我认为 GPT 3 把这部电影贴上喜剧的标签是错误的。
- GPT-3 对“列出喜剧吸血鬼电影”的问题有一个很好的答案,但它重复了几次正确答案的子集。此外,惊魂夜是迄今为止最好的喜剧吸血鬼子类型,所以我很失望 GPT 3 从重复中省略了它。
当我提供几个例子来帮助 GPT-3 回答它没有正确回答的问题时,我决定看看会发生什么。
首先,对于电影类型,我提供了几个例子,然后再次询问了 Soylent Green 的类型:
GPT-3 得到了一点提示的正确答案
正如你所看到的,经过一点提示,GPT-3 得到了 Soylent Green 类型的正确答案。
我尝试了一种类似的方法来应对对吸血鬼喜剧电影问题的过度热情:
额外的训练没有帮助吸血鬼喜剧电影查询
更多的多体裁回答的例子并没有帮助我得到这个问题的正确答案,我在其他多体裁问题上得到了类似的结果:
GPT 3 挣扎着回答关于多类型电影的问题
结论
这个有限的测试是否证明 GPT-3 可以取代 Rasa?简单的答案是“不”,原因如下:
- 无可否认,电影琐事应用程序的用例过于简单,而且本练习中的测试用例数量非常少。这种有限的测试本身并不能确定 GPT-3 是否能取代 Rasa。
- Rasa 框架非常灵活和完善,可以用专门的和当前的数据进行训练。相比之下,GPT-3 是根据截至 2019 年 10 月的最新数据进行训练的。你可以看到下面的结果,GPT 3 无法为 2020 年上映的猛禽提供剧情:
- 当 Rasa 失败时,调试问题的根本原因相对容易。相比之下,GPT-3 以意想不到的方式失败,用例子把它推回到正确的答案可能会失败,正如你在本文描述的测试中看到的。
虽然这个简单的测试没有证明 GPT-3 可以取代 Rasa,但它确实产生了一个惊人的结果:几乎开箱即用,只需几个例子就可以纠正一个答案,GPT-3 的性能与 Rasa 聊天机器人相当,而 Rasa 聊天机器人需要 4 个月的艰苦训练和开发。经过 4 个月的努力,Rasa 聊天机器人只能做一件事——回答关于电影的问题。除了匹配 Rasa 聊天机器人的性能,GPT-3 还可以处理大量其他问题,包括自然语言翻译和从英语文本生成代码。
作者照片
回到我在本文开始时介绍的蒸汽机车类比,我相信虽然 GPT-3 可能不是人工智能的火箭,但它肯定展示了特里维西克机车的前景。190 年前,在铁路时代来临之际,靠在运河上运输货物致富的人们有一个选择。他们可以对新生蒸汽机车的局限性和缺陷感到欣慰,并认为运河时代将永远持续下去,或者他们可以拥抱新技术,为铁路革命做准备。我相信 GPT-3 代表了人工智能向前发展的一个新方向,因为它可以“开箱即用”地应用于如此多的问题,而几乎不需要额外的工作。我也相信巨大的变形金刚语言模型的全部潜力还在后面,所以 GPT 3 的后继者将会有更大的影响。人工智能版本的火箭正在路上,人工智能世界的运河驳船主人需要做好准备。
你可以在这里找到本文中描述的 Rasa 电影聊天机器人的代码:https://github.com/ryanmark1867/chatbot_production
你可以在这里找到一个演示本文描述的代码的视频短片:https://www.youtube.com/watch?v=ECeRjLkT01U&t = 2s
关于 Rasa 的更多故事:
- 通过 Facebook Messenger 使用 Rasa:https://medium . com/@ markryan _ 69718/tips-for-use-Rasa-chatbots-with-Facebook-Messenger-ee 631 e 67 e 30 b
- 使用 Facebook Messenger 和 Rasa 部署深度学习模型:https://medium . com/swlh/deploying-a-deep-learning-model-using-Facebook-Messenger-with-Rasa-fc85c 419 e 82 f
- 使用 Facebook Messenger webview with Rasa:https://medium . com/swlh/using-Facebook-Messenger-webview-with-a-Rasa-chatbot-67 b43 af 3324 a
更多关于 GPT 的故事-3:
- 使用 GPT-3 将英文描述转换成 git 命令:https://towardsdatascience . com/replacing-my-git-cheat-sheet-with-GPT-3-69223 e 58626 f
- 使用 GPT-3 导航伦敦地铁:https://towards data science . com/on-the-tube-with-GPT-3-6f 9572 e 88292
GPT-怎么了?OpenAI 开创性的新 NLP 模型的非技术性指南
图片由 Unsplash.com 提供
周末期间,推特上对 GPT 3 号的炒作达到了历史新高,许多人将这一技术发展称为未来人工智能研究的突破性拐点。在这篇文章中,我探索了什么是 GPT,它对人工智能发展意味着什么,以及我们可能从这里走向何方。
OpenAI 的 GPT-3 语言模型上周获得了极大的关注,让许多人相信这项新技术代表了自然语言处理(NLP)工具发展的一个重要转折点。那些通过 OpenAI 的测试程序获得早期 API 的人去 Twitter 展示了使用 GPT-3 技术构建的令人印象深刻的早期工具:
对于非工程师来说,这可能看起来像魔术,但这里有很多东西需要解开。在这篇文章中,我将提供一个 GPT 和它可以用来做什么的简要概述。
什么是 OpenAI 和 GPT-3?
OpenAI 是一个人工智能研究实验室,由埃隆·马斯克、萨姆·奥特曼等人于 2015 年创立,其使命是创造造福全人类的人工智能。该公司最近在 2019 年获得了微软 10 亿美元的额外资金,被认为是人工智能研发的领导者。
从历史上看,获得大量的标记数据来训练模型一直是 NLP 开发(以及一般人工智能开发)的主要障碍。通常,这可能非常耗时且昂贵。为了解决这个问题,科学家们使用了一种叫做迁移学习的方法:使用在先前训练的模型中学习到的现有表示/信息作为起点,为不同的任务微调和训练新的模型。
例如,假设你想学习一门新的语言——德语。最初,你仍然会用英语思考你的句子,然后翻译和重新排列单词,得出德语的对等词。事实是,即使实际的单词和语法是不同的,你仍然在间接地应用从以前的语言中学到的句子结构、语言和交流。这就是为什么如果你已经知道另一种语言,学习新的语言通常会更容易。
将这种策略应用于 AI 意味着我们可以使用预训练的模型,用更少的训练数据更快地创建新模型。在这个伟大的演练中,Francois Chollet 比较了从零开始训练的人工智能模型和从预训练模型构建的模型的有效性。他的结果显示,在用相同数量的训练数据训练两者后,后者的预测准确性提高了 15%。
2018 年,OpenAI 提交了令人信服的研究,显示这种策略(将监督学习与无监督预训练配对)在 NLP 任务中特别有效。他们首先使用“未标记文本的多样化语料库”(即来自各种流派的超过 7000 本独特的未出版书籍)产生了一个生成性预训练模型(“GPT”),本质上创建了一个“理解”英语和语言的模型。接下来,这个预训练的模型可以进一步微调和训练,以使用监督学习来执行特定的任务。打个比方,这就像教某人英语,然后训练他或她阅读和分类可接受和不可接受的求职者的简历。
GPT-3 是 GPT 模型的最新版本,于 2020 年 5 月在首次描述。它包含 175 亿个参数,相比之下 GPT-2 中有 15 亿个参数(增加了 117 倍),训练它消耗了几千万亿次/秒-天的计算能力。与 GPT-2 相比,GPT-3 提供了更多的数据,调整了更多的参数,因此,到目前为止,它已经产生了一些惊人的 NLP 能力。所需的大量数据和计算资源使得许多组织不可能重现这一点,但幸运的是他们不必如此,因为 OpenAI 计划在未来通过 API 发布访问。
关键接待
诚然,GPT-3 并没有得到太多的关注,直到上周沙里夫·沙米姆和其他人的病毒推文(见上图)。他们展示了 GPT-3 可以用来创建基于简单英语指令的网站,设想了一个无代码技术的新时代,人们可以通过简单的文字描述来创建应用程序。早期采用者凯文·拉克尔用图灵测试测试了模型,看到了惊人的结果。GPT-3 在最初的 Q & A 中表现异常出色,展示了人工智能系统传统上与之斗争的“常识”的许多方面。
然而,该模型远非完美。Max Woolf 执行了一项批判性分析,指出了几个问题,如模型延迟、实施问题以及需要重新考虑的数据偏差。一些用户也在 Twitter 上报告了这些问题:
OpenAI 的博客讨论了该模型的一些关键缺陷,最值得注意的是 GPT 对世界的全部理解都是基于它接受训练的文本。例证:它是在 2019 年 10 月接受训练的,因此不了解新冠肺炎。不清楚这些文本是如何选择的,以及在这一过程中进行了(或要求)什么样的监督。
此外,生产和维护这些模型所需的巨大计算资源引发了关于人工智能技术对环境影响的严重问题。虽然经常被忽视,但硬件和软件的使用都极大地导致了能源资源的枯竭、过多的废物产生以及稀土矿物的过度开采,从而对人类健康产生了相关的负面影响。
为了平息人们的担忧,OpenAI 一再声明其使命是为了人类的利益开发人工智能,并打算在发现滥用时停止访问其 API。即使在测试版中,它也要求候选人描述他们对该技术的意图以及对社会的好处和风险。
我们将何去何从?
毫无疑问,GPT-3 仍然代表着人工智能发展的一个重要里程碑。许多早期用户已经建立了令人印象深刻的应用程序,这些应用程序可以准确地处理自然语言并产生惊人的结果。总而言之:
- GPT 3 号是对 GPT 2 号的重大改进,具有更高的精确度和更好的使用情况。这是人工智能发展向前迈出的重要一步,仅用了两年时间就令人印象深刻地完成了
- 建立在 GPT-3 上的早期工具显示了商业可用性的巨大前景,例如:允许你通过描述来构建应用的无代码平台;使用简单英语的高级搜索平台;以及更好的数据分析工具,使数据收集和处理速度更快
- OpenAI 宣布计划发布一个商业 API ,这将使组织能够大规模构建由 GPT-3 驱动的产品。然而,关于如何具体实施仍存在许多问题,如定价、SLA、模型延迟等。
- 用户指出了在广泛商业使用之前需要解决的几个问题。模型中固有的偏见,围绕公平和道德的问题,以及对滥用(假新闻、机器人等)的担忧。)需要深思熟虑,监督可能是必要的
- OpenAI 公开承诺为了人类的利益创造人工智能,但是,大规模监控滥用将很难实现。这引发了一个更广泛的问题,即政府参与保护个人权利的必要性(T4)
总之,我非常兴奋地看到哪些新技术建立在 GPT 3 号上,以及 OpenAI 如何继续改进其模型。对 NLP 和 GPT-3 越来越多的关注和资助可能足以抵御许多批评家的恐惧,他们担心一个人工智能的冬天可能会到来(包括我自己)。尽管该模型存在不足,但我希望每个人都能对未来持乐观态度,在未来,人类和机器将以统一的语言相互交流,数十亿人将能够使用技术创造工具。
GPT-3:现实世界中的梦想机器
人工智能产品的范式转变
就像山姆的推文一样,科技社区对 OpenAI 于 2020 年 6 月发布的最新 GPT-3 有很多炒作,但当你与它互动时,它仍然很强大,令人印象深刻。GPT-3 是有史以来最大的语言模型,在语言生成和语言翻译等几个 NLP 任务中取得了良好的效果,在许多其他创造性和功能性任务中具有巨大的潜力。
在这里,我们将回顾几个亮点,并通过示例更清楚地了解该模型能做什么和不能做什么,以及如何利用它来支持各种应用程序。
为什么是破坏性的?
巨大的
GPT-3 使用变压器框架和注意力架构,这是与 GPT-2 相同的模型架构。它有不同的尺寸,最大的(或“GPT-3”)有 175 个可训练参数,96 层,每层 96 个头,每个头的尺寸为 128。即使是 3.2 米的批量也是巨大的
它在来自以下来源的巨大文本语料库上进行训练
- 已过滤的常见爬网(410B 令牌 0.44)*
- 网页文本 2(19B * 2.9)
- 2 本互联网书籍(12B * 1.9 + 55B * 0.43)
- 英文维基百科(3B * 3.4)
根据论文,训练最大的 GPT-3(175B 参数)需要 3640 petaflop/s-day,1 petaflop/s-day 相当于 8 个 V100 GPUs 一天的全效率。
“为 OpenAI 开发的超级计算机是一个单一系统,具有超过 285,000 个 CPU 核心、 10,000 个GPU 和 400 千兆位每秒的网络连接,查看微软如何为 OpenAI 构建 GPU 加速的超级计算机系统
少数镜头学习者👏👏👏
这是 GPT-3 的主要突破,这意味着该模型可以通过观察零个、一个或几个任务实例来快速学习任务,使其更有能力预测从未见过的任务。较大的模型可以更好地从少量的例子中学习上下文信息。
来源:https://arxiv.org/pdf/2005.14165.pdf
相比之下,传统的任务不可知架构(BERT)需要数万个特定于任务的示例来微调下游任务。GPT-3 使我们能够执行一项新的任务(分类,问题回答,翻译,推理和许多其他),只需几个例子或指令,无需微调。这是一个巨大的优势,超过其他主流语言模型,如伯特,ELMO,XLM。
[## 不要杀死一个人形机器人:机器值得拥有权利吗?数据驱动的投资者
7 月下旬,全世界都知道 Neuralink 公司即将把人脑与计算机集成在一起…
www.datadriveninvestor.com](https://www.datadriveninvestor.com/2020/07/09/dont-kill-a-humanoid-do-machines-deserve-to-have-rights/)
更有甚者,OpenAI 发布了 GPT-3 API 。发送文本提示,API 将返回完成信息,尝试匹配您在示例中给出的模式。API 非常简单,开发人员可以即插即用,将远程模型的智能带到他们的产品中,而不用担心 ML 管道、基础设施和托管。这是一个巨大的突破,有许多好处:
- 它使得最先进的模型更容易被开发人员用来探索潜在的用例。
- 显著降低了采用 NLP/机器智能的门槛。开发人员不再需要花费额外的精力来获取特定于任务的数据集,掌握复杂的 ML 和微调过程,处理 ML 基础设施。
该 API 尚未准备好用于大规模生产,OpenAI 和开发人员仍在学习和评估各种应用程序和潜在的社会影响。
用例
过去几周,许多由 GPT-3 实现的创意原型涌现出来,在 Twitter 上可以找到许多令人印象深刻的演示。现在,让我们更深入地了解 GPT-3 如何帮助传统的自然语言处理任务以及一些来自社区的创造性应用。
** 在下面的例子中,我们将使用 蓝色 🔵颜色以指示上下文或提示(任务描述、示例)作为前缀。然后是 橙色 🍊颜色来表示用户的输入,剩下的就是模型的预测。
语言生成
最令人印象深刻的用例之一是语言生成/文本完成。这里有一个例子,让 GPT-3 帮助我们扩展一个句子来写一篇短文。它甚至提供了如何表达感激的具体例子。
用实用知识和零例子写作文
问题回答
仅使用 5 个 QA 示例,该模型就能够以准确的答案回答所有以下问题,同时保持上下文信息。
问答引擎帮助你找到“事实”
聊天机器人
通过任务描述和一个例子,该模型能够进行有益的、创造性的和相关的聊天体验。但在这个例子中,机器人编造了山姆·奥特曼是 Y Combinator 的联合创始人,而实际上他是总裁。这可能是因为我使用了更高的温度(api 参数之一)来获得更高的创造性。
一个具有知识、创造力和人类洞察力的聊天机器人
文本分类
对于这个任务,我们提供了任务的描述和 3 个公司名称、业务类别及其最新市值的例子。然后,我们通过提供 4 个新名称进行测试,如联合利华、麦当劳、谷歌和苹果。
该模型最准确地完成了企业类别分类,并且能够估计市值。但由于模型是用 2019 年 10 月截止的数据训练的,所以我猜测预测的市值已经过时了。
学会对公司类别进行分类,用很少的镜头预测市值
翻译
只有 5 个英汉翻译示例,该模型在完成其余翻译方面做得相当好。
用几个例子建立一个翻译任务
虚拟助手
这个例子演示了模型的文本到动作的能力。一个类似 Alexa 或 Siri 的用例,用户发出语音查询,我们需要通过将每个查询解析为一个意图和多个动作来提取查询的语义。
以下示例向您展示了一个带有少量镜头的文本至 actions NLU 引擎。令人惊讶的是,仅仅通过几个例子,该模型就能够帮助创建一个新的意图“打开应用程序”,并正确提取“打开网飞和搜索纸牌屋”的所有位置。
通过几个例子,你将有你的意图分类和槽检测引擎
还有什么?
除了传统的 NLP 任务之外,我们还可以用这个 API 构建许多其他令人惊奇的东西。
就像创作小说,写歌,生成电影剧本,生成不同方向的故事,写电子邮件,帮你产生想法,给孩子讲故事,甚至生成图像 …
以下是一些来自社区的创意原型,你会发现在不同的领域和形式的巨大潜力。
用自然语言建立了一个照片应用程序
编码指导
自动化你的谷歌电子表格
帮助你更好地了解你的食物
把法律条款变成人类可以理解的语言😂😂😂
进一步思考
GPT-3 创造了开发人工智能产品的典范转移
传统上,作为 ML 产品经理或 ML 工程师,您将花费更多精力来管理训练数据集、选择模型、微调和运行评估。ML infra 需要协调多个模型的托管,以便进行推理和扩展。
使用 GPT-3 API,可以跳过上述一些工作。一旦你弄清楚 GPT-3 API 可以帮助解决什么问题,你如何设计提示,以及你如何选择 API 参数(温度、响应长度等)。)将影响产品的完成质量和成功。产品所有者和开发人员还需要深入探索其他可能的提示来源和形式,如用户的喜欢、点击、分享和评论,甚至是来自音频的抄本或来自图像/视频的语义分段。
社会影响
GPT-3 是一个良好的开端,尽管在公平性、偏见和社会影响方面存在一些担忧。用户使用产品的时间越长,对数据集质量的影响就越大。这将导致来自不同提供商的人工智能产品的潜在偏见,这些产品基于相同的 GPT-3 模型。
解决上述问题的一些想法:
为 ML 模型创建一个可信的信誉系统。
向模型提供跟踪数据以提高答案的质量。用户可以根据他们的需求和质量来控制选择哪个提供商。
最后
训练模型和评估人工智能产品的努力仍然至关重要。但 GPT-3 仍然提供了一种开发人工智能产品的新方法,在时间、成本和质量方面具有潜在的优势。
GPT 3 号功能强大,超级聪明。现在是时候开启我们的想象力去发现所有的可能性了。
请随意提出建议或说嗨。
一开始我用“用真实用例揭开 GPT3 的神秘面纱”作为标题。在发表这篇文章之前,我觉得它是如此平淡,所以我向 GPT-3 求助。😜
这篇文章的标题和几个段落是由 GPT-3 生成的。
使用 GPU 加速您的移动应用程序使用 Android NDK、Vulkan 和 Kompute 加速机器学习
一个手把手的教程,教你如何利用你的手机 GPU 加速数据处理和机器学习。您将学习如何使用原生开发工具包(NDK)、Kompute 框架和 Vulkan SDK 构建一个简单的 Android 应用程序。
安卓 NDK 中的 Kompute(图片由作者提供)
如今,一些智能手机配备了笔记本电脑级别的硬件——携带高达 16GB 的 RAM、高速多核 CPU 和能够在 4k 显示器上渲染高性能复杂图形应用的 GPU。
作者图片
随着移动硬件不断改进 e,挖掘这种能力——特别是 GPU 处理能力——对于设备上的数据处理能力变得越来越重要。最近,围绕边缘计算、联合架构、移动深度学习等,这已经开启了令人兴奋的机遇。
本文提供了一个技术深度,向您展示了如何利用移动跨供应商 GPU 的强大功能。您将学习如何使用 Android 原生开发套件 和 Kompute 框架 为 Android 设备编写 GPU 优化代码。最终结果将是在 Android Studio 中创建的移动应用程序,它能够使用我们将从头开始编写的 GPU 加速机器学习模型,以及允许用户向模型发送输入的用户界面。
Android Studio 在模拟器中运行项目(图片由作者提供)
除了编程经验之外,不需要任何背景知识**,但是如果你对参考的底层 AI / GPU 计算概念感兴趣,我们建议查看我们以前的文章,“移动设备中的机器学习&跨厂商 GPU 使用 Kompute & Vulkan 变得简单”。**
你可以在 资源库的 示例文件夹中找到完整的代码。
Android 本地开发套件(NDK)
安卓 NDK 图(图片由作者提供)
原生开发套件(NDK) 是 Android 解决方案之一,旨在解决移动应用不断增长的计算需求。NDK 框架使开发人员能够编写低级、高效的 C 和 C++代码,这些代码可以通过流行的 Java 本地接口 绑定与 Java/Kotlin 应用程序代码进行互操作。
这种工具使移动应用程序开发人员不仅可以编写高效的代码,还可以利用现有的用 C++编写的优化框架进行高级数据处理或机器学习。
进入 Kompute & Vulkan SDK
与 Khronos 成员一起玩“瓦尔多在哪里”(图片由 Vincent Hindriksen 通过 StreamHPC 提供)
Vulkan 是由 Khronos Group 领导的一个开源项目,Khronos Group 是一个由几家科技公司组成的联盟,致力于定义和推进移动和桌面媒体(和计算)技术的开放标准。
大量高调(和新)的框架已经采用 Vulkan 作为他们的核心 GPU 处理 SDK。Android NDK 的主文档页面有一个完整的章节 专门介绍 Vulkan ,以及展示如何在 Android 移动设备中使用它的实例。
正如您所想象的,Vulkan SDK 提供了对 GPU 的非常低级的访问,这允许非常专业的优化。这对于数据处理和 GPU 开发人员来说是一笔巨大的财富——主要缺点是冗长,需要 500–2000 多行代码才能获得编写应用程序逻辑所需的基本样板文件。这可能导致昂贵的开发周期和错误,从而导致更大的问题。这是我们启动 Kompute 项目的主要动机之一。
Kompute 是一个构建在 Vulkan SDK 之上的框架,它抽象了大量所需的样板代码,引入了展示 Vulkan 计算能力的最佳实践。Kompute 是 GPU 计算框架,我们将在本教程中使用它来构建我们的移动 Android 应用程序中的机器学习模块。
Kompute 文档(图片由作者提供)
移动开发中的机器学习
在本帖中,我们将基于我们在“移动设备中的机器学习&跨厂商 GPU 使用 Kompute & Vulkan ”文章中创建的机器学习用例。我们不会像在那篇文章中那样详细地讨论基础概念,但是我们仍然会在这一节中介绍所需的高级直觉。
首先,我们需要一个允许我们公开机器学习逻辑的接口,这主要需要两个功能:
train(…)
—允许机器学习模型学习从提供的输入预测输出的功能predict(...)
—预测未知实例输出的函数。
这可以在下图中概述的两个工作流程中看到。
数据科学流程(图片由作者提供)
特别是在应用程序开发中,这也将是机器学习工作流的一种常见模式,无论是预测性还是解释性建模用例。这通常包括利用用户在直接(或间接)与应用程序交互时生成的数据。这些数据可以作为机器学习模型的训练特征。新模型的训练可以通过数据科学家执行的手动“离线”工作流来执行,或者通过自动触发再训练模型来执行。
Android Studio 项目概述
项目文件结构(图片由作者提供)
我们将从提供 Android Studio 项目中核心组件的高级概述开始,包括 Kompute C++绑定、Android 用户界面、Kotlin 中的应用程序逻辑构建以及所需的构建文件。如果你对某个领域感兴趣,你可以跳到下面相应的部分。
您需要确保安装了 Android Studio ,还需要安装Android NDK——其余的依赖项将在 IDE 中打开项目时自动安装和配置。
现在您已经安装了所有的东西,您可以导入项目了。为此,你首先要克隆 完整的 Kompute 库 并导入examples/android/android-simple/
下的 Android Studio 项目。现在,您应该能够看到项目加载和配置构建。一旦它打开,你就可以在模拟器或你自己的安卓手机上运行它。这个项目在 Pixel 2 模拟器和三星 Galaxy 手机上进行了测试。
最终的 GPU 加速 Kompute 应用程序(图片由作者提供)
当您加载项目时,您会注意到文件结构中的以下关键组件,我们将在下面的部分中进一步详细分析这些组件:
- Android SDK 应用—Android UI、资产资源、构建文件和 Kotlin/Java 组件,提供与 UI 和 C++ Kompute ML 绑定交互的相关应用逻辑。
- 安卓 NDK Kompute ML 模块 —通过安卓 NDK 配置的用于 GPU 加速处理的 Kompute ML C++代码和绑定。
Android SDK 应用程序
本节涵盖了 Android SDK Java/Kotlin 和用户界面组件,这些组件将直观地展示高级业务逻辑如何与本地 C++ JNI 绑定进行交互。
用户界面主要由输入文本框和显示文本标签组成,使用户能够与 GPU 加速 ML 处理 C++内核进行交互(如下图所示)。如果你对所使用的视图很好奇,你可以在你的 Android Studio 项目中查看,或者直接打开[activity_kompute_jni.xml](https://github.com/EthicalML/vulkan-kompute/blob/v0.3.2/examples/android/android-simple/app/src/main/res/layout/activity_kompute_jni.xml)
文件。
我们的移动应用程序的核心可以在[KomputeJni.kt](https://github.com/EthicalML/vulkan-kompute/blob/v0.3.2/examples/android/android-simple/app/src/main/java/com/ethicalml/kompute/KomputeJni.kt)
文件内的app/src/main/java/com/ethicalml/kompute
文件夹中找到。这个 Kotlin 文件包含我们的 Android 应用程序的主要业务逻辑。
如果我们在下面的代码块中查看该类的简化版本,我们会注意到以下要点:
fun onCreate(…)
—此函数在 Android 活动初始化时调用(当应用程序加载时)fun KomputeButtonOnClick(…)
—当主“KOMPUTE”按钮被按下时,该函数被触发,并使用用户界面文本框中的数据触发 C++ Jni 绑定函数。external fun initVulkan(): Boolean
—该函数是 C++ JNI 函数之一,将被绑定到 Vulkan 初始化 C++函数。external fun kompute(...): FloatArray
—这是 C++ JNI 函数,它将训练 ML 模型并对提供的输入运行推理,返回推理结果。external fun komputeParams(...): FloatArray
—训练模型并返回学习参数weight 1
、weight 2
和bias
的 C++ JNI 函数。companion object { ...("kompute-jni") }
—这是您将为 C++输出共享库指定的名称,该库将包含带有所有相关绑定函数的已编译 C++源代码。
您还会注意到,external fun
函数没有任何定义——这是因为定义是在 C++ JNI 函数绑定中提供的,这将在 C++ JNI 绑定部分 中介绍。
现在,为了更详细地介绍每个函数,我们从onCreate
函数开始。这个函数负责初始化应用程序中所有相关的组件。这包括:
val binding
—这是允许我们访问 UI 中所有文本框和元素的主要对象。- 这是我们第一次调用 C++ JNI 函数,它主要负责初始化 Vulkan。如果成功,它返回
true
,我们在一个android.widget.Toast
弹出窗口中显示相应的成功消息——否则显示一个错误。
接下来我们有KomputeButtonOnClick(...)
功能。当用户按下应用程序中的“KOMPUTE”
按钮时,该功能被触发。该函数的主要目的是从 UI 中的输入文本框中检索输入,然后使用输入数据通过 JNI C++绑定执行 ML 训练/推理步骤,最后在 UI 文本标签中显示结果输出。更详细地说:
val <elementname> = findViewById<EditText>(R.id.<elementname>)
—这是创建变量的步骤的格式,该变量包含相应的输入文本框。在这种情况下,<elementname>
是我们正在交互的元素的名称。xi, xj and y
—FloatArray
元素从相应输入框中的文本创建,然后用于 ML 模型处理。val out = kompute(xi, xj, y)
—这里我们运行 C++ JNI 绑定函数kompute
,它通过我们在 C++中创建的 KomputeModelML 类训练和处理数据。val params = komputeParams(xi, xj, y)
—这里我们运行 C++ JNI 绑定函数,该函数训练并返回 Kompute 机器学习模型的学习参数。<elementname>.text = <value>
—遵循此格式的行基本上会覆盖 UI 中的文本标签以显示输出。
最后几个函数只被显式设置为绑定到 C++ JNI 绑定的外部函数。此外,companion object
部分提供了共享库的名称,该共享库将包含本活动中引用的各个绑定。
您可以在资源库中的[KomputeJni.kt](https://github.com/EthicalML/vulkan-kompute/blob/v0.3.2/examples/android/android-simple/app/src/main/java/com/ethicalml/kompute/KomputeJni.kt)
文件中找到完整的文件。
安卓 NDK Kompute ML 模块
本节涵盖了 Android NDK Kompute ML 模块文件,其中包括构建系统,以及使用 Kompute 框架 的 C++源代码。
Kompute 建筑设计(图片由作者提供)
我们将使用 Kompute 的核心组件,如附图所示。也就是说,我们将使用 Kompute Tensors 在 GPU 中加载相关数据,使用相应的 Kompute 操作处理它,并使用 Kompute 序列和 Kompute 管理器协调它。我们不会详细讨论 Kompute 架构,但是如果你想了解更多的底层概念,你可以查看关于底层实现的更详细的文章。
Android NDK 绑定模块中的核心组件包括:
- JNI 绑定函数 —可以从 Java/Kotlin Android SDK 应用代码中调用的原生函数。
- KomputeModelML 类 —公开 Kompute GPU 加速 ML 模型逻辑的类。
- CMake 构建文件 —负责编译和链接所有相关库的 C++构建文件。
JNI 结合函数
在这种情况下,JNI 绑定通过[KomputeJniNative.cpp](https://github.com/EthicalML/vulkan-kompute/blob/v0.3.2/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp)
文件提供。下面是这个类的框架——为了简单起见,函数代码逻辑已经被编辑过了,下面会有更详细的解释。
JNI 绑定函数必须匹配 Java/Kotlin 代码中定义的类函数。该函数的格式为:
Java_<modulepath>_<class>_<functionname>(env, thiz, ...params)
在我们的例子中,这个类在com.ethicalml.kompute
模块中,在类KomputeJni
和它各自的函数中——下面的函数名称将反映这个结构。
再深入一层,我们现在可以浏览文件的每个部分。从导入开始,我们可以看到下面的导入以及概述其核心功能的注释。
在 Android 应用程序中,我们实际上需要手动初始化 Vulkan 动态库(这是在 Android 之外通常不会做的事情)。之所以需要这样做,是因为 Vulkan 库实际上并没有链接到 Android 手机中。Android 避免进行任何链接的原因是为了向后兼容,主要是为了确保如果在旧手机中找不到 Vulkan 库,应用程序不会崩溃。
这意味着我们需要在 C++代码中手动找到这个库,如果找到了,就将每个函数链接到它各自的内存地址指针,这样我们的 C++框架就可以使用它了。幸运的是,这是 Kompute 自动做的事情,我们不会在本文中涉及细节,因为它本身可能需要一篇文章,但如果你感兴趣,你可以在 这篇文章 中阅读更多关于它的内容,你可以看到 Kompute 如何使用[vk_ndk_wrapper_include](https://github.com/EthicalML/vulkan-kompute/tree/45ddfe524b9ed63c5fe1fc33773c8f93a18e2fac/vk_ndk_wrapper_include)
文件在 Core.hpp 头文件中动态导入 Vulkan。
下面您可以看到公开了initVulkan
逻辑— Java_com_ethicalml_kompute_KomputeJni_initVulkan(...)
的函数的实现。你可以在这个函数中看到我们运行InitVulkan()
直到 Vulkan 库成功初始化,或者如果达到最大重试次数则失败。
一旦 Vulkan 被初始化,就可以调用剩余的函数。第一个是kompute
函数,它负责训练模型和运行推理请求。该函数接收输入 Xi 和 Xj 值,以及模型将从中学习的预期预测值。然后,它将返回把 Xi 和 Xj 视为看不见的数据的预测。函数基本上会调用KomputeModelML
类的train
函数和predict
函数。
最后剩下的将会暴露给 Java/Kotlin 代码的 JNI 函数是komputeParams
函数,它负责返回机器学习模型学习的参数,即weight 1
、weight 2
和bias
参数。
唯一剩下的函数是我们在 JNI 逻辑中使用的效用函数——即[jfloatArrayToVector](https://github.com/EthicalML/vulkan-kompute/blob/45ddfe524b9ed63c5fe1fc33773c8f93a18e2fac/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp#L32)
和[vectorToJFloatArray](https://github.com/EthicalML/vulkan-kompute/blob/45ddfe524b9ed63c5fe1fc33773c8f93a18e2fac/examples/android/android-simple/app/src/main/cpp/KomputeJniNative.cpp#L41)
—这些函数是不言自明的,所以我们将让感兴趣的读者在源代码中进一步探索。
KomputeModelML 类
既然我们已经介绍了绑定到 Kotlin / Java 类的关键函数,我们可以介绍包含 Kompute GPU 加速逻辑的KomputeModelML
C++类。
KomputeModelML 类的头文件如下所示,它包含以下关键组件:
#include "kompute/Kompute.hpp”
—包含我们将在这个项目中使用的所有 Kompute 依赖项的头void train(...)
-使用逻辑回归模型的 GPU 本机代码来训练机器学习模型。它接受输入数组X
,以及包含预期输出的数组y
。std::vector<float> predict(...)
—执行推理请求。在这种实现中,它不使用 GPU 代码,因为通常在推理端通过并行化获得的性能收益较少。然而,如果并行处理多个输入,仍有预期的性能增益(此功能允许)。std::vector<float> get_params()
—以[ <weight_1>, <weight_2>, <bias> ]
的格式返回包含学习参数的数组。static std::string LR_SHADER
—着色器代码,将在 GPU 内部作为机器码执行。Kompute 允许我们传递包含代码的字符串,但是对于生产部署,可以将着色器转换为二进制文件,也可以使用可用的实用程序转换为头文件。
如果您对完整的实现感兴趣,您可以在资源库中找到所有文件。此外,如果你对这些技术的理论和潜在的基本概念感兴趣,这将在我们之前的文章中全面介绍。
CMake 生成文件
[**CMakeLists.txt**](https://github.com/EthicalML/vulkan-kompute/blob/v0.3.2/examples/android/android-simple/app/src/main/cpp/CMakeLists.txt)
构建文件 是 Android NDK 工作流程中非常重要的组件。如果您希望将 Kompute 添加到您自己的项目中,这一部分变得尤为重要。cmake 文件很小,所以我们将分别介绍每一行。
首先,我们需要确保 Kompute 库是可用的。通常你会运行 Kompute 构建的INSTALL
目标来使用/导入各自的库。然而,在这种情况下,我们需要确保 Kompute 是为正确的 Android CPU 架构构建的——我们最简单的选择是添加主存储库作为构建的一部分,这意味着 Kompute 也将为正确的移动架构构建。如果你想把它包含在你的项目中,你只需要确保路径是相对于 Kompute 克隆文件夹的。
我们现在将变量 VK_ANDROID_INCLUDE_DIR 设置为 vulkan include 目录。这包含了 Vulkan 需要的所有包含文件——为了完整起见,Kompute 使用了vulkan.h
头文件和vulkan.hpp
C++头文件。
我们现在能够添加 Java/Kotlin Android Studio 项目将使用的库,在本例中是共享库**kompute-jni**
。
我们现在能够添加所有相关的include
目录。这包括我们上面定义的VK_ANDROID_INCLUDE_DIR
,以及包含 Android log.h
的VK_ANDROID_COMMON_DIR
。single_include
包含来自 Kompute 的kompute/Kompute.hpp
报头。最后,我们需要导入 Kompute 动态库包装器vk_ndk_wrapper_include
,这是动态导入 Vulkan 库所必需的。这背后的逻辑本身可以成为一系列文章,所以我们不会深入这个兔子洞,但如果你感兴趣,你可以在 这篇文章 中阅读更多内容,你可以看到 Kompute 如何动态导入Vulkan。
为了编译这个项目,我们需要确保设置了VK_USE_PLATFORM_ANDROID_KHR
,因为这是启用 Android 配置的原因。对于这个项目,我们也用KOMPUTE_DISABLE_VK_DEBUG_LAYERS.
禁用 Vulkan 调试层
最后,我们能够将相关的库链接到我们的kompute-jni
共享库目标。这包括:
kompute
—这是在 Kompute 构建中创建的库。kompute_vk_ndk_wrapper
—这个库也是由 Kompute build 创建的,包含动态加载和包装 Vulkan 库的代码。log
—这是 Android 日志库,Kompute 需要它来覆盖日志记录。android
—这是 Android 项目使用的 Android 库。
就这样——您现在可以运行应用程序了,它将执行完整的构建。然后你应该能够在你的 Android Studio 模拟器中或者你的物理手机中看到 Kompute 应用程序,在那里你将能够触发你的设备上 GPU 的处理。
Android Studio 在模拟器中运行项目(图片由作者提供)
下一步是什么?
恭喜你,你一路走到了最后!虽然这篇文章涵盖了广泛的主题,但是也有大量的概念被浏览过。其中包括底层 Android 开发工作流、Vulkan 概念、GPU 计算基础、机器学习最佳实践以及更高级的 Kompute 概念。幸运的是,网上有资源可以扩展你在这些方面的知识。以下是我推荐的一些进一步阅读的链接:
- "利用 Kompute 简化移动设备中的机器学习&跨供应商 GPU&Vulkan文章,深入探讨理论和概念
- “使用 Kompute 通过多队列并发并行化 GPU 密集型工作负载”采用更先进的 Kompute 概念
- Kompute 文档了解更多细节和更多示例
- 机器学习工程师时事通讯如果你想了解关于机器学习的最新文章
- Android NDK 入门文档如果您想深入了解本地开发套件
- 令人敬畏的生产机器学习开源工具列表,用于部署、监控、版本化和扩展您的机器学习
- FastAI 的编码人员 ML 课程简介进一步学习机器学习概念
- Vulkan SDK 教程深入了解底层 Vulkan 组件
KubeFlow 上的 GPU 即服务:快速、可扩展且高效的 ML
机器学习(ML)和深度学习(DL)涉及计算和数据密集型任务。为了最大限度地提高我们的模型准确性,我们希望在更大的数据集上进行训练,评估各种算法,并为每个算法尝试不同的参数(超参数调整)。
随着我们的数据集和模型复杂性的增加,我们等待工作完成所需的时间也在增加,导致我们的时间使用效率低下。我们最终运行更少的迭代和测试,或者在更小的数据集上工作。
NVIDIA GPUs 是加速我们数据科学工作的伟大工具。当涉及深度学习工作负载时,它们是显而易见的选择,并且比 CPU 提供更好的 ROI。随着像 RAPIDS 这样的新发展,NVIDIA 正在高效地处理数据分析和机器学习工作负载(如 XGBoost)(阅读我之前帖子中的详细信息:Python Pandas in Extreme Performance)。例如,读取 Json 数据、聚合其指标并写回压缩(Parquet)文件的分析任务在 GPU 上运行 1.4 秒,而在 CPU 上运行 43.4 秒(快了 30 倍!).
挑战:共享 GPU
CPU 长期以来一直支持虚拟化(虚拟机管理程序)、虚拟内存和 IO 管理等技术。我们可以在相同的 CPU 上运行许多不同的工作负载、虚拟机和容器,同时确保最大程度的隔离。我们可以使用各种集群技术在多个 CPU 和系统之间扩展计算,并使用调度程序将计算动态分配给任务。
另一方面,GPU 必须分配给特定的虚拟机或容器。这就导致了效率低下。当 GPU 密集型任务完成时,GPU 将保持空闲。例如,如果我们将笔记本服务器与 GPU 相关联,每当任务不运行时,我们就会浪费 GPU 资源——例如当我们编写或调试代码时,或者当我们去吃午饭时。这是一个问题,尤其是当配备 GPU 的服务器更加昂贵的时候。
存在一些将单个 GPU 划分为更小的虚拟 GPU 的解决方案,但这并没有解决问题,因为我们获得的(大部分是空闲的)片段太小或内存太少,无法运行我们的任务,并且鉴于很难在同一 GPU 上的任务之间隔离内存,我们可能会遇到许多潜在的故障。
解决方案:动态 GPU 分配和横向扩展
用户正在寻找的解决方案是,可以利用多个 GPU 来完成一项任务(因此可以更快地完成),并在任务持续期间分配 GPU。这可以通过将容器与编排、集群和共享数据层相结合来实现。
假设我们在 Jupyter 笔记本或 IDE 中编写了一些代码(例如 PyCharm)。我们可以在本地执行它,但当我们需要扩展时,我们打开旋钮,它在分布式集群上的运行速度会快 10 到 100 倍。那不是很好吗?我们能实现这样的梦想吗?是的,我们可以,我将在本文的后面向您展示一个演示。
为了实现这一点,我们需要能够在运行时将代码和库打包并克隆到多个动态调度的容器中。我们需要所有这些容器共享相同的数据,并实现任务分配/并行机制,如下图所示。
动态 GPU/CPU 分配(图片由作者提供)
一个名为 MLRun 的新开源 ML 编排框架允许我们定义“无服务器”ML 功能,这些功能由代码、配置、包和基础设施依赖项(如 CPU、GPU、内存、存储等)组成。).这些“无服务器”功能可以在我们的笔记本电脑中本地运行,或者在一个或多个容器上运行,这些容器是在任务期间动态创建的(如果需要,也可以驻留更长时间),客户端/笔记本电脑和容器可以通过低延迟共享数据平面(即虚拟化为一个逻辑系统)共享相同的代码和数据。
MLRun 建立在 Kubernetes 和 KubeFlow 之上,它使用 Kubernetes API 来创建和管理资源。它利用 KubeFlow 定制资源(CRD)无缝运行水平扩展工作负载(如 Nuclio functions 、Spark、Dask、horo VOD……),KubeFlow SDK 将任务附加到存储卷和机密等资源,以及 KubeFlow 管道创建多步执行图(DAG)。
通过 MLRun 执行的每个本地或远程任务都由 MLRun 服务控制器跟踪,所有输入、输出、日志和工件都存储在版本化数据库中,可以使用简单的 UI、SDK 或 REST API 调用浏览,即内置的作业和工件管理。MLRun 函数可以链接起来形成一个管道,它们支持超参数和 AutoML 任务,Git 集成,项目打包,但这些是不同帖子的主题,在这里阅读更多内容。
GPU 即服务堆栈(图片由作者提供)
示例:使用 Keras 和 TensorFlow 的分布式影像分类
在我们的示例中,我们有一个基于著名的猫和狗 TensorFlow 用例的 4 步管道:
- 数据摄取功能—从 S3 自动气象站加载图像档案
- 数据标记功能—将图像标记为狗或猫
- 分布式训练功能—使用 TensorFlow/Keras 和 Horovod 来训练我们的模型
- 部署交互式模型服务功能
你可以看到完整的 MLRun 项目和笔记本 来源这里,我们将重点放在第 3 和第 4 步。要做到这一点,你需要使用 Kubernetes,并在其上运行少量开源服务(Jupyter、KubeFlow Pipelines、KubeFlow MpiJob、Nuclio、MLRun)和共享文件系统访问,或者你可以要求使用那些预集成的 Iguazio 云试用版。
我们的代码可以在本地运行(参见笔记本中的第 1 步和第 2 步),要在具有 GPU 的集群上运行分布式训练,我们只需将我们的函数定义为 MPIJob 类(使用 MPI 和 Horovod 来分发我们的 TensorFlow 逻辑),我们指定代码的链接、容器映像(或者 MLRun 可以为我们构建映像)、所需的容器数量、GPU 数量(每个容器), 并将其附加到文件挂载(我们应用 iguazio 低延迟 v3io 结构挂载,但其他 K8s 共享文件卷驱动程序或对象存储解决方案也可以)。
一旦我们定义了函数对象,我们需要做的就是用一堆参数、输入(数据集或文件)运行它,并指定输出工件的默认位置(例如,训练好的模型文件)。
mprun = trainer.run(name='train', params=params, artifact_path='/User/mlrun/data', inputs=inputs, watch=**True**)
请注意,在本例中,我们不需要移动代码或数据,我们在笔记本和 worker 容器中使用相同的低延迟共享文件系统挂载这一事实意味着我们可以在 Jupyter 中修改代码并重新运行我们的作业(所有作业容器都将看到新的 Py 文件更改),并且所有作业结果都将在 Jupyter 文件浏览器或 MLRun UI 中即时查看。
除了交互查看作业进度(watch=True)之外,run 对象(mprun)还保存运行的所有信息,包括指向输出工件、日志、状态等的指针。我们可以使用 MLRun 基于 web 的 UI 来跟踪我们的工作进度,比较实验结果或访问版本化的工件。
我们用”。save()"为了将我们的函数对象序列化和版本化到数据库中,我们可以稍后在不同的笔记本或 CI/CD 管道中检索这个函数对象(不需要在笔记本和团队之间复制代码和配置)。
如果我们想要将生成的模型部署为一个交互式的无服务器函数,我们所需要的就是将“model”和“category_map”输出提供给一个“serving”函数,并将其部署到我们的测试集群中。
MLRun 编排自动扩展 Nuclio 功能速度超快,可以是有状态的(支持 GPU 附件、共享文件挂载、状态缓存、流等。),函数将自动伸缩以适应工作负载,如果请求在几分钟内没有到达,函数将伸缩到零(不消耗任何资源)。在这个例子中,我们使用“nuclio-serving”函数(承载标准 KFServing 模型类的 nuclio 函数),正如您在下面看到的,只需要一个命令(deploy)就可以使它作为一个活动的无服务器函数运行。
现在我们有了一个正在运行的推理函数,我们可以使用简单的 HTTP 请求测试端点,在有效负载中有一个 url,甚至是一个二进制图像。
使用 KubeFlow 管道的端到端工作流程
既然我们已经手动测试了管道的每一步,我们可能希望自动化这个过程,并可能按照给定的时间表运行它,或者由一个事件触发(例如 Git 推送)。下一步是定义一个 KubeFlow 管道图(DAG ),它将 4 个步骤链接成一个序列并运行该图。
MLRun 函数可以用一个简单的方法转换成 KubeFlow 管道步骤。as_step()),并指定如何将步骤输出馈入其他步骤输入,查看完整的笔记本示例在这里,下面的代码演示了图形 DSL。
MLRun 项目可以有多个工作流,它们可以通过单个命令启动,也可以由各种事件触发,如 Git push 或 HTTP REST 调用。
一旦我们运行我们的管道,我们可以使用 KubeFlow 跟踪它的进展,MLRun 将自动在 KubeFlow UI 中注册指标、输入、输出和工件,而无需编写一行额外的代码(我想你应该先尝试在没有 MLRun 的情况下这样做,以便欣赏它😊).
KubeFlow 输出(图片由作者提供)
对于更基本的项目示例,您可以查看 MLRun Iris XGBoost 项目,其他演示可以在 MLRun 演示资源库中找到,并且您可以查看 MLRun 自述文件和示例以获得教程和简单示例。
摘要
本文展示了如何有效利用计算资源来大规模运行数据科学工作,但更重要的是,我展示了如何简化和自动化数据科学开发,从而实现更高的生产率和更快的上市时间。如果您有其他问题,请联系我。
请查看 11 月 KubeCon NA 的“我的 GPU 即服务”演示和现场演示。
亚龙
使用 OmniSci(开源)的 GPU 地理空间—实验失败
GPU 数据库使地理空间工作流更快吗?是的(但也不总是像本文讨论的那样)…
我最近一直在尝试不同的方法,看看是否有一些方法不需要向大型云提供商支付数百或数千美元来进行数据科学研究。有了我可信赖的 QNAP NAS 和一个基本的消费级 GPU,我已经在各种工具上尝试了多个用例。
今天我正在试用 OmniSci(【https://www.omnisci.com/】T2),这是一个支持地理空间功能的 GPU 支持的数据库,我的计划是创建一个简单的实验来测试它——不幸的是,事情并没有那么顺利!
设置/安装
QNAP 的容器站基本上是 docker 的 UI。首先,我只需在 docker 注册表中搜索 OmniSci,然后单击“创建”。我将 GPU 附加到 docker 容器上,这就是大部分内容。
由于我使用的是开源版本,所以没有太多的 UI,所以我 SSH 到我的 QNAP,并使用 docker exec -ti 连接到 docker 容器,开始加载一些数据
正在加载数据…
你说加载数据?多么古老的学校。
到了这个时候,我已经感到相当厌烦了。与 Redshift 非常相似,如果您希望看到这个数据库引擎的好处,您必须将数据加载到其中。
我使用了其他测试中使用的相同数据集,我创建了一个 DDL 语句来创建一个表,然后使用 COPY 命令来获取我的拉斯维加斯数据集
将数据加载到 OmniSci
这是我第一次失望,我已经有一段时间没有真正地将数据加载到“数据库”中了(BigQuery 除外)——更喜欢直接在 ORC 或 Parquet 之类的列文件上工作。
该过程在 53 分钟后结束(从 SATA 驱动器加载)
第一个基本查询
OmniSci 首先要求我通过发出 \gpu 将会话切换到 GPU 模式
好的,首先让我们检查一下数据是否都已正确加载,让我们运行一些计数查询,然后让我们尝试一些真正的地理空间内容。
像往常一样,任何新的数据库引擎都有相当多的尝试和错误,有些事情不能像预期的那样工作,而其他字段需要我不知道的特定数据类型。此外,至少可以说,有许多武断的限制虽然不是交易破坏者,但却是一种烦恼:
用 SQL 表达的 Braindump
所用时间:未知——我无法完成(我给了 3 个小时)
值得注意的一点是:我看不到任何 GPU 活动
容器将最大限度地利用其 CPU,但 GPU 将坐在那里什么也不做——我假设这是因为它试图在 GPU 和 CPU 之间来回传递信息,或者只是试图在 CPU 上计划一切。
我通过“解释选择”验证了查询规划器正在使用 GPU,但不幸的是,要么这个数据库平台需要比我目前拥有的更好的硬件,要么还有其他事情正在发生。
不管怎样,看起来不像是实际上是在处理任何事情。我将联系 OmniSci 团队,看看是否有什么我能做的。
结论
我不确定这里的问题是什么——也许我的查询对于这个平台来说效率不高,也许对表进行连接比我目前使用的方法更好。如果我尝试一下,可以让它工作,我会更新文章。
当我有时间的时候,我也可能会通过他们在云服务上的免费试用重新审视这一点,但坦率地说,如果它甚至不能在我公认的疲惫的 GPU 上处理多边形地理空间计数中的一些基本点,那么我认为它真的无法与其他已经在传统上管理它的解决方案竞争。
寻找 GPU 地理空间解决方案的努力仍在继续…
GPU-可选 Python
编写代码,在 GPU 可用和需要时利用它,但在不可用时在 CPU 上运行良好
奇妙的 CuPy 库允许你在 NVIDIA GPU 上轻松运行 NumPy 兼容代码。然而,有时
- 您(或您的用户)没有兼容的 GPU,或者
- 你没有兼容 CuPy 的 Python 环境,或者
- 您的代码在我们的 GPU 上运行比在您的多个 CPU 上运行慢。
通过定义三个简单的实用函数,您可以使您的代码 *GPU 可选。(*在这个小的 GitHub 项目中找到实用函数的定义。)
当我们试图使用 CuPy 为我们的开源基因组包 FaST-LMM 添加 GPU 支持时,我们遇到了三个问题。我们用一个简单的效用函数解决了每个问题。让我们看看每个问题,解决它的效用函数,以及例子。
问题 1:控制使用 NumPy 还是 CuPy
假设您想要生成一组简单的随机 DNA 数据。行代表个人。列代表 DNA 位置。值代表“等位基因计数”,可以是 0、1、2 或 NaN(代表缺失)。此外,您希望
- 默认生成一个 NumPy 数组
- 通过字符串、数组模块或环境变量请求时生成 CuPy 数组
- 当对 CuPy 的请求失败时,回退到 NumPy 例如,因为您的计算机不包含 GPU 或者因为没有安装 CuPy。
效用函数array_module
(在 GitHub 中定义)解决了这个问题。下面是使用array_module
生成的数据生成器:
def gen_data(size, seed=1, **xp=None**):
**xp = array_module(xp)**
rng = xp.random.RandomState(seed=seed)
a = rng.choice([0.0, 1.0, 2.0, xp.nan], size=size)
return a
输入:
a = gen_data((1_000,100_000))# Python 3.6+ allows _ in numbers
print(type(a))
print(a[:3,:3]) # print 1st 3 rows & cols
输出:
<class 'numpy.ndarray'>
[[ 1\. nan 0.]
[ 0\. 2\. 2.]
[nan 1\. 0.]]
根据需要,DNA 生成器默认返回一个numpy
数组。
注意gen_data
的可选xp
参数。当xp
通过array_module
效用函数时,会发生以下情况:
- 如果你还没有安装 CuPy 包,
xp
就会是numpy
。 - 否则;如果您指定了字符串
'cupy'
或'numpy'
,那么您的规范将会得到遵守。 - 否则;如果您指定数组模块
cupy
或numpy
,您的规范将会得到尊重。 - 否则,如果您将
'ARRAY_MODULE'
环境变量设置为'cupy'
或'numpy'
,您的规范将会得到遵守。 - 否则,
xp
就是numpy
。
让我们看看它在我安装了 GPU 和 CuPy 的机器上的工作情况:
输入:
a = gen_data((1_000,100_000),xp='cupy')
print(type(a))
print(a[:3,:3]) # print 1st 3 rows & cols
输出:
<class 'cupy.core.core.ndarray'>
[[ 0\. nan 0.]
[ 2\. 2\. 2.]
[ 0\. nan 1.]]
正如所料,它按照要求生成一个cupy
数组。
旁白:注意 NumPy 和 CuPy 生成不同的随机数,即使给定相同的种子。
接下来,让我们通过环境变量请求 CuPy。
输入:
# 'patch' is a nice built-in Python function that can temporarily
# add an item to a dictionary, including os.environ.
from unittest.mock import patchwith patch.dict("**os.environ", {"ARRAY_MODULE": "cupy"}**) as _:
a = gen_data((5, 5))
print(type(a))
输出:
<class 'cupy.core.core.ndarray'>
正如所料,我们可以通过环境变量请求一个cupy
数组。(同样,使用patch
,我们可以临时设置一个环境变量。)
问题 2:从数组中提取“xp
”数组模块
假设您想要“标准化”一组 DNA 数据。这里的“标准化”是指使每一列的值具有平均值 0.0 和标准差 1.0,并用 0.0 填充缺失值。此外,您希望这能起作用
- 对于 NumPy 阵列,即使您还没有或不能安装 CuPy 包
- 对于 NumPy 阵列和 CuPy 阵列
效用函数get_array_module
(在 GitHub 中定义)解决了这个问题。以下是使用get_array_module
的标准化器:
def unit_standardize(a):
"""
Standardize array to zero-mean and unit standard deviation.
"""
**xp = get_array_module(a)** assert a.dtype in [
np.float64,
np.float32,
], "a must be a float in order to standardize in place." imissX = xp.isnan(a)
snp_std = xp.nanstd(a, axis=0)
snp_mean = xp.nanmean(a, axis=0)
# avoid div by 0 when standardizing
snp_std[snp_std == 0.0] = xp.inf a -= snp_mean
a /= snp_std
a[imissX] = 0
注意我们如何使用get_array_module
将xp
设置为数组模块(或者numpy
或者cupy
)。然后我们用xp
调用xp.isnan
之类的函数。
让我们标准化一个 NumPy 数组:
输入:
a = gen_data((1_000,100_000))
unit_standardize(a)
print(type(a))
print(a[:3,:3]) #1st 3 rows and cols
输出:
<class 'numpy.ndarray'>
[[-0.0596511 0\. -1.27903946]
[-1.32595873 1.25433129 1.21118591]
[ 0\. 0.05417923 -1.27903946]]
在我的电脑上,这运行得很好,大约在 5 秒钟内返回一个答案。
接下来,让我们标准化一个 CuPy 阵列:
输入:
a = gen_data((1_000,100_000), xp='cupy')
unit_standardize(a)
print(type(a))
print(a[:3,:3]) #1st 3 rows and cols
输出:
<class 'cupy.core.core.ndarray'>
[[-1.22196758 0\. -1.23910541]
[ 1.24508589 1.15983351 1.25242913]
[-1.22196758 0\. 0.00666186]]
在我的电脑上,标准化在 CuPy 阵列上运行得更快,大约在 1 秒钟内返回一个答案。
旁白:那么 GPU 是不是更快了?不一定。上面运行的 CPU 只用了我六个 CPU 中的一个。当我使用其他技术——例如,Python 多处理或多线程 C++代码——在所有 6 个 CPU 上运行时,运行时变得可比。
问题 3:在 NumPy 和"xp
"之间转换
假设您的数据以 NumPy 数组开始,您需要将它转换成您想要的xp
数组模块。稍后,假设您的数据是一个xp
数组,您需要将它转换成一个 NumPy 数组。(使用熊猫等知道 NumPy 但不知道 CuPy 的包时会出现这些情况。)
内置函数xp.asarray
和实用函数asnumpy
(在 GitHub 中定义)解决了这个问题。这里有一个例子:
输入:
a = gen_data((1_000,100_000))
print(type(a)) # numpy
xp = array_module(xp='cupy')
**a = xp.asarray(a)**
print(type(a)) # cupy
unit_standardize(a)
print(type(a)) # still, cupy
**a = asnumpy(a)**
print(type(a)) # numpy
print(a[:3,:3]) # print 1st 3 rows and cols
输出 1:
<class 'numpy.ndarray'>
<class 'cupy.core.core.ndarray'>
<class 'cupy.core.core.ndarray'>
<class 'numpy.ndarray'>
[[-0.0596511 0\. -1.27903946]
[-1.32595873 1.25433129 1.21118591]
[ 0\. 0.05417923 -1.27903946]]
此示例生成一个随机 NumPy 数组。将其转换为 CuPy(如果可能的话)。标准化它。转换(如有必要)为 NumPy。在我的电脑上,它大约运行 2 秒钟。
如果没有安装 CuPy,代码仍然运行良好(大约 5 秒钟),产生以下输出:
输出 2:
WARNING:root:Using numpy. (No module named 'cupy')
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
[[-0.0596511 0\. -1.27903946]
[-1.32595873 1.25433129 1.21118591]
[ 0\. 0.05417923 -1.27903946]]
旁白:请注意,无论是否安装了 CuPy,我们现在看到的结果都是一样的。为什么?因为这个例子总是使用 NumPy 来生成随机数据。
结论
我们已经看到了三个实用函数如何使您能够编写使用或不使用 GPU 都可以工作的代码。
array_module
—如果可能,根据用户输入(包括环境变量)设置xp
。默认并在必要时回退到 NumPy。get_array_module
—根据数组设置xp
。即使没有或不能安装cupy
包也能工作。xp.asarray
和asnumpy
—与 NumPy 相互转换
除了支持使用或不使用 GPU 的代码之外,编写 GPU 可选的代码还有一个额外的好处。GPU 有时会无法加速你的工作。通过让你的代码成为可选的 GPU,你可以在 GPU 不起作用的时候关闭它。
你可以在这个小小的 GitHub 项目中找到这些实用函数的定义。