大模型专栏介绍
😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本文为大模型专栏子篇,大模型专栏将持续更新,主要讲解大模型从入门到实战打怪升级。如有兴趣,欢迎您的阅读。
💡适合人群:本科生、研究生、大模型爱好者,期待与你一同探索、学习、进步,一起卷起来叭!
🔗篇章一:本篇主要讲解Python基础、数据分析三件套、机器学习、深度学习、CUDA等基础知识、学习使用AutoDL炼丹
🔗篇章二:本篇主要讲解基本的科研知识、认识数据和显卡、语言模型如RNN、LSTM、Attention、Transformer、Bert、T5、GPT、BLOOM、LLama、Baichuan、ChatGLM等系列、强化学习教程、大模型基础知识及微调等
🔗篇章三:本篇主要讲解智能对话、大模型基础实战如Ollama、Agent、QLoar、Deepspeed、RAG、Mobile Agent等、大模型领域前沿论文总结及创新点汇总
目录
- 基础概念
- Embedding
- Tokenilzer
- RNN
- LSTM
- Attention
- Attention
- Self-Attention
- Transformer
- Bert
- Bert
- RoBERTa
- ALBERT
- XLNet
- SpanBERT
- MT-DNN
- T5
- GPT
- GPT-1
- GPT-2
- GPT-3
- Instruct-GPT
- GPT-4
基础概念
- Baseline:比较算法好坏中作为
“参照物”
而存在,在比较中作为基线;目的是比较提出算法的性能或者用以彰显所提出的算法的优势;- Baseline Model(基准模型):在前人的模型基础上新增加了一些组件,别人也基本都是在这个模型上进行修改,那这个模型就叫做基准模型【因为基准模型是地基,必须
越牢固越好
,因此我们强调必须得通过近两年的顶刊顶会找,⽽且越新越好
。】
- Baseline Model(基准模型):在前人的模型基础上新增加了一些组件,别人也基本都是在这个模型上进行修改,那这个模型就叫做基准模型【因为基准模型是地基,必须
- Benchmark:评价算法好坏的一种
规则和标准
,即目前的模型能做到的比较好的效果; - SOTA(State-of-the-Art):
业界顶尖水平
,用于描述某领域中取得某个任务上当前最优效果的模型。 - Checkpoint:模型训练过程中保存的
模型状态
。这些检查点通常包括模型的参数(权重和偏置)、优化器状态和其他相关的训练信息。通过保存检查点,您可以在训练过程中定期保存模型的当前状态,以便在需要时恢复训练或用于模型评估和推理。 - 版本模型:
- Base版本模型:是模型的
标准版本
,提供了模型的基本架构和参数配置。训练数据通常来自于大规模的文本语料库,例如互联网上的网页、书籍、新闻文章等。这些数据被用于训练模型,以学习语言的统计规律和语义表示。 - Chat版本模型:是
专门为对话和交互式任务优化
的模型版本。训练数据可能会包括更多的对话文本,例如聊天记录、问答对、社交媒体上的对话等。此外,Chat版本模型的训练数据可能还会经过筛选和预处理,以确保数据的质量和相关性。 - 4Bit版本模型:是通过
模型量化
技术实现的,其中模型的权重和激活函数的精度从通常的32位浮点数减少到4位。这种量化可以显著减少模型的大小和推理时的计算需求。4Bit版本模型的训练数据与Base版本模型类似,但在训练过程中可能会采用一些特殊的技术和算法,以适应量化带来的精度损失。
- Base版本模型:是模型的
- 消融实验(Ablation Study):用于
确定一个条件或参数对结果的影响程度
。当研究者提出了一个新的方案或方法时,消融实验通过逐一控制一个条件或参数,来观察结果的变化,以确定哪个条件或参数对结果的影响更大。- 针对
可以去除
的部分/模块/选项,可以采用去除
的方式来设计实验; - 针对
不可以去除
的变量/超参数等,可以采用Grid Search
等方法来展示参数对于系统的影响- Grid Search:一种调优方法,在参数列表中进行穷举搜索,对每种情况进行训练,找到最优的参数
- 针对
Embedding
🚩问题:在机器学习算法中,我们经常会遇到分类特征
,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的
。通常我们需要对其进行特征数字化
。
🚩特征数字化:将分类变量(或称为离散特征、无序特征)转换为一种适合机器学习算法处理的格式。
🚩独热(One-Hot)编码:又称为一位有效编码
,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。例如:猫的编码是 [1, 0, 0, 0],狗的编码是 [0, 1, 0, 0],乌龟的编码是 [0, 0, 1, 0],鱼的编码是 [0, 0, 0, 1]
One-Hot编码的优点:
- 解决分类数据处理问题【特征数字化】:独热编码将离散分类特征转换为机器学习算法易于处理的二进制格式,提高了算法对离散特征的处理能力。
- 避免引入数值偏误:通过将每个类别映射到独立的二进制向量,独热编码
消除了类别间可能存在的错误数值关系
,从而避免了算法基于这些关系做出不准确的预测。
One-Hot编码存在的问题:
- 大量为 0 的稀疏矩阵;
- 硬编码,特征没有语义信息;【
任意两者向量的相似度结果都为 0
,即任意二者都不相关,也就是说独热表示无法解决词之间的相似性问题】 - 特征维度较高,且每个特征都彼此独立,训练所需要的数据量高,容易导致维度灾难;
🚩Embedding:用一个低维稠密向量
来表示一个对象,使得这个向量能够表达相应对象的某些特征,同时向量之间的距离能反应对象之间的相似性
。——王喆《深度学习推荐系统》【离散实例连续化的映射】
- Image Embedding(图像嵌入)
- 定义与目的:图像嵌入是将
图像转换为低维向量
,以简化处理并保留关键信息供机器学习使用。 - 方法与技术:利用深度学习模型(如CNN)抽取图像特征,通过降维技术映射到低维空间,训练优化嵌入向量。
- 应用与优势:图像嵌入广泛应用于图像分类、检索等任务,提升模型性能,降低计算需求,增强泛化能力。
- 定义与目的:图像嵌入是将
- Word Embedding(词嵌入):
- 定义与目的:词嵌入是将单词映射为数值向量,以
捕捉单词间的语义和句法关系
,为自然语言处理任务提供有效的特征表示。 - 方法与技术:词嵌入通过预测单词上下文(如Word2Vec)或全局词频统计(如GloVe)来学习,也可使用深度神经网络捕捉更复杂的语言特征。
- 应用与优势:词嵌入广泛应用于文本分类、机器翻译等自然语言处理任务,有效提升模型性能,因其能捕捉语义信息和缓解词汇鸿沟问题。
- 定义与目的:词嵌入是将单词映射为数值向量,以
Tokenilzer
- 介绍:即
分词器
,是一种将文本拆分成一系列词汇单元(Token)的工具。 - 原因:模型对语言结构一无所知,因此我们需要在将其输入模型之前将其分成块或标记。
- 目标:在NLP中,Token可以是
一个单词、一个字符或者一个子词
。Tokenizer的作用就是将连续的文本切分成这些离散的Token,并为每个Token分配一个唯一的标识符(ID)
,以便于模型进行后续的处理。 - 分词粒度
- 单词级别
- 例句:he is likely to be unfriendly to me
- 分词:[‘he’, ‘is’, ‘likely’, ‘to’, ‘be’, ‘unfriendly’, ‘to’, ‘me’]
- 字符级别
- 例如:he is likely to be unfriendly to me
- 分词:[‘h’, ‘e’, ‘i’, ‘s’, ‘l’, ‘i’, ‘k’, ‘e’, ‘l’, ‘y’, ‘t’, ‘o’, ‘b’, ‘e’, ‘u’, ‘n’, ‘f’, ‘r’, ‘i’, ‘e’, ‘n’, ‘d’, ‘l’, ‘y’, ‘t’, ‘o’, ‘m’, ‘e’]
- 子词级别:
- 例句:he is likely to be unfriendly to me
- 分词:[‘he’, ‘is’, ‘like’, ‘ly’, ‘to’, ‘be’, ‘un’, ‘friend’, ‘ly’, ‘to’, ‘me’]
- 单词级别
- 算法
- WordPiece
- BPE(Byte-Pair Encoding)
- BBPE(Byte-level BPE)
- ULM(Unigram Language Model)
- SentencePiece
RNN
- 贡献:解决了短距离的时序依赖问题。与传统神经网络相比,每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。
即RNN前面所有的输入都会对未来的输出产生影响。
- 存在问题:远距离的梯度消失,不适合长距离依赖;无法并行训练,导致训练成本较高;
LSTM
- Forget Gate(遗忘门):
- Input Gate(输入门):
- Cell State(细胞状态):
- OutPut Gate(输出门):
贡献:一定程度上解决梯度消失和梯度爆炸的问题
为什么采用tanh函数?
- Sigmoid函数比Tanh函数
收敛饱和速度慢、值域范围更窄
- tanh的
均值是0
,Sigmoid均值在0.5左右,均值在0的数据显然更便于数据处理 - tanh的函数
变化敏感区间更大
- 对两者求导,发现
tanh对计算的压力更小
,直接是1-原函数的平方,不需要指数操作
Attention
Attention
- 大白话理解Attention(注意力):
从关注全部到关注重点
。从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略不重要的信息。
- 理解过程:
- 1)计算比较 Q 和 K 的相似度
- 2)将得到的相似度进行 softmax 操作,进行归一化
- 3)针对计算出来的权重 α i {α_i} αi,对 V 中的所有 values 进行加权求和计算,得到 Attention 向量
- 贡献:Attention机制可以更加好的
解决序列长距离依赖问题
,并且具有并行计算能力
。
Self-Attention
- 大白话理解作用:假设有一句话:
The animal didn't cross the street because it was too tired
,Self Attention机制能够让模型把it和animal关联起来
。 - 大白话理解过程:
- 1)计算Query 向量,Key 向量,Value 向量
- 2)计算Attention Score(注意力分数):例如"Thinking" 的 Attention Score,通过计算
"Thinking" 对应的 Query 向量
和其他位置的每个词的 Key 向量
的点积
- 3)把每个分数除以 d k \sqrt{d_k} dk: d k {d_k} dk是Key向量的长度,保证在反向传播时,求取梯度更加稳定
- 4)通过Softmax归一化,使得
分数都是正数并且加起来等于1
,这些分数决定了在编码当前位置的词
对所有位置的词
分别有多少的注意力
。 - 5)把上一步得到的向量全部相加
- 理解矩阵运算:
- 1)计算 Query,Key,Value 的矩阵:把所有词向量放到一个矩阵X,分别和3个权重矩阵
W
Q
W^Q
WQ、
W
K
W^K
WK、
W
V
W^V
WV相乘,得到Q、K、V矩阵。
矩阵 X 中的每一行,表示句子中的每一个词的词向量
,长度是 512。Q,K,V 矩阵中的每一行表示 Query 向量,Key 向量,Value 向量
,向量长度是 64。
- 2)计算Self Attention:
- 1)计算 Query,Key,Value 的矩阵:把所有词向量放到一个矩阵X,分别和3个权重矩阵
W
Q
W^Q
WQ、
W
K
W^K
WK、
W
V
W^V
WV相乘,得到Q、K、V矩阵。
Masked Self Attention:
- 理解意思:mask就是沿着对角线把灰色的区域用0覆盖掉,不给模型看到未来的信息
- 理解过程:
- 1)通过将Query向量乘以Key矩阵来计算注意力分数:
- 2)加上一个mask矩阵(上三角形矩阵)
屏蔽掉当前还未输入的词
,一般是将我们想要屏蔽的位置设置为−∞或一个非常大的负数
- 3)对每一行进行softmax:
- 1)通过将Query向量乘以Key矩阵来计算注意力分数:
Transformer
🔗推荐教程:https://jalammar.github.io/illustrated-transformer
🔗Paper:Attention Is All You Need
Positional Encoding(位置编码):
- 引入原因:Self Attention 的 Q、K、V 三个矩阵是由同一个输入
X
1
=
(
x
1
,
x
2
,
.
.
.
,
x
n
)
{X_1=(x_1, x_2, ... , x_n)}
X1=(x1,x2,...,xn)线性转换而来,也就是说对于这样的一个
被打乱
序列顺序的 X 2 = ( x 2 , x 1 , . . . , x n ) {X_2=(x_2, x_1, ... , x_n)} X2=(x2,x1,...,xn)而言,由于 Attention 值的计算最终会被加权求和,也就是说两者最终计算的 Attention 值都是一样的
。 - 位置编码分类:
- 绝对位置编码:给每个位置的位置信息建模。假如模型最大序列长度为 512,那么
预测阶段输入超过 512 的序列就无法进行处理
。 - 相对位置编码:没有完整建模每个输入的位置信息,而是在计算Attention的时候
考虑当前位置与被Attention的位置的相对距离
。 - 自定义位置编码:例如LLaMA的旋转位置编码,
兼顾了绝对位置信息与相对位置信息
。
- 绝对位置编码:给每个位置的位置信息建模。假如模型最大序列长度为 512,那么
- 公式: PE是Positional Encoding的缩写,其中pos表示位置,i表示维度,
d
m
o
d
e
l
d_{model}
dmodel表示位置向量的向量维度,2i、2i+1表示奇偶数
- X的词向量为 X f i n a l e m b e d d i n g = E m b e d d i n g + P o s i t i o n a l E m b e d d i n g X_{final_embedding} = Embedding + PositionalEmbedding Xfinalembedding=Embedding+PositionalEmbedding
某个单词的位置信息是其他单词位置信息的线性组合
,这种线性组合就意味着位置向量中蕴含了相对位置信息。
Multi-head Attention(多头注意力机制):
- 多头的理解:将线性变换之后的QKV切分为H份,然后对每一份进行后续的self-attention操作。即
将高维向量拆分成了H个低维向量,在H个低维空间里求解各自的self-attention
。- 赋予 attention 层多个“子表示空间”;
- 扩展了模型关注不同位置的能力;
- 赋予 attention 层多个“子表示空间”;
Add & Norm:
- Add是一种残差连接,用于
缓解梯度消失
,这一概念在ResNet中被提出:
- Add的结果经过LN进行层归一化:
概念区分Normalization
:
- Batch-Normalization:每一层的输出归一化成均值为0,方差为1的分布。这样使得
激活输入值落在非线性函数对输入比较敏感的区域
,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度
。- BN用于激活层之前
- BN的目的:将数据规整到统一区间,减少数据的发散程度,降低网络的学习难度。BN的精髓在于归一化之后,使用可训练γ、β作为还原函数,在一定程度上保留原数据的分布,让模型在训练过程通过调整γ、β来决定保留原数据分布的程度。
- Layer-Normalization:LN
针对单个训练样本
进行,不依赖于其他数据,因此可以避免 BN 中受 mini-batch 数据分布影响的问题,可以用于小 mini-batch 场景、动态网络场景和 RNN,特别是自然语言处理领域。- LN 不需要保存 mini-batch 的均值和方差,节省了额外的存储空间。
Feed Forward:
- Feed Forward 层是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数:
- Feed Forward 结果再次经过Add&Norm后,就得到了Encoder的输出:
Decoder(解码器):
- 在解码器里,Self Attention 层只允许关注到输出序列中早于当前位置之前的单词
- Encoder-Decoder Attention层是使用前一层的输出来构造 Query 矩阵,而 Key 矩阵和 Value 矩阵来自于解码器最终的输出
最后的线性层和 Softmax 层:
- Decoder最终的输出:一个向量,其中每个元素是浮点数。
- 线性层:一个普通的全连接神经网络,可以把解码器输出的向量,映射到一个更长的向量,这个向量称为
logits 向量
。例如有 10000 个英语单词, logits 向量就会有 10000 个数字,每个数表示一个单词的分数
。 - Softmax 层:把这些分数转换为概率(把所有的分数转换为正数,并且加起来等于 1),选择最高概率的那个数字对应的词。
Bert
Bert
🔗Paper:Pre-training of Deep Bidirectional Transformers for Language Understanding
- Pre-training:通过大量数据预训练得到通用模型,后续基于通用模型进行微调。
- Deep:BERT-base采用12层Encoder,层数更深。
- Bidirectional:通过MLM任务实现上下文理解。
- Transformer:基于Transformer的Encoder。
- Language Understanding:Bert 是一个语言模型,通过深层双向Encoder实现语义理解。
- Self-supervised Learning:通过设计合理的训练任务,实现使用大量无监督数据进行训练。
BERT之预训练任务
- MLM(Masked Language Model):语言掩码模型
- 定义:在每一个训练序列中
以15%的概率(在CBOW 模型中,每个词都会被预测一遍)
随机地选中某个token进行MASK,当一个token被选中后,在对该位置的MASK进行预测。token有以下三种处理方式:- 80%的概率被[MASK]。如my dog is hairy—>my dog is [MASK]
- 10%的概率修改为随机的其他token。如my dog is hairy—>my dog is apple【该做法是为了缓解训练文本和预测文本的偏差带来的性能损失】
- 10%的概率不变。如my dog is hairy—>my dog is hairy【该做法是为了让 BERT 学会根据上下文信息自动纠错】
- 好处:
- 编码器不知道哪些词需要预测的,哪些词是错误的,因此
被迫需要学习每一个 token 的表示向量
双向编码器比单项编码器训练要慢
,但MLM 训练方法可以让 BERT获得超出同期所有预训练语言模型的语义理解能力
,牺牲训练效率是值得的。
- 编码器不知道哪些词需要预测的,哪些词是错误的,因此
- 定义:在每一个训练序列中
- NSP(Next Sentence Prediction):下句预测
- 定义:BERT 输入的语句将由两个句子构成,把训练样例输入到BERT模型中,用[CLS]对应的信息去进行二分类。其中
[SEP] 标签表示分隔符
;[CLS] 表示标签用于类别预测,结果为 1,表示输入为连续句对;结果为 0,表示输入为随机句对
:- 50%的概率保持原有顺序(标注为IsNext),如:[CLS]今天天气很糟糕[SEP]下午的体育课取消了[SEP]
- 50%的概率后面的句子被替换为文档的其他随机句B(标注为NotNext),如:[CLS]今天天气很糟糕[SEP]鱼快被烤焦啦[SEP]
- 好处:可以捕捉句子之间的语义联系
- 定义:BERT 输入的语句将由两个句子构成,把训练样例输入到BERT模型中,用[CLS]对应的信息去进行二分类。其中
经过上面两个任务的处理,训练数据如下所示:
Input1=[CLS] 我 今 天 要 [MASK] 课 [SEP] 上完 [MASK] 给 你 打 电 话 [SEP]
Label1=IsNext
Input2=[CLS] 大 模 型 [MASK] 术 发 展 很 快[SEP] 晚 [MASK] 吃 什 么 [SEP]
Label2=NotNext
Bert之输入
- Token Embeddings:采用look up的方式,将每个token转换成768维的向量。
Segment Embeddings
:BERT支持双句输入,Segment(0,1)用于区分a、b句。- Position Embeddings:采用训练式位置编码,通过look up获取位置编码。
BERT之Encoder
BERT-base:采用12层Transformer Encoder堆叠
,上一层的输出作为下一层的输入。
- layers=12
max_len=512
dim=768
Head=12
- param=110M
Bert之Finetune(下游任务改造)
- 句对分类任务:给定两个句子,判断它们的关系。如:两句是否相似,后者是否为前者的答案。
- 句对用
[SEP] 分隔符
拼接成文本序列,在句首加入标签 [CLS]
,将句首标签所对应的输出值作为分类标签
,计算预测分类标签与真实分类标签的交叉熵
,将其作为优化目标
,在任务数据上进行微调训练。
- 二分类任务:直接使用与 NSP 训练方法一样的输入和输出结构。
- 多分类任务:需要在句首标签 [CLS] 的输出特征向量后
接一个全连接层和 Softmax 层
,保证输出维数与类别数目一致
,最后通过arg max
操作(取最大值时对应的索引序号)得到相对应的类别结果。
- 示例:句对分相似性任务
- 任务:判断句子 “我很喜欢你” 和句子 “我很中意你” 是否相似
- 输入改写:“[CLS]我很喜欢你[SEP]我很中意你”
- 取 “[CLS]” 标签对应输出:[0.02, 0.98]
- 通过 arg max 操作得到相似类别为 1(类别索引从 0 开始),即两个句子相似
- 句对用
- 单句分类任务:给定一个句子,判断该句子的类别。如:判断情感类别、判断是否语义连贯。
- 在句首加入标签 [CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉熵,将其作为优化目标,在任务数据上进行微调训练。
- 二分类任务:直接使用与 NSP 训练方法一样的输入和输出结构。
- 多分类任务:需要在句首标签 [CLS] 的输出特征向量后
接一个全连接层和 Softmax 层
,保证输出维数与类别数目一致
,最后通过arg max
操作(取最大值时对应的索引序号)得到相对应的类别结果。
- 示例:语义连贯性判断任务
- 任务:判断句子“海大球星饭茶吃” 是否为一句话
- 输入改写:“[CLS]海大球星饭茶吃”
- 取 “[CLS]” 标签对应输出:[0.99, 0.01]
- 通过 arg max 操作得到相似类别为 0,即这个句子不是一个语义连贯的句子
- 在句首加入标签 [CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉熵,将其作为优化目标,在任务数据上进行微调训练。
- QA任务(文本问答):给定一个问句和一个蕴含答案的句子,找出答案在后句中的位置,例如:给定一个问题(句子 A),在给定的段落(句子 B)中标注答案的起始位置和终止位置。
- BERT引入了两个辅助向量
s(start,判断答案的起始位置) 和 e(end,判断答案的终止位置)
。以判断句子 B 中答案位置为例:- 将句子 B 中的每一个词得到的最终特征向量 T i ′ T_{i}^{′} Ti′经过全连接层(利用全连接层将词的抽象语义特征转化为任务指向的特征)
- 分别与向量 s 和 e 求内积,对所有内积分别进行 softmax 操作,即可得到词Tok m(m∈[1,M])作为答案其实位置和终止位置的概率。
- 取概率最大的片段作为最终的答案。
- 技巧:
- 用全连接层把 BERT 提取后的深层特征向量转化为用于判断答案位置的特征向量
- 引入辅助向量 s 和 e 作为答案其实位置和终止位置的基准向量,明确优化目标的方向和度量方法
- 示例:文本问答任务
- 任务:给定问句 “今天的最高温度是多少”,在文本 “天气预报显示今天最高温度 37 摄氏度” 中标注答案的起始位置和终止位置
- 输入改写:“[CLS]今天的最高温度是多少[SEP]天气预报显示今天最高温度 37 摄氏度”
- Softmax 结果:
- 对 Softmax 的结果取 arg max,得到答案的起始位置为 6,终止位置为 7,即答案为 “37 摄氏度”
- BERT引入了两个辅助向量
- 单句标注任务:给定一个句子,标注每个词的标签
- 在每个词的最终语义特征向量之后添加全连接层,将语义特征转化为序列标注任务所需的特征,单句标注任务需要对每个词都做标注,因此不需要引入辅助向量,直接对经过全连接层后的结果做 Softmax 操作,即可得到各类标签的概率分布
- 预测结果分为5 大类(IOBES),这是序列标注最常用的标注方法:
- O(非人名地名机构名,O 表示 Other)
- B-PER/LOC/ORG(人名/地名/机构名初始单词,B 表示 Begin)
- I-PER/LOC/ORG(人名/地名/机构名中间单词,I 表示 Intermediate)
- E-PER/LOC/ORG(人名/地名/机构名终止单词,E 表示 End)
- S-PER/LOC/ORG(人名/地名/机构名独立单词,S 表示 Single)
- 示例:命名实体识别(NER:Named Entity Recognition)任务
- 任务:给定句子 “爱因斯坦在柏林发表演讲”,根据 IOBES 标注 NER 结果
- 输入改写:“[CLS]爱 因 斯坦 在 柏林 发表 演讲”
- Softmax 结果:
- 对 Softmax 的结果取 arg max,得到最终地 NER 标注结果为:“爱因斯坦” 是人名;“柏林” 是地名
RoBERTa
- 论文名称:RoBERTa:A Robustly Optimized BERT Pretraining Approach(强力优化的BERT方法)
- 论文地址:https://arxiv.org/abs/1907.11692
- 论文代码:https://github.com/pytorch/fairseq
- 作者:Yinhan Liu 、Myle Ott, et al.
- 改进:
- 模型规模、算力和数据:
- 更大的模型参数量(模型使用 1024 块 V100 GPU 训练了 1 天的时间)
- 更大的batch_size(batch_size 256 -> batch_size 8K)
- 更多的训练数据(16GB -> 160GB)
- 最初的BERT使用16GB BookCorpus数据集和英语维基百科进行训练
- RoBERTa采用 160 G 训练文本
- BOOKCORPUS 和英文维基百科:原始 BERT 的训练集,大小 16GB。
- CC-NEWS:包含2016年9月到2019年2月爬取的6300万篇英文新闻,大小 76 GB(经过过滤之后)。
- OPENWEBTEXT:从 Reddit 上共享的 URL (至少3个点赞)中提取的网页内容,大小 38 GB 。
- STORIES:CommonCrawl 数据集的一个子集,包含 Winograd 模式的故事风格,大小 31GB 。
- 训练方法:
舍弃NSP任务
,并使用更长的序列长度;- 采用动态掩码。
在模型训练阶段实时计算掩码的位置和方法,能够最大限度的保证同一段文本在不同epoch下使用不同的掩码模式,提高了数据的复用效率。
- 原本的
BERT
采用的是static mask
的方式,就是在准备训练数据时,先对数据进行提前的mask
。 - 为了避免在每个epoch中使用相同的mask数据,充分利用数据,RoBERTa定义了dupe_factor,这样可以将训练数据复制dupe_factor份,然后
同一条数据可以有不同的mask
。注意这些数据不是全部都喂给同一个epoch,是不同的epoch
,例如dupe_factor=10, epoch=40,则每种mask的方式在训练中会被使用4次
。
- 原本的
- 使用更大的词表(30K -> 50K):Byte-Pair Encoding(BPE)是字符级和词级别表征的混合,支持处理自然语言语料库中的众多常见词汇。
- 原版的 BERT 实现使用字符级别的 BPE 词汇,大小为 30K,是在利用启发式分词规则对输入进行预处理之后学得的。
- RoBERTa采用了更大的 byte 级别 BPE 词汇表来训练 ,这一词汇表包含 50K 的 subword 单元,且没有对输入作任何额外的预处理或分词。
- 模型规模、算力和数据:
- 贡献:通过
更长时间地训练模型
,在更多数据
上使用更大的批次,移除下一句预测
目标,训练更长的序列
, 并动态更改应用于训练数据的屏蔽模式
可以显着提高性能
ALBERT
- 论文名称:ALBERT:A Lite BERT for Self-supervised Learning of Language Representations
- 论文地址:https://arxiv.org/abs/1909.11942
- 论文代码:https://github.com/google-research/albert
- 作者:Zhenzhong Lan, Mingda Chen, et al.
- 改进
- 词向量因式分解。BERT中 embedding 维度 E 与 Transformer 隐层维度 H一致,ALBERT 引入
词向量因式分解
方法解耦E和H,先将词向量编码到低维空间E,然后通过一个全连接层将E映射到H,计算复杂度从(VH)降低到(VE + EH); - Transformer
跨层参数共享
。ALBERT中每一层Transformer的参数都是一样的,类似于一个循环结构,每次都经过相同的Transformer层; - 引入
SOP
(Sentence Order Prediction)任务代替NSP任务,避免了主题预测,侧重于句子间的建模连贯性
- 词向量因式分解。BERT中 embedding 维度 E 与 Transformer 隐层维度 H一致,ALBERT 引入
- 贡献: 直接把同等量级的BERT缩小了10倍+,让普通用户有了运行GPT2、威震天的可能。
- 实验使用的
xlarge
是24层,2048维度,xxlarge是12层,4096维度- 在相同的模型训练时间下,ALBERT得到的效果确实比BERT好
- 在相同的模型推理时间下,ALBERT base和large的效果都是没有BERT好的,而且差了2-3个点
- 实验使用的
XLNet
SpanBERT
MT-DNN
T5
T5 (Transfer Text-to-Text Transformer):将所有 NLP 任务都转化成 Text-to-Text (文本到文本)任务
- 论文名称:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer,2020,JMLR
- 论文地址:https://arxiv.org/abs/1910.10683
- 论文代码:https://github.com/google-research/text-to-text-transfer-transformer
- 论文作者:Raffel C, Shazeer N, Roberts A, et al.
- T5的输入格式和输出格式:绿色部分表示翻译任务,红色和黄色部分分别表示CoLA任务和STS-B任务,蓝色部分表示摘要生成任务,左侧的框表示T5的输入样例,右侧的框则是对应的输出结果
- Encoder-Decoder:Transformer 基本结构,分成 Encoder 和 Decoder 两部分,对于 Encoder 部分,是双向注意力,词与词之间互相可见,之后结果输给 Decoder,Decoder 部分当前时间步的词汇只能看到之前时间步的词汇。
- Decoder-only:当前时间步词汇只能看到之前时间步词汇。GPT 全系列及目前主流大模型均为 Decoder-only 结构。
- Prefix LM:通过巧妙的 Attention 设计实现双向注意力与单向注意力的结合,一部分如 Encoder 一样能看到全体信息,一部分如 Decoder 一样只能看到过去信息。
GPT
- 介绍:Generative Pre-trained Transformer(GPT)系列是由
OpenAI
提出的非常强大的预训练语言模型
,这一系列的模型可以在非常复杂的NLP任务中取得非常惊艳的效果,例如文章生成,代码生成,机器翻译,Q&A等,而完成这些任务并不需要有监督学习进行模型微调。对于一个新的任务
,GPT仅仅需要非常少的数据
便可以理解这个任务的需求并达到接近或者超过state-of-the-art的方法。
GPT-1
- 论文名称:Improving Language Understanding by Generative Pre-Training,2018
- 论文地址:https://www.mikecaptain.com/resources/pdf/GPT-1.pdf
- 论文代码:https://github.com/huggingface/transformersGPT
- 论文作者:Alec Radford, Karthik Narasimhan, et al.
- 关键词和摘要总结:
- 关键词:自回归,生成式,无监督预训练,有监督微调
- 摘要总结:
- 研究设计和结论
- 问题: 如何去学习更为深层次的语义信息表达?所学习的语义信息能否有效的帮助目标任务?
- 方法:
先通过在无标签的数据上学习一个生成式的语言模型,然后再根据特定下游任务进行微调
- 数据集:BooksCorpus数据集,这个数据集包含7000本没有发布的书籍。
- 数据集拥有更长的上下文依赖关系,使得模型能学得更长期的依赖关系;
- 这些书籍因为没有发布,所以很难在下游数据集上见到,更能验证模型的泛化能力。
- 无监督与训练:给定一个无标签序列u = {
u
1
,
u
2
,
.
.
.
,
u
n
u_1,u_2, ..., u_n
u1,u2,...,un},采用标准的语言模型最大化下列目标。其中,k是滑动窗口大小,P是条件概率,Θ是模型参数,这些参数通过SGD进行优化。【
希望模型生成的句子尽量靠近当前句子
】 - 模型:使用了12个transformer的decoder block
- U是上下文token,n是层数, W e W_e We是token embedding矩阵, W p W_p Wp是position embedding矩阵
- 有监督微调:
- 任务:
- 分类(Classification):对本文进行分类。比如给定一段文字,判断表达了积极/消极情感。
- 文本蕴含(Entailment):给定前提,判断这个前提是否支持一个假设。例如:premise为“我在周六早上被闹钟闹醒,然后打开了电脑”,是否能够推出“一个打工人在周末起早来打工”?
- 相似性(Similarity):给定两段文本,判断它们表示的意思是否相似。
- 多选题(Multiple Choice):给定一段文本和若干个答案,判断正确答案。
- 对于一个有标签的数据集C,每个实例有m个输入token,对于每个实例的标签y,首先将tokens输入到训练好的预训练模型中,得到最终的特征向量hlm,然后再通过一个全连接层得到预测结果y:
- 需要最大化的目标为:
- 作者发现
将语言建模作为微调的辅助目标
有利于提升模型的泛化性并加速学习
。其中,λ用于控制两个任务的权值,λ的取值一般为0.5。当进行有监督微调的时候,只训练输出层的 W y W_y Wy和分隔符(delimiter)的embedding值(因为分隔符在无监督预训练过程中模型没有见过)。
- 任务:
- 数据集:BooksCorpus数据集,这个数据集包含7000本没有发布的书籍。
- 实验结果:
- 在有监督学习的12个任务中,
GPT-1在9个任务上的表现超过了原有SOTA模型
。 - 在zero-shot任务中,GPT-1的模型要比基于LSTM的模型稳定,且随着训练次数的增加,GPT-1的性能也逐渐提升,表明
GPT-1有非常强的泛化能力
。 - 能够用到和有监督任务无关的其它NLP任务中。GPT-1证明了
transformer对学习词向量的强大能力
,在GPT-1得到的词向量基础上进行下游任务的学习,能够让下游任务取得更好的泛化能力。对于下游任务的训练,GPT-1往往只需要简单的微调便能取得非常好的效果。 - GPT-1
在未经微调的任务上虽然也有一定效果,但是其泛化能力远远低于经过微调的有监督任务
,说明了GPT-1只是一个简单的领域专家,而非通用的语言学家。
- 在有监督学习的12个任务中,
GPT-2
- 论文名称:Language Models are Unsupervised Multitask Learners,2019
- 论文地址:https://insightcivic.s3.us-east-1.amazonaws.com/language-models.pdf
- 论文代码:https://github.com/openai/gpt-2
- 论文作者:Alec Radford, Jeffrey Wu, et al.
- 期刊:OpenAI blog
- 关键词和摘要总结:
- 关键词:
去除fine-tune
,聚焦zero-shot
,通过提示完成下游任务 - 摘要总结:在GPT-1的基础上进一步提升了模型的量级和分词方法,使得在完全没有fine-tune的情况下模型在多个下游任务表现良好。
- 关键词:
- 研究设计和结论
- 问题: 在没有大量特定任务数据集的监督下,如何学习并执行多种任务
- 方法:通过在数据集WebText上训练模型,研究其在零样本(zero-shot)设置下执行多种自然语言处理任务的能力。
- WebText:GPT-2 的数据取自于 Reddit 上 at least 3 karma 的文章,命名为 WebText。数据集共有约800万个文本,累计体积约40G。为了避免和测试集的冲突,WebText 移除了涉及Wikipedia的文章。
- 模型改进:
- 将Layer Normalization移动到每个子块的输入处;
- 在最后一个self-attention后增加Layer Normalization;
- 残差层的参数初始化根据网络深度进行调节;
- 扩展词汇表到50,257个词;
- 增加上下文大小到1024个词;
- 使用更大的批量大小为512。
- 实验结果:
- 在7个测试的8个语言建模数据集中,GPT-2在零样本设置下达到了最先进的结果,但仍然
在WebText上存在欠拟合
。 - 在阅读理解(CoQA数据集)、翻译(WMT-14 Fr-En)、摘要(CNN和Daily Mail)和问答(Natural Questions)等多个任务中,GPT-2表现出有竞争力甚至最先进的结果。
- 在7个测试的8个语言建模数据集中,GPT-2在零样本设置下达到了最先进的结果,但仍然
- 论文贡献:
- 优点:证明了
增加模型容量可以显著提高在多种任务上的性能
。 - 缺点:GPT-2在经过预处理的语料库上面测试效果并不理想,这很可能是由于byte-level BPE的关系。
- 优点:证明了
GPT-3
- 论文名称:Language Models are Few-Shot Learners,2020
- 论文地址:https://arxiv.org/abs/2005.14165
- 论文代码:https://github.com/openai/gpt-3
- 论文作者:Tom B. Brown, Benjamin Mann, et al.
- 关键词和摘要总结:
- 关键词:庞然大物,in-context learning,zero-shot&one-shot&few-shot
- 摘要总结:GPT-3模型
参数达到175B
,它从极致的zero-shot回到few-shot
,是彼时最庞大以及最强大的NLP模型
。
- 研究设计和结论
- 问题: 如何让语言模型在没有大量任务特定微调数据集的情况下,通过少量示例或简单指令学习新的语言任务?
- 方法:
- 模型调整:
- GPT-3的
单词embedding大小
从GPT-2的1600增加12888; 上下文窗口大小
从GPT-2的1024增加到GPT-3的2048;Adam优化器
,β_1=0.9,β_2=0.95,ε= 10-8;- 使用与Sparse Transformer类似的
dense and locally banded sparse attention结构
。- dense attention:每个token之间两两计算attention,复杂度O(n²)。
- sparse attention:每个token只与其他token的一个子集计算attention,复杂度O(n*logn)。
- sparse attention除了
相对距离不超过k以及相对距离为k,2k,3k,...的token
,其他所有token的注意力都设为0。 - sparse attention的优势:
减少注意力层的计算复杂度
,节约显存和耗时,从而能够处理更长的输入序列;- 具有
“局部紧密相关和远程稀疏相关”
的特性,对于距离较近的上下文关注更多,对于距离较远的上下文关注较少;
- sparse attention存在的问题:自然语言的内容存在上下文关系,
稀疏的attention形式会损失一定的上下文关系
,也会导致对长文本建模的效果变差
。
- sparse attention除了
- GPT-3的
- 模型调整:
- 直接使用预训练模型进行预测,提出了三种下游任务形式:zero-shot,one-shot,few-shot
- 实验结果:
- 参数来对下游任务的影响:
- 任务表现:
- 翻译任务:在英法、法英、英德、德英、英罗、罗英等语言对的翻译任务中,GPT-3
在少量样本学习
设置下表现出色,尤其是在英法和德英翻译任务中。 - 问答任务:在TriviaQA、Natural Questions和WebQuestions等问答数据集上,GPT-3在零样本、单样本和少量样本学习设置下均表现出色,尤其是在TriviaQA上达到了71.2%的准确率。
- 阅读理解:在CoQA、DROP、QuAC、SQuAD 2.0和RACE等阅读理解数据集上,GPT-3
在少量样本学习
设置下表现出色,尤其是在CoQA上达到了85.0的F1分数。 - Winograd Schema Challenge:在Winograd Schema Challenge和Winogrande数据集上,GPT-3在零样本、单样本和少量样本学习设置下均表现出色,尤其是在Winograd上达到了88.3%的准确率。
- 常识推理:在PIQA、ARC和OpenBookQA等常识推理数据集上,GPT-3在
少量样本学习
设置下表现出色,尤其是在PIQA上达到了82.8%的准确率。 - 文本合成:GPT-3能够生成人类评估者难以区分的新闻文章样本,这表明其在
文本合成方面的能力
。
- 翻译任务:在英法、法英、英德、德英、英罗、罗英等语言对的翻译任务中,GPT-3
- 论文贡献:
- 优点:对GPT进行少样本微调要比零样本微调更可以发掘模型的涌现能力
- 缺点:GPT-3存在
“幻觉”问题
,很多情况下不会按照用户的指令,语言模型的目标应该是预测下一个token,而不是“follow the user’s instructions helpfullyand safely”。
Instruct-GPT
- 论文名称:Training language models to follow instructions with human feedback,2022
- 论文地址:https://arxiv.org/abs/2203.02155v1
- 论文代码:
- 论文作者:Long Ouyang, Jeff Wu, et al.
- 关键词和摘要总结:
- 关键词:Human Feedback、Supervised Learning、Reinforcement Learning
- 摘要总结:
- 研究设计和结论
- 问题: 大多数LLM都存在“幻觉”问题,语言模型的目标是“misaligned”,而不是“follow the user’s instructions helpfully and safely”。
- 方法:
- 定义语言模型对齐三个目标:
- helpful: they should help the user solve their task;
- honest: they shouldn’t fabricate information or mislead the user;
- harmless: they should not cause physical, psychological, or social harm to people orthe environment;
- 使用RLHF(reinforcement learning from human feedback):
- 有监督微调:收集有监督数据,
微调大语言模型(SFT:supervised fine-tuning)
; - 奖励模型训练:收集对比数据,训练
reward model(RM)
; - 强化学习对齐:基于
PPO算法
通过reward model对齐大语言模型;
- 有监督微调:收集有监督数据,
- 早期的InstructGPT收集标注数据:
- Plain:让标注人员随意发挥,提出任意任务类型,确保任务的多样性;
- Few-shot:指定instruction,让标注人员给出多组qeury/response对;
- User-based:根据OpenAI-API收集到的实际用户使用case,让标注者编写对应prompt;【OpenAI提供了Playground接口,让用户实际体验,收集用户的问题并进行筛选(脱敏,每个用户ID限制200条prompts,并基于用户ID划分训练集、验证集和测试集),用于后续模型的迭代更新】
- 定义语言模型对齐三个目标:
- 实验结果:
- 相比于GPT3(175B):
- instructGPT(
1.3B
)的输出更好(这里-ptx指的是在PPO训练中引入预训练数据的梯度更新,帮助模型在保持对人类反馈的敏感性的同时,减少在某些公共NLP任务上的性能损失,防止过拟合)
- instructGPT的
真实性
(truthfulness)有所提高(TruthfulQA); - instructGPT在
生成有毒文本方面(包含不适当、有害、偏见性或可能对用户造成心理、情感或社会伤害的文本内容)
有小幅改善(RealToxicityPrompts),但没有解决偏见问题
;
- instructGPT(
- RLHF的训练过程
并没有使得模型在原有能力上有明显下降
;
- 相比于GPT3(175B):
- 论文贡献:
- 优点:
- instructGPT能够满足(泛化到)没有生成任何训练数据的标注人员的偏好;
- instructGPT模型在RLHF数据分布之外的指令上,也具有很好的泛化能力;
- 缺点:
- 简单错误:InstructGPT仍然会犯一些简单的错误,例如未能遵循指令、编造事实或在简单问题上给出过长的回答。
- 公开的NLP benchmark不能真实反映出InstructGPT的优势(数据视角与人类视角的差异);
- 优点:
GPT-4
- 论文名称:GPT-4 Technical Report,2023
- 论文地址:https://arxiv.org/abs/2303.08774
- 论文代码:
- 论文作者:OpenAI, et al.
- 关键词和摘要总结
- 关键词:Large-scale、Multi-modal
- 摘要总结:GPT-4是一个多模态的大模型,基础结构仍然是Transformer+预测下一个词的目标函数
- 研究设计和结论
- 问题: 如何增强理解生成文本的能力,尤其在复杂且存在细微差异的场景。
- 方法:
- 实验结果:
模型损失与模型计算量满足幂律关系
,论文对这一论点进行了论证,用和GPT-4相同的训练方法训练参数/计算量更小的模型
,得到一组compute VS loss的数据对
,再用这些数据拟合一个幂律模型
,发现GPT-4恰好在该幂律模型上,说明GPT-4的loss是可以被精准预测的。- GPT-4很好的解决了
Inverse scaling prize(大模型不擅长任务)
中的hindsight neglect任务
。 - GPT-4在多种考试和基准测试中表现出色
- 论文贡献
- 优点:多模态能力
- 缺点:
- 生成内容并不是绝对可靠,要在法律、金融、医疗等领域谨慎使用其生成内容;
- 模型本身存在各种各样的偏见;
- 由于训练周期的问题,GPT-4的知识体系截止到2021年9月;
- 会犯非常简单的推理错误;
- 容易受骗,容易被用户引导而犯错;
- GPT-4非常自信,及时回答错误也非常自信;
- 仍存在安全性的问题,例如生成有害内容;
📌 [ 笔者 ] 文艺倾年
📃 [ 更新 ] 2024.9.14
❌ [ 勘误 ] /* 暂无 */
📜 [ 声明 ] 由于作者水平有限,本文有错误和不准确之处在所难免,
本人也很想知道这些错误,恳望读者批评指正!