LLM论文学习总结-2023年之前
以前一直是做推荐的,从来没有专门研究过NLP论文或模型,但是顺着2023年的潮流跳入了大模型的坑,入职阿里做大模型相关的工作,下面的论文是我入门LLM时看的文章,不多,仅做个初级入门。
《UniLM:Unified Language Model Pre-training for Natural Language Understanding and Generation》
微软在2019年提出的预训练语言模型,目的是用一种模型结构统一多种NLP预训练任务,只需要预训练一个UniLM模型,后续能接入所有任务类型的fine-tune,本质上仍是一个pretrain+finetune的架构。 前言:有三大类训练任务,分别对应三种模型结构。
- 以BERT为代表的自编码(Auto-Encoder)语言模型,仅使用transformer encoder结构,用于做自然语言理解类任务(Natural Language Understanding,NLU),如:文本分类、命名实体识别NER等;
- 以GPT3为代表的自回归(Auto-Regressive)语言模型,仅使用transformer decoder结构,用于做自然语言生成类任务(Natural Language Generating,NLG),如:文章生成、问答系统。
- 以MASS为代表的seq2seq语言模型,使用transformer encoder-decoder结构,常用于做翻译类任务,这类模型训练好之后,抽取出encoder部分可做NLU任务,decoder后面可做NLG任务。
UniLM结构:结构上类似BERT仅使用encoder结构,但其中增加一个核心的掩码矩阵(Mask Matrix)来实现同时适配多种训练任务,该矩阵用于在Q和K计算得到权重W之后,W加上这个M矩阵之后再与V相乘,M矩阵实际上控制了文本序列中哪些部分是否可见。
任务统一:UniLM预训练任务有四个,前三个分别占训练时间的1/3:
- 双向语言模型:上下文全感知,因此M矩阵为全0;
- 单向语言模型:类似GPT3的上三角或下三角M矩阵;
- seq-to-seq模型:将输入句子和输出句子合并在一起,输入句子是全感知的,输出句子是顺序感知的,因此M矩阵就是全0矩阵和上三角矩阵的合并形式,使得UniLM用一个encoder就能实现encoder-decoder的全感知和顺序感知模式;
- NSP:和BERT一样的句子顺序任务。
finetune:根据不同任务拼接全连接分类层、或拼接输入输出。
总结:通过带掩码矩阵的Encoder优雅的统一NLU和NLG任务,替换以前需要用encoder-decoder才能实现的任务统一。
参考:https://zhuanlan.zhihu.com/p/584193190
《T5:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》
Google在2020年提出的模型,希望训练一个NLP通用框架,把所有NLP训练任务都归到seq2seq(Text-To-Text)任务中,作为以后所有NLP任务的baseline。
任务改造:其实是数据改造,对不同类型任务的数据输入构造对应的前缀等方式(比如:翻译这句话为德语/英语、输出一个1-5的分类结果等),让模型通过识别这个前缀来将任务进行归类,从而将多任务统一用一个训练目标的进行预训练,收集了一个750G的大数据集Common Crawl去训练模型。
模型结构:采用trandformer encoder-decoder的结构,改变了一些细节:去除层番薯偏差,将Layer-Norm放到残差路径之外,使用相对位置embedding(原始是正弦位置embedding或学习位置embedding)。
实验:T5模型的最终版本,实际上通过了四个方面的参数搜索确定:
- 三种无监督训练方式/结构(encoder-decoder,auto-decoder,Prefic-LM),最终选择encoder-decoder;
- 对训练文本的破坏策略(单token的mask,replace-span:多token合并为一个mask,drop直接丢弃),最终选择replace-span;
- 对文本的破坏比例,最终选择15%;
- replace span的破坏长度,最终选择3。
有趣的点:T5将模型参数从小模型一直堆到110亿,模型性能几乎都在提升,提升幅度仍没有变缓的趋势,感觉还能继续加参数提升效果。
参考:(1)https://zhuanlan.zhihu.com/p/489821960 (2)https://blog.csdn.net/weixin_46025824/article/details/126739667
《GPT1:Improving Language Understanding by Generative Pre-Training》
模型分为两阶段任务,分别是无监督预训练和有监督微调。
无监督预训练:使用12层transformer decoder,实际上,原始的transform encoder是有两层残差网络结构和上下文全知的模式,而decoder是三层残差网络(中间多一层encoder-decoder attention)和仅知道上文的顺序生成模式,而GPT1的结构是两层残差网络结构和顺序生成模式,其实就是单向的encoder,通过masked attetion的方式使得每个位置的训练,只能看到前文不能看到后文。
有监督微调:预训练好模型之后,固定decoder的参数,在模型的最后添加一个softmax层,将最后一个decoder的输出作为输入,通过softmax转化为标签概率,进行有监督训练。
《GPT2:Language Models are Unsupervised Multitask Learners》
其实就是在GPT1的基础上,增加参数到48层decoder(15亿参数),然后使用一个超大数据集WebText(40G)进行训练,这个训练集包含多个预训练任务,多任务预训练之后,在测试集上的效果比其他baseline在各个任务专门的训练集上训练的效果更好,同时表明GPT2仍然属于欠拟合状态就有如此大的效果提升,证明大数据量和大参数量是给模型效果提升的一个可行之道,同时模型不需要在特定任务数据集上训练,而是在一个通用数据集上训练通用模型,就能应用到所有任务上(zero shot,只pretrain不finetune)。
实现细节:
- decoder中把Layer-Norm提前到self-attention和feed-forward之前了,并且在最后的输出之前有增加了一个Layer-Norm。
- GPT1:
- GPT2:
- Byte Pair Encoding(BPE)文本表示(1994年提出的数据压缩算法),感觉对GPT2训练效果和模型效果提升发挥重要作用。传统的分词通常以字符、词、ngram作为单位,生成对应的word embedding table,对于英文来说,使用字符虽然少,但是需要连续很长字符才有意义,训练会比较慢,毕竟遗忘问题严重,对于中文来说,使用词语做单位,则词汇表为十万级别,会导致模型训练缓慢。为了控制词汇表规模,通常会使用去除停用词的方法,删除一些token,导致一定的信息损失,而保留低频token也会导致模型训练不充分。
BPE就是用一个新的代号区表示数据中出现频率最高的bigram(就是token对,token可以是字节、字符、词语等),不断迭代直到触发终止条件(如bigram最高频次为1),图解:
GPT2使用的token对为字节对(byte-pair),人对字节不熟悉,但是对机器来说却更亲和,通过这种方式优雅的控制了词汇表的规模,缓解数据稀疏问题。
总结特点:多任务预训练+超大数据集+超大规模模型。
参考:https://zhuanlan.zhihu.com/p/136138225
图解GPT2:https://zhuanlan.zhihu.com/p/264396525
《GPT3:Language Models are Few-Shot Learners》
2020年6月发布的。
解决的问题:传统的pretrain+finetune生成仅精通一个专业领域的模型,传统方式的问题在于:需要收集大量的专业领域有监督数据,经过finetune之后模型泛化能力将会特别差,不利于扩展到新的领域、新的任务。GPT3希望训练一个通用大模型,利用一个大的通用数据集,训练一个大规模参数的模型。
模型基本结构和GPT2一样,依旧采用自回归语言模型(transformer decoder),只是增加模型层数到96层(1750亿参数),评估模型在20+个任务上few-shot learning、one-shot learning 和 zero-shot learning三种条件下的性能,三种评估条件表达为In-Context Learning(ICL),这种学习方式仅在构造测试集输入上不同,并不会像传统fine-tune learning那样更新模型参数。
实验:多大部分任务上,zero-shot到ont-shot再到few-shot的性能是不断提升的,尤其在更大参数的模型上,但是需要few-shot的效果才能跟sota pretrain-finetune模型的效果相媲美。
GPT3摒弃pretrain-finetune的方式,希望用纯自回归生成模型代替所有任务上的其他模型,通过大训练数据集和大参数模型,但是具体的实现已经完全黑盒了,同时参数规模和计算资源要求已经提高到令常人/公司望而却步,真正变成大公司的玩物。
《InstructGPT:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》
解决的问题:目标对齐问题(alignment),即模型的输出和我们人类期望的出输出不一定的问题。GPT是一种自回归生成模型,就是“续写”的模型,比如对于我们输入一个问题,机器可能输出这个问题的答案,也可能输出与这个问题相关的一系列续写问题,对于模型来说都是合理的,因为训练数据集里面也会出现连续问题的数据。目前对齐就是希望训练模型能够按照人类期望的结果进行输出,因此设计下面Instruct Tuning这种范式。
三阶段Reinforcement Learning from Human Feedback(RLHF)训练方式:
- supervised fine-tuning (SFT):已有初始预训练模型V0,基于一些人工构造的人类期望的数据集,训练模型V0得到模型V1;
- reward model (RM) training:让V1模型根据一堆prompt分别输出多个结果,人工堆结果进行排序,然后将排序标签结果训练一个排序模型RM,用于评价prompt和output的匹配分;
- reinforcement learning via proximal policy optimization (PPO):再人工构造一批数据集,丢给V1模型得到输出,把模型的输入和输出丢给RM模型进行评分,利用强化学习的方法反复训练V1模型,得到最终的V2模型,就是instructGPT。
三个训练阶段都需要人工构造训练集,但是构造的训练集数量都很少,每个阶段只有几万条,成本算是很小的了。
隐含的前提条件:基础模型(GPT3.0)本身已经被预训练得足够强大。基础模型能够基于少量的人工构造高质量数据训练一个泛化能力很强的、在第二步就能产出比较合理的输出供人工打分,才能顺利完成整个训练流程。
通过这种instruct训练,指导模型往人类期望的方向训练,生成更加真实、无害、有用的结果,提升效果十分显著(13亿的instructGPT比1750亿的GPT3.0效果更好),这种训练方式最终也用于训练得到chatGPT和GPT4。
弊端:通过instruct tuning的方式会牺牲模型的性能,来换取与人类期望的对齐,称为“对齐税”(Alignment Tax)
参考:https://cloud.tencent.com/developer/article/2216036
参考:https://www.cnblogs.com/LexLuc/p/17178547.html
为了解决胡乱输出和安全的问题,训练过程中加了人为干预(instruct tuning)。
为了解决模型逻辑能力差的问题,加入了代码数据集进行预训练(codex):本意是为了解决模型在代码生成和理解能力不足的问题,但是发现使用代码预训练模型之后,模型在其他非代码问题的逻辑性方便也得到了增强,获得了推理的能力。
《FLAN:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》
Google在2021年提出(2022 ICLR)的指令微调(instruction tuning)模型,主要是探索一个基础模型,在一组任务上进行tuning之后,是否能够提高该模型在其他未见过的任务上的性能。结论就是指令微调确实能够提升模型的通用性,使模型在未见过任务上的zero-shot性能提高,而且任务越多,效果越好。
模型结构没有改变,只是做了很多的实验,去论证一些观点:
- 收集62个文本数据集,划分为12个任务群,对于每个数据集构建10个独特的模板,这些模版使用自然语言instructions来描绘该数据集的任务(instruction tuning和普通fine-tuning的区别,普通的fine-tuning没有模板,或者把任务名字拼接到数据集里)。然后利用一个预训练过的基础模型,在其中11个任务群上tuning,最后评估tuning后的模型在第12个任务(未见过的任务)上的性能,对于这个未见过的任务,相当于zero-shot learing。结果是137B的FLAN模型在许多数据集上都拥有超过了175B的GPT3.0的zero-shot性能。
- 消融实验1:实验结果就是每增加一个任务群,FLAN在zero-shot性能都会提升,同时仍未达到提升上限。
- 消融实现2:实验结果就是只有基础模型的参数量大于某个阈值时,这种instruction tuning才能提高模型的zero-shot效果,参数量越大效果越好;而如果参数量低于这个阈值时,instruction tuning反而会降低模型的性能,就是tuning后的模型结果还不如基础模型的zero-shot性能。
- 消融实验3:实验论证instruction设定的tuning比普通的fine-tuning更能提高模型在未见过任务上的zero-shot性能。
《COT Prompting:Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
解决问题:大模型在做一些复杂推理任务的时候表现性能比较差。
论文方案:通过构建一种包含中间推理过程的prompt,来提升模型的性能。通常人在解决一个复杂推理问题时,是有一个有1得2,再由2得3,存在这么一个逻辑推理链路,而不是直接有1得3,论文就是借鉴思想设计包含中间推理过程的prompting,提出的prompt exemplar是一个三元组:<input, chain-of-thought, output>。
实验结论:COT方法在1000亿参数以下的模型效果不好,可能的原因是模型参数量大了之后才具备COY能力,或者小参数量的模型instruct fine-tune不够,具体原因不明。而对于参数量超过1000亿的模型来说,COT能够显著提升模型在复杂推理问题上的性能,而且问题越复杂,提升效果也好,某些数据集上甚至超过了精确fine-tuning之后的模型。
三个消融实验:
- 把推理过程简写为数学计算公式,发现效果对比baseline没有提升,证明自然语言表述的必要性。
- 把推理过程改写为同样长度的“.”点符号,发现效果对比baseline没有提升,证明自然语言表述的必要性。
- 那推理过程写在答案的后面,检验推理链是否帮助模型得到最后的答案,发现效果对比baseline没有提升,证明推理链和答案的顺序很重要,答案确实是机遇推理链得到的。(因为GPT时从左往右的自回归生成模型)。
《LLM4Rec综述:A Survey on Large Language Models for Recommendation》
主要关注生成式LLM4Rec,因为判别式LLM4Rec基本就是BERT衍生的一类pretrain- finetuning的模型。
不tuning模型的情况下:
- 将LLM直接作为推荐系统:
- Prompting,通用场景下,可以这样优化prompt:任务描述:将推荐任务适应为自然语言处理任务;行为注入:将用户-项目交互纳入,帮助LLMs捕获用户的喜好和需求;格式指示器:约束输出格式,使推荐结果更容易理解和评估。或者构造类似“你是一个新闻推荐系统”的prompt作为开头。
- In-context Learning,特定领域下,可以构建近期序列为重的序列prompt,来感知用户交互历史的序列信息;或将候选列表多次打乱并取平均得分进行排名,以缓解位置偏见的问题,或以滑动窗口形式构建prompt,来解决LLM输入token数量限制问题。
- 将LLM作为特征提取器:
- 将文章摘要输入LLM以获取优化后的文章标题、将用户阅读历史输入LLM提取关键词、并生成合成新闻来丰富用户交互历史,构建三种特征增强后续推荐系统性能。
- 将LLM作为推荐系统多个组件(内容数据库、候选检索模型、排序模型等)的控制器:
- 通过多轮对话理解用户需求,再调用现有推荐系统提供结果
tuning模型的情况下:
- Prompt Tuning:LLM的参数或soft prompt针对特定任务进行tuning,如评分预测。
- Instruction Tuning:LLM通过不同的指令对多个任务进行tuning今儿获得更高的性能。
《LIMA: Less Is More for Alignment》
主要工作:Meta的新模型LIMA,精选1000个微调样本进行训练,对比GPT-4/Bard/DaVinci003,表现出强大的性能。
突出点:在没有使用任何强化学习或人类偏好建模(RLHF)的情况下,仅使用精选1000个prompts和response进行标准的监督损失微调。提高模型性能的关键不在于微调样本数量、而在于微调样本的多样性和数据质量。
论文的假设(也是最终证明的结论):LLM中的几乎所有知识都是在预训练中学习的,只需要使用有限的指令微调就能教会模型产出高质量的输出。
《SELF-INSTRUCT- Aligning Language Models with Self-Generated Instructions》
一张图总结:
详细介绍:
解决的问题:现有很多实验证明了对大语言模型的instruction的重要性,instruction效果的好坏非常依赖于人工标注的数据,而人工标注成本过高,并且标注的数据缺乏多样性,为了解决这两个问题,作者提出self-instruction,通过半监督的方法让模型基于自身生成的instruction signals来finetune模型。
整体流程如下:
文章构造的完整样本有三个要素:instruction,input,output。instruction描述任务的形式,input和output组成该任务的一个具体样本。
整个self-instruction分为四个过程:
- 生成指令(instruction):先人工标注一些instruction例子,然后利用大模型的few-shot能力,生成新的instruction样本。(增强任务多样性)
- prompt格式:每次从人工构造的的task pool(175个)中随机抽6个,加上从大模型中生成的task pool中随机抽2个
- 判断是否为分类任务:分类任务和非分类任务的处理方式是不同的,在步骤(1)得到的task样本后,同样使用大模型的few-shot能力对task进行是否为分类任务的判断。
- prompt格式:使用12个分类任务和19个非分类任务。
- 样本生成:对于非分类任务,使用“input-first approach”方法生成样本,即按照task,input(如有),output的顺序给few-shot样例和生成样本;
- prompt格式:会生成偏向于一个标签的结果,尤其在分类任务中,因此不适用。
- 对于分类任务,则使用“output-first approach”的方式生成样本,即按照task,output,input的顺序给样例和生成样本。
- prompt格式:先输出标签,然后在标签约束下生成input
- 过滤低质量和重复样本。 最后将大模型GPT3生成的task和task对应的样本合并在一起,直接在原模型GPT3基座上进行有监督的finetune,实验结果是self-instruction-GPT3对比GPT3有33%的提升,对比InstructGPT(001)性能接近,而InstructGPT用了大量人工标注数据和RLHF方法。
总结工作:设计了一套半监督finetune流程,和一系列prompt模版,让一个大预言模型基于自己生成的样本训练自己,就能提升模型效果。而且全程使用openai的接口,用GPT3接口生成few-shot样本(花费600刀),用GPT3的finetune接口对样本进行有监督finetune(花费338刀),低成本sft大模型。
感觉openai的产品之所以强大,一部分归功于开放接口给用户生成样本和sft,好的数据和结果,openai完全可以直接拿来用,更新下一代产品。
参考文档:https://blog.csdn.net/qq_18555105/article/details/129935312
2023年大模型在推荐领域的论文
来源1:https://github.com/WLiK/LLM4Rec-Awesome-Papers
来源2:https://arxiv.org/pdf/2307.02046.pdf