使用 GPT-2 模型进行文本生成

文本生成是深度学习最引人入胜的应用之一。随着 GPT-2 等大型语言模型的出现,我们现在可以生成连贯、上下文相关且极具创造性的人类般文本。在本教程中,您将学习如何使用 GPT-2 实现文本生成。您将通过可以立即运行的实际示例进行学习,通过本指南,您将理解其理论和实际实现细节。

完成本教程后,您将了解:

  • GPT-2 的 Transformer 架构如何实现复杂的文本生成
  • 如何使用不同的采样策略实现文本生成
  • 如何针对不同的用例优化生成参数

通过我的书籍《Hugging Face Transformers中的NLP》快速启动您的项目。它提供了带有工作代码的自学教程

让我们开始吧。

使用 GPT-2 模型进行文本生成
图片由 Peter Herrmann 提供。保留部分权利。

概述

本教程分为四个部分;它们是:

  • 核心文本生成实现
  • 文本生成中的参数有哪些?
  • 批处理和填充
  • 优化生成结果的技巧

核心文本生成实现

让我们从一个演示基本概念的基本实现开始。下面,您将创建一个类,使用预训练的 GPT-2 模型,根据给定的提示生成文本。您将在本教程的后续部分扩展此类别。

让我们分解一下这个实现。

在此代码中,您使用 `transformers` 库中的 `GPT2LMHeadModel` 和 `GPT2Tokenizer` 类来加载预训练的 GPT-2 模型和分词器。作为用户,您甚至不需要了解 GPT-2 的工作原理。`TextGenerator` 类托管它们,如果您有 GPU,则在 GPU 上使用它们。如果您尚未安装该库,可以使用 `pip` 命令进行安装。

在 `generate_text` 方法中,您处理核心生成过程,其中包含几个重要参数:

  • `max_length`:控制生成文本的最大长度
  • `temperature`:调整随机性(值越高 = 越有创意)
  • `top_k`:将词汇限制为 $k$ 个最高概率的令牌
  • `top_p`:使用核采样动态限制令牌

以下是使用此实现生成文本的方法:

输出可能为

您在这里使用了三个不同的提示,并生成了三段文本。该模型使用起来非常简单。您只需将分词器编码的提示以及注意力掩码传递给 `generate_text` 方法。注意力掩码由分词器提供,但本质上只是与输入形状相同的全一张量。

文本生成中的参数有哪些?

如果您查看 `generate_text` 方法,您会看到通过 `gen_kwargs` 传递了几个参数。其中一些最重要的参数是 `top_k`、`top_p` 和 `temperature`。您可以通过尝试不同的值来查看 `top_k` 和 `top_p` 的效果。

示例输出可能为

`top_k` 和 `top_p` 参数用于微调采样策略。要理解它,请记住模型为每个标记输出一个词汇表上的概率分布。有大量的标记。当然,您总是可以选择概率最高的标记,但您也可以选择一个随机标记,以便从相同的提示中生成不同的输出。这就是 GPT-2 使用的**多项式采样**算法。

`top_k` 参数将选择限制为 $k>0$ 个最有可能的标记。与其考虑词汇表中的数千个标记,不如将 `top_k` 设置为更易于处理的子集。

`top_p` 参数进一步缩短了选择范围。它只考虑那些累积概率达到 `top_p` 参数 $P$ 的标记。然后根据概率对生成的标记进行采样。

上面的代码演示了三种不同的采样方法。

  • 第一个示例将 `top_k` 设置为一个小值,限制了选择。输出是集中的,但可能重复。
  • 第二个示例通过将其设置为 0 来关闭 `top_k`。它设置 `top_p` 以使用核采样。采样池将移除低概率标记,提供更自然的变体。
  • 第三个示例是一种组合方法,利用这两种策略以获得最佳结果。设置更大的 `top_k` 以允许更好的多样性,因此随后更大的 `top_p` 仍然可以提供高质量、自然的生成。

