最近在做生成式模型的一些工作,至今算是能有些总结的了,趁着还有些能记住的地方,赶紧记录下来,后面想到了再补充。

前期调研

1. 相关工作

目前我们在做的算是业界独创的,搜了一圈,没有相关的工作,所以我把PaddleNLP中generation相关的任务给看了一遍,比如question_generation,用T5预训练模型或unimo-text项目,machine_translation中的transformer部分,对于大致的实现思路以及各自在解码时采用的策略都作了些了解,所以整理实现起来并不复杂。

2. 预训练模型选择

这里反而是比较头疼和纠结的地方,从类型选择上有两大类:decoder和encoder-decoder。对于这部分在huggingface course上是怎么解释或者区分的呢,如果你用于文本生成,那你可以选择CTRL、GPT等相关模型,如果是文本摘要、翻译、生成问题的回答,那你就选择BART、T5等相关模型。这里思考了许久,最终选择使用encoder-decoder架构来做,因为做的任务是需要结合输入,对输入来做理解的,那么这么来看encoder-decoder架构是最合适不过的了。那反过来思考下,decoder难道就不适合了吗?比如GPT坚持的decoder这条路,不也已经能说明问题了吗。

语言选择,一个是我们是做中文领域的,首先必须支持中文,multi-language虽说支持,但是支持语言太多,带来相同模型容量的情况下就不如中-英这种效果更好,比如国内的erlangshen、mengzi、Randeng、PEGUES、gpt2-chinese等相关模型。

模型容量,首先不能太大,一是要能训练的起来,二是推理时也不能太慢,三是部署时模型体积也不能太大。看了些相关的generation模型,比如Llama2-chinese,BLOOM,简直是最想要尝试的,不过跑不起来。。OPT、CTRL、FLAN,也不太行,还不如前者。那只能退化到BART、T5、GPT2这类小点的。

后来想想,这里哪个最好,我觉得有许多可以尝试的点,不过当时试了下t5-small,感觉就不如国内一些模型效果好些,收敛起来也更快。另外一个,一定要选择一个有在multi-task上微调的模型,会少走弯路。

注意点

解码

如果非说哪里有额外需要着重注意的点,解码算是重中之重。解码有不同的策略,比如要不要做采样,不做采样那可以使用beam search,生成的结果是固定的,要采样可以使用top_p, top_k,temperature,这部分不着重介绍,huggingface上有相关的文章,以及国内也有翻译成中文版本的,都是很齐全的了。

对于解码策略,我觉得这里非常有必要多尝试尝试,网上一些文章介绍说比如做翻译或者说比较短文本的生成,使用beam search效果就比较好,如果需要文本更具有多样性以及连贯性,可使用采样,比如huggingface在介绍不同策略时,说GPT2为啥会取得成功,因为使用了top_p。各有各的好,不过说的也非常笼统。

至于超参怎么选择,beam search可看下上面介绍的项目以及huggingface上训练GPT2的流程或者其他相关的项目,采样可看看比如Llama2-chinese、BELLE等一些项目。

评估

由于是生成式任务,评估的标准与方式也有所不同,比如基于连贯性的BLEU、GLEU,一个侧重召回,一个侧重准确。基于词向量的评价指标,基于PPL等其他评价。每个任务目标不同,可采取的评估标准也可以不同,比如也可以采用输入和输出文本的相似度,输入和输出的核心词是否还在来作为评估方式,以及也可以使用打印出来输入输出,来人工进行评估。

另外一个点是一定要多看看标注的数据,因为每个标注人员的理解不同导致标注结果都或多或少有所不同,也可能直接导致了没有归一化的答案。

未来展望

这里算是埋个坑,由于目前大模型的崛起,对于加速推理也有不同的方式,比如Imdeploy,FasterTransformer,vLLM。

finish.