1. Attention is all you need
大模型开启了AIGC热潮,而这与google于2017年发表在NIPS上的一篇论文紧密关联
引用量7.6w+
1.1 静态图
论文原图注解如下:
编码器(Encoder):负责将输入转化为特征 => 北京 -> [0.012, 0.6, -0.9]
解码器(Decoder):负责将特征转化为目标 => 中国首都 -> [0.011, 0.65, -0.89] ->北京
这篇论文提出了一种基于Attention的transformer结构,由编码器(Encoder,左边)和解码器(Decoder,右边)组成。
- Encoder和Decoder的核心运算是self-attention,都可以生成向量(一个是特征,一个是预测)
- Encoder的主要功能是将**文本编码成向量(理解)**表示,可以通过向量完成各类下游任务(比如分类,语义匹配),Encoder衍生类模型有:BERT、RoBERTa、ViT等等,横跨NLP和CV领域
- Decoder的主要功能是文本续写(生成),Decoder的衍生类模型有:gpt1~3、chatgpt,chatglm等等
- 基于Encoder理解文本,然后使用Decoder生成的衍生模型有T5等等
1.2 动态图
- Encoding:圆圈是每个token生成的向量,每个token的向量都会与其他token的向量交互,向量化时需要考虑“结合哪些token,计算注意力的分布”,该过程即self-attention,注意,每一层的向量都是同时生成的
- Decoding:该过程是在根据给定文本的向量以及之前decoding生成的向量,综合计算(cross-attention)下一个向量,并生成token
Encoder的特点是可以双向、并行“理解”文本,所有的token向量都是同时生成
Decoder只能从左到右,根据向量映射到token的过程是串行
1.3 xx is all you need?
attention起源于cv领域,被nlp领域借鉴后,由下面这篇论文发扬光大
Neural Machine Translation by Jointly Learning to Align and Translate
机器翻译的seq2seq结构中使用attention,引用量2.8w+
抛开这篇论文,来看看transformers中每一层的attention是怎么计算的:通过QKV(self-attention)矩阵运算,具体如下
2. 模型相关
2.1 BERT
google发布,基于Encoder结构
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
google于2018年发表,引用量6.7w+
- 输入文本,输出词、文本的向量表示(语言表征)
- 基于向量表示,进行情感分类、实体识别等NLP任务
2.2 GPT系列
gpt是OpenAI的系列作品,基于Decoder结构,主要如下:
gpt1:Improving Language Understanding by Generative Pre-Training
2018年发表gpt1,引用量5577
gpt2:Language Models are Unsupervised Multitask Learners
2018年发表gpt2,引用量6165
gpt3:Language Models are Few-Shot Learners
2020年发表gpt3,引用量10613
InstructGPT:Training language models to follow instructions with human feedback
OpenAI2022年发表的InstructGPT,引用量983
ChatGPT无相关论文,但是原理和InstructGPT相同
长达100页的技术报告
gpt系列结构相似,都是基于Decoder的单向自回归模型(自回归:基于过去一步一步地预测未来),只是参数量更多,语料更多,模态更多(文本-> 文本+图片),训练方式优化,结果大力出奇迹。
有一种说法是模型参数量到达一定数量级(6~10B),模型就会出现涌现能力。什么是涌现能力?在较小的模型中不出现,而在较大的模型中出现的能力
个人看法:
- 单核生物 => 多核生物 智慧
- 小模型 => 大模型 涌现
用涌现解释大模型有点”用玄学解释玄学“的味道,但是在人脑的工作机制没被彻底发现之前,用含玄量低的解释含玄量高的也不是不可以
左边为gpt1结构,右边为可完成的任务举例,其实这些任务BERT能更好的完成。所以gpt1,gpt2没有bert的应用面广泛。至于gpt3,一方面没开源,另一方面,模型拥有1750亿的参数量(BERT才1亿参数),也没几家公司敢部署应用。
2.2.1 gpt系列的训练
根据过去的token(feature),预测未来的token(label),使之接近
2.2.2 gpt系列的预测
预测和训练流程差不多,只是训练时会更新模型,预测不会更新模型了。
文本依次向量化,最后一个token(it)的向量用来预测下一个token(okay),然后将预测的token当做输入,继续预测
2.2.3 gpt系列的in-context learning
**gpt3及后续模型参数那么大,下游任务几乎无法通过微调来更新参数,**怎么解决?in-context learning!
- 语境学习
- 面对下游任务的时候,模型不更新参数,通过构造合适的”提示词“,让模型理解需求并回答
- 换句话来说,就是提问,并给出明确需求
in-context learning可以分为三种:
- zero-shot:不给例子,直接回答
- one-shot:给一个例子,再回答
- few-shot:给多个例子,再回答
个人理解:其实人类的对话又何尝不是zero-shot任务呢?每一次对话都是希望对方给出相应的回答,对方如果不懂,我们就会举一个例子(one-shot),甚至更多例子(few-shot)
2.3 InstructGPT & ChatGPT
gpt3后的各种尝试
Training language models to follow instructions with human feedback
OpenAI2022年发表的InstructGPT,引用量983
ChatGPT的技术原理和InstructGPT相似
InstructGPT和ChatGPT都是基于gpt3模型的语言生成模型,本质相似,主要区别:
- InstructGPT的训练目标是根据给定的指令或约束条件生成满足条件的自然语言文本。例如生成问题答案、摘要、代码等
- ChatGPT的训练目标是生成自然流畅的对话,使得机器可以与人类进行自然的对话交互
2.3.1 近期gpt的训练方案RLHF
主要用于InstructGPT、ChatGPT、gpt4
基于人类反馈的强化学习(RLHF,Reinforcement Learning from Human Feedback),让模型去拟合人的偏好
- SFT
- Supervised Fine-Tuning,监督性微调,作用:训练**一个基础模型,**论文直接选用gpt3在对话数据上微调
- 现状:目前在APP对话上只走通了SFT流程
- 通俗理解:让小孩(基础模型)学会说话
- RM
- Reward Model,奖励模型,作用:**学习人类偏好,**可以代替人类对高质量结果打高分
- 通俗理解:安排一个长辈(奖励模型),知道哪些话是好的,哪些话不好
- PPO
- proximal policy optimization,近端策略优化,作用:让奖励模型指导基础模型训练,使其拟合人类偏好
- Proximal Policy Optimization Algorithms
- 通俗理解:让长辈教小孩说话,说得好,给一个糖,说的不好,面壁思过,这样小孩说话越来越好
2.3.2 该技术方案好处
-
比起全量标注,消耗资源少,奖励模型替代人指导模型训练
-
训练的模型可以生成符合人类偏好的结果(13亿参数量模型 + rlhf > 1750亿参数量模型)
2.3.3 启示
- 现在AIGC很卷,生成式的内容铺天盖地。如果我们可以有一个通用的标注平台产生优质数据(并排序),那么在以数据为壁垒的AGI时代,好处如下:
- 数据:低成本(其实也不低,只是相对全量标注而言)的产生优质数据
- 模型:训练更好的模型(模型的上限取决于数据质量)
- 内容:产生更优质的内容(对话、图片、视频等等)
- OKR:好内容会促进用户增长,提高营收
- 其他…
2.4 GPT4
没有论文,只有技术报告,长达100页,OpenAI一贯的作风(gpt3有75页)
重在实验,展示效果,闭源细节
- 更大模型,更多数据,更多模态。
- 可以处理更长的上下文,并具有更广泛的常识和问题解决能力
- 更具有创造力和协作能力
- 更……
gpt1~3只接受文本输入 ,输出文本。gpt4接受文本、图像输入,只输出文本(给一张前端草稿图,gpt4直接生成前端代码,并且正常运行)。
2.4.1 输入限制
transformer衍生模型都有最大token长度限制,为什么呢?
- 算力原因
- qkv计算量随着token长度成二次方增长,显存开销大
- 长度外推性能不佳
- 训练时用1000token,预测2000token,模型也顶不住
- 平时我们写600字作文,高考要写6000字,手麻脑废
- 技术原因,位置编码
- 早期的绝对编码只分配了长度512、1024,一个token一个坑,多余的token挤不进去
- 相对位置编码理论上可以无限生成,但是效果待提高,学术界有此类研究方向
2.5 小结
-
以encoder为基础的BERT成为文本表征的主力军
-
以decoder为基础的gpt系列,参数量越来越多,模态越来越多,效果越来越好
-
RLHF的方式赋予了ChatGPT和GPT4惊人符合人类偏好的对话能力
-
我们获取的启示:数据、模型、内容、OKR、等等
3. 优化相关
大模型的训练耗费资源、时间,优化极其重要。优化主要体现在:
- 显存优化:为了少量gpu资源能跑起来大模型
- 速度优化:为了减少迭代周期
- 其他优化
3.1 显存优化
限于篇幅,这里主要讲述显存优化的思想,并给出可参阅文档
主要思想:
- 单卡时
- 把显存的一部分信息放入内存,节省显存,代价是增加内存与显存通讯
- 多卡时
- 将多张显卡模拟成一张大显存显卡(8张40GB的A100可以模拟1张320GB的大显卡!),代价是显卡之间的通讯(显卡带宽很重要,砍这个就是砍大模型的发展)
- 也可以借鉴单卡时的做法,将显存的一部分信息放入内存
3.2 训练速度优化
大模型训练速度慢原因较多,例如:
- 模型参数量大,计算量多,可以通过**减少可训练参数解决,**训练参数越少,需要的梯度信息以及参数更新就越少,所以更快
- transformers的内部计算复杂度是O(n^2),n代表序列长度,可通过优化计算过程,降低复杂度来实现(会有一定的近似计算,忽略不重要的输入数据等等),由于涉及模型细节,本次分享不展开
3.2.1 冻结部分参数
比如有个28层的transformer衍生模型,我们可以冻结1~27层,只训练28层,训练参数约为原先的3.5%
为啥不冻结2~28层,只训练第一层呢?
- NLP中有个sense,低层网络关注语法、句法等低层信息,高层网络关注语义等高层信息
- 高层网络对任务影响更大,可以一定程度加速收敛
3.2.2 LoRA
顾名思义,就是用低秩矩阵AB(mn & nm)去适配参数中的大矩阵W(mm),只更新低秩矩阵
一般情况下m >> n (m可能为1000~10000,n一般可取[2,4,6,8,10]),使用LoRA后,一般可训练参数变成原来的0.1%左右
论文原图如上,但是该图非常具有迷惑性,很多人容易将蓝色部分当做整个模型,其实它只是其中一个参数矩阵!
可以理解为对其增加一个旁路矩阵来模拟,并且旁路矩阵“可插拔”,不同的子任务可能有不同的旁路矩阵,在主模型不变的情况下,切换任务时,不需要重新部署,只需要“插拔”旁路矩阵
3.2.3 其他类似
- prefix-tuning
- 固定预训练模型不动,为模型添加可训练、任务特定的前缀,为不同任务保存不同的前缀,微调成本也小(有点LoRA那个味道了,其实本质差不多)
- Prefix-Tuning: Optimizing Continuous Prompts for Generation
- 更多的方式不一一列举,用一张图总览一下,共同点:经过挖掘数学本质后,都固定原始模型,训练旁路矩阵
3.3 数据优化
一句话总结:利用大模型的能力,产生数据,筛选后加入训练数据(数据增强)
Self-Instruct: Aligning Language Model with Self Generated Instruction
人工标注数据存在以下缺点:
- 费时费力
- 数据多样性存在问题,40个人标注的数据取决于那40个人的认知
sense:判断模型产生的数据是否优质,进而决定是否加入训练集则会更简单。模型的认知比标注人员多(见过太多语料了),因此可以保障数据的多样性,论文结构图如下:
怎么生成instruction?其实就是prompt,和之前介绍的few shot一样,给几个例子,让模型自己去生成。
本质而言:该方法只是普通的一种数据增强方法。在传统机器学习领域, 早有类似做法,只不过self-instruct利用了语言模型的生成多样性来扩充数据。
3.4 其他优化
3.4.1 数据与模型
一句话总结:训练的数据量要跟模型参数量相匹配
- 该论文认为现在模型尺寸越来越大,但是训练数据却不够多,导致一个现象:模型训练不够充分
- 模型大小和训练token数应该成比例:模型参数加倍,训练token数也应该加倍
- 人在成长,阅历要跟上
- 否则会出现巨婴(大模型、少数据)、少年老成(小模型、多数据)
- 少年老成:论文中Chinchilla参数量只有70B(gpt3是175B),但它表现比gpt3更好,因为它是在1.4万亿token上进行训练的,而gpt3“仅”在3000亿token上训练
个人认为:RLHF以及对应的数据配套设施(平台or其他)很重要,就算不搞基座大模型,形成数据壁垒后,微调也能独领风骚
3.4.2 另一把尺子
一句话总结:让AI根据人类设定的规则,对AI的回答进行自我批评与修正
上面的self-instruct都可以利用模型造数据了,那么用模型来判定或者识别生成的内容理应更简单。(实际上两篇论文都是2022年发表)。该论文提出了一种新的feedback模式:
- RLFH ----> RLAIF
- RL from human Feedback ----> RL from AI Feedback
怎么让AI Feedback呢?思路如下:
- 人类设立一系列规则
- 让模型根据抽取的规则进行回复自我批评与自我修正,甚至是优劣比较
由于论文原图不好理解,所以直接给出实例
Principles for SL-CAI:根据一系列规则(随机抽取),微调模型
具体流程是如何的呢?看一组官方示例:
- 第一次随机抽取的原则识别回答是有害的,因此做了修正
- 修正的回复没有违反第二次随机抽取的原则(perfect),所以第二次几乎没修改
- 其实后续还抽取了2次原则,分别做了一定的修正,限于篇幅,不再赘述,流程相同
4. 总结
4.1 内容回顾
讲技术是枯燥的,尤其是串烧了这么多论文,本次分享仅传达论文的sense,不重细节。回顾一下讲了哪些:
- 大模型起源的肩膀《Attention Is All You Need》,transformers衍生出两类大模型
- Encoder类是表征式任务的中流砥柱,BERT依然是NLP和跨模态中的顶梁柱
- Decoder在生成式任务中大放异彩,ChatGPT等席卷全球
- 生成式AI模型训练要谨慎
- 学术界使用RLHF来让模型拟合人类的偏好,确保生成的内容是安全的(非种族歧视、政治错误等)
- 也有RLAIF来让大模型去自监督自学习,完成自我进化
- 生成式AI模型训练很耗费资源
- 全参数微调很贵,促生了一系列微调方法:LoRA,Prefix-tuning,Adapter等。他们的数学本质一样,都是冻结原模型,增加可训练得旁路矩阵(某些可插拔)
- 不仅耗费机器资源,还耗费数据资源(模型和数据要权衡),模型也可以产生数据了!(self-instruct)
4.2 启示
- 我们如何去在AGI浪潮中乘风破浪呢?(以下为个人看法)
- 资源上支持大模型训练(这点是基础)
- 数据上可以和算法团队协作,走通RLHF、RLAIF、self-instruct或者其他有用的流程,建立一定的数据壁垒,训练优质模型,产生好内容
- 持续学习,主动学习,大模型的推理部署优化涉及到cuda编程等各个方面,迎难而上