文本分类
本文介绍如何使用GPT-3对文本进行分类,通过微调GPT-3模型可以满足并超过文本分类基准上的最新记录。对训练数据的规模、质量、代表性和指定充分进行了讲解。还介绍了微调GPT-3的工作原理和如何设置训练数据的格式,以及在分类过程中应该如何使用分隔符序列。
正文
GPT-3 对语言的理解使其在文本分类方面非常出色。通常,使用 GPT-3 对文本进行分类的最佳方法是在训练样本上微调 GPT-3。微调的 GPT-3 模型可以满足并超过文本分类基准上的最新记录。
本文分享了微调 GPT-3 以对文本进行分类的最佳做法。
其他资源:
微调 GPT-3 的工作原理
OpenAI 微调指南 介绍了如何微调您自己的自定义版本的 GPT-3。您提供训练示例列表(每个示例分为提示和完成),模型从这些样本中学习,以预测给定提示的完成情况。
示例数据集:
提示 | 完成 |
“汉堡–>” | “可食用” |
“纸巾–>” | “不可食用” |
“酒–>” | “可食用” |
“香蕉–>” | “可食用” |
“狗玩具–>” | “不可食用” |
采用 JSONL 格式:
{"提示": "汉堡 -->", "完成": "可食用"} {"提示": "纸巾 -->", "完成": "不可食用"} {"提示": "葡萄酒 -->", "完成": " 食用"} {"提示": "香蕉 -->", "完成": "可食用"} {"提示": "狗玩具 -->", "完成": " 不能吃的"}
在微调期间,模型读取训练示例,并在每个文本标记之后预测下一个标记。将此预测的下一个令牌与实际的下一个令牌进行比较,并更新模型的内部权重,使其更有可能在未来正确预测。随着训练的继续,模型将学习生成训练示例中演示的模式。
微调自定义模型后,可以通过 API 调用它 来对新示例进行分类:
提示 | 完成 |
“牙膏–>” | ??? |
获取最有可能的令牌的示例 API 调用
api_response = openai.Completion.create( model="{fine-tuned model goes here, without brackets}", prompt="toothpaste -->", temperature=0, max_tokens=1 ) completion_text = api_response['choices'][0]['text'] if completion_text == ' edible': label = 'edible' elif completion_text == ' in': label = 'inedible' else: label = 'other'
由于“可食用”是 1 个代币,“不可食用”是 3 个代币,在此示例中,我们只请求一个完成代币,并将“in”计为“不可食用”的匹配项。
获取5 个最有可能的令牌的概率能力的示例 API 调用
api_response = openai.Completion.create( model="{fine-tuned model goes here, without brackets}", prompt="toothpaste -->", temperature=0, max_tokens=1, logprobs=5 ) dict_of_logprobs = api_response['choices'][0]['logprobs']['top_logprobs'][0].to_dict() dict_of_probs = {k: 2.718**v for k, v in dict_of_logprobs.items()}
训练数据
成功的最重要决定因素是训练数据。
训练数据应为:
- 大(理想情况下是数千或数万个示例)
- 高质量(格式一致,并清除不完整或不正确的示例)
- 代表性(数据应与使用模型的数据相似)
- 充分指定(即,在输入中包含足够的信息以生成您希望在输出中看到的内容)
如果没有得到良好的结果,首先要查看的是训练数据。尝试遵循以下有关数据格式、标签选择和所需训练数据数量的提示。另请查看我们的常见错误列表。
如何设置训练数据的格式
对 fine-tuned
模型的提示通常不需要说明或示例,因为模型可以从训练示例中学习任务。包含说明不应损害性能,但额外的文本令牌会增加每个 API 调用的成本。
提示 | 令 牌 | 推荐 |
“汉堡–>” | 3 | ✅ |
“将以下物品标记为可食用或不可食用。 项目:汉堡 标签:” | 20 | ❌ |
“项目:蛋糕 类别: 食用 项目:平底锅 类别: 不可食用 项目:汉堡 类别:” | 26 | ❌ |
在微调单个模型以执行多个任务时,说明仍然很有用。例如,如果您训练模型对同一文本字符串中的多个特征进行分类(例如,物品是否可以食用或是否手持),则需要一些指令来告诉模型要标记哪个特征。
示例训练数据:
提示 | 完成 |
“汉堡–>可食用:” | “是” |
“汉堡–>手持式:” | “是” |
“汽车–>可食用:” | “不要” |
“汽车–>手持:” | “不要” |
未见过的示例示例提示:
提示 | 完成 |
“奶酪–>可食用的:” | ??? |
请注意,对于大多数模型,每个示例的提示 + 完成必须少于 2048 个标记 (大约两页文本)。对于txt-davinci-002
,限制为 4000 个标记(大约四页文本)。
分隔符序列
对于分类,请使用文本序列结束文本提示,以告知模型输入文本已完成,并且应开始分类。如果没有这样的信号,模型可能会在附加类标签之前附加其他发明的文本,从而产生如下输出:
- 汉堡 可食用 (准确)
- 汉堡 和薯条可食用 (不是很要求)
- 汉堡图案的新奇领带不可食用 (不准确)
- 汉堡 汉堡 (未生成标签)
分隔符序列示例
提示 | 推荐 |
“汉堡” | ❌ |
“汉堡–>” | ✅ |
“汉堡 ### “ | ✅ |
“汉堡>>>” | ✅ |
“汉堡 标签:” | ✅ |
确保您选择的序列不太可能出现在文本中(例如,在对 Python 代码进行分类时避免使用“###”或“->”)。否则,您选择的序列通常无关紧要。
如何选取标签
一个常见的问题是将什么 用作类标签。
一般来说,微调可以与任何标签一起使用,无论标签是否具有语义含义(例如,“可食用”)(例如,“1”)。也就是说,在每个标签的训练数据很少的情况下,语义标签可能会更好地工作, 以便模型可以利用其对标签含义的知识。
方便时,我们建议使用单标记标签。您可以使用 OpenAI 标记器检查字符串中的令牌数量。单标记标签有几个优点:
- 最低成本
- 更容易获得它们的概率,这对于指标置信度分数、精度、召回率很有用
- 无需指定停止序列或后处理完成以比较不同租金长度的标签
标签示例
提示 | 标签 | 推荐 |
“汉堡–>” | “可食用” | ✅ |
“汉堡–>” | ” 1″ | ✅ |
“汉堡–>” | “是” | ✅ |
“汉堡–>” | “汉堡可以吃” | ❌ (但仍然有效) |
一个有用的事实:所有数字<500都是单个令牌。
如果您确实使用多标记标签,我们建议每个标签以不同的令牌开头。如果多个标签以相同的令牌开头,则由于贪婪采样,不确定的模型最终可能会偏向于这些标签。
您需要多少训练数据
您需要多少数据取决于任务和所需的性能。
下面是添加训练示例如何提高分类准确性的说明性示例。
斯坦福自然语言推理(SNLI)语料库文本分类表现的说明性示例,其中有序的句子对按其逻辑关系分类:矛盾,包含(implied)或中性。如果未另行指定,则使用默认微调参数。
粗略地说,我们通常会看到需要几千个示例才能获得良好的性能:
每个标签的示例 | 性能(粗略估计) |
数百 | 体面 |
数以千计 | 好 |
数万或更多 | 伟大 |
要评估获取更多数据的价值,您可以在当前数据集的子集(例如 25%、50%、100%)上训练模型,然后查看性能如何随数据集大小而扩展。如果绘制训练样本数的准确度,则100% 的斜率将指示获取更多数据可以预期的改进。(请注意,您无法从单个训练运行期间的准确性演变中推断出其他数据的值,作为模型半 tr使用两倍的数据并不 等同于完全训练的模型。
如何评估微调模型
评估微调后的模型对于 (a) 改进模型和 (b) 判断何时可以部署模型至关重要。
许多指标可用于表征分类器的性能
- 准确性
- F1
- 精度/正预测值/假盘差率
- 召回/灵敏度
- 特 异性
- AUC / AUROC(接收器操作员特性曲线下的面积)
- AUPRC(精确召回曲线下面积)
- 交叉熵
使用哪个指标取决于您的特定应用程序以及您如何权衡不同类型的错误。例如,如果检测到罕见但重要的内容,其中假阴性比误报成本更高,则您可能更关心召回率而不是准确性。
OpenAI API 提供了计算其中一些分类指标的选项。如果启用,这些指标将在微调期间以及最终模型定期计算。您将在结果文件中看到它们作为附加列。
若要启用分类指标,需要:
- 使用单标记 类标签
- 提供验证文件(与训练文件的格式相同)
- 设置标志 –compute_classification_metrics
- 对于多类分类:设置参数 –classification_n_classes
- 对于二元分类:设置参数 –classification_positive_class
使用 OpenAI CLI 微调调用的示例
``` # For multiclass classification openai api fine_tunes.create \ -t <TRAIN_FILE_ID_OR_PATH> \ -v <VALIDATION_FILE_OR_PATH> \ -m <MODEL> \ --compute_classification_metrics \ --classification_n_classes <NUMBER_OF_CLASSES> # For binary classification openai api fine_tunes.create \ -t <TRAIN_FILE_ID_OR_PATH> \ -v <VALIDATION_FILE_OR_PATH> \ -m <MODEL> \ --compute_classification_metrics \ --classification_n_classes 2 \ --classification_positive_class <POSITIVE_CLASS_FROM_DATASET> ```
如果您设置 –compute_classification_metrics,则以下指标将显示在结果文件中:
对于多类分类
- classification/accuracy: accuracy
- classification/weighted_f1_score: weighted F-1 score
对于二元分类
以下指标基于 0.5 的分类阈值(即,当概率> 0.5 时,示例被归类为属于正类。
- classification/accuracy
- classification/precision
- classification/recall
- classification/f{beta}
- classification/auroc – AUROC
- classification/auprc – AUPRC
请注意,这些评估假定您正在对标记为单个标记的类使用文本标签 ,如上所述。如果这些条件不成立,你得到的数字可能是错误的。
示例输出
训练运行中指标演变的示例,使用权重和偏差可视化
如何选择合适的型号
OpenAI 为 5 种模型提供微调:
- ada (cheapest and fastest)
- babbage
- curie
- davinci
- text-davinci-002 (highest quality)
使用哪种模型将取决于您的使用情况以及您如何重视质量与价格和速度。
通常,我们看到文本分类用例分为两类:简单和复杂。
对于简单或直接的任务,例如对情绪进行分类,较大的模型可提供 d预期的好处,如下所示:
型 | 说明性准确性* | 培训费用** | 推理成本** |
阿达 | 89% | $0.0004 / 1K 代币(~3,000 页/美元) | $0.0016 / 1K 代币(~800 页/美元) |
巴贝奇 | 90% | $0.0006 / 1K 代币(~2,000 页/美元) | $0.0024 / 1K 代币(~500 页/美元) |
居里 | 91% | $0.003 / 1K 代币(~400 页/美元) | $0.012 / 1K 代币(~100 页/美元) |
达芬奇 | 92% | $0.03 / 1K 代币(~40 页/美元) | $0.12 / 1K 代币(~10 页/美元) |
文本–达芬奇-002 | 93% | 未发布 | 未发布 |
*SNLI数据集的说明性准确性,其中句子对被分类为矛盾,暗示或中性
**每美元页数假设每页~800个代币。开放人工智能 定价。
斯坦福自然语言推理 (SNLI) 语料库文本分类性能的说明性示例,其中有序的 se ntence 对按其逻辑关系进行分类:矛盾、包含(暗示)或中性。如果未另行指定,则使用默认微调参数。
对于复杂的任务,需要微妙的解释或推理或事先知道的壁架或编码能力,模型之间的性能差距可能更大,更好的模型(如居里或文本-davinci-002)可能是最合适的。
单个项目最终可能会尝试所有模型。一个说明性开发路径可能如下所示:
- Test 代码使用最便宜和最快的模型 (ada)
- 运行一些早期试验,以检查数据集是否按预期使用中等模型(居里模型)工作
- 使用最佳模型再运行一些实验,看看您可以将性能提高到什么程度 (text-davinci-002)
- 获得良好的结果后,对所有模型进行训练运行,以绘制出性价比边界,并选择对您的用例最有意义的模型(ada、babbage、curie、davinci、text-davinci-002)
使用多个模型的另一个可能的发展可能是:
- 从一个小数据集开始,训练最佳模型(text-davinci-002)
- 使用此微调模型生成更多标签,并将数据集扩展为多个
- 使用此新数据集训练更便宜的模型 (ada)
如何选取训练超参数
可以使用各种参数进行调整。通常,默认 参数运行良好,调整只会导致较小的性能变化。
参数 | 违约 | 建议 |
n_epochs 控制每个示例的训练次数 | 4 | 对于分类,我们已经看到了 4 或 10 等数字的良好表现。小型数据集可能需要更多纪元,而大型数据集可能需要较少的纪元。 如果您发现训练准确性较低,请尝试增加n_epochs。如果您看到训练精度高但 validation 准确度低(过拟合),请尝试降低n_epochs。 您可以通过将compute_classification_metrics设置为 True 并传递包含不在训练数据中的标记示例的验证文件来获取训练和验证精度。您可以看到在使用权重和偏差帐户进行微调期间不断发展的指标图表。 |
batch_size 控制单次训练传递中使用的训练样本数 | 零 (动态调整到训练集的 0.2%,上限为 256) | 我们已经看到了 0.01% 到 2% 范围内的良好性能,但在 5%+ 的范围内表现较差。通常,较大的批量大小往往更适合较大的数据集。 |
learning_rate_multiplier 控制模型权重的更新速率 | 零 (发电机根据批次大小调整为 0.05、0.1 或 0.2) | 我们已经看到了 0.02 到 0.5 范围内的良好性能。较大的学习率往往在较大的批处理中表现更好。 |
prompt_loss_weight 控制模型从提示到KINS 与完成令牌的学习量 | 0.1 | 如果提示相对于完成时间很长,则减少此权重以避免过度优先学习提示可能是有意义的。在我们的测试中,将其减少到 0 有时稍微差一点,有时大致相同,具体取决于数据集。 |
More detail on prompt_loss_weight
当模型被微调时,它会学习生成它在提示和完成中看到的文本。事实上,从模型被微调的角度来看,提示和完成之间的区别大多是比特拉。提示文本和完成文本之间的唯一区别是,模型从每个提示令牌中学习的比从每个完成令牌中学习的要少。此比率由prompt_loss_weight控制,默认情况下为 10%。
100% 的prompt_loss_w 8 意味着模型从提示令牌和完成令牌中学习相同。在此方案中,您将获得与提示中的所有训练文本、完成中的所有训练文本或它们之间的任何拆分相同的结果。对于分类,我们建议不要 100%。
快速损失权重为 0% 意味着模型的学习完全集中在完成令牌上。请注意,即使在这种情况下,提示仍然是必需的,因为它们为每个完成设置上下文。有时我们看到权重为0%会略微降低c语言化性能,或者使结果对学习率稍微更敏感;一种假设是,少量的提示学习有助于保持或增强模型理解输入的能力。
超参数扫描示例
n_epochs
额外纪元的影响在这里特别大,因为只使用了 100 个训练示例。
learning_rate_multiplier
prompt_loss_weight
如何选取推理参数
先进的技术
添加推理步骤
对于需要推理的复杂任务,您可以尝试的一种有用技术是在最终答案之前插入解释。给模型额外的时间和空间来“大声”思考可以增加它得出正确最终答案的几率。
示例(来自 Zelikman,Wu等人。):
提示 | 完成 | 通过推理完成 |
“问:退房前你把葡萄放在哪里? 答案选择: (a) 嘴巴 (b) 杂货车 (c) 超市 (d) 水果篮 (e) 水果市场 A:” | “(b)” | “答案应该是结账前放置杂货的地方。在上述选择中,杂货车最适合存放杂货。因此,答案是杂货车(b)。 |
虽然编写许多示例解释听起来令人生畏,但事实证明您可以使用大型语言模型来编写解释。2022 年,Zelikman、Wu 等人发表了一个名为 STaR (自学推理者)的程序, 其中可以使用几个镜头提示从一组 {问题、答案} 中生成一组 {问题、理由、答案}。
顺序微调
模型可以根据需要多次按顺序微调。 您可以使用它的一种方法是在大量相关文本(例如非结构化域文本或类似的分类任务)上预先训练模型,然后对您希望模型执行的任务的示例进行微调。示例过程可能如下所示:
- 第 1 步:微调廉价的半相关数据
- 例如,非结构化域文本(例如法律或医学文本)
- 例如,类似的任务数据(例如另一个大型分类集)
- 第 2 步:对昂贵的标记示例进行微调
- 例如,文本和classes(如果训练分类器)
要微调以前微调的模型,请在创建新的微调作业时传入微调的模型名称(例如 -m curie:ft-<org>-<date>)。其他训练参数不必更改,但是,如果您的新训练数据比我们以前的训练数据小得多,您可能会发现将learning_rate_multiplier减少 2 到 4 倍很有用。
常见错误
微调文本分类器时最常见的错误通常与训练数据有关。
常见错误 #1: 未充分指定训练数据
要记住的一件事是,训练数据不仅仅是输入到正确答案的映射。至关重要的是,输入需要包含得出答案所需的信息。
例如,考虑使用以下数据集微调模型 t o 预测某人的成绩:
提示 | 完成 |
“爱丽丝>>>” | “一” |
“鲍勃>>>” | “ B+” |
“可可>>>” | “阿——” |
“多米尼克>>>” | “乙” |
提示 | 完成 |
“爱斯梅拉达>>>” | ??? |
如果不知道为什么这些学生会得到他们所做的成绩,模型没有足够的信息可供学习,也没有希望对埃斯梅拉达做出良好的个性化预测。
当提供一些信息时,这可能会更微妙地发生,但我仍然缺少。例如,如果根据是否允许业务支出微调分类器,并且业务支出策略因日期、位置或员工类型而异,请确保输入包含有关日期、位置和员工类型的信息。
提示 | 完成 |
“金额:50美元 项目:牛排晚餐 ### “ | “允许” |
“金额:50美元 项目:牛排晚餐 ### “ | “不允许” |
提示 | 完成 |
“金额:50美元 项目:牛排晚餐 ### “ | ??? |
常见错误 #2:输入数据格式与训练数据格式不匹配
确保在使用微调模型时,提交的提示与训练数据的格式匹配。
训练数据格式 | 接口调用 | 还行? |
“狗玩具–>” | “狗玩具” | ❌缺少分隔符 |
“金额:50美元 项目:牛排晚餐 ### “ | “50美元的牛排晚餐允许吗? ### “ | ❌不同的格式 |
“爱斯梅拉达>>>” | “爱斯梅拉达>>>” | ❌附加额外空间 |
更多示例
下面,我们分享更多可能的分类器的训练数据示例。
真实的一致性分类器
提示 | 完成 |
“公司:BHFF保险 产品:全方位保险 广告:一站式商店,满足您的所有保险需求! 支持:” | “是” |
“公司:鸽舍转换专家 产品:- 广告:几周内整齐牙齿! 支持:” | “不要” |
产品评论分类器(多个类并行标记)
提示 | 完成 |
“4/5星 相机似乎没问题。不惊人,但完全体面。 最大的抱怨是电缆只有5英尺长,我没有想到要检查。这是我的错,所以我不会归还它,但是如果你有多个名字,5英尺真的很短,如果你在站立式办公桌旁边的地板上有一个桌面,可能是不可能的。 ### 积极因素:” | “很好,非常体面 缺点:不惊人,电缆只有 5 英尺长 整体情绪:积极 可能的改进:更长的电缆 返回ri sk: 1 支持优先级:低 客户类型:不适用” |
“4/5星 我以 70 美元的价格买了这个。我很满意。 (1)说明还不错。(实际上只有一个模棱两可的步骤,很容易对正确的方法做出有根据的猜测。对其中一个台阶的顺序感到惊讶,因为有些酒吧在那里挂了一段时间,但无论如何。 (2)这绝对是劳动密集型的——最痛苦的步骤是拧入24个小木螺钉以连接钩子。需要一点技巧才能让它们垂直平行。所有的拧紧都起了一个大水泡。而且角度使 电动工具难以使用-最终用手拧入,因为更容易在钩子旁边保持垂直。 (3)我体重170磅,老实说,长凳似乎可以支撑我的体重。我对其他评论感到担心。但我的诀窍是让 事情松动一点,直到最后,然后一旦一切都在一起,就真正收紧一切。我认为最后真正拧紧可以防止任何吱吱作响的摇摆。但到目前为止只使用了一天,所以我们拭目以待。 总的来说,这绝对便宜,但 感觉完全没问题。它以便宜的方式便宜,以垃圾仿冒的方式不便宜。会再次购买。看起来很棒。 ### 积极因素:” | “说明还不错,看起来很棒 缺点:步骤模棱两可,劳动密集,起大水泡,便宜 整体情绪:积极 可能的改进:更少的歧义指令 退货风险: 0 支持优先级:低 客户类型:不适用” |
“5/5星 我是粉丝。它是闪亮而纯净的金属。 正是我想要的。 ### 积极因素:” | “ 闪亮的纯金属 负面:不适用 整体情绪:积极 可能的改进:不适用 退货风险: 0 支持优先级:低 客户类型:不适用 |
情绪分析器
提示 | 完成 |
“对新款iPhone感到欣喜若狂!->” | “积极” |
“@lakers连续第三个晚上失望 https://t.co/38EFe43->” | “负” |
电子邮件优先级排序器
提示 | 完成 |
“主题:更新我的地址 寄件人:乔·多伊 收件人: support@ourcompany.com 日期: 2021-06-03 内容:您好, 我想更新我的账单地址以匹配我的送货地址。 完成后请告诉我。 谢谢 乔 ### ” | ” 4″ |
法律索赔检测器
提示 | 完成 |
“当使用IPV(注射)时,90%或更多的人在两剂灭活脊髓灰质炎疫苗(IPV)后产生针对所有三种血清型脊髓灰质炎病毒的保护性抗体,并且至少99%的人在三剂后对脊髓灰质炎病毒免疫。–>” | “ 功效” |
“乔纳斯·爱德华·索尔克 (/sɔːlk/;出生于乔纳斯·索尔克;1914 年 10 月 28 日 – 1995 年 6 月 23 日)是美国病毒学家和医学研究员,他开发了第一批成功的脊髓灰质炎疫苗之一。他出生于纽约市,曾就读于纽约城市学院和纽约大学医学院>。 | “不是” |
新闻主题检测器
提示 | 完成 |
“PC World – 即将推出的芯片组将包括PC的内置安全功能。>>>” | ” 4″ (其中 4 = 科学/技术) |
“希腊的报纸反映了雅典奥运会成功的兴奋,以及他们没有任何重大挫折的宽慰 。>>>” | ” 2″ (其中 2 = 体育) |
逻辑关系检测器
提示 | 完成 |
“一辆路虎正在过河。 一辆车正在过河。 ### ” | “参与” |
“小提琴独奏家在剧院的乐团开幕演出中登台。 人们站在屋顶上吹口琴。 ### ” | “矛盾” |
请问如何查看微调后的模型评估指标呢