讨论
以chatgpt为起始节点的大模型技术经过了两年左右的开展,大抵积淀了一些较为确定的钻研畛域。首先是基座大模型的钻研,关键是国际外大厂集中少量财力、人力、算力启动大模型军备比赛,希图将大模型的基础才干(包括推理才干)下限逐渐优化到更高的档次。当然也有一些钻研机构努力于改良transformer的架构或许提出其余更先进的基础模型结构,在性能或许效率上做文章,例如MOE,Mamba等;多模态模型,让大模型同时能够了解并生成图像、音频、视频、文字等多种模态的消息,例如大火的Sora。其次是大模型的微调对齐钻研,关键是基座大模型经过指令微调、强化学习等技术将其变成一个运行友好、用户友好的才干模型,也可以将模型长文本、长高低文才干的优化也蕴含在该方向内;另外,还有大模型的高效部署和推理计算,在降低大模型服务老本的同时,优化大模型服务的实时性,优化用户体验;最后,则是大模型在各种细分场景畛域的运行落地,能够将大模型封装成一个成熟的运行产品,真正的将大模型用起来,当然也可以将agent相关的技术钻研演绎在这个方向上,由于agent的目的就是将大模型的才干充沛应用起来,协助人类更好地经常使用大模型。详见下图所示:
自己目前关键精神集中在大模型的运行落地,对大模型在传统NLP运行义务上的成果十分感兴味。正好前段期间,有潜在客户宿愿咱们钻研能否能够经过大模型优化资讯事情分类的成果。借着这个时机,我对大模型在文本分类义务上的运行方式和对应成果启动了钻研,有了一些初步的论断。本文宿愿经过形容上述钻研环节与结果,总结出大模型在文本分类义务上的最佳通常,并推行到更多相似的运行上,为业界做大模型运行时提供一些落地的参考。
运行场景分类
在谈详细的钻研内容前,须要先明白一下钻研的疑问类型。目前关于或许会运行到大模型的传统NLP运行,我自己将其分为两种不同的状况:
(1)垦荒式业务场景。这种场景关键出如今那些刚刚成功数字化还未启动自动化的机构、或许业务场景自身比拟复杂、传统技术无法在该场景中婚配最低的用户经常使用体验要求的状况。特点:数据积攒不成熟(也就是没有足够的训练语料用于场景公用模型的训练)、配件资源无余(没有足够的GPU用于训练模型)等。
(2)优化优化式业务场景。这种场景关键出如今那些曾经有肯定自动化基础的机构、或许业务场景中曾经经常使用了一些传统NLP技术处置了局部疑问的状况。特点:须要优化已有方法的运行成果和用户体验(如准确率、召回率等),以前方法继续优化的难度较大。
本文关键讨论的是第二种场景,这也是很多有肯定数字化、自动化基础的公司比拟关注的类型。他们在大模型提出之前,曾经经过一些规定、统计机器学习、深度神经网络等算法模型技术构建了一些分类服务,有些行业头部团队在此基础上经过一些技巧(数据增强,反抗训练等)启动了优化,将算法目的优化到了某个瓶颈线。但是,业务用户关于算法的精度优化要求是继续性的,因此在大模型产生之前的一段期间,算法人员疲于接待业务用户关于场景成果的高要求。
只用prompt工程足够吗?
截止2024年,我阅读过很多运行大模型钻研传统NLP义务的上班,大多集中在如何应用prompt技术、few-shot技术等间接将大模型运行在这些传统义务中。例如这一篇:Can ChatGPT Understand Too? A Comparative Study on ChatGPT and Fine-tuned BERT,经过prompt工程对比ChatGPT与Fine-tuned Roberta在GLUE数据集上的成果,最终的论断是Fine-tuned Roberta在文本了解义务上依然无法被逾越。但是我也看到有一些观念以为这些传统义务间接用大模型一把梭就能搞定,只需prompt写的足够好,就能获取一个足够好的言语了解剖析服务。自己并不推戴这种观念,而且还允许对过去的一些运行形式启动改造,从而让大模型能够充散施展其个性。不过在目前的阶段,很多企业或许业务场景基于安保、老本、时延等要素,无法经常使用综合才干强的模型(GPT4,国际模型的付费版私有云服务、超越14B的开源模型等),而经过纯prompt工程经常使用相似7B的模型还无法齐全代替曾经在足量数据上训练过的BERT类模型。由于上述提到的钻研是经常使用ChatGPT以及英文的数据集,为了验证国际开源的大模型能否在中文数据集上能否也有相似的论断,上方我将依据相关的目的运行场景以一个详细的数据集的试验来说明。
运行场景与数据集
目的运行场景:资讯事情分类义务。义务特点:
(1)多标签分类义务,即一个资讯或许会对应多个事情类别;
(2)事情标签体系庞大,且有比拟重大的类别不平衡疑问。产生频次高的类别容易累积训练数据,而低频长尾类别属于典型的小样本疑问。
由于一些要素,不能拿到相关实在场景数据,因此搜索了网上的地下数据集,最终找到了一个比拟贴近上述义务特点的数据集:ccks 2022 义务八数据集。
数据链接见:
数据集简介:数据关键来自金融畛域的地下资讯、报道,数量在5万+左右。原始数据集的义务是“给定100+事情类型及其事情主体公司,
训练数据中对其中16个事情类型只保管10条左右的训练样本,测试集中蕴含这16个类型的少量待抽取样本。
”
本次的验证为了简化疑问,不会驳回上述的义务方式
,而是驳回最基本的全类别分类数据集的处置方式,从而验证模型在这种类型的数据集上的全体成果,以及在一些小样本类别上的成果。
由于目前只要训练集有标注标签,因此只能针对标注数据集启动剖析。详细做法是依据标注数据散布划分了训练集,测试集(5000+),其中测试集只用于评测模型的最终结果。
备注:该数据集存在肯定的标注质量疑问,前期经过一些人力检测与校对,优化了局部的标注质量。
数据示例如下:
{"textId": "2333e4ef53762e498cc79c7613d6ac6f", "text": "科锐国际:2018年年度权力分派实施通告", "eventTags": [{"eventType": "公司权力分派", "eventCompany": "科锐国际"}]}{"textId": "35a726ecec33a755abea4ff6fd5464ec","text": "讷河软式透水管有限责任—讷河公司;湘潭招聘/万达个人招聘消息;屡次延期后,ST康美终于披露回覆函","eventTags": [{"eventType": "延期消息披露","eventCompany": "ST康美"},{"eventType": "外地招募员工","eventCompany": "万达个人"}]}
事情标签数量为174个,均为金融相关的事情标签。以下为局部事情标签样例。
对数据集启动剖析后,发现其具有典型的长尾散布特色,与实践的业务数据散布比拟相似。由于类别比拟多,以每个类别为粒度启动画图不够直观,因此将一切标签类别依照从大到小顺序排序后,以10为一组启动分组,依照组的粒度画出的柱状图如下(图由GPT-4生成):
以下是出于长尾位置的局部事情标签样例:
基于BERT的baseline
为了验证大模型的相关打算与传统的NLP打算相比能否有优化,因此选定了BERT簇的分类打算作为baseline来启动对比。
BERT也是一个以Transformer为模型架构的预训练言语模型。
BERT与GPT在言语模型训练义务上的区别如下图所示:
详细来说,本次试验的BERT模型选用了哈工大的macbert-base和macbert-large两种体量的模型。
模型链接如下:
详细训练方式:
输入:资讯文本
输入:事情标签列表
loss函数:BCEWithLogitsLoss
将一切训练数据(5万+)灌入模型启动训练
最终,base和large模型的目的如下:
基于Prompt工程的LLM方法
将LLM大模型间接运行于文本多标签分类义务,实践上就是编写揭示词指令,让大模型去生成最终的事情标签结果。全体还是一个文本生成的环节。
揭示词模版样例如下:
f"作为一个多标签资讯分类专家,你的义务是识别出资讯中的一切相关事情标签。事情标签列表:{event_tags}。资讯内容:{text}。该资讯对应的一切事情标签是什么?"
其中,event_tags须要把体系中的事情标签填入。这里触及到两个疑问:
基于最新的技术开展,有的开源大模型曾经能够处置超越128K的高低文,关于170+的标签文本是能够笼罩的。当然,能处置和处置好是两种概念,关于大模型来说,必需是标签范围越小越容易处置疑问,因此也可以经过先将事情标签启动分级分组,而后逐级启动大模型的剖析,两种方式均可。
引入Few-shot sample
为了能够充沛应用已有的标注数据集和大模型的才干,在上述prompt中,还可以引入示例样本(普通论文外面都叫demonstrations),从而激起大模型的In-context learning才干。为此,对全体训练数据集设计了如下的上班流程:
该上班流程的关键外围理想是将示例样本的选用疑问转化成RAG(Retrieve-Augmented-Generation),将训练样本汇合向量化存储后,关于每个测试样本的剖析,经过召回+排序的方式做常识库的检索,依据预设的示例样本数量(试验中设置为10),选用语义最相似的标注样本填充到prompt中。
示例样本填充顺序关键吗?
在选用示例样本后,还有个容易被疏忽的疑问:示例样本填充入prompt的顺序须要关注吗?
之前,有一些文章提到过,RAG获取的召回样本在prompt中,假设较为相似的召回内容离用户疑问越近,大模型的回答质量会更高。我也尝试了这样的处置方式,将相似度高的样本搁置在了与待预测的资讯文本凑近的位置。揭示词模版样例如下:
你是一个先进的大言语模型,专门用于了解和分类金融资讯资讯,如今须要你依据提供的资讯内容,将其分类到预约义的事情标签中。义务要求:1、细心阅读资讯内容,了解资讯主题和外围内容。2、只经常使用给定的事情标签列表启动分类,若资讯属于多个事情标签,则经常使用竖线|来分隔不同的事情标签,若没有适宜的事情标签,则分类为others。3、只须要输入事情标签名字,其余内容不须要输入。事情标签列表如下,经常使用英文逗号分隔:\n{event_tags}上方是给你提供的人工标注过的参考样例:{demonstrations}待分类的资讯内容如下:{text}该资讯事情标签为:
其中demonstrations寄存的顺序为依照示例与待预测样本相似度的正序陈列,即相似度越高的排得越后,离待预测样本text越近。
经过上述处置方式,确实能够在这个义务上有比拟庞大的优化,只管优化幅度不大,但操作老本上也简直可以疏忽,因此介绍经常使用。
结果
基于纯Prompt工程的方式驳回了开源的qwen-7b-chat,Yi-34b-chat-int4,闭源的qwen-72b-chat接口(百炼平台)三种大模型来验证。(试验的时刻,qwen1.5还未出,但依据其余义务的剖析,可以推测不会相差太多)
详细目的如下:
依据目的结果,可以看到纯Prompt工程的方式,即使是经常使用百亿级别参数量的模型,还是离传统BERT方式的成果差不少。由于LLM大模型的训练方式与BERT不同,以文本生成为目的,是单向构建高低文(从左到右);而BERT训练是以完形填空式义务为目的。相比于LLM,能够在双向(向左向右)构建高低文了解,自身就适配人造言语了解义务(文本分类,消息抽取等均为了解义务)。
经过剖析大模型的失误case,可以发现很多样本都是由于指令遵照才干不够(比如格局未按要求,生成了有关的剖析解释内容等),造成格局处置后的结果是错的。因此,推测假设对大模型启动训练样本的sft,应该还能够在目的上有不少的优化。
Prompt工程+指令微调
方法形容
既然要指令微调了,那么基于配件老本限度,就只能选用一些性价比高的开源模型来做验证了。因此,最终选用了qwen-7b-chat和qwen-14b-chat来做试验。针对的数据集,联合Prompt工程和指令微调技术,设计了如下的大模型文本分类流程:
与Prompt工程的打算相比,本打算参与了指令微调的步骤。详细来说就是对训练集启动数据挑选和处置后,挑选出高质量的训练数据集,而后经过lora的方式启动低老本的指令微调模型,最后在微调后的模型上经常使用Prompt工程来成功样本的分类。整个流程中,有几个关键节点的详细说明如下:
这些方法除去一些不太繁难成功的(例如要训练一个reward模型,标注老本太高),基本都成功了一下,在的数据集上成果都不是很理想,猜想应该是上方的方法关于目的是复杂生成的义务会更有效。
实践上,探求数据集精选的实质,不外乎以下两点:(1)样本多样性高;(2)关于义务的关键性或许增益水平尽量高。其实,之前做文本摘要的时刻,对摘要句子的选取也是遵照这两个准则,因此人造而然就想到可以借用文本摘要的思维来选用:
(1)先将一切样本依据标签类别分红不同的簇(当然,也可以对样本启动聚类剖析,获取的簇或许更偏文本自身的语义相似性聚合)
(2)对每个簇中的样本,驳回MMR算法启动样本的排序。MMR综合思考了样本的多样性和相关性,因此咱们可以依据分数从高到低选用肯定数量的样本放到训练集中。
MMR算法:
(3)关于蕴含多个标签的样本,以及样本数量自身就很少的标签均驳回白名单形式,即所有参与样本汇合中。这也是为了让大模型对多标签、小样本的状况能够尽或许多的学习。
经过上述方式,选用了0+的样本用于训练。(每个标签数据都会笼罩到)
结果
咱们将上述挑选后的训练样本集与全量训练样本集启动了大模型微调的对比试验,可以发现一些幽默但并不异常的结果。
依据上述的对比试验,可以看到当标注数据量比拟富余的时刻,LLM即使经过微调、揭示词精心设计等步骤后,全体的成果还是不如BERT模型的微调成果。除了上一小节提到的“LLM大模型的训练方式与BERT不同”的要素外,或许还有以下这个要素:
BERT在数据量短缺的条件下,能够充沛“过拟合”下游义务消息,从而在义务上到达不错的成果。但是微调后的模型齐全无法去做其余义务;而LLM大模型的目的本就是通用人工自动,不会为了某个详细义务而丢失通用性,因此经过肯定的指令微调后,并不会充沛“过拟合”某个义务。
当然,在标注数据量不是十分充沛的状况下,经常使用大模型做指令微分配合Prompt工程,确实能在小样本场景下有不错的成果。
实践的运行场景中,有些小样本的事情标签只管产生次数不多,但业务属性却十分关键,优化这些数据的成果,或许对全体的评测成果没有清楚的影响,但对业务经常使用来说是能够优化体验的。
大模型+BERT式微调
大模型+指令微调的组合到底与谋求精度优化的文本了解类义务不太符合。在足量的标注数据场景下,精度上难以匹敌传统的BERT式微调方法。但是大模型毕竟在参数量和学习的常识消息量级上要远超越往的BERT簇模型,所以从通常过去看,只需能够充沛应用大模型庞大的常识量,其在文本了解才干上肯定是逾越BERT簇模型的。指令微调+Prompt工程的大模型生成式方法在文本了解类义务上并没有充沛应用到大模型的丰盛常识,那么能否参考BERT式的微调方法,将大模型的参数权重作为基座,去针对性适配下游义务呢?答案是可行的,由于大模型实质也是一个transformer模型网络,只不过预训练的方式不同而已,只须要在网络的最后一层参与对应的义务层即可。不过在实践落地时,这种方式或许面临这样的疑问:
目前干流的大模型参数通常在7B以上的量级,经常使用这种参数量的模型即使是经常使用lora微调,训练和在线推理预测的老本也是不小的,为了某个单个义务的精度优化而去过拟合一个大模型看下来得失相当。
不过,上述疑问在通义千问颁布了0.5B、1.8B的模型后获取了极大的缓解。相关于7B的参数量,1.8B左右的模型在训练老本与推理的时延等方面都能获取足够的控制。因此,本次试验就以qwen1.5-1.8B为基准模型,来探求它联合了BERT式微调方法后的成果。
方法形容
大模型经常使用BERT式的微调方法其实很繁难,甚至transformers的库都曾经帮咱们写好了,间接经常使用"Qwen2ForSequenceClassification"即可,其余的流程就跟传统的文本分类流程一样就行了。另外须要手动指定tokenizer的pad_token_id,否则在构建Dataset数据启动tokenize的时刻会报错。
整个训练流程其实与传统文转义务相似,但是有一些训练中的细节内容,我想在上方着重分享一下。
NEFT方法:方法:lora_config = LoraConfig(r=32,# low ranklora_alpha=64,# alpha scaling, scale lora weights/outputstarget_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], #if you knowlora_dropout=0.1,bias="none",modules_to_save=["score","embed_tokens"],task_type=TaskType.SEQ_CLS # 文本分类经常使用该类型)
class ChatGLMPreTrainedModel(PreTrainedModel):"""An abstract class to handle weights initialization anda simple interface for downloading and loading pretrained models."""is_parallelizable = Falsesupports_gradient_checkpointing = Trueconfig_class = ChatGLMConfigbase_model_prefix = "transformer"_no_split_modules = ["GLMBlock"]def _init_weights(self, module: nn.Module):"""Initialize the weights."""if isinstance(module, nn.Linear):module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)if module.bias is not None:module.bias.data.zero_()return
结果
上方列出经常使用qwen1.5-1.8B模型启动BERT式微调与前述的方法成果对比。
可以看到,qwen1.5-1.8B+BERT式微调+lora的组合在全体F1精度和小样本标签类别的F1精度都是最好的。当全体数据集的量级比拟少的时刻,qwen1.5-1.8B+BERT式微调+lora关于小样本标签类别的体现也是不错的,证实其在小样本学习才干上也是有优化的。
论断能否实用其余分类义务?
当然,仅在一个义务上的试验结果必需是无余以允许上述的论断的,为了验证这种方式能否能够在文本分类通用义务上有不错的成果,我又在两个开源的数据集上启动了验证,区分是THUCnews数据集以及Ifly文本分类数据集。上方列出BERT-baseline以及qwen1.5-1.8B+BERT式微调+lora的组合的分类F1目的对比。
THUCnews数据集:数据集:
留意!!!以下所列目的为自己自己训练后的结果,比地下出来的数据目的会低一点,由于我不太青睐干调参的活,就随机选了超参数,不过bert与qwen两者训练的通用参数是坚持分歧,目的是验证qwen能否能够对bert有成果的优化,所以不倡导与地下榜单目的做对比。
可以看到,qwen1.5-1.8B+BERT式微调+lora在其余分类义务上的精度相较于bert-large来说还是能有不错的优化。
论断实用于其余参数量的模型吗?
答案是必需的。实践上,我还尝试了qwen1.5-4B,qwen1.5-7B,chatglm3-6B,minicpm等模型结果,上方列出局部数据集的成果。
随着大模型参数量的参与,BERT式微调的成果仿佛并没有随着参数清楚得优化,可以看到的是即使是BERT式微调方法,也无法应用大模型更多的参数常识了。联合运行实践老本的考量,选用qwen1.5-1.8B仿佛是性价比最高的。
当然,我对上述结果也不是齐全没有不懂的。
最大的变数在于这些国际大模型能否在预训练的时刻将这些开源的数据集蕴含出来了。
假设在训练的时刻就见过这些数据,那么对上述结果的实在性就须要进一步验证了。
运行落地的“新姿态”驳回BERT式的微调方式,由于是让模型尽量过拟合某个下游义务,微调后它就无法适配其余类型的义务了,因此在实践运行时,关于不同的义务会微调部署多个独立的模型。关于大模型来说,假设每个义务都独自部署一个模型从运行老本过去看显然是无法控的。但经过上述的lora微调,可以有效得降低运行部署的显存老本。
1、训练阶段,针对不同的义务,经常使用不同lora独自启动训练,获取独立的lora权重。
其实我尝试过MTDNN的多义务同时训练的方式,即参与lora的参数规模,而后同时训练不同的分类义务,目的是用一个模型cover多个义务。详细做法是在数据预处置batch的时刻,依据不同义务的数据量比例经过采样的方式采样某个义务的1batch数据介入step的训练。而后经过在模型定义时,指定对应义务与义务dense层的映射相关来保障每个义务都能经常使用正确的。
MTDNN方法:class MTDNNForSequenceClassification(Qwen2PreTrainedModel):def __init__(self, config,task_configs):super().__init__(config)# self.num_labels = config.num_labelsself.model = Qwen2Model(config)# self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False)self.task_heads = nn.ModuleDict({f"task_{task_name}": nn.Linear(config.hidden_size, config_task["num_labels"])for task_name, config_task in task_configs.items()})self.task_configs = task_configsself.dropout = nn.Dropout(config.classifier_dropout)# Initialize weights and apply final processingself.post_init()
但是我尝试了各种不同的参数组合,对上述提到的一切数据集启动了试验,发现都无法保障一切的数据集都能获取理想的成果,推测还是由于数据集之间会存在“拖后腿”的状况,这种方法要成功最好是找一些特色相似的数据,才干获取相互增强的成果。最后,还是选择每个义务经常使用独立的lora独自训练。
2、在部署推理的时刻,咱们只须要先将一个qwen1.5-1.8B的基础模型加载到显存中,而后依据义务类型,来灵活选择经常使用哪个lora权重兼并到基础模型中,详细可参考这篇博文:
繁难来说就是对multi-lora启动切换的操作。不过,这种方式或许会参与单次预测的推理时延(额外参与了lora卸载和装载的操作期间),可以综合配件状况以及运行服务的经常使用频次,对高频次、时延要求比拟高的义务独自部署独立的模型服务,关于低频次、时延要求低的义务驳回上述multi-lora切换的形式。
小结
本文关键目的是讨论大模型运行在传统NLP义务上的有效性和增益,经过一个细分的文本了解义务——文本分类,钻研了大模型运行的不同“姿态”。最终发现,将大模型联合BERT式微调的方法在标注语料比拟充沛的时刻,相关于已有的BERT类方法还能有进一步的精度优化,同时在部署推理老本上的投入也是可控的;另外,关于小样本标签类别的学习才干也能够协助优化关于边界case的处置。当全体的标注数据语料比拟匮乏的时刻,也无妨可以运行大模型+sft+prompt工程的形式,辅佐技术团队启动冷启动,在积攒肯定的标注语料后,可以切换成上述BERT式的微调方式,以优化义务的精度。
本文转载自,作者: