面向自然语言处理的迁移学习(三)(5)

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 面向自然语言处理的迁移学习(三)

面向自然语言处理的迁移学习(三)(4)https://developer.aliyun.com/article/1522493

11.2 其他新兴研究趋势

在整本书中,我们试图强调,在诸如 NLP 的迁移学习这样的快速发展领域中,像这样一本单独的书籍完全涵盖每种架构或创新是不可能的。相反,我们采取的方法是专注于我们认为是基础的架构和技术。未来的创新很可能在某种程度上是从这些架构和技术中派生出来的,因此读者可能通过自己的一些努力来学习它们。为了进一步促进这一点,我们将这一部分重点放在了我们在这本书中没有涵盖但在该领域中已经有些影响的各种研究趋势的简要讨论上。我们尽可能将它们置于我们已经涵盖的内容的背景中,以便您在需要时更轻松地学习这些主题。

我们首先通过概述 RoBERTa⁷——Robustly Optimized BERT Approach——来开始这个练习,它采用了一些优化技巧来提高 BERT 的效率。

11.2.1 RoBERTa

所讨论的研究试图复制 BERT,同时特别关注各种训练超参数和设置以及它们对结果的影响。总的来说,观察到通过谨慎的设计选择可以显著改善原始 BERT 的性能。这样的选择之一是去除下一句预测(NSP)任务,同时保留掩码语言建模(MLM)— 填空— 任务。换句话说,他们发现 NSP 会降低下游任务的性能,并显示去除它是有益的。其他设计选择包括在训练过程中使用较大的学习率和小批量。它是由我们在本书中介绍的 Hugging Face 的 transformers 库中实现的。

接下来,我们将看看迄今为止开发的最大语言模型之一 — GPT-3,最近引起了很多关注,并在 NeurIPS 2020 虚拟研究会议(2020 年 12 月)上获得了最佳论文奖。

11.2.2 GPT-3

您可能还记得我们的报道,GPT 模型经历了几次迭代 — GPT、GPT-2,最近是 GPT-3。在撰写时,GPT-3 恰好是拥有 1750 亿参数的最大的预训练语言模型之一。它的前身 GPT-2 拥有 15 亿参数,在发布时也被认为是最大的,仅仅在前一年发布。在 2020 年 6 月发布 GPT-3 之前,最大的模型是微软的图灵 NLG,拥有 170 亿参数,并于 2020 年 2 月发布。这些指标的进展速度之快令人震惊,这些记录往往很快就会被打破。为了比较,这些参数爆炸在图 11.2 中有所体现。


图 11.2 模型参数数量随时间增长的趋势。如图所示,模型大小的爆炸趋势似乎在加速,其中最近的一个进步 — GPT-3 — 表示了 10 倍的增长因子。

如图所示,GPT-3 相比之前最大的图灵 NLG 增长了超过 10 倍,这是一次超越以往进步的飞跃。实际上,一种称为 Switch Transformer 的架构,通过为不同的输入分配单独的 transformer 块部分利用了稀疏性,并声称在 2021 年 1 月达到了 1 万亿参数的规模。由于在撰写时仍在进行同行评审,我们没有在图 11.2 中包含这种架构。然而,很明显,这种模型大小增长的趋势似乎正在加速。

在 GPT-3 论文中,作者展示了这个巨大的模型可以在很少的样本情况下执行广泛的任务。例如,只需看几个示例翻译,它就可以被启动以将一种语言翻译成另一种语言,或者只需看几个示例垃圾邮件,即可检测垃圾邮件。 事实上,一些意想不到的应用,例如从编码的描述中编写代码,已经被广泛报道。目前,该模型尚未由 OpenAI 作者发布给公众,只有通过邀请和付费 API 向少数早期采用者提供。 OpenAI 限制接入的理由是监控使用,从而限制这种技术的任何潜在有害应用。 GPT-3 的早期采用者是一款名为 Shortly 的应用程序,它为创意写作提供了 GPT-3 访问权限,任何人都可以以少量费用尝试。

此外,一个最近更小但功能强大的 GPT-3 开源替代品已经在 transformers 库中可用:EleutherAI 的 GPT-Neo。该组织旨在构建一个与全尺寸 GPT-3 相当的模型,并在开放许可下向公众提供。他们的存储库中提供了不同大小的模型,您也可以使用 Hugging Face 托管的推理 API,通过浏览器测试这些模型。我们还提供了伴随 Kaggle 笔记本,演示了我们在第七章中进行的练习的运行情况。通过检查,您应该会发现其性能更好,但自然而然地,成本也更高。 (最大型号的重量超过 10 GB!)

关于 GPT-3 工作的一个重要事项是,作者本人在论文中认识到,使语言模型更大的好处已接近极限。即便在极限下,处理某些类型的任务(例如关于对常识物理的理解的文本生成)的性能仍然较差。因此,虽然它确实代表了一项重要的技术突破,但在建模方法(而不是简单地扩大模型规模)上的创新必须成为前进的道路。

接下来,我们将看一组旨在改善基于 transformer 的模型在更长输入序列上的性能的方法。这很重要,因为香草 transformer 模型会随着输入长度呈平方级别的运行时间和内存使用。

11.2.3 XLNet

XLNet¹³是在类似早期模型 Transformer-XL¹⁴的基础上构建的,旨在更好地处理更长的输入序列。其中一个关键组成部分的想法是因果语言建模(CLM),我们在讨论 GPT 时已经讨论过,它涉及到预测序列中下一个词的经典语言建模任务。请注意,此方法中的未来标记已被屏蔽。XLNet 论文的作者等效地将其称为自回归语言建模。XLNet 的另一个关键组成部分是对输入序列的所有可能排列执行 CLM。这个想法有时被称为排列语言建模(PLM)。通过结合 PLM 和 CLM,实现了双向性,因为所有标记都有机会在某个排列中作为过去标记被包含。XLNet 和 Transformer-XL 都没有序列长度限制,并且由 Hugging Face 的 transformers 库实现。

有了这种对 XLNet 的看法,让我们继续考虑 BigBird¹⁵,这是一种引入稀疏注意机制的创新,以实现更高的计算效率。

11.2.4 BigBird

