实践中的少样本学习:GPT-Neo 和 🤗 加速推理 API

Few-shot learning in practice GPT-Neo and 🤗 Accelerated Inference API.

在许多机器学习应用中,可用的标记数据量是生成高性能模型的障碍。自然语言处理(NLP)的最新发展表明,您可以通过在推断时间提供几个示例和一个大型语言模型(一种称为Few-Shot Learning的技术)来克服这个限制。在本博客文章中,我们将解释什么是Few-Shot Learning,并探讨一个名为GPT-Neo的大型语言模型和🤗加速推断API如何用于生成您自己的预测。

什么是Few-Shot Learning?

Few-Shot Learning是指使用非常少量的训练数据来指导机器学习模型的预测,例如在推断时间提供的几个示例,而不是需要相对较大量的训练数据来使预训练模型适应所需任务的标准微调技术。

这种技术主要在计算机视觉中使用,但随着一些最新的语言模型,如EleutherAI GPT-Neo和OpenAI GPT-3,我们现在可以在自然语言处理(NLP)中使用它。

在NLP中,Few-Shot Learning可以与大型语言模型一起使用,这些模型在大型文本数据集的预训练过程中已经学会了执行许多任务。这使得模型能够泛化,即仅凭几个示例就能理解相关但以前未见过的任务。

Few-Shot NLP示例由三个主要组件组成:

  • 任务描述:模型应该做什么的简短描述,例如“将英语翻译成法语”
  • 示例:几个示例展示模型应该预测什么,例如“海獭 => loutre de mer”
  • 提示:一个新示例的开头,模型应该通过生成缺失的文本来完成,例如“奶酪 => ”

图片来源:语言模型是Few-Shot学习者

创建这些Few-Shot示例可能会有些棘手,因为您需要通过它们来表达您希望模型执行的“任务”。一个常见问题是模型,特别是较小的模型,对示例的书写方式非常敏感。

在生产环境中优化Few-Shot Learning的一种方法是学习一个任务的通用表示,然后在该表示之上训练特定于任务的分类器。

OpenAI在GPT-3论文中表明,few-shot提示能力随着语言模型参数的增加而改善。

图片来源:语言模型是Few-Shot学习者

现在让我们看看如何使用GPT-Neo和🤗加速推断API生成您自己的Few-Shot Learning预测!


什么是GPT-Neo?

GPT-Neo是EleutherAI基于GPT架构的一系列基于Transformer的语言模型。EleutherAI的主要目标是训练一个与GPT-3大小相当的模型,并在开放许可下向公众提供。

目前所有可用的GPT-Neo检查点都是使用Pile数据集进行训练的,Pile数据集是一个大型文本语料库,在(Gao等人,2021)中有详细记录。因此,预计它在与其训练文本分布匹配的文本上的功能更好;我们建议在设计示例时牢记这一点。


🤗加速推断API

加速推断API是我们的托管服务,可通过简单的API调用在🤗模型中心公开提供的10,000多个模型或您自己的私有模型上运行推断。该API包括在CPU和GPU上的加速,与Transformers的开箱即用部署相比,速度提高了多达100倍。

要将Few-Shot Learning预测与GPT-Neo集成到自己的应用程序中,您可以使用以下代码片段中的🤗加速推断API。如果您没有帐户,您可以在此处找到API令牌,您可以在此处开始。

import json
import requests

API_TOKEN = ""

def query(payload='',parameters=None,options={'use_cache': False}):
    API_URL = "https://api-inference.huggingface.co/models/EleutherAI/gpt-neo-2.7B"
        headers = {"Authorization": f"Bearer {API_TOKEN}"}
    body = {"inputs":payload,'parameters':parameters,'options':options}
    response = requests.request("POST", API_URL, headers=headers, data= json.dumps(body))
    try:
      response.raise_for_status()
    except requests.exceptions.HTTPError:
        return "错误:"+" ".join(response.json()['error'])
    else:
        return response.json()[0]['generated_text']

parameters = {
    'max_new_tokens':25,  # 生成的标记数量
    'temperature': 0.5,   # 控制生成的随机性
    'end_sequence': "###" # 停止生成的序列
}

prompt="...."             # 少样本示例

data = query(prompt,parameters,options)

实用见解

以下是一些实用见解,可以帮助您开始使用 GPT-Neo 和 🤗 加速推理 API。

由于 GPT-Neo(2.7B)比 GPT-3(175B)小约60倍,它在零样本问题上的泛化能力不如前者,并且需要3-4个示例才能取得良好的结果。当您提供更多示例时,GPT-Neo 会理解任务并考虑到 end_sequence,这使得我们能够很好地控制生成的文本。

超参数 End SequenceToken LengthTemperature 可用于控制模型的 text-generation,您可以利用这些来解决所需的任务。 Temperature 控制生成的随机性,较低的温度会导致生成的结果较少随机,而较高的温度会导致生成的结果更随机。

在这个例子中,您可以看到定义超参数的重要性。这些超参数可以决定您是否能够成功解决任务。


负责任的使用

少样本学习是一种强大的技术,但在设计用例时也存在独特的风险需要考虑。为了说明这一点,让我们考虑小部件中提供的默认 情感分析 设置。在将情感分类的三个示例放入模型后,当 temperature 设置为0.1时,模型会在5次中有4次做出以下预测:

推文:“我是一个残疾的开心的人” 情感:负面

可能会出现什么问题?想象一下,您正在使用情感分析来聚合在线购物网站上产品的评论:可能的结果之一是有助于残疾人的物品会自动被降低排名-这是一种自动化歧视。有关此特定问题的更多信息,请参阅ACL 2020论文《Social Biases in NLP Models as Barriers for Persons with Disabilities》。由于少样本学习更直接地依赖于预训练中获得的信息和关联性,因此对这种类型的故障更为敏感。

如何最大程度地减少风险?以下是一些建议。

负责任使用的最佳实践

  • 确保用户知道他们的用户体验的哪些部分依赖于机器学习系统的输出
  • 如果可能,让用户有选择退出的能力
  • 为用户提供反馈模型决策的机制,并允许用户对其进行覆盖
  • 监控反馈,特别是模型故障,以便对可能受到不成比例影响的用户群体进行监测

最需要避免的是在没有机会让人提供输入或更正输出的情况下,使用模型自动做出对用户的决策。欧洲的GDPR等多项法规要求为用户提供有关对其自动决策的解释。


要在您自己的应用程序中使用GPT-Neo或任何Hugging Face模型,您可以开始免费试用🤗加速推理API。如果您需要帮助减轻模型和AI系统中的偏见,或者利用Few-Shot Learning,🤗专家加速计划可以为您的团队提供Hugging Face团队的直接优质支持。