主要学习如何对大模型进行预训练工作,如果我们要使用一个已经经过一部分预训练的模型的话,实际上我们就可以得到这个预训练模型的预训练代码
1. 什么是大模型
参数量很大(十几亿,几百亿)的深度神经网络模型
1.1 基座模型选择
开源领域 ChatGLM,LLAMA,RWKV 主要就是这 3 种模型, 中文好一点就是 ChatGLM,潜力最好的就是 LLAMA,RNN 架构决定 RWKV 有很好的推理效率(随输入长度内存占比线性自增,而 LLAMA 则是指数增加) 和 Length Extrapolation (关于长度外推性,可以参考苏神的文章 [4])
1.2 模型参数大小选择
当然对于模型参数的选择,往往是参数越大效果越好。如果资源充足,当然是推荐 30B 以上的模型。不管是 6B, 7B 和 13B 同样的训练数据,同样训练参数,模型参数量大效果则优于低参数的模型。那么根据模型参数,如何预估我们的训练所需的内存开销,这里有一个简单的方法 比如 6B 模型,60 亿规模参数,根据以下公式计算:
模型参数 + 梯度参数 + 优化器参数 = 6B * 1bytes + 6GB + 2*6GB = 24GB
1.3 数据处理
对于 LLM 训练,数据质量很重要。预训练时,我们可以将数据先进行预处理,比如对数据进行一定规则的筛选,数据去重,去除一些低质量的数据。同时,我们可能面临各种类型的数据,PDF,Word,HTML,代码文件等等,对于这种不同类型的数据我们需要都处理成文本,同时还过滤掉一些干扰项或乱码的数据。
当然,我们也可以利用一些工具去处理,比如 justext [7],trafilatura [8],来提取文档主要内容,减少数据的噪音。对于空的文档或文档长度低于 100 进行过滤,进一步减少噪音。
对于一些机器生成的文本或 OCR 识别错误的文本,质量不高,由没有什么逻辑性,虽然比较难以检测,但是还是会有一些工具能做这样的事情,比如 ctrl-detector [9]。当然对于一些有毒的或带有偏见的数据,可以采用 PerspectiveAPI [10] 或垃圾邮件检测的办法来过滤。
我们还不得不考虑数据的一些隐私风险,也需要考虑,比如身份证号,银行卡等信息,比如 presidio 和 pii-codex 等工具提供了检测、分析和处理文本数据中的个人身份信息的能力。
指令微调数据,我们可以使用 PromptSource [11] 来创建微调数据。当然我们还可以让 GPT4 给我们标注一些数据,这样蒸馏知识,可以让数据质量进一步提升。这里我分享一个我使用的 Prompt 工程:
1 | first_prompt = """ |
1.4 大模型内在原理
大模型不存在涌现能力
目前人们所看到的涌现能力实质上是人们构建的指标是非线性指标所造成的,指标的非线性指的是指标只能代表0或1,所以模型在指标上表现出了从0到1的涌现性,而如果将指标换为线性指标,这篇论文发现模型的能力随着算力和模型参数规模在线性增加,也就是说,模型只是在做减小loss的行为,而没有发生涌现行为,是一种涌现错觉
emergent abilities may be creations of the researcher’s choices, not a fundamental property of the model family on the specific task(“涌现”能力的出现是人为刻意标准下的筛选,而不是模型自己的真实能力)
从这个看法来讲,我们应该重新正视大模型的发展,不是期望大模型能够利用其”涌现”造就神话故事,而是一步一步的推动模型的增长h
2. 预训练是什么意思
预训练这个词并不是一个很新的词,之前就有,我理解的预训练就是大模型在某一个任务上进行模型训练,训练完成的模型参数就是预训练模型,预训练模型就意味着把人类的语言知识,先学了一个东西,然后再代入到某个具体任务,就顺手了,就是这么一个简单的道理。
预训练思想的本质:
- 模型参数不再是随机初始化,而是通过一些任务(如语言模型)进行预训练
- 将训练任务拆解成共性学习和特性学习两个步骤
3. 预训练有哪些技术
那么预训练应该具体怎么做?
大致流程:自监督的大规模预训练 + 微调,本文重点关注自监督预训练如何实现
预训练本质上是迁移学习的一种应用,利用几乎无限的文本,学习输入句子的每一个成员的上下文相关的表示,它隐式地学习到了通用的语法语义知识,预训练通过自监督学习从大规模数据中获得与具体任务无关的预训练模型。体现某一个词在一个特定上下文中的语义表征。
3.1 网络
transformer模型,是预训练的核心网络,因为有个非常好的优点,就是可以跑得很快,并且做的很深。
3.2 预训练任务
预训练任务的分类架构通常可以分为两类,一类是基于自监督学习的预训练 任务,另一类是基于监督学习的预训练任务。具体而言,可以将预训练任务分成以下几类:
基于自监督学习的预训练任务:这种预训练任务要求模型通过自监督方式来学习数据中的模式和结构,而不需要人工标注的标签。这种方法通常包括自回归预测和掩码语言模型等任务,模型通过对输入文本的预测来学习文本的语言结构和语义信息。
自回归预测
- 给出前几个单词,预测后一个单词的概率
- 从左向右做预测,再从右往左做预测
掩码语言模型
将句子中的一个词语掩盖掉,预测该词
动态mask(RoBERTa)
SpanBERT:Random Contiguous Words Masking and Span Boundary Objective (SBO) 随机掩盖一段连续的词、模型在预测掩盖词的同时,还需要预测出掩盖词所在的连续片段的开始位置和结束位置。
StructBERT :Span Order Recovery task 模型在输入的文本中找到两个连续的实体,并预测它们在原始文本中的顺序
TLM:XLM 双语对齐 将源语言句子和目标语言句子拼接,模型需要预测这个拼接后的句子中缺失的一些词汇或者短语。
Seq2Seq MLM
对于句子”The quick brown fox jumps over the lazy dog.”,Seq2Seq MLM任务可能会将其掩码为”The quick [MASK] fox jumps [MASK] the lazy dog.”,然后让模型预测掩码位置上的词汇。在预测第一个掩码位置时,模型可能会将其预测为”brown”,然后将”brown”作为下一个掩码位置的输入,继续预测下一个掩码位置上的词汇。
PLM:Permuted Language Modeling模型输入一个随机排列的词序列,并预测这些词在原始序列中的正确顺序。
对比学习Contrastive Learning,没有被替换的句子得分比被替换的句子得分高
DAE:Denoising Autoencoder:输入一句有噪音的句子,输入没有噪音的句子
- 随机mask
- 随机删除token
- 随机去除n个token
- 句子随机排序
- 文档旋转
基于监督学习的预训练任务:这种预训练任务要求模型通过有标注的数据来学习任务特定的语言处理技能。这些任务通常包括情感分析、命名实体识别、文本分类等任务,模型通过对标注数据的学习来提高在特定任务上的表现。==NLP领域,没有足够多的带标签的数据==
基于弱监督学习的预训练任务:这种预训练任务要求模型通过仅有部分标注数据或者弱标注数据来学习任务特定的语言处理技能。这些任务通常包括半监督学习、多任务学习等方法,模型通过对标注数据和非标注数据的学习来提高在特定任务上的表现。
1. GPT3
输入是单词序列,输出是对最有可能放在这个序列结尾的单词的预测。
输入采用固定长度为2048个token的序列。不足2048个token的短序列,用空值填充。GPT-3同时对输入序列的下一个token进行预测,但是通常只取输入序列中最后一个位置的预测token,并将其加入输入序列的末尾,进行下一个位置的预测。
2. OPT
预训练任务与GPT3相同
3. BLOOM
预训练任务与GPT3相同
4. GLM-130B
设计了两个预训练目标,包含自监督空白填充和多任务instruction预训练(Multi-Task Instruction Pre-Training,MIP)。
自监督空白填充(95% tokens)
为了同时支持理解和生成,设计了两种掩码方式。[MASK]:句子中的短空格,其长度被添加至输入的某一个部分; [gMASK]:句尾随机长度的长空格,并提供前缀上下文;具体来说,[MASK]训练目标占比30%。[gMASK]训练目标占比70%。
MIP(5% tokens)
收集了一个由自然语言理解、生成和信息抽取等组成的instruction prompted数据集,并在上面对模型进行预训练而不是微调,以防止破坏模型的生成能力。这个任务的目的是改善模型zero-shot任务的迁移能力。
5. PaLM
- 编码器首先被训练成双向自动编码器,从损坏的上下文重建原始文本,随机token被采样,并根据BERT的实践用[MASK]符号替换。该训练优化了编码器输出与原始上下文之间的交叉重构损失,如BERT中的掩码语言建模(MLM)。通过预测上下文中被屏蔽的实际令牌,PALM迫使编码器理解未掩码token和整个上下文的含义。
- 然后将编码器和解码器联合训练,以从编码器的上下文表示形式自回归地生成文本输出。训练最大限度地提高了文本的loglikelihood in ground truth从解码器的输出:
6. Chinese LLaMA
自回归,给定序列,预测下一个token
以上是从头开始训练一个模型,如果要在一个已经预训练过的模型上再次进行训练,那就会面临灾难性遗忘的问题,以下是如何应对灾难性遗忘的方法,也被称为增量学习,与在线学习也有点关系:
- intelligent synapse(冻结权重)
- replay
- meta learning
3.2 预训练任务 另一种划分
• Next Sentence Prediction (NSP) (Devlin et al., 2019): A binary classification loss predicting whether two
segments appear consecutively within a larger document, or are random unrelated sentences.
• Sentence Order Prediction (SOP) (Lan et al., 2020): A binary classification loss for predicting whether two
sentences are in a natural or swapped order.
• Capital Word Prediction (CWP) (Liu et al., 2020b): A binary classification objective calculated over each
word, predicting whether whether each word is capitalized or not.
• Sentence Deshuffling (SDS) (Liu et al., 2020b): A multi-class classification task to reorganize permuted
segments.
• Sentence distance prediction (SDP) (Liu et al., 2020b) : A three-class classification task, predicting the
positional relationship between two sentences (adjacent in the same document, not adjacent but in the same document, in different documents).
• Masked Column Prediction (MCP) (Yin et al., 2020): Given a table, recover the names and data types of
masked columns.
• Linguistic-Visual Alignment (LVA) (Lu et al., 2019): A binary classification to Predict whether the text content can be aligned to visual content.
• Image Region prediction (IRP) (Su et al., 2020): Given an image whose partial features are masked (zeroed out), predict the masked regions.
• Replaced Token Detection (RTD) (Xiao et al., 2021): A binary classification loss predicting whether each token in corrupted input was replaced by a generative sample or not.
• Discourse Relation Prediction (DRP) (Sun et al., 2020): Predict the semantic or rhetorical relation between two sentences.
• Translation Language Modeling (TLM) (Lample and Conneau, 2019): Consider parallel sentences and mask words randomly in both source and target sentences.
• Information Retrieval Relevance (IRR) (Sun et al., 2020): Predict the information retrieval relevance of two sentences.
• Token-Passage Prediction (TPP) (Liu et al., 2020b): Identify the keywords of a passage appearing in the
segment.
• Universal Knowledge-Text Prediction (UKTP) (Sun et al., 2021): Incorporate knowledge into one pre-trained language model.
• Machine Translation (MT) (Chi et al., 2021a) : Translate a sentence from the source language into the target language.
• Translation Pair Span Corruption (TPSC) (Chi et al., 2021a) : Predict the masked spans from a translatio pair.
• Translation Span Corruption (TSC) (Chi et al., 2021a) : Unlike TPSC, TSC only masks and predicts the spans in one language
• Multilingual Replaced Token Detection (MRTD) (Chi et al., 2021b): Distinguish real input tokens from corrupted multilingual sentences by a Generative Adversarial Network, where both the generator and the
discriminator are shared across languages.
• Translation Replaced Token Detection (TRTD) (Chi et al., 2021b): Distinguish the real tokens and masked tokens in the translation pair by the Generative Adversarial Network.
• Knowledge Embedding (KE) (Wang et al., 2021): Encode entities and relations in knowledge graphs (KGs) as distributed representations
• Image-to-text transfer (ITT) (Wang et al., 2021): Is similar to the image caption that generates a corresponding description for the input image.
• Multimodality-to-text transfer (MTT) (Wang et al., 2021): Generate the target text based on both the visual information and the noised linguistic information.
3.3 预训练数据
- 训练数据中使用代码数据可以很好地提升LLM的推理逻辑能力
3.4 如何避免灾难性遗忘
通常我们有以下方式,可以减少或避免灾难性遗忘问题
- 将重要的权重冻结 - 像 Lora 就是采用的这种方案,只学习部分网络权重。但这里 Lora 的配置其实是要注意一下,如果你是用 Lora 做预训练,lora 训练模块可以配上 q_proj,v_proj,k_proj,o_proj 如果是微调则只需要训练 q_proj,v_proj lora_rank 的设置也有讲究,初始设 lora_ran 为 8,训练存在遗忘时,可以将 lora_rank 改为 64(原因是与原模型数据领域相差较大的话,需要更大的秩,原论文有说明)。
- 复习 - 跟人一样,在预训练或微调时,回看之前训练的数据。还可以专门把特征图存起来,量化以后放在一个类似于记忆库的地方,之后在新任务上训练的时候从这个记忆库里重构出记忆和新数据一起训练。感兴趣可以看这篇论文 [16]。
- MoE - 稀疏门控制的专家混合层,最近爆出 GPT4 是由 8 个 220B 的模型组合。关于 Moe 相关资料 [17] 大家自行了解。
3.4 大模型预训练与知识图谱结合
3.4.1 KGs 增强 LLM
1. KG增强的LLM预训练
将KGs整合到训练目标中
利用KGs中蕴含的实体信息作为监督信号,让LLM来通过某种方式预测得到KGs中的实体信息
将KGs整合到LLM输入中
将KGs中的知识形成文本作为大模型的输入
通过额外的融合模块整合KGs
2. KG增强LLM推理
动态知识融合
将知识图谱编码,与输入编码融合,使用问答数据微调
==检索增强的知识融合==
对于问题,先在KG上查找相关信息作为变量z, 然后将z作为附加上下文信息和问题一起输入到LLM中
3. KG增强的LLM可解释性
用于LLMs探测的KGs
使用LLM来回答KG中的知识问题
用于LLMs分析的KGs
采用语言模型来生成知识图
3.4.2 LLM增强 KGs
3.4.3 LLM 与 KGs 协同
知识表示
推理
在问答任务中,QA-GNN[117]首先利用LLM来处理文本问题,并指导推理步骤。通过这种方式,它可以弥合文本和结构信息之间的差距,从而为推理过程提供可解释性。在知识图谱推理任务中,LARK[45]提出了一种LLM引导的逻辑推理方法。它首先将传统的逻辑规则转换为语言序列,然后要求LLM对最终输出进行推理。此外,siyuan等人[46]将结构推理和语言模式预训练统一在一个统一的框架中。给定文本输入,他们采用LLM来生成逻辑查询,该查询在KGs上执行以获得结构上下文。最后,将结构上下文与文本信息融合以生成最终输出。RecInDial[243]结合知识图谱和LLM,在对话系统中提供个性化推荐。KnowledgeDA[244]提出了一个统一的领域语言模型开发pipeline,以增强具有领域知识图谱的任务特定训练过程。
4 监督式微调
1. ChatGLM: p-tuning v2
soft prompt tuning
1 | - prompt_learning:带女朋友去了一家餐厅,她吃的很开心,这家餐厅太__了! |
2. hybrid-tuning
deal with the catastrophic forgetting
3. MOSS: fine-tuning in instruction data
4. Chinese-LLaMA-Alpaca: pre-trained 1 + pre-trained 2 + instruction_tuning
5. QLoRA
QLoRA通过冻结的、4比特量化的预训练语言模型来做 LoRA,进行反向传播梯度。
https://arxiv.org/pdf/2305.14314.pdf
https://zhuanlan.zhihu.com/p/632229856
如果你受限于GPU内存,QLoRA可能是值得考虑的选择。它可以节省33%的内存,但运行时间将增加39%
6. LORA
LORA实战小技巧:
- 调整LoRA的秩(rank)并选择合适的alpha值至关重要。将alpha值设定为rank值的两倍是一个明智的选择
- 如果你正在使用LoRA,应将其应用于所有层(而不是仅仅应用于Key和Value矩阵),以最大化模型性能
- 我们可以在14GB RAM的单个GPU上,在几小时内有效微调70亿参数的模型。使用静态数据集优化一个LLM,让其完美胜任所有基准任务难以实现。要解决这个问题,需要使用多样化的数据源,或许LoRA并不是理想的工具
- 对指令微调进行多轮训练作用不大,可能会导致结果恶化。我在1000个示例的LIMA数据集上也观察到了同样的情况。这种性能下降可能是由过拟合导致的,这需要进一步的研究
- LoRA让我们能够在单个GPU上微调7B参数的LLM。在这种特殊情况下,使用最佳设置(r=256、alpha=512)的QLoRA,在A100上,使用AdamW进行50000个训练示例(Alpaca数据集)的训练,占用了17.86 GB的内存,大约需要3小时。
7. Adapter Tuning
8. Prefix Tuning
9. AdaLoRA
5.对齐
1. RLHF
6. 模型使用
1. 上下文提示
2. 思维链提示
鼓励大语言模型解释其推理过程。思维链的主要思想是通过向大语言模型展示一些少量的 exapmles,在样例中解释推理过程,大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。
CoT prompting:输出由原来的answer 变为 reason + answer
Zero-shot-CoT:是一个 pipeline。使用“Let’s think step by step”让LLM 生成一些思考过程 a,然后将生成的 a(理由) 和 question 拼在一起,再加一个answer 指向的 prompt 如“The answer is ”来激励模型生成答案。
自洽性(Self-consistency):生成多个思路链,然后取多数答案作为最终答案
Least to Most prompting, LtM:首先将问题分解为子问题,然后逐个解决。
Multi-Persona Self-Collaboration:这个有点类似之前提到的 AutoGen,让多个代理相互对话来解决问题,只不过 AutoGen 是从工程层面真正做到了多 Agents 交互,而这里提到的,是让 ChatGPT 扮演多重人格/角色,例如:
“你可以扮演任何角色,针对我给出的问题,请提供三个最相关的角色,对问题进行两轮讨论,然后你综合讨论结果总结最佳方案。请打印三个角色的讨论过程以及最后的方案。
思维树:
举例:假设三位不同的专家来回答这个问题。所有专家都写下他们思考这个问题的第一个步骤,然后与大家分享。然后,所有专家都写下他们思考的下一个骤并分享。以此类推,直到所有专家写完他们思考的所有步骤。只要大家发现有专家的步骤出错了,就让这位专家离开。请问…
3. 推理加速
对于推理,一般我们采用量化方案,这里有两个办法。第一个则是采用 ggml 工具,比如 llama.cpp [18] 针对 llama 模型,将模型量化运行在 cpu 或 gpu 上,也可以 cpu 和 gpu 一起跑,内存则大大减少,推理速度有极大的提高。
这里如果将 llama.cpp 运行在 gpu 上, 编译时一定要加 LLAMA_CUBLAS=1,同时推理的时候,指定 –gpu-layers|-ngl 来分配运行在 gpu 上的层数,当然越大,占用 gpu 的内存会越多。
如果是 RWKV 模型,则考虑采用 rwkv.cpp [19],此方法与 llama.cpp 类似,使用方式也是类似的。
还有 Llama 模型还可以考虑使用 exllama [20] 纯 GPU 的加速,虽然还不够完善,但也可以值得一试。
另一个,采用 LLM Accelerator [21],LLM 存在大量的相似性推理,基于此,可以做一些优化加速推理,具体请看论文。最后采用架构上的调整,faster transformer [22] 要优于传统的 transformer 架构。
7. 实践环节
总结一下,目前的大模型范式基本上都是预训练+微调
预训练分为两种情况:
从头开始预训练
那就是要构造训练任务,主要用自回归任务和自编码任务两种主流训练方法
对已经预训练过的模型进行再次预训练
这种情况可以当作增量学习的问题来看
尝试langchain
构造微调数据(目前质量堪忧)使用通用指令数据混合wiki数据
微调llama(1. 微调预训练过的模型 2.微调原模型)
问题:微调和与预训练之后都丧失了模型的对话能力??? 本质上是过拟合
基础优化手段
- Zero-shot:arxiv.org
- Few-shot:arxiv.org
- CoT:arxiv.org
- ToT:arxiv.org
- GoT:arxiv.org
- SC:arxiv.org
- Multi Persona:arxiv.org
- Least to Most:arxiv.org
- Step Back:arxiv.org
- ART:arxiv.org
- ReAct:arxiv.org
- Reflection:arxiv.org
- RAG:arxiv.org
8.检测是否是AI生成的方法
- 选定一段新的文本,用LLM计算这段文本的对数概率
- 对文本进行少量的词汇替换(例如mask几个词然后rewrite)
- 对重新生成的文本再次计算文本的对数概率
- 重复几次,将这些对数概率画成曲线
如果这篇文本是由AI写的,那么所得曲线更像红色曲线,原始文本会处于平缓区域的最大值
如果这篇文本是真人写的,那么所得曲线更像绿色曲线,重写文本的对数概率可能高于/低于原文本
9. 大模型测评
GPT-Fathom是一个开源和可复制的LLM评估套件,在对齐设置下对10多个领先的开源和闭源LLM以及OpenAI的早期模型进行基准测试。
10. 总结原则
最后总结几条原则:
- 参数多量化低的模型要优于参数低量化高的模型
- 模型质量与训练数据质量是存在相关性的
- 扩充中文词表有助于提高推理效率
- 微调推荐采用 Lora QLora 方案
- 模型加速必然需要对模型进行量化