BigBird 通过引入一种稀疏注意机制将传统基于 Transformer 的模型的二次依赖关系减少到线性,该机制被证明能够近似并保持原始完整注意力的性质。与一次应用完整注意力到整个输入序列不同,稀疏注意力逐个查看序列标记,允许它更加智能地且舍弃一些连接。可以处理长达传统基于 Transformer 模型处理的八倍长度的序列,且可在类似硬件上处理。它是由 Hugging Face 的 transformers 库实现的。

接下来,我们将介绍 Longformer¹⁶,这是对 Transformer 传统完整自注意力的另一项创新,能够更好地随着输入长度的增加而扩展。

11.2.5 Longformer

Longformer 是针对传统 Transformer 注意力的二次缩放的又一尝试。这里的创新是将局部窗口注意力与全局任务导向注意力相结合。局部注意力用于上下文表示,而全局注意力用于构建在预测中使用的完整序列表示。所达到的缩放在输入序列长度方面是线性的,类似于 BigBird。Longformer 是由 Hugging Face 的 transformers 库实现的。

我们接下来介绍 Reformer¹⁷,这是另一种减轻原始自注意力二次缩放的方法。

11.2.6 Reformer

Reformer 引入了两种技术来对抗原始 Transformer 输入长度的二次扩展的计算时间和内存消耗。用局部敏感哈希替换原始的完全自注意力机制,减少了冗余计算和时间复杂度从二次到 O(LlogL)(其中 L 是输入序列长度)。一种称为可逆层的技术允许只存储激活一次。在实践中,这意味着,与为具有N层的模型存储激活N次相比,只使用了一小部分内存。根据N的值,内存节省可能非常大。Reformer 是由 Hugging Face 实现的 transformers 库中的一个模型。

显然,使基于 Transformer 的模型在处理更长的输入长度时表现更好已成为一个元研究趋势。我们在这里可能没有包括所有关于此主题的重要研究,如果你自己深入研究,可能会发现更多。

接下来,我们将谈论最近重新出现的序列到序列建模方法。这些尝试将本书中遇到的各种问题统一到一个文本到文本建模框架中。

11.2.7 T5

你可能还记得在本书中我们讨论过,序列到序列模型在自然语言处理中发挥了重要作用。首次出现在循环神经网络(RNN)模型的背景下,它们也被翻译应用领域在原始 Transformer 架构的背景下所探索。T5,“文本到文本转换 Transformer”,是将各种自然语言处理问题统一到一个序列到序列框架中的尝试。它允许对每个任务应用相同的模型、目标、训练过程和解码过程。处理的问题类别包括从摘要到情感分析和问答等众多领域。英语和罗马尼亚语、德语、法语之间的语言对翻译被包括在训练中。一些代表性的数据转换,使得可以在多种任务上训练单一模型,如图 11.3 所示的翻译和摘要(灵感来源于 T5 论文的图 1)。


图 11.3 T5 是一个序列到序列模型,它采用了一系列转换,使得可以同时在各种任务上训练单一模型、解码过程和目标。它可以被看作是多任务学习的一个有趣变体。

如图所示,任务数据通过在原始文本数据前加上标准任务描述符来转换。训练数据包括 GLUE 和 SuperGLUE 数据集、用于抽象摘要的 CNN/Daily Mail 数据集等。目标是处理包含的多样化的自然语言理解任务,而不修改模型。从这个意义上说,它可以被看作是我们在整本书中一直提到的多任务学习思想的一个有趣变体或迭代。同时学习如此多种任务的包含可能会实现参数共享和生成模型的更好泛化能力。关键是,模型最初是在作者称之为“巨大干净爬行语料库”(C4)的数据集上使用蒙版语言建模或自动编码目标进行训练,然后在上述各种任务上进行微调。基本上,所有标记的 15% 被丢弃,结果被送入输入,而未损坏的输入被送入输出以进行预测。请注意,C4 语料库本质上是目标语言(英语)的互联网,其中过滤掉了色情材料、代码和其他“垃圾数据”。用于训练的模型架构类似于我们在第七章中用于翻译的转换器架构。由所得模型在许多包含的任务上实现了最先进的结果。

除了原始的 T5 模型之外,还开发了一个多语言版本,不足为奇地称为 mT5,通过同时对 101 种语言进行训练。T5 和 mT5 都在 Hugging Face 的 transformers 库中实现。

接下来,我们简要介绍 BART,它与 T5 类似,都是基于转换器的序列到序列建模框架。

11.2.8 BART

BART,即双向自回归转换器,可以被视为 T5 减去单一统一变换的模型,以使未经修改的模型能够应用于各种任务。相反,首先对标准的转换器编码器-解码器架构进行预训练,以通过各种噪声方法重现损坏的输入。这包括蒙版语言建模,如 BERT 和 T5,以及排列语言建模,如 XLNet 等。然后,该模型被修改用于各种任务,例如 SQuAD、摘要等,并针对每个任务分别进行微调,类似于我们对传统 BERT 所做的操作。这个模型在语言生成任务中表现特别好,例如摘要、翻译和对话。同时也开发了一个多语言版本 mBART,通过同时对 25 种语言进行训练而获得。BART 和 mBART 都在 Hugging Face 的 transformers 库中实现。

在下一个小节中,我们将审视一种最新的跨语言模型,它不仅仅是同时在多种语言上进行训练,还通过在有并行数据时修改语言建模目标来显式建模跨语言转移。

11.2.9 XLM

XLM,²² 其作者用来指代“跨语言语言模型”,是一个结合单语和并行数据的跨语言学习方法的建模框架。在不同语言上学习得到的单语嵌入可以使用已知数值表示的小词汇表进行对齐。如果有并行数据可用,作者提出了一种他们称之为翻译语言建模(TLM)的方法,并同时利用它进行跨语言学习。本质上,这涉及将并行数据的连接序列应用掩码语言建模,在两种语言的连接序列的各个部分中,让一些单词消失并预测它们。

在跨语言学习任务中观察到显著的改进。它还激发了许多类似模型的产生,特别是 XLM-R,²³ 它将 XLM 的思想与 RoBERTa 的思想结合起来,以提高性能。XLM 和 XLM-R 都在 Hugging Face 的 transformers 库中实现。

最后,我们简要谈到了一种在书中遇到的重要问题数据类别——表格数据的专门模型。

11.2.10 TAPAS

在第五章和第六章中,我们讨论了 SIMOn 方法及其对表格数据类型分类的处理——这是数据科学家通常会遇到的一个重要问题类别。TAPAS²⁴ 是尝试将基于变换器的模型的建模优势扩展到这一重要问题类别的一种尝试,通过显式地为表格数据中的问答建模和专门化。TAPAS 代表表格解析器。在第八章中,我们讨论了将 BERT 应用于问答任务。结果专门化模型的输出是输入上下文段落中感兴趣问题的潜在答案的开始和结束位置。除此之外,TAPAS 还学会检测表格中哪个单元可能包含可以从中提取答案的上下文段落,且起始和结束索引类似。与本节中讨论的其他大多数模型一样,该模型在 Hugging Face 的 transformers 库中实现。

这标志着我们对本书中尚未有机会详细分析的近期工作的概述之旅的结束。这些模型架构大多可以通过与我们在 transformers 库中使用 BERT 和 DistilBERT 非常相似的代码来使用。

在下一节中,我们将尝试对这个领域下一步可能的走向做出有根据的猜测——鉴于当前和新兴的研究趋势,哪些主题可能保持或变得流行。

11.3 NLP 中转移学习的未来

在本节中,我们尝试通过预测该领域即将出现的形态来推断前面两节描述的趋势。

对过去两节的批判性分析揭示了两个可以说是正交的元趋势——一个是将模型尽可能地变大,另一个是开发更高效的更大模型的推动。

GPT-3,目前我们观察到的参数数量迈出的最大一步——是以前的 10 倍,最初引起了一些研究人员对研究公司开始将重点放在规模而不是巧妙建模上的担忧。然而,正如我们在上一节讨论的那样,扩大模型的局限性很快变得明显,GPT-3 论文的作者们承认已经达到了可能的极限。考虑到 GPT-3 目前仅通过有限的付费 API 可用,我们可以预期空间中的其他参与者将尝试很快构建更大的模型,因为他们有货币激励这样做(我们已经提到正在进行同行评审的拥有万亿参数的 Switch Transformer)。这场竞赛很可能最终将导致谷歌和/或 Facebook 发布一个类似的模型,这很可能会推动 GPT-3 完全开源(类似的情况在 GPT-2 历史上已经发生过)。除此之外,我们预计会有更多资源开始致力于实现类似性能的更有效方法。

在 NLP 迁移学习的即将到来的有趣问题中,大多数可能都在被一些人称为TinyML的运动中。这可以被定义为一个将模型大小缩小到可以适应较小硬件的通用目标。我们在第九章演示了一个例子,即通过 DistilBERT 等方法可以将 BERT 的大小大致缩小一半,而性能损失很小。我们在第十章取得了类似的成就的另一种方法是 ALBERT,它实现了模型大小的 90%缩减。现在全球大部分人口都拥有智能手机,可以运行这些先进模型的较小版本。这给物联网(IoT)等领域带来的机会是巨大的,其中设备形成智能网络,每个节点都能独立地执行复杂功能。尽管今天许多手机应用程序可能都包含翻译和其他工具的服务器后端,用于进行实际的翻译和其他计算,但在没有互联网连接的情况下在智能手机上本地运行这些算法的能力正在成为更可行和更普遍的范式。我们预计在未来几年内,在使 BERT 及其衍生产品更小和更具参数效率的努力将继续如火如荼。

另一个你可能从前一节中注意到的趋势是对跨语言模型的日益关注。事实上,过去一年全球对所谓的“低资源”语言的方法的投资有所增加。我们在第七章中通过一个例子提到了这一点,当时我们使用了一个变压器架构将低资源的西非语言特威(Twi)翻译成了英语。许多流行的经济模型预测,非洲市场正在出现一个日益重要的消费者群体,这很可能是引起对这一领域突然兴趣和投资的至少一个推动因素。对于许多低资源语言来说,应用我们讨论的所有方法的初始障碍往往是数据的可用性。因此,我们可以预期在接下来的一年左右,适当的多语言数据开发将受到很多关注,随后将进行对语言特定方法的深入研究。值得关注的地方,特别是涉及非洲语言的地方,包括 NLP Ghana,Masakhane,EthioNLP,Zindi Africa,AfricaNLP 和 Black in AI。

语音是另一个即将迎来转折时刻的 NLP 研究前沿。直到最近,自动语音识别模型,将语音转录成文本,需要大量的平行语音文本数据才能取得良好的结果。Facebook 最近的一种架构 Wav2Vec2 展示了,同时在许多语言上对语音进行预训练可以极大地减少所需的平行数据量。这类似于我们在本书中探讨的文本中使用的 mBERT 的功能。Wav2Vec2 模型已经在 transformers 库中提供,并且可以通过只使用几个小时的标注语音数据对新语言进行微调。我们预计这将在接下来的一年内首次推动多种语言的语音识别工具的开发。此外,我们预计类似的事情也将在不久的将来出现在另一个方向上:文本到语音,也就是从文本生成语音。

在第一章中,我们描述了 NLP 中的迁移学习是如何受到计算机视觉的进展的启发的。有趣的是,最近 NLP 迁移学习的进展似乎又激发了计算机视觉的进一步发展。一个具体的例子是 DALL-E,这是一个在文本描述 - 图像对上训练的 GPT-3 的版本,它已经学会了从文本提示中生成图像。一个更广泛的趋势是构建上下文情景的对象嵌入,试图从场景中其他可观察到的对象预测缺失的对象,类似于 BERT 和类似的遮蔽语言模型所使用的填空词目标。

另一个最近似乎越来越受到关注的研究问题是:这些模型的环境和道德影响是什么?在最近的研究高潮初期,研究人员似乎满足于发布只改善技术指标的模型,但随着时间的推移,这个领域开始重视对潜在道德影响的详细探讨。与之相关的是对可解释性的提高兴趣:我们能否真正解释模型是如何做出决定的,以确保它不会歧视?我们将在下一节进一步探讨这些道德问题。

11.4 道德和环境考虑

你可能还记得我们在第五章和第六章讨论关于假新闻检测的问题时提出了所谓的假新闻是什么是一个有争议的观点。如果在数据标签的质量上不加注意,那么准备训练数据标签的人身上植入的偏见很可能会转移到分类系统上。这是我们首次遭遇到了在部署这些模型到可能会显著影响人类生活的情况下,充分意识到潜在局限性的重要性。

当我们在第八章用 Jehovah’s Witnesses 准备的 JW300 数据集对 mBERT 进行微调时,我们发现它会以有偏见的方式填补空白。当我们试图预测一个基本名词“学校”时,它会提供像伊甸园这样的词作为合理的补充。这表明了强烈的宗教偏见,这是我们在旅程中第二次被提醒到,盲目地将这些模型应用于某些数据可能会产生有偏见和意想不到的结果。

