很明显,类似于ChatGPT、GPT-3和GPT-4等热门的新型生成式人工智能模型可以产生惊人的结果。但我们真的在每一种语言应用中都需要这种规模的模型吗?我们是否可以使用较小的模型如GPT-J为众多自然语言处理(NLP)任务实现先进的性能?
答案是肯定的。对于下游任务,如问题回答、命名实体识别、情感分析和文本分类,较小的模型可以轻松地进行fine-tune以提供SOTA结果。较大的模型主要增加了更多的世界知识并拥有更好的自由文本生成性能,可能用于人工智能助理或聊天机器人。
OpenAI并没有免费提供GPT-4、GPT-3或ChatGPT的训练权重,而从头开始训练这种规模的模型是非常昂贵的。该公司确实提供了有限的fine-tune服务,但用户需要共享他们的训练数据,并持续为fine-tune过程付费,以获取所产生的模型。
对于许多公司来说,像GPT-J这样更高效、高性能的小型模型是正确的选择。
GPT-J是来自EleutherAI的OpenAI GPT-3的开源替代品。它是GPT-3的6B参数版本,任何人都可以下载,在许多语言任务中它的表现与大型模型一样好。
GPT-J现在可以在Graphcore拟未IPU上使用Paperspace Gradient Notebooks运行,用于推理 [1] 和fine-tune [2]
fine-tune GPT-J 6B
在这篇文章和附带的视频教程中 [3],我们将向您展示如何在Paperspace易于使用的Jupyter notebook中fine-tune预训练的GPT-J模型,它运行在16个IPU系统上。
我们将解释如何在GLUE MNLI数据集上 [4] 针对文本蕴含任务 [5] 对GPT-J进行fine-tune,以实现SOTA的性能,同时比大型数据集更具成本效益。
我们将MNLI任务表述为一个使用程式化提示的文本到文本的问题。这种方法在《探索使用统一的文本到文本transformer迁移学习的局限性》[6] 一文中被首次提及,它非常通用,可以用来对GPT-J或其他生成式模型在每个下游任务上进行开箱即用的fine-tune。
这种技术的优势在于,您可以对许多不同的任务使用相同的模型结构和预训练起点。下游任务的特殊性在提示格式中得到了体现。在fine-tune过程中,模型会学习将给定的格式与任务进行关联。
最重要的是,解决该任务所需的所有语言理解能力都已经存在于预训练的模型中。fine-tune只是为了学习提示与任务之间的关联,因此成本相对较低。
纯因果解码器模型概述
每种语言模型的第一步都是标记化。对文本进行标记意味着将其拆分为多个部分,这些标记可以是单词或子单词,具体取决于标记器。然后通过表查找将标记转换为id。这张表的大小就是词汇表的大小。
标记化过程的细节对于理解给定模型对输入文本更改的敏感程度非常重要。
在更高层次上,自回归因果模型是一个黑匣子,它接受一个标记化的输入句子,并且针对每个标记,在过去标记的条件下,输出下一个标记的概率分布。更确切地说,它输出的是非归一化的概率,即logits。可以理解为当需要一个真实的概率分布时,logits采用softmax函数进行归一化。
简单地说,该模型为每个标记输出一个大小为vocab_size的向量,其组成部分i表示,考虑到给定句子中以前的标记,标记i是下一个标记的可能性。
在训练时,转换后的输入句子将被作为标签提供给模型。标签隐含地将目标分布定义为一个分类分布,其中单个类别的概率为1,所有其他类别的概率为0:基本上目标向量是独热编码向量。
交叉熵损失在训练期间被用来测量模型输出分布和目标分布之间的“距离”。
在推理时,logits被用来预测下一个标记,遵循所选择的启发式方法(相关总结,请阅览这篇Hugging Face的文章 [7] )。最简单的情况是启发式算法,即选择下一个标记,选择与最高logits对应的标记。
GPT-J MNLI fine-tune
有了这些背景,您就可以了解GPT-J fine-tune的基本功能。
接下来让我们深入了解MNLI的例子。关于逐行解释,您可以查看我们的视频演示,其中解释了如何在Paperspace中运行MNLI。
1. 数据集预处理——将任务转换为文本到文本格式
MNLI数据集由多对句子、一个前提和一个假设组成。任务是预测前提和假设之间的关系,可以是:
•   包含:前提包含了假设
   矛盾:假设与前提相矛盾
   中性:假设和前提无关
你可以在Hugging Face [8] 上探索数据集:
为了将任务转换成文本到文本的格式,我们可以形成训练提示:
标记化的提示为fine-tune提供了输入和标签。由于该模型被要求预测下一个标记,因此输入由完整的标记化句子组成,但最后一个标记(prompt[:-1]),标签是移动了一个(prompt[1:])的标记化句子。
事实上,不同的句子被组合成模型序列长度。考虑到模型的因果性质,不需要额外把句子分成不同的部分(我们不需要掩码)。输入和标签是从打包的句子中提取的。
对数据集的验证拆分也进行了类似的预处理。
2. 自定义配置
一旦数据集预处理完成,我们就可以自定义训练和验证配置。
对于训练,我们可以自定义优化器参数、信息漏失概率、训练步骤和控制检查点周期的参数。
对于验证,我们通常希望控制允许的最大输出标记、缩小序列长度并增加批次大小。此外,我们需要定义一个指标来衡量模型的性能。对于 MNLI,使用的是精确度。
3. 举例说明GPTJTrainer
最后,我们定义预训练的模型。这是在Hugging Face上可用的EleutherAI基础检查点。这些权重是我们进行fine-tune的起点。
所有这些成分都被用来创建GPTJTrainer:
4. 运行fine-tune
通过GPTJTrainer,我们可以用单个指令运行fine-tune
5. 运行验证
验证如此简单:
6. 转换为HF检查点
一旦我们对模型进行了fine-tune并对其进行了验证,我们就可以保存一个兼容Hugging Face的检查点,之后可以将其上传到HUB。
  结论  
GPT-J可以在Graphcore的IPU产品如Bow Pod系统和C600 PCIe卡上轻松运行,您可访问graphcore.cn来获取更多产品信息。
[1]https://ipu.dev/YulO7j
[2]https://ipu.dev/0uiXjd
[3]https://www.graphcore.ai/posts/gpt-j-fine-tuning-tutorial-walkthrough
[4]https://huggingface.co/datasets/glue#mnli
[5]https://en.wikipedia.org/wiki/Textual_entailment
[6]https://arxiv.org/abs/1910.10683
[7]https://huggingface.co/blog/how-to-generate
[8]https://huggingface.co/datasets/glue/viewer/mnli/train
[9]https://www.graphcore.ai/paperspace-pod64-waiting-list
获取更多Graphcore资讯,阅读深度技术文章,并与其他创新者们一起交流,请至中国官网graphcore.cn,以及关注Graphcore微信、微博和知乎创新社区。
Graphcore中国官网
Graphcore官方微信
Graphcore微博创新社区
Graphcore知乎创新社区
点击阅读原文,查看英文blog。
继续阅读
阅读原文