【0样本起手做多标签分类】3——大小模型螺旋上升

前情提要

背景

由于运营同学和老板们都很相信大模型的能力,导致这一时期有很多看起来简单,但实际开发量很大任务被要求上马,为了同时实现<快速上线>、<低成本开发>、<低成本运维>这三大目标,建议考虑本文介绍的这套开发方案。
这套方案用了一系列奇技yin巧的trick调整现在的经典召回方案和经典模型方案,最终做到了

  1. 高密度挖掘种子样本
  2. 模型可分开训练,结构可插拔
  3. 实际运行时准确率高,运行成本低

前面两篇文章分别描述了在工业场景下:
0样本开始如何积攒样本–> STEP-1 快速挖掘种子样本
选择什么样的模型架构更灵活–> STEP-2 选择可插拔的模型架构

本篇重点

本篇讲这个内容的第三部分:大小模型的螺旋上升。本篇内容会涉及到两个个关键点:

  1. 螺旋上升的流程
  2. 上线之后如何针对bad_case定向优化

螺旋上升的过程

这个过程简单的讲分两段
冷启动阶段:用STEP-1中挖掘到和并粗标的样本,放到STEP-2提供的模型框架里
螺旋上升阶段:训练一个小模型
–> 小模型挖掘的样本给提示工程的升级提供样本
–> 提示工程优化一轮之后,再清洗并扩充标注的样本
–>扩充后的样本再训练小模型

流程图如下
【0样本起手做多标签分类】3——大小模型螺旋上升_第1张图片

When To Stop

在循环当中要关注两个指标
其一、以recall=x对应的评分为阈值,无标注样本池中超过该阈值的样本占比。如果这个占比不再变化,说明大部分可能的正样本类型已经被找到
其二、大模型作为审核员,认为 【超过阈值的样本的准确率】 是多少。如果这个准确率不再变化,说明小模型高分段的分布大致稳定了。

如果上面两个指标都基本稳定了,建议退出循环。

值得说明的是,结束了大小模型螺旋迭代的过程后:

建议用同一套数据随机初始训练10次小模型,然后选择指标最好的模型。

因为实践中,样本量较小的场景下,随机训练10次模型,其AUC和相同召回率下的precision这些指标会有较大差异。AUC能有2%左右的差异,相同recall下的precision差距能超过4%甚至10%。
选取模型的时候:

建议 用【相同水平的recall下的precision】作为选择标的

因为大小模型结合的这个体系下,实际的precision是由大模型来保障的,小模型主要负责以更高的精度保证召回,也就是减少预期运算量,即降低成本。

停止循环后,记得把扩充出来的样本存档入库,后面更新模型/回归测试等场景都用

如果同一组数据随机训练出的两个模型,在相同recall下的precision相差很大,是不是说明模型还不够好,还不能退出循环?

小样本的场景下,单样本的影响力比较大,在训练过程中,确实存在不同初始的模型指标差距比较大的情况。尤其是目标标签在自然分布中比例就比较低的时候。
但就工程角度而言,当Stop指标达到预期水平的时候(大致稳定),与其花更大精力优化,不如先把服务上线,等待线上数据的扩充之后,有更好的条件进行优化。个人不推荐在这个点上纠结。

过程中的细节问题

1. 小模型的训练数据怎么来的?

1 冷启动阶段
正样本来自STEP-1 挖掘和粗标的样本 X p o s X_{pos} Xpos
负样本有个小trick,我用正样本和faiss,在未标注样本池中查找与正样本 X p o s X_{pos} Xpos 距离较远的样本作为伪负样本 X p s e u d o − n e g X_{pseudo-neg} Xpseudoneg

2 螺旋上升阶段
正样本除了 X p o s X_{pos} Xpos,还有这一轮LLM新标注的样本 X l l m − p o s X_{llm-pos} Xllmpos
负样本的来源变成两个,1个是仍然会从未标注样本池中重新resample一批与 { X p o s , X l l m − p o s } \{X_{pos},X_{llm-pos}\} {Xpos,Xllmpos} 距离较远的新 X p s e u d o − n e g X_{pseudo-neg} Xpseudoneg;另一个是LLM新标注的负样本 X l l m − n e g X_{llm-neg} Xllmneg

值得指出的是,不管循环多少轮, X p s e u d o − n e g X_{pseudo-neg} Xpseudoneg 都是必要的,否则会降低小模型的泛化性。

2. 为什么调整提示工程也要在循环里?

原因有两个:其一、针对小模型认为的高分样本调整提示工程的效率更高。面对全分布去调,反例也写不完,还容易过度自信。
其二、每次训练完的新模型,都会提供新的【难样本】。因为提示工程的优化是基于可见样本的,人需要先找到现有提示工程的易错案例,再基于案例依赖的事实/常识/隐形规则,对提示工程添加内容。

3. 为什么每一轮都要清洗标注样本?

因为每轮提示工程迭代之后,原来的判例有可能错误。这种错误在样本量极少的情况下非常致命。

4. 如何 <定向> 扩充样本。

这里用<轮>来形容一次小模型+LLM的迭代升级
随着小模型的训练,定向的方向的几次变化:
在这里插入图片描述

<最开始一两轮>:专注标最高分样本,用以定向扩中正样本
<正样本超过200个以后>,专注扩充正负样本的多样性:把train+eval集上 recall达到90%的分数当做threshold,在未标注样本池中找threshold以上的样本,随机抽样标注。
<模型高分段占未标注样本池的比例不再变化后>,为了快速减少漏访,把训练集和校验集 中 模型评分低于threshold的样本 作为种子,在未标注池中与种子表征相似的样本中 随机抽样,增加标注

上线如何定向优化

服务上线运营之后,难免会出现漏防或者误判。
这个过程主要涉及到服务的小模型和提示工程的定向优化。

小模型的定向优化

小模型主要可能发生的问题就是漏召回(因为precision的压力在提示工程身上),大致的原因还是小模型在小样本训练过程中见识太少或生产上发现了一些新类型的样本。
定向优化的主要工作就是定向挖掘样本,增加标注,回归测试。其中,增加标注和回归测试跟螺旋上升的过程中并没有显著差异。主要的差异就在于定向挖掘样本。
定向挖掘 有三种情况
第一种,漏防都是同一类或比较相似,且有一点样本
这种情况,直接从样本池中(要包括新增的生产数据),用表征相似检索捞就可以,如果能捞到的比较多,建议1vs1的选一半分数较高的和一半分数较低的,送入标注流程即可。

第二种,漏防的case种类比较多
这种情况,建议直接参考 STEP-1 的思路。进行扩充。

第三种,漏防的是同一类,但就3-5个样本
这种情况可以用一个tricky的方法——AB种子改写。
这种方法在其他场景可能名字不一样,是一种量产自媒体文章的操作方案 (/ω\),即给定待注入信息库A(也就是漏防的case)和 照抄文献库B(也就是之前存的标注过的种子),要求大模型依照A 的特征(信息量/句式)调整B中的随机某个种子。然后再用表征相似去库里查相似样本即可。

你可能感兴趣的:(LLM相关工程经验,数据挖掘,人工智能,分类,深度学习,语言模型)