在这一部分,我们将从更广泛的角度讨论这个问题,考虑到可能需要放在从业者脑后的道德和环境考虑因素。这是一个近来受到越来越多关注的话题,但在机器学习领域并不算新鲜。

早期关于偏见的知名机器学习研究可预见地发生在计算机视觉领域。具有里程碑意义的作品,“性别和肤色”,³⁴研究了商业性别分类系统在种族和性别维度上的准确性。它发现,与较浅肤色的男性相比,这些系统在较深肤色的女性身上表现不佳,绝对百分比高达 35 个百分点。这对少数族裔社区有着巨大的实际影响,在一些地区可能会受到一些自动计算机视觉系统的监控。错误的分类或检测可能意味着错误的逮捕,即使被清除,也可能意味着在最脆弱的社区中失去工作。有多次广泛报道这种情况发生在真实的人身上。一个愤世嫉俗的力量失衡在那些打着“客观”和“科学”旗号的系统背后被揭露出来,在这些系统被开发的更富裕的社区和它们的经济利益主要是被搬走的地方并没有遭受到对较贫困的社区造成的伤害。这项工作及相关研究的影响是巨大的,最近美国国会最近出台了相关的减轻监管措施,可以说这是直接后果。像 IBM 和亚马逊这样的公司也被迫重新审视他们与执法机构分享这些技术的方式,IBM 甚至完全停止了这项服务。

最近对预训练的自然语言处理语言模型存在偏见的担忧也很高。实际上,GPT-3 论文³⁵专门包括了一个研究的部分,涵盖了几个方面,即种族、性别和宗教。最近越来越常见地看到学术文章做这样的研究,这是非常令人鼓舞的。特别是 GPT-3 的研究探讨了模型从训练数据中学到的与各个关注维度的关联。例如,他们发现通常与较高教育水平相关联的职业在填空时更倾向于与男性代词相关联。同样,暗示专业能力的提示更有可能由男性代词和说明者完成。这很可能是模型直接从互联网学到的性别偏见,我们可能无法指望互联网是一个无偏见的信息来源。另一方面,积极的描述词更有可能被“亚洲”和“白人”等词引导的名词以比“黑人”人物高得多的速度分配。同样,模型显然从互联网学到了种族偏见,而对模型的盲目应用只会传播这种偏见。在宗教维度上,“伊斯兰”一词与“恐怖主义”一词相关联,是最有可能的完成之一。作为这种偏见的直接现实影响,考虑一下那位巴勒斯坦人的善意“早上好”Facebook 帖子被错误地翻译为“攻击他们”,并导致了重大的不公平后果。³⁶

预训练的自然语言处理语言模型可能无意中影响贫困社区的另一种方式是通过气候变化。实际上,这些模型最近被发现具有相当大的碳足迹。³⁷, ³⁸虽然发现单个 BERT 模型的一次训练的碳足迹相当于纽约到旧金山的一个普通往返航班,但在微调和超参数优化期间,模型实际上会进行多次训练。如果模型通过 神经架构搜索 部署,其中各种架构超参数被详尽地变化,然后选择性能最佳的模型,研究人员发现单个模型部署的碳足迹相当于五辆普通汽车的寿命。再次强调,这是严重的,特别是因为与这些碳足迹直接相关的气候变化影响最严重的是贫困社区,而这些社区并没有体验到这些模型的直接好处。很明显,在评估这些模型时,这些成本需要纳入考虑。这一认识可以说是驱使该领域朝着更具参数效率的模型发展的力量之一。

预训练语言模型及深度学习普遍存在的一个长期批评是,这些模型往往不太可解释——很难解释模型是如何在特定情景下得出预测的。这与本节早些时候讨论的偏见问题有关——让模型解释其对教育相关联的决策是如何做出的,例如,可以帮助检测这样的决定是否基于种族或性别变量。最值得注意的最近的方法之一是 bertviz,³⁹试图在第七章中探索的注意力可视化基础上进行改进。然而,这仍然没有解决训练数据透明度缺失的问题:语言模型的训练规模如此之大,以至于研究人员几乎无法确保其是无偏的。因此,我们期望看到人们投入时间和精力开发出可以从更小、精心策划的数据集中执行相当的方法。

通过我们对一些应该记住的伦理问题的简要讨论完成后,我们在下一节中提供一些关于如何在这个快速发展的领域中保持时效性的建议。

11.5 保持时效性

正如我们在本章中一再强调的那样,NLP 中的迁移学习方法的状况更新速度很快。本书涵盖的材料应该仅被视为一个平台,用于继续跟踪最新发展。在本节中,我们提供了一些关于如何实现这一目标的基本提示。总的来说,在 Kaggle 和/或 Zindi 平台上参加各种相关竞赛可能是一个处理现实情况的好方法,但数据足够干净且与时俱进。跟踪 arXiv 上的最新论文是必不可少的,尽管新闻和社交媒体的报道可能夸张并且不可靠,但它仍然有助于及早发现有影响力的论文。

11.5.1 Kaggle 和 Zindi 竞赛

在整本书中,我们鼓励您使用 Kaggle 来运行所呈现的各种代码。尽管该平台提供的免费 GPU 计算和易用的设置立即成为其优点,但最大的好处可能直到现在才被明确说明。可以说,Kaggle 平台最强大的方面是可以访问该平台上众多持续进行和归档供后人参考的竞赛。

各种顶级公司面临各种技术挑战,使用该平台来刺激对这些问题的解决方案的研究和开发,通过提供现金奖励,有时可达数千美元的头等奖。这意味着通过跟踪这些竞赛,您可以了解到行业中最紧迫的问题是什么,同时可以访问代表性数据进行即时测试和实验。您可以按主题浏览当前和过去的竞赛,以找到测试任何想法所需的数据——您所需要做的就是将数据集附加到本书中使用的笔记本上,更改一些路径,然后您可能已经准备好产生一些初步的见解了。当然,如果您能够做到这一点,赢得竞赛是很好的,但您从实验、失败和再试中获得的学习价值才是真正无价的。实际上,根据我的经验,一个在排行榜上可能被认为是平庸的竞赛问题解决方案,如果在实践中易于部署和扩展,可能会导致真正的现实影响。我们在附录 A 中提供了一些使用 Kaggle 的具体提示,以帮助初学者入门。