然而,一个令牌的概率是多少呢?这就是温度参数。我们来看另一个例子。

请注意,所有三个示例都使用相同的提示。输出可能为:

那么温度有什么影响呢?您可以看到

  • 0.3 的低温度会产生更集中和确定性的输出。输出很无聊。使其适用于需要准确性的任务。
  • 0.7 的中等温度在创造性和连贯性之间取得了平衡。
  • 1.0 的高温度生成更多样化和创造性的文本。每个示例都使用相同的 max_length 进行公平比较。

在幕后,温度是 softmax 函数中的一个参数,该函数应用于模型的输出以确定输出标记。softmax 函数是:

$$
s(x_j) = \frac{e^{x_j/T}}{\sum_{i=1}^{V} e^{x_i/T}}
$$

其中 $T$ 是温度参数,$V$ 是词汇量大小。用 $T$ 缩放模型输出 $x_1,\dots,x_V$ 会改变标记的相对概率。高温度使概率更均匀,让不太可能的标记更有可能被选择。低温度使概率更集中在最高概率标记上,因此输出更具确定性。

批处理和填充

上面的代码适用于单个提示。但是,在实践中,您可能需要为多个提示生成文本。以下代码显示了如何有效地处理多个提示的生成。

输出可能为

BatchGenerator 的实现做了一些细微的改动。 generate_batch 方法接受一个提示列表,并将其他参数传递给模型的 generate 方法。最重要的是,它将提示填充到相同的长度,然后为批次中的每个提示生成文本。结果以与提示相同的顺序返回。

GPT-2 模型经过训练可以处理批量输入。但要将输入以张量形式呈现,所有提示都需要填充到相同的长度。分词器可以轻松处理批量输入。但 GPT-2 模型没有指定填充标记应该是什么。因此,您需要使用 add_special_tokens() 函数来指定它。上面的代码使用 EOS 标记。但实际上,您可以使用任何标记,因为注意力掩码将强制模型忽略它。

优化生成结果的技巧

您知道如何使用 GPT-2 模型生成文本。但您应该对输出有什么期望呢?这确实是一个取决于任务的问题。但这里有一些技巧可以帮助您获得更好的结果。

首先是提示工程。您需要在提示中具体明确,才能获得高质量的输出。模糊的词语或短语可能导致模糊的输出,因此您应该具体、简洁、精确。您还可以包含相关上下文,以帮助模型理解任务。

此外,您还可以调整参数以获得更好的结果。根据任务,您可能希望输出更专注或更具创造性。您可以调整温度参数来控制输出的随机性。您还可以调整 temperaturetop_ktop_p 参数来控制输出的多样性。输出生成是自回归的。您可以设置 max_length 参数来通过权衡速度来控制输出的长度。

最后,上面的代码不是容错的。在生产环境中,您需要实现适当的错误处理、设置合理的超时、监控内存使用情况以及实现速率限制。

进一步阅读

下面是一些进一步的阅读材料,可以帮助您更好地理解使用 GPT-2 模型进行文本生成。

总结

在本教程中,您学习了如何使用 GPT-2 生成文本,并使用 Transformer 库通过几行代码构建实际应用程序。特别是,您学习了

  • 如何使用 GPT-2 实现文本生成
  • 如何针对不同用例控制生成参数
  • 如何实现批处理以提高效率
  • 最佳实践和要避免的常见陷阱

想在您的NLP项目中使用强大的语言模型吗?

NLP with Hugging Face Transformers

在您自己的机器上运行最先进的模型

...只需几行Python代码

在我的新电子书中探索如何实现
使用 Hugging Face Transformers 进行自然语言处理

它涵盖了在以下任务上的实践示例实际用例文本分类、摘要、翻译、问答等等...

最终将高级NLP带入
您自己的项目

没有理论。只有实用的工作代码。

查看内容

暂无评论。

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。