原文标题 :How to Fine-Tune GPT-2 for Text Generation
如何微调 GPT-2 以生成文本
使用 GPT-2 生成优质歌词
近年来,自然语言生成 (NLG) 取得了令人难以置信的进步。 2019 年初,OpenAI 发布了 GPT-2,这是一个巨大的预训练模型(1.5B 参数),能够生成类似人类质量的文本。
Generative Pretrained Transformer 2 (GPT-2),顾名思义,是基于 Transformer 的。因此,它使用了注意力机制,这意味着它学会了关注与上下文最相关的先前单词,以预测下一个单词(有关更多信息,请转到此处)。[0]
本文的目的是向您展示如何微调 GPT-2 以根据您提供给它的数据生成与上下文相关的文本。
例如,我将生成歌词。这个想法是使用已经训练好的模型,根据我们的特定数据对其进行微调,然后根据模型观察到的内容,生成任何给定歌曲应该遵循的内容。
Prepare the data
GPT-2 本身可以生成质量不错的文本。但是,如果您希望它在特定上下文中做得更好,则需要根据您的特定数据对其进行微调。就我而言,由于我想生成歌词,我将使用以下 Kaggle 数据集,其中包含总共 12,500 首流行摇滚歌曲的歌词,全部为英文。[0]
让我们从导入必要的库和准备数据开始。我建议在这个项目中使用 Google Colab,因为对 GPU 的访问将使你的事情变得更快。
从第 26 行和第 34-35 行可以看出,我创建了一个小型测试集,在其中删除了每首歌曲的最后 20 个单词。这将允许我将生成的文本与实际文本进行比较,以了解模型的执行情况。
Create the dataset
为了在我们的数据上使用 GPT-2,我们仍然需要做一些事情。我们需要对数据进行标记化,这是将字符序列转换为标记的过程,即将一个句子分成单词。
我们还需要确保每首歌曲尊重最多 1024 个令牌。
SongLyrics 课程将在训练期间为我们做这件事,为我们原始数据框中的每一首歌。
模型的训练
我们现在可以导入预训练的 GPT-2 模型以及标记器。另外,就像我之前提到的,GPT-2 是巨大的。如果您尝试在计算机上使用它,很可能会遇到一堆 CUDA Out of Memory 错误。
可以使用的替代方法是累积梯度。
这个想法很简单,在调用优化以执行梯度下降步骤之前,它将对几个操作的梯度求和。然后,它将总数除以累积步数,以获得训练样本的平均损失。这意味着更少的计算。
现在,最后,我们可以创建一个训练函数,使用我们所有的歌词来微调 GPT-2,以便它可以预测未来的高质量诗句。
随意使用各种超参数(批量大小、学习率、时期、优化器)。
然后,最后,我们可以训练模型。
model = train(dataset, model, tokenizer)
使用 torch.save 和 torch.load,您还可以保存经过训练的模型以供将来使用。
Lyrics Generation
是时候使用我们全新的微调模型来生成歌词了。通过使用以下两个函数,我们可以为我们的测试数据集中的所有歌曲生成歌词。请记住,我删除了每首歌的最后 20 个单词。现在,我们的模型将针对给定的歌曲,查看他拥有的歌词并提出歌曲的结尾应该是什么。
generate 函数为整个测试数据帧准备生成,而 text_generation 实际上是这样做的。
在第 6 行中,我们指定了一代的最大长度。我把它保留在 30,但那是因为标点符号很重要,我稍后会删除最后几个单词,以确保生成在句末完成。
另外两个超参数值得一提:
- 温度(第 8 行)。它用于缩放生成给定单词的概率。因此,高温会迫使模型做出更多原始预测,而较小的温度会阻止模型偏离主题。
- 顶部 p 过滤(第 7 行)。该模型将按降序对单词概率进行排序。然后,它将这些概率相加到 p,同时删除其他单词。这意味着模型只保留
最相关的单词概率,但不仅保留最好的单词概率,因为给定一个序列可能有多个单词是合适的。
在下面的代码中,我只是清理生成的文本,确保它在句子的末尾(而不是中间)完成,并将其存储在测试数据集中的新列中。
Performance Evaluation
有很多方法可以评估生成文本的质量。最流行的指标称为 BLEU。该算法输出 0 到 1 之间的分数,具体取决于生成的文本与现实的相似程度。 1 分表示生成的每个单词都存在于真实文本中。
这是为生成的歌词评估 BLEU 分数的代码。
我们获得了 0.685 的平均 BLEU 分数,这非常好。相比之下,没有任何微调的 GPT-2 模型的 BLEU 得分为 0.288。
但是,BLEU 有其局限性。它最初是为机器翻译而创建的,仅查看用于确定生成文本质量的词汇表。这对我们来说是个问题。实际上,可以生成使用与现实完全不同的词语的高质量诗歌。
这就是为什么我会对模型的性能进行主观评估。为此,我创建了一个小型 Web 界面(使用 Dash)。该代码可在我的 Github 存储库中找到。
界面的工作方式是您为应用程序提供一些输入词。然后,该模型将使用它来预测接下来的几节经文应该是什么。以下是一些示例结果。
红色是 GPT-2 模型预测的,给定黑色的输入序列。你会看到它已经成功地生成了有意义的诗句,并且尊重了之前的背景!此外,它会生成相似长度的句子,这对于保持歌曲的节奏非常重要。在这方面,输入文本中的标点符号在生成歌词时是绝对必要的。
Conclusion
如文章所示,通过针对特定数据微调 GPT-2,可以相当轻松地生成上下文相关文本。
对于歌词生成,该模型可以生成既尊重上下文又尊重句子所需长度的歌词。当然,可以对模型进行改进。例如,我们可以强制它生成押韵的诗句,这是写歌词时经常需要的。
非常感谢阅读,希望能帮到你!
可以在这里找到包含所有代码和模型的存储库:https://github.com/francoisstamant/lyrics-generation-with-GPT2[0]
文章出处登录后可见!