我们还强调了 NLP 中对低资源语言的关注日益增加。因此,重要的是提到 Zindi Africa 平台,该平台提供与 Kaggle 类似的许多功能,但专注于非洲语言和问题。如果您是一位研究人员,想要了解您的方法在这些类型的语言中可能的表现,那么这个平台将是一个寻找相关竞赛和实验数据的好地方。

11.5.2 arXiv

机器学习,以及延伸开来的自然语言处理,可以说是当今最开放的研究领域。除了几个例外,一般来说,结果通常在一旦出现后立即在开放平台arXiv上发表。这使研究团队能够提前对任何发现进行申请,同时进行完善和论文出版手续。这意味着,如果你能找到它的话,最前沿的研究已经对你可用。arXiv由 Google Scholar 存档,因此你可以在那里设定关键词的警报,帮助你及早发现相关的论文。

arXiv平台上传的论文数量巨大,要找到与你相关的最重要的论文可能会有些困难。为了解决这个问题,我建议关注你喜欢的论文的作者在社交媒体上的动态——Twitter 似乎是这一领域的研究人员比较喜欢的平台。关注媒体报道也可能会有所帮助,只要你对所有声明持保留态度。接下来我们会多说几句关于这个问题。

11.5.3 新闻和社交媒体(Twitter)

总的来说,把科学主题的新闻和社交媒体报道看作可能具有煽动性和技术上不可靠是件好事。如果我们考虑一个媒体机构可能与报道技术相关的激励以及通常记者对主题可能没有技术背景的事实,这就说得通了。然而,经过核实的新闻可能是关于特定论文或主题的社区兴奋的一个良好指标,这总是一个需要考虑的好事。

如果你使用像谷歌新闻这样的平台,你可以在你的订阅中设置“语言模型”等主题的警报。你可能会得到很多信息,而且并非所有信息都值得关注。通常,我只会在这些论坛上深入研究一篇论文,只有在我认为一段时间内一直“可靠”的场所出现后,我才会深入研究一篇论文,这使我对这些论点至少经受了一段时间的公开评审产生了信心。GPT-3 的情况正好是个最近的例子——通过谷歌新闻上的这个启发式方法,我立刻就能体会到其影响。

关于社交媒体,Twitter 似乎是机器学习研究科学家的选择平台。事实上,许多人对他们的工作非常开放,并且如果你向他们提问,他们会很乐意在平台上直接回答你。这也是我最喜欢在这个领域工作的原因之一。请随时在@pazunre 上联系我。你最喜欢的作家或科学家可能会在他们的订阅中分享他们最新最喜欢的论文,通过关注他们,你可以直接收到这些信息。在这一领域,你可能会对以下一些受欢迎的账户感兴趣:@fchollet,@seb_ruder 和@huggingface。

除了竞赛、阅读 arXiv 上的论文、追踪新闻和社交媒体,没有什么比使用这些工具解决实际的挑战更好的了。对于许多人来说,这可能意味着在机器学习和/或自然语言处理领域拥有一份工作,并且每天都在解决一个实际的应用。实际的经验是这个领域大多数潜在雇主最重视的。如果你还没有在这个领域获得这样的实际经验,并且希望进入,那么开源项目可能是一个很好的途径——看看 TensorFlow、PyTorch、Hugging Face、NLP Ghana、Masakhane 等等。列表是无穷尽的,有很多有趣的问题可以解决和贡献,同时也可能使每个人受益。

我希望这些提示能帮助你进入你的机器学习和自然语言处理的未来,让你有能力对你的社会产生重大的积极影响。能够与你分享你旅程的一部分是我的荣幸。

11.6 最后的话

这就是了!你做到了——你已经读完了整本书。在写作过程中,我度过了难忘的时光,与许多研究人员互动,讨论思想并克服了许多挑战。我真诚地希望你享受这个旅程,就像我一样。当你带着这些工具改变世界的时候,请记得善待你周围的人,不要伤害生态系统,并且保持警惕,以防技术被滥用。通过与这个领域中一些杰出头脑互动的短暂时间内,我真诚地相信大多数人对于将这些技术突破变成善良的源头都感到兴奋。因此,我每天都迫不及待地关注研究新闻,渴望看到我们集体的人类思维将会产生什么样的惊喜。我只能希望你也能分享一些这种兴奋。


附录 A:Kaggle 入门指南

Kaggle 平台为数据科学和机器学习初学者提供了一个学习基本技能的绝佳途径。通过恰当地利用该平台,你有机会在各种数据集上练习各种问题,并与其他机器学习工程师展示和讨论你的工作。这有可能帮助你扩展你的专业网络。重要的是,该平台允许你在云中直接运行 Python 笔记本,这可以显著消除初学者的系统设置障碍。它还每周提供有限的免费 GPU 计算。这进一步使得本书讨论的工具和方法更加民主化。在全书中,我们鼓励你使用 Kaggle 来运行所呈现的代码。

另一个工具——Google Colab——同样提供免费的 GPU 计算,同时与 Google Drive 集成。然而,如果你必须选择一个工具,我会推荐 Kaggle,因为它具有社交性质,可以访问数据集、讨论和竞赛,这些都是非常宝贵的学习资源。当然,在实际情况下,大多数工程师可能会在某个时候同时使用两者,例如为了增加每周的免费 GPU 配额。

在这个附录中,我们试图提供一个简要的入门指南,可以帮助初学者逐步了解 Kaggle 的各种功能。我们将其分为两个部分。首先讨论 Kaggle 内核的概念以运行笔记本,然后查看竞赛、相关讨论和 Kaggle 博客功能。

A.1 Kaggle 内核提供的免费 GPU

如前所述,你可以在 Kaggle 免费使用云中直接运行 Python 代码。这些云笔记本有时被称为Kaggle 内核。在撰写本文时(2021 年 1 月),Kaggle 每周提供约 36 小时的 GPU 时数,你可以为任何你认为可能需要的笔记本启用它。我们将通过演示如何开始,逐步介绍一个对 Python 初学者有用的简单场景。

假设你是一个初学者,并且有兴趣使用这些内核学习基本的 Python 语法。一个很好的开始地方是访问www.kaggle.com/kernels,然后搜索“Python 教程”。这个搜索结果可能如图 A.1 所示。


图 A.1 开始学习 Kaggle 内核和启动相关笔记本来学习新知识的最佳地点。前往www.kaggle.com/kernels,然后搜索你感兴趣的主题。在图表中,我们展示了这样一个查询的结果列表,供初学者开始学习 Python 时参考。选择最合适的结果继续。或者使用新笔记本按钮创建一个新笔记本。

如图所示,搜索将返回一系列结果,您可以选择最符合您需求的一个。在这种情况下,初学者可能希望教程直接以 NLP 为重点开始,考虑到书籍的内容,因此可能会选择突出显示的教程笔记本。点击它将会显示相关的渲染笔记本,其中代表性视图如图 A.2 所示。


图 A.2 渲染笔记本的视图,突出显示可以执行的一些关键操作

请注意,所示的视图代表了您在单击书籍存储库中我们的伴随笔记本链接之一时将遇到的第一个视图。¹ 如图所示,笔记本已呈现,这意味着即使不运行代码,您也可以滚动并查看所有代码的代表性输出。

要运行代码,请点击复制并编辑按钮以创建自己版本的笔记本。生成的笔记本将具有相同的依赖项——在 Kaggle 环境中预安装的 Python 库版本和用于生成代表性笔记本输出的库。请注意,如果您点击了图 A.1 中的新笔记本按钮而不是选择复制现有笔记本,则依赖项将是 Kaggle 指定的最新依赖项。因此,您可能需要修改原始代码以使其正常工作,这会增加难度。要完成复制和编辑,或分叉,过程,将要求您提供登录信息。您可以注册您的电子邮件地址,也可以直接使用谷歌等社交账号登录。

为了精确复制我们为本书的伴随笔记本所使用的 Kaggle 环境,我们在伴随书籍存储库中包含了需求文件。请注意,这些需求文件仅用于在 Kaggle 笔记本上复制 Kaggle 环境的目的。如果您试图在本地计算机上使用它们,根据本地架构的不同,您可能会遇到额外的问题,并且可能需要对其进行修改。我们不支持这种模式,如果您正在追求它,请仅将需求文件用作指南。还要记住,并非每个列出的要求都需要在您的本地安装中使用。

单击“复制并编辑”将带您进入主工作区,如图 A.3 所示。如图所示,您可以通过左上角的按钮运行当前选择的单元格,也可以运行笔记本中的所有代码。在右侧面板上,您可以启用或禁用您的互联网连接。下载数据或安装软件包可能需要互联网连接。此右侧面板还包含在当前笔记本中启用 GPU 加速的选项,您需要在合理的时间内训练神经网络。您还将看到当前附加到笔记本的数据集,并且可以单击其中任何一个以转到数据集的描述。单击“添加数据”将打开一个搜索查询框,您将能够按关键字搜索感兴趣的数据集,以添加到当前笔记本。对于本书的所有伴侣笔记本,必要的数据已经附加到笔记本中。


图 A.3 使用 Kaggle 内核时的主工作区。在左上角,是运行笔记本的按钮。在右上角,是共享、保存、重新启动和关闭笔记本的选项。右侧面板包含连接到互联网的选项(用于安装软件包或下载数据)、启用/禁用当前笔记本的 GPU 加速以及添加数据。

在右上角,您可以选择笔记本的共享设置——根据您的项目需要,您可以将笔记本设置为仅自己可见,与其他用户私下共享,或者对外公开。我们所有的伴侣笔记本都是公开的,这样任何人都可以访问,但您可以将它们的分支设置为私有。重要的是,也在右上角,选择保存版本将弹出对话框以保存您的工作,如图 A.4 所示。


图 A.4 笔记本的保存选项。您可以提交代码并让其后续非交互式运行以供以后检查,也可以直接快速保存代码和当前输出。

正如图所示,有两种保存模式。快速保存模式将在版本名称文本博客中保存当前代码和输出。如果当前输出需要几个小时来生成,这将是正确的选择。保存并运行所有选项将保存代码并在后台非交互式地运行它。当运行长时间的训练作业时,例如五六个小时时,这特别有用。您可以关闭会话和所有窗口,并在需要检查结果时随时返回。最近运行/保存的检查通常可以在个性化的 URL www.kaggle.com//notebooks 上进行,其中 是您的用户名。对于我的用户名 azunre,此页面的视图如图 A.5 所示。


图 A.5 近期运行/保存的检查通常可以在个性化 URL www.kaggle.com//notebooks 进行,其中 是您的用户名(此处显示的是我的用户名 azunre)。

我们已经介绍了您需要了解的本书练习的主要特性。我们还没有涵盖的许多其他特性,Kaggle 经常会添加更多。通常,快速的谷歌搜索和一些坚持和实验的愿望就足以弄清楚如何使用任何这样的特性。

在下一节中,我们简要讨论 Kaggle 比赛。


附录 B:初级深度学习工具介绍

本附录涵盖

  • 介绍本书中使用的五种基本算法和软件工具
  • 对训练神经网络使用的算法——随机梯度下降进行概述
  • 以 TensorFlow 开始进行神经网络建模
  • 以 PyTorch 开始进行神经网络建模
  • 对较高级别的神经网络建模框架 Keras、fast.ai 和 Hugging Face transformers 进行概述

在本附录中,我们试图对本书中使用的一些基本工具和概念提供一个简要的入门。对这些工具的简要介绍并不绝对必要,以便理解并充分从本书中受益。不过,阅读它们可以帮助一个新的深度学习领域的人快速融入,并且对他们可能是最有用的。

具体来说,我们首先向读者介绍了我们目前经历的深度学习革命背后的基本算法。当然,这就是用于训练神经网络的随机梯度下降算法。接着我们介绍了两种基本的神经网络建模框架,PyTorch 和 TensorFlow。然后我们介绍了这两个建模框架之上构建的三种工具,以提供一个更高级别的接口:Keras、fast.ai 和 Hugging Face transformers。这些工具相互补充,你可能在职业生涯的某个时候都会用到它们。我们对概念的阐述并不是穷尽的;它提供了一个“鸟瞰”为什么这些工具是需要的以及它们如何相互比较和相互补充。我们涉及了介绍性的概念,并引用了精心筛选的参考资料,以便深入研究。如果你觉得自己对这些工具的经验很少,你可能需要在开始阅读本书之前深入研究一下它们。

让我们从深度学习革命背后的算法引擎开始,即随机梯度下降算法。

B.1 随机梯度下降

神经网络有一组参数,称为权重,确定它将如何将输入数据转换为输出数据。确定哪组权重允许网络最接近地逼近一组训练数据称为训练网络。随机梯度下降是实现这一目标的方法。

让我们用W表示权重,x表示输入数据,y表示输出数据。我们还用y_pred表示神经网络对输入x预测的输出数据。损失函数,用于衡量yy_pred之间的接近程度,被表示为函数f。注意它是xyW的函数。随机梯度下降算法被制定为一个过程,以找到f的最小值,即预测尽可能接近训练数据的位置。如果f的梯度,用f'表示,存在——如果它是一个可微函数——我们知道在这样的点上f'=0。算法试图使用以下步骤序列找到这样的点:

  • 从训练集中随机抽取一个输入-输出批次x-y的数据。这种随机性是算法被称为随机的原因。
  • 使用当前W的值将输入通过网络以获得y_pred.
  • 计算相应的损失函数值f
  • 计算损失函数相对于W的相应梯度f'
  • 稍微改变W的方向以降低f。步长的大小由算法的学习率决定,这是收敛的一个非常重要的超参数。

对于过度简单的单个权重的情况,该过程在图 B.1 中的第 2 步找到了算法的最小值。这张图受到弗朗索瓦·朱利叶的优秀书籍《深度学习与 Python》(Manning Publications,2018)中图 2.11 的启发,你也应该查看这本书以获得对该算法非常直观的解释。


图 B.1 展示了随机梯度下降在单个权重的过度简单情况下的示意图。在每一步中,计算相对于W的梯度,并采取预先确定大小的步骤,由学习率决定,沿着损失函数梯度的相反方向。在这个假设的情景中,最小值在第 2 步找到。

有许多此算法的变体存在,包括 Adam、RMSprop 和 Adagrad。这些算法倾向于专注于避免局部最小值,并以各种方式(如学习率)进行自适应,以更快地收敛。动量的概念——它表现为每一步W更新中的额外加法项——被几种这样的变体用来避免局部最小值。以下是一些最流行的变体及简要描述。

Adagrad 根据参数遇到的频率调整学习率。罕见的参数会以更大的步长进行更新,以实现平衡。该技术被用于训练 GloVe 静态词嵌入,该词嵌入在本书的第四章中描述。在这种情况下,它需要适当处理语言中的稀有单词。

RMSprop是为了解决 Adagrad 的学习速率经常过快下降的问题而开发的。我们可以通过将更新缩放为平方梯度的指数衰减平均值来部分缓解这个问题。

Adam表示自适应矩估计,也针对不同参数变化学习率。它与 RMSprop 具有相似之处,因为它使用衰减平方梯度平均值来执行更新。衰减平方梯度平均值的第一和二个时刻被估计,更新,然后用于在每个步骤中更新参数。这是尝试解决许多问题的流行算法。

NadamNesterov 加速 Adam的缩写,采用称为Nesterov 加速梯度的创新来进一步改善 Adam 的收敛性。

因为这里的介绍只是一个简短的介绍,而不是详细的处理,所以我们不会更深入地探讨这些变体。这个主题已经被许多优秀的参考文献详细覆盖了¹,²,我们鼓励您深入研究以获得更好的理解。即使您可以在不深入了解这些变体的情况下使用现代框架,更好地了解它们可以帮助您调整超参数,并最终部署更好的模型。

B.2 TensorFlow

如前一节所述,了解损失函数相对于神经网络权重的梯度对于训练网络至关重要。由于现代神经网络是巨大的,达到数十亿个参数,因此手动计算此梯度函数将是不可能的。相反,使用 TensorFlow 等基本神经网络建模工具,通过应用取导数的链式法则自动找到梯度来计算它。这个过程被称为自动微分

Tensorflow 中的基本数据结构是张量,通过构建一个计算图来对其进行操作。在框架的 1.x 版本中,通过多种 API 调用tf.*来构建图,并使用Session对象编译和执行它以产生数值。示例 B.1 中演示了使用此 API 定义图形并执行其梯度计算的说明性示例。具体来说,我们需要计算矩阵乘积z = x*y,其中x是简单的列向量,而y是简单的行向量。我们还希望自动计算它相对于xy的梯度。

示例 B.1 使用 TensorFlow 1 计算矩阵乘积 z = x * y 及其梯度

import tensorflow as tf                                                   ❶
tf.compat.v1.disable_eager_execution()                                    ❷
x = tf.compat.v1.placeholder(tf.float32, name = "x")                      ❸
y = tf.compat.v1.placeholder(tf.float32, name = "y")
z = tf.multiply(x, y) # Define vector product graph
gradient = tf.gradients(z,[x, y],grad_ys=tf.eye(2))                       ❹
with tf.compat.v1.Session() as session:                                   ❺
    z = session.run(z, feed_dict={x: [[1., 1.]], y: [[5.], [5.]]})        ❻
    zG = session.run(gradient,feed_dict={x: [[1.,1.]], y: [[5.],[5.]]})   ❼
print("Product:")                                                         ❽
print(z)                       
print("\n\n")                  
print("Gradient of Product:")  
print(zG)                      
print("\n\n")

❶总是先导入 TensorFlow

❷Eager 执行在 2.0 之前作为非默认值引入,因此在此确保其关闭。

❸定义留给后面分配值的向量变量占位符

❹ 定义了乘积的向量导数图,相对于 x 和 y。参数 grad_ys 乘以输出,可用于取链导数,因此我们将其设置为单位矩阵以无效果。

❺ 使用 Session 对象执行图

❻ 运行函数,指定占位符的值

❼ 运行梯度,指定占位符的值

❽ 显示结果

执行此代码将产生以下输出。您应该能够手动验证这些值是否正确,使用您的基本线性代数知识,这是本书的先决条件。我们还在书的伴随存储库中包含了一个 Kaggle 内核笔记本,执行这些命令。³

Product:
[[5\. 5.]
 [5\. 5.]]
Gradient of Product:
[array([[5., 5.]], dtype=float32), array([[1.],
       [1.]], dtype=float32)]

框架的 2.0 版及更高版本将更“Pythonic”的 eager execution 模式作为默认模式,这使得框架更易于使用。它现在还包括了 Keras,使得使用各种高级功能更加容易。下一个列表中显示了使用此 API 定义和执行与列表 B.1 中相同图形的说明性示例。更易于访问性立即变得明显,eager 模式使得立即执行变得可能,而不是通过图上的 Session 对象。

列表 B.2 计算矩阵乘积 z = x*y 及其在 TensorFlow 2 中的梯度

import tensorflow as tf
x = tf.convert_to_tensor([[1., 1.]])            ❶
y = tf.convert_to_tensor([[5.], [5.]])          ❷
with tf.GradientTape() as g:                    ❸
    g.watch(x)
    z = tf.multiply(x, y)
    dz_dx = g.gradient(z, x, output_gradients=tf.eye(2))
with tf.GradientTape() as g:                    ❹
    g.watch(y)
    z = tf.multiply(x, y)
    dz_dy = g.gradient(z, y, output_gradients=tf.eye(2))
print("Dot Product:")                           ❺
print(z)
print("\n\n")
print("Gradient of Product (dz_dx):")
print(dz_dx)
print("\n\n")
print("Gradient of Product (dz_dy):")
print(dz_dy)

❶ 列向量

❷ 行向量

❸ 这是如何相对于 x 计算自动导数的。这里的“Tape”一词表示所有状态都被“记录”,可以播放回来以检索我们需要的信息。

❹ 这是如何相对于 y 计算自动导数的。参数 output_gradients 乘以输出,可用于取链导数,因此我们将其设置为单位矩阵以无效果。

❺ 显示结果

执行此代码应产生与之前相同的输出值。

框架按层次结构组织,具有高级和低级 API,如图 B.2 所示。


图 B.2 TensorFlow 框架的分层组织示意图

此图受官方 TensorFlow 文档第 1 图的影响。⁴ 如果您是初学者,并且想更详细地浏览此参考资料,这可能会有所帮助。在附录的最后一节将进一步讨论 TensorFlow 版本的 Keras,该版本也显示在图中。

更好地了解 TensorFlow 各种特性的方法是动手尝试相关的 Kaggle 内核/笔记本教程,如附录 A 中所述。特别是,只需访问 kaggle.com 并搜索“TensorFlow 教程”即可找到大量精彩的教程,您可以选择最适合您的学习风格和经验水平的内容。www.kaggle.com/akashkr/tensorflow-tutorial 上的教程似乎对初学者很有帮助。

B.3 PyTorch

这个框架在 TensorFlow 之后发布(2016 年对比 2015 年)。然而,它很快就成为许多研究人员首选的框架,如 TensorFlow 相对 PyTorch 在学术论文引用方面的相对流行度下降所证明的那样。⁵ 这种增加的流行度被普遍认为是因为该框架能够在运行时以编程方式修改各种 PyTorch 模型对象,从而在研究过程中更容易进行代码优化。事实上,TensorFlow 2.0 中的急切模式的引入被普遍认为受到了 PyTorch 成功的影响。尽管在 TensorFlow 2.0 发布后,这两个平台之间的差异变得更小了,但普遍的观点是,研究人员更喜欢 PyTorch,而 TensorFlow 更适用于在生产中部署。

作为例证,我们在 PyTorch 中执行与清单 B.1 和 B.2 相同的操作序列 —— 向量乘法及其导数,这是神经网络模型的核心 —— 并在下一个清单中展示相应的代码。

清单 B.3 在 PyTorch 中计算矩阵乘积 z = x*y 及其梯度

import torch                                                               ❶
from torch.autograd import grad                                            ❷
import numpy as np # tensors will be built from numpy arrays
x = torch.from_numpy(np.array([[1., 1.]]))                                 ❸
y = torch.from_numpy(np.array([[5.], [5.]]))                               ❹
x.requires_grad = True                                                     ❺
y.requires_grad = True
z = torch.mul(x, y)                                                        ❻
zGx = grad(outputs=z, inputs=x,grad_outputs=torch.eye(2),retain_graph=True)❼
zGy = grad(outputs=z, inputs=y,grad_outputs=torch.eye(2))                  ❽
print("Dot Product")                                                       ❾
print(z)
print("Gradient of Product(dz_dx)")
print(zGx)
print("\n\n")
print("Gradient of Product (dz_dy):")
print(zGy)

❶ 总是首先导入 PyTorch。

❷ 导入 grad 函数进行自动微分

❸ 列向量

❹ 行向量

❺ 这确保了可以针对 x 计算梯度。

❻ 计算乘积

❼ 针对 x 计算自动导数。retain_graph 确保我们可以继续进行导数计算;否则,“Tape” 将被丢弃,无法回放。

❽ 针对 y 计算自动导数。参数 grad_outputs 乘以输出,可以用于进行链式导数,因此我们将其设置为单位矩阵以无效果。

❾ 显示结果

执行此代码应该产生与前一节相同的结果。我们还在本书的伴随存储库中包含了一个 Kaggle 内核笔记本,执行这些命令。

相关文章
|
7月前
|
机器学习/深度学习 自然语言处理 机器人
面向自然语言处理的迁移学习(二)(4)
面向自然语言处理的迁移学习(二)
54 2
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
面向自然语言处理的迁移学习(二)(3)
面向自然语言处理的迁移学习(二)
58 2
|
7月前
|
机器学习/深度学习 自然语言处理 算法
面向自然语言处理的迁移学习(一)(3)
面向自然语言处理的迁移学习(一)
57 3
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
面向自然语言处理的迁移学习(二)(2)
面向自然语言处理的迁移学习(二)
35 1
|
7月前
|
机器学习/深度学习 自然语言处理 算法
面向自然语言处理的迁移学习(一)(5)
面向自然语言处理的迁移学习(一)
60 1
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
面向自然语言处理的迁移学习(三)(2)
面向自然语言处理的迁移学习(三)
59 0
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
面向自然语言处理的迁移学习(三)(1)
面向自然语言处理的迁移学习(三)
56 0
|
7月前
|
机器学习/深度学习 自然语言处理 数据可视化
面向自然语言处理的迁移学习(二)(1)
面向自然语言处理的迁移学习(二)
45 0
|
7月前
|
机器学习/深度学习 自然语言处理 算法
面向自然语言处理的迁移学习(一)(4)
面向自然语言处理的迁移学习(一)
58 0
|
25天前
|
自然语言处理 API C++
阿里通义推出SmartVscode插件,自然语言控制VS Code,轻松开发应用,核心技术开源!
SmartVscode插件深度解析:自然语言控制VS Code的革命性工具及其开源框架App-Controller