大模型学习笔记
基础
NLP基础任务
- 词性标注:每一个词的词性(名词等)
- 实体识别:客观实体的识别,例如人名,时间等
- 共指消解:代词指代内容的识别
- 语法依赖关系:识别语法关系
词表示
one-hot vector:将词表达为一个0-1向量,向量的长度为词表的长度,,例如[0,0,0,1,0,0...]
缺点: 每个词向量都是正交的,无法计算词的相似性
上下文表示:词向量长度也是词表的长度,但是表示的是上下文其他词语出现的次数
缺点: 对空间存储需求大,且出现频率低的词,其词向量很稀疏
word embeding:利用深度学习将词投影到词向量,例如word2vec
语言模型
两个基本能力:
- 判断一个词序列组成一个句子的概率
- 判断下一个词出现的概率
N-gram
根据前面出现的n-1个词计算出现第n个词的概率
缺点:n越大,对存储的要求越大,前文越长,统计结果很稀疏,且无法关注词的相关性
例如 the cat is walking 和 the dog is running,按照n-gram计算相似度为0
上述方法最后的输出都是softmax之后,输出一个和词表长度一样的向量,缺点是计算资源和存储资源消耗过多,现有两种处理方法
Hierarchical Softmax
根据词表建立哈夫曼树
则输出方式变为,经过sigmoid(不需要进行所有量的指数运算了)后输出向量,向量的长度与哈夫曼树的节点相同,代表在每个节点选择左边或右边的概率
负采样
也就是在输出时,不对所有节点都进行softmax,而是选取少量负样本进行softmax,例如下面这个例子,从too预测never,只需要选择少量负样本(非never的词),一起进行softmax即可
sub-sampling
用来平衡常见词和罕见词,对于“的”等这样的常见词应该去除,下面这个公式表示当一个词语出现次数越多,其被去除的概率越大
soft sliding window 动态滑动窗口
前面在进行Word2vec时,滑动窗口是固定的,这意味这其认为在窗口内的所有词地位都是一样的
但是其实距离target较近的context词应该更重要,所有设置动态滑动窗口
先设置一个最大的窗口大小值s,然后在1到s中采样窗口进行训练,这样距离target较近的context词采样的次数会相比更多
自回归和自编码模型综述
https://zhuanlan.zhihu.com/p/483785458
Transformer
BPE(Byte-Pair Encoding)
https://zhuanlan.zhihu.com/p/701869443
原理:将词表先用空格分隔,然后构建基础词表,再根据词对的频率更新词表
例如:
拿到词表,先构建基础vocabulary,然后去查找词对的频率(例如"lo","es")等,然后发现频率最高的是“es”,于是更新vocabulary,加入“es”,去掉"e",得到新的词表
循环这个过程
优势
- 首先,直接按空格进行分词会导致词表大小不必要的庞大,如果希望限定词表大小还需要进一步考虑词表中 token 优先级的设定(即当容量填满时如何淘汰 token)
- 其次,按空格分词会导致分词粒度太大。这会导致大量的 out of vocabulary (OOV) 的问题,并且缺乏泛化性。下面我们具体解释下泛化性。
例如按空格分词的词表为 [rich, old, older, oldest, hard, harder, hardest]
,而如果使用子词 er
,est
,词表变为 [rich, old, hard, er, est]
,即节省了空间,还能在一定程度上学到词之间的相关性,避免一部分 OOV 问题(例如现有方案对于 richest
也可以进行合理的编码,而在原始的方案中会变成 unknown
)。
所以,用 sub-word (子词)进行编码的好处呼之欲出。既能节省空间,又能提升泛化性来解决 OOV 问题
PE(Positional Encoding)
不像rnn和lstm等可以天然记录词的位置信息,transfomer必须在输入层就加入位置信息:
当embeding输出是一个n*d的向量(n为词数,d为每个词embeding后的维度),那么PE结果也应该是n*d,然后总体的输入为BPE+PE
优势:
- 对于每个词,及词的每个维度的位置编码都是不一样的
- 从下面的公式可以看出,这种编码方式更关注词的相对位置,而不关注绝对位置i
Word Embedding
参考:Transformer 之逐层介绍 - 知乎 (zhihu.com)
在Transformer模型中,词嵌入(Word Embedding)通常有两种来源:预训练模型和从头开始训练。
-
预训练模型:在这种方法中,词嵌入是通过使用如Word2Vec、GloVe或其他预训练词嵌入模型在大规模文本数据集上训练得到的。这些预训练的词向量能够捕捉词与词之间的语义关系,并将每个词表示为一个固定维度的向量。然后,这些预训练的词嵌入可以作为Transformer模型的初始输入。
-
从头开始训练:在这种方法中,Transformer模型的词嵌入矩阵是随机初始化的,然后在训练过程中学习得到。这意味着模型将根据特定任务的数据从头开始学习词嵌入。这种方法不依赖于预训练模型,但可能需要更多的数据和计算资源来训练模型。
文本序列被映射成词汇表的单词ID的数字序列。嵌入层再将每个数字序列射成一个嵌入向量,这是该词含义的一个更丰富的表示。
在经过embedding之后,在进入attention之前,矩阵会乘一个
原因:embedding matrix的初始化方式是xavier init,这种方式的方差是1/embedding size,因此乘以embedding size的开方使得embedding matrix的方差是1,在这个scale下可能更有利于embedding matrix的收敛。
Transformer 3. word embedding 输入为什么要乘以 embedding size的开方 - 知乎 (zhihu.com)
Scaled Dot-Product Attention
参考Transformer模型是什么?带你从零详细解读Transformer模型(图解最完整版)_狐说天下的技术博客_51CTO博客
举一个例子说明QKV是什么:
假设现在有一些商品的名字(K)和他们的价格(V),然后我自己有一个购买意向(比如我一定买一些苹果,可能买一下橘子等等,既为Q),通过Q与K做运算得到一个商品的购买偏向,再与V运算得到我最终需要花费多少
计算公式:
Encoder
Batch Norm & Layer Norm
假设m个序列,每个序列长度为n,每一个词编码维度为d,编码后为(m,n,d)
batch norm是针对每一个维度进行规范化(进行m*d次),但是由于序列的长度是变化的,这样的方法会不稳定
layer norm是针对一个词的所有维度进行规范化,不需要考虑序列长度(进行m*n次)
训练优化方法
3-9 Transformer结构--优化Tricks_transformer中dropout放在哪里-CSDN博客
• Checkpoint averaging(检查点平均)
在训练期间,Transformer模型通常会保存多个检查点(即不同时间点的模型参数)。Checkpoint Averaging技巧是将这些检查点的参数进行平均,生成一个平均模型。这可以提高模型的泛化能力和鲁棒性,并减少过拟合的风险。
• ADAM optimizer(自适应矩估计优化器)
ADAM(Adaptive Moment Estimation)优化器是一种常用的优化算法,用于调整模型的参数以最小化损失函数。它结合了AdaGrad和RMSProp的优点,通过自适应地计算每个参数的学习率和动量,能够在训练过程中更有效地更新模型参数。
• Dropout during training at every layer just before adding residual(Dropout正则化)
Dropout是一种正则化技术,用于减少模型的过拟合。在Transformer模型中,Dropout被应用于每个层的输入,即在添加残差连接之前。这有助于随机地丢弃一部分神经元的输出,以减少它们之间的依赖关系,并增加模型的鲁棒性。
• Label smoothing(标签平滑)
标签平滑是一种用于改善模型训练和泛化能力的技巧。在Transformer模型中,当进行多类别分类任务时,传统的独热编码标签可能会导致过于自信的预测。通过标签平滑,将一部分概率质量从正确标签分配给其他标签,以减少模型的过拟合和提高泛化能力。
• Auto-regressive decoding with beam search and length penalties(自回归解码与束搜索和长度惩罚)
在生成目标序列时,Transformer模型通常使用自回归解码策略。这意味着模型每次生成一个单词时,将其作为输入,并使用生成的单词继续生成下一个单词,以此类推。为了得到更准确的生成结果,一种常用的策略是使用束搜索(beam search)来探索多个可能的生成序列,并根据得分进行选择。此外,为了避免生成过长的序列,可以使用长度惩罚来鼓励更短的输出序列。
并行计算
Transformer之十万个为什么?_teacher force-CSDN博客
transfomer的并行计算主要体现在训练阶段的encoder和decoder和预测阶段的encoder部分
encoder阶段
decoder阶段
①、teacher force
对于teacher force,是指在每一轮预测时,不使用上一轮预测的输出,而强制使用正确的单词,过这样的方法可以有效的避免因中间预测错误而对后续序列的预测,从而加快训练速度,而Transformer采用这个方法,为并行化训练提供了可能,因为每个时刻的输入不再依赖上一时刻的输出,而是依赖正确的样本,而正确的样本在训练集中已经全量提供了。值得注意的一点是:Decoder的并行化仅在训练阶段,在测试阶段,因为我们没有正确的目标语句,t时刻的输入必然依赖t-1时刻的输出,这时跟之前的seq2seq就没什么区别了。
②、masked self attention
我们在5里说到,多头注意力意味着多组KQV进行self-attention运算,不同于LSTM中的一步步的按部就班的运算,而是KQV的运算可以是同时计算的(这是因为每QKV的线性变换不同,计算互不影响)
注意transformer的运算复杂度,乘法运算不一定比LSTM少,但因为可以进行同步运算,因而可以依靠硬件加速。
multi-head attention 是每一个head都进行了KQV生成以及attention的计算,这些计算是同步实现的,也就是并行实现的,因而可以同时获取不同空间的特征。
Q&A
计算机视觉面试题-Transformer相关问题总结 - 知乎 (zhihu.com)
Transformer面试常见问题总结-CSDN博客
Transformer为何使用多头注意力机制?
提高模型的理解和表达能力,不同的头关注的是不同层次的信息,例如对于一篇文稿,有的头关注的是字体,有的头关注的是颜色,有的头关注的是语法等,当然Transformer是一个不可解释的模型,这一切都是我们的假设
Transformer为什么Q和K使用不同的权重矩阵生成,为何不能使用同一个值进行自身的点乘?
因为Q和K代表的信息不同,Q表示的是查询信息,K代表的是键信息,使用不同的权重能使其更好的发挥自己的作用,增强表达能力和泛化能力,如果使用同一个,会发现结果是一个对称矩阵,投影到了一个空间,泛化性能很差
在计算attention时,为什么进行softmax之前需进行scaled(为什么除以dk的平方根)
在计算self-attention时,需要进行softmax操作,以计算每个输入序列位置对其他位置的注意力权重。为了避免softmax函数的指数计算导致数值溢出或下溢,Transformer模型中使用了scaled dot-product attention,即在softmax之前对向量点乘结果进行了缩放操作,用于控制点乘结果的大小。
具体来说,该缩放操作是将点乘结果除以一个值,这个值是输入向量的维度的平方根,即dk的平方根,其中dk表示每个向量的维度。这个缩放因子的作用是:当输入向量的维度增加时,点乘结果的大小也会增加,导致softmax函数的指数计算变得困难,缩放因子能够使点乘结果的大小保持在一个合适的范围内,从而提高计算的稳定性。Transformer面试常见问题总结-CSDN博客
简单介绍一下Transformer的位置编码?有什么意义和优缺点?
计算机视觉面试题-Transformer相关问题总结 - 知乎 (zhihu.com)
其他位置编码方法?
六种位置编码的代码实现及性能实验 - 知乎 (zhihu.com)
大语言模型中常用的旋转位置编码RoPE详解:为什么它比绝对或相对位置编码更好?-腾讯云开发者社区-腾讯云 (tencent.com)
ELMo
参考
00 预训练语言模型的前世今生(全文 24854 个词) - B站-水论文的程序猿 - 博客园
一个专门做词向量的模型,解决问题:word2vec无法解决一词多义的问题
- E1:是对单词的简单编码,类似与word2vec,使用的是cnn编码,也无法区分一词多义
- E2,E3:本质上采用双向LSTM,理解每一个单词的前文和后文的信息,并根据前后文给出当前单词的embedding
ELMo 采用了典型的两阶段过程:
- 第一个阶段是利用语言模型进行预训练;
- 第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的 Word Embedding 作为新特征补充到下游任务中。也就是说会综合E1、E2、E3当成最后的embeding结果作为子任务的输入
Feature-based 和 Fine-tune
参考
#深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法_feature based finetune-CSDN博客
基于神经网络的语言模型根据学习方法不同大体可以分为两大类,分别是Feature-based和Fine-tune
- Feature-based 方法是通过训练神经网络从而得到词语的embedding,换句话说就是通过神经网络得到更恰当的向量来表示词库中的每一个词语,Feature-based 方法不使用模型本身,而是使用模型训练得到的参数作为词语的 embedding;feature-base 方法最典型的例子就是ELMO和word2vec
- Fine-tune 方法会根据下游特定的任务,在原来的模型上面进行一些修改,使得最后输出是当前任务需要的。这些修改一般是在模型的最后一层,或者在现有的网络后添加一个网络结构用于匹配下游的各种任务;GPT1 GPT2 就采用了Fine-tune 方法,GPT3得益于海量的与训练样本和庞大的网络参数,不在需要 fine-tune过程;BERT论文采用了LM + fine-tuning的方法,同时也讨论了BERT + task-specific model的方法。
NLP四范式
目前学术界一般将 NLP 任务的发展分为四个阶段即 NLP 四范式:
- 1. 第一范式:基于传统机器学习模型的范式,如 tf-idf 特征 + 朴素贝叶斯等机器算法;
- 2. 第二范式:基于深度学习模型的范式,如 word2vec 特征 + LSTM 等深度学习算法,相比于第一范式,模型准确有所提高,特征工程的工作也有所减少;
- 3. 第三范式:基于预训练模型 + fine tuning 的范式,如 BERT + finetuning 的 NLP 任务,相比于第二范式,模型准确度显著提高,但是模型也随之变得更大,但小数据集就可训练出好模型;
- 4. 第四范式:基于预训练模型 + Prompt + 预测的范式,如 BERT + Prompt 的范式相比于第三范式,模型训练所需的训练数据显著减少。
Prompt learning
参考
【NLP】Prompt Learning 超强入门教程
目的:提升预训练模型的泛化性
例如一般预训练模型都是使用【mask】去进行完形填空,而下游任务有很多,例如情感分类,如果能讲下游任务的任务形式转换未和预训练模型一样的模式,就可以省去微调的过程
Prompt 的工作流包含以下4部分:
- Prompt 模版(Template)的构造
- Prompt 答案空间映射(Verbalizer:fantastic=postive,boring=negtive)的构造
- 文本代入template,并且使用预训练语言模型进行预测
- 将预测的结果映射回label。
Template构造方法
根据任务类别人为构造
https://zhuanlan.zhihu.com/p/375934846
delta-tuning
在预训练模型微调中的delta-tuning一般是指固定PLM的参数,额外增加一部分参数用来针对不同的下游任务来微调,从而避免全参数微调,节省资源并且可以在不同的子任务上使用大模型学到的通用知识。
(8 封私信 / 80 条消息) 什么是delta-learning?or ∆-Learning? - 知乎 (zhihu.com)
增量式
通俗解读大模型主流微调方法:从Prefix Tuning、P-Tuning V1/V2到LoRA、QLoRA - 知乎 (zhihu.com)
adapter-tuning
在transfomer layer中的feed-forward层下层加入两层全连接层,在微调时只训练这部分参数
adapter的一种优化方案,将加入的全连接层移动到外面,通过先降维再升维的方式做到精度一致,最大的优势在于反向传播时不需要经过原始的transfomer layer,计算更简单
Prefix Tuning
Prefix Tuning是一种针对大型预训练语言模型(如GPT-2、GPT-3)的微调方法,它在不改变底层模型参数的情况下,通过修改输入的前缀来优化模型的效果。这种方法在自然语言生成任务(NLP)中尤其有效,并且在数据较少的场景下也能表现出色。
原理: Prefix Tuning的核心思想是在模型的输入序列前添加一系列可训练的连续向量,称为前缀(prefix)。这些前缀作为额外的输入与原始输入一起被模型处理。在训练过程中,只有前缀向量的参数是可训练的,而模型的主要参数被冻结。通过优化这些前缀的参数,模型可以学会生成适应新任务输出的提示,而无需改变模型的主要参数。
对于自回归模型,只需要在输入数据前加入前缀,对于encoder-decoder模型,两侧都要加入prefix
为了形象说明,举个例子,对于table-to-text任务,context 是序列化的表格,输出是表格的文本描述,使用GPT-2进行生成;对于文本摘要,是原文,是摘要,使用BART进行生成 对于自回归(Autoregressive)模型,在句子前面添加前缀,得到
这是因为合适的上文能够在fixed LM的情况下去引导生成下文(比如GPT3的 in-context learning),对Encoder-Decoder模型来说,Encoder和Decoder都增加了前缀,得到
这是因为Encoder端增加前缀是为了引导输入部分的编码 (guiding what to extract from ),Decoder 端增加前缀是为了引导后续token的生成 (influence the generation of by steering the next token distribution)该方法其实和构造Prompt类似,只是Prompt是人为构造的“显式”的提示,并且无法更新参数,而Prefix则是可以学习的“隐式”的提示。
同时,为了防止直接更新Prefix的参数导致训练不稳定的情况,特在Prefix层前面加了MLP结构(相当于将Prefix分解为更小维度的Input与MLP的组合后输出的结果),训练完成后,只保留Prefix的参数。
缺点:
-
较难训练,且模型的效果并不严格随prefix参数量的增加而上升,这点在原始论文中也有指出
-
会使得输入层有效信息长度减少。为了节省计算量和显存,我们一般会固定输入数据长度。增加了prefix之后,留给原始文字数据的空间就少了,因此可能会降低原始文字中prompt的表达能力
指定式
直接指定在微调过程中能改变的参数
BitFit
大模型参数高效微调技术原理综述(二)-BitFit、Prefix Tuning、Prompt Tuning - 知乎 (zhihu.com)
BitFit是一种稀疏微调方法,其中仅修改模型(或其子集)的bias项。
重参数化
中心思想是,将参数转换为低秩模式,以微调更少的参数。
LoRA
LORA微调系列(一):LORA和它的基本原理 - 知乎 (zhihu.com)
LoRA通过仅训练低秩矩阵,然后将这些参数注入到原始模型中,从而实现对模型的微调
也就是说,预训练之后的W~=W+△W,可以使用两个小矩阵来近似得到△W
训练优化
KV Cache
参考:
https://juejin.cn/post/7362789570217885759
在Transformer的解码器中,其是带 Masked 的 Self Attention,造成的结果为任意时刻的attention只与当前时刻的Q有关,且V也只与同一时刻的Q有关
在原始的方案中,对于每一时刻的attention,都需要重新计算之前所有时刻的KV,但是其实之前时刻的KV是不会变化的,所有可以将之前的KV都缓存起来
数据并行
数据并行(Data Parallelism)是一种在大规模数据处理和训练大型神经网络中常用的并行计算技术。其核心思想是将大型数据集分割成多个小块,并将这些数据块分配给多个处理器(例如GPU)同时处理。每个处理器运行相同的程序,但处理的数据子集不同。
例如最基础的思想,现将参数进行广播复制到每一个显卡,将数据分成多份分发到不同显卡,然后每个显卡负责一块数据的梯度计算,最后将梯度结果规约到一个服务器,最后完成参数更新和优化。
缺点:
-
通信开销:在数据并行中,不同处理单元之间需要频繁通信以同步数据和结果,这可能导致通信开销随着处理单元数量的增加而显著增加,从而影响整体性能。
-
内存占用:由于每个处理单元都需要存储模型的完整副本,因此数据并行可能导致内存占用显著增加,尤其是在处理大规模数据集时。
-
负载均衡问题:如果数据切分不均匀,某些处理单元可能会过载,而其他处理单元则可能处于空闲状态,这会影响整体的训练效率。
分布式数据并行
之前的方案是存在一个专门的参数服务器,管理所有参数,且负责参数的更新和广播,分布式数据并行取消了这个参数服务器,使得每个显卡都得完整的梯度信息进行更新
显卡的合作模式
1、broadcast
2、reduce
3、all reduce
4、reduce scatter
out0等于in0的前四分之一加上in1的前四分之一...
5、all gather
模型并行
在做矩阵乘法时,可以将其拆分为多个部分结果相加的形式,那在深度学习中,也可以将模型参数分成多分,然后结果聚合的形式以达到模型并行,前提是输入x一致,也就是说无法使用数据并行
将模型参数分成n分,然后针对相同的输入数据做矩阵乘法,最后将结果all gather起来
ZeRO
ZeRO(Zero Redundancy Optimizer)是一种先进的内存优化技术,旨在优化大规模深度学习模型训练过程中的内存使用。ZeRO通过减少冗余内存占用,使得在有限的硬件资源上训练更大的模型成为可能。它主要通过以下三种级别的优化来实现这一目标:
stage1:每张显卡使用reduce sactter存储一部分梯度结果,然后使用对应的优化器进行优化,然后update with all gather后更新每个显卡的全部参数,保证参数一致
stage2:在第一阶段中,中间的gradient需要在反向传播结束之后才删除,在第二阶段,gradient是动态删除的,例如在第n层的反向传播完成后,计算得到gradient*,就把第n层的gradient删除,以此类推,而不需要等到所有反向传播做完
stage3:每张显卡只保存一部分的模型参数,但是在反向传播计算的过程中还是需要先gather得到所有参数再计算,计算完就丢弃,不需要保存,相当于是时间换空间的做法。
流水线并行
模型并行主要针对的是线性层,将线性层矩阵分解为多个小矩阵分发到不同的显卡进行运算
流水线并行主要针对的是不同的网络层,例如一个三层的transfomer,将三层参数分发到不同的显卡进行计算,但是第二层模型计算时需要第一层的结果,所以其弊端就是,一个时间内只有一层模型对应的显卡运行,会有资源浪费
其他细节
混合精度训练
深度学习中的数据类型介绍:FP32, FP16, TF32, BF16, Int16, Int8 ...-CSDN博客
FP16 和 FP32 (float) 的存储示例图
FP16带来的问题
混合精度训练原理总结
在模型训练中一般采用FP32进行训练,混合精度训练的意思是设置部分训练参数为FP16类型,以加速训练速度、减小内存消耗
一般来说 weight update = gradient*lr,学习率一般是10^-5数量级,那么weight update肯定不能用FP16存储
权重备份
https://zhuanlan.zhihu.com/p/570942198
本质上这里的参数更新公式为:
只是在计算中weight采用fp32计算,然后再转为FP16,这里我的理解是会将weight缩放以适应fp16的要求
offloading
Offload 技术(也可以理解为混合部署或混合推理)将对象卸载到外部资源或将其分布在多种设备上以减少主设备的内存负载,常用用于在GPU显存有限的设备上优化内存使用。比如:将GPU显存中的权重卸载到CPU内存、NVMe/Disk。
由于ZeRO模式的运用,且一个GPU可对应多个CPU,CPU的计算速度不会成为模型推理的瓶颈。
overlaping
overlapping策略是指在模型训练过程中同时执行计算和数据传输的技术。这种策略旨在最大程度地减少计算资源的浪费,提高训练效率。
原始方案中,需要先gather第一层参数,然后计算第一层,然后gather第二层参数,然后计算第二层...
更新方案为,计算第一层参数时,同时gather第二层参数,以实现异步
通过实现overlapping策略,可以有效减少模型训练过程中的计算资源浪费,提高训练效率和整体性能。这种策略在训练大型模型时尤为重要,可以显著加快训练速度并提高训练效率
checkpointing
一种对某些中间结果进行保存,以减少其他内存开销的方法,是一种以时间换空间的方式
以transformer举例
- without checkpointing:保存每一层的线性层中间结果(BP graph),在反向传播时才能进行线性层参数更新
- with checkpointing:只保留每一层大的layer的输入层,在反向传播时再临时计算BP graph
如果一个模型有24层transformer,每一层有5个线性层,那么保存的数据从24*5缩小到24
模型压缩
知识蒸馏(knowledge distillation)
一分钟带你认识深度学习中的知识蒸馏 - 知乎 (zhihu.com)
知识蒸馏是一种模型轻量化的方法,通过先训练一个模型更大,参数更多,理解能力更强的Teacher模型,如何使用这个Teacher模型去训练一个小模型Student模型,已达到模型轻量化的目的。来自Teacher模型输出的监督信息称之为knowledge(知识),而student学习迁移来自teacher的监督信息的过程称之为Distillation(蒸馏)。
知识蒸馏的功能
1、提升模型精度
用户如果对目前的网络模型A的精度不是很满意,那么可以先训练一个更高精度的teacher模型B(通常参数量更多,时延更大),然后用这个训练好的teacher模型B对student模型A进行知识蒸馏,得到一个更高精度的模型。
2、降低模型时延,压缩网络参数
用户如果对目前的网络模型A的时延不满意,可以先找到一个时延更低,参数量更小的模型B,通常来讲,这种模型精度也会比较低,然后通过训练一个更高精度的teacher模型C来对这个参数量小的模型B进行知识蒸馏,使得该模型B的精度接近最原始的模型A,从而达到降低时延的目的。
3、图片标签之间的域迁移
用户使用狗和猫的数据集训练了一个teacher模型A,使用香蕉和苹果训练了一个teacher模型B,那么就可以用这两个模型同时蒸馏出一个可以识别狗,猫,香蕉以及苹果的模型,将两个不同与的数据集进行集成和迁移
知识蒸馏的一般原理:
对于原始数据,student模型可能无法学习到其内部关系,例如对于一个分类任务,label往往是单一的0-1分布,学生模型可能难以高精度拟合
这时可以训练一个更大的模型,让其去学习这个0-1分布,然后其输入可以经过softmax等方式,得到软label,即分类的概率分布,这样的输出包含信息更多,即熵值更大,再使用这个概率分布label去训练student模型。
整个过程类似老师先去学习一个晦涩难懂的知识,然后再以通俗的方式教给学生
针对最基础的知识蒸馏方式,有许多变式方法:
- 从teacher模型中间层学习
- 从teacher模型embeding层和输出层学习
- 针对transfomer模式,从teacher模型中间的attention matrics中学习
模型剪枝
模型量化
LLM基础|模型量化到底是啥?看这一篇就够了! - 知乎 (zhihu.com)
在模型中,将数值的位数减小为定值,已达到降低显存,提升速度的目的,简单直白点讲,即原来表示一个权重需要使用float32/float16表示,量化后只需要使用int8来表示就可以啦,仅仅这一个操作,我们就可以获得接近4倍的网络加速。
- 线性量化
- 普通线性量化
- 对称量化
- 非对称量化
- 非线性量化
- 逐层量化、逐组量化和逐通道量化
- 权重量化、权重激活量化
- 在线量化和离线量化
应用:
BinaryBERT
BinaryBERT是一种对BERT模型进行极限量化的方法,它通过权重二值化(weight binarization),即将模型中的权重参数转化为1比特的值,从而极大地减少模型大小和计算量。这种方法可以将模型大小减少32倍,并用加法代替大多数浮点数乘法,从而降低能源消耗和芯片上的面积使用。
原理: BinaryBERT的关键在于如何有效地训练一个二值化的BERT模型。直接训练一个二值化的网络是困难的,因为二值化的权重会导致模型的损失景观变得非常复杂和不规则。为了解决这个问题,BinaryBERT采用了一种称为“三值权重分裂”(ternary weight splitting)的方法。这种方法首先训练一个半尺寸的三值BERT模型,然后将这个三值模型的权重等价地分裂成二值权重和潜全精度权重,作为全尺寸BinaryBERT的初始化。这样,BinaryBERT就继承了三值模型的良好性能,并且可以通过在新架构上进一步微调来提高性能。
训练过程:
- 首先训练一个三值BERT模型。
- 应用三值权重分裂操作,将三值模型的量化权重和潜全精度权重等价地转换,初始化全尺寸的BinaryBERT。
- 在新架构上对BinaryBERT进行微调,以进一步优化性能
模型量化和混合精度训练都是讲参数的精度降低以提升训练速度,但是其针对的对象不一样,以transformer为例:
参数共享
参数共享的基本思想是在整个模型的不同部分使用相同的参数,而不是为每个任务或模型组件训练唯一的参数集。
嵌入层共享:词嵌入矩阵在整个模型中共享,这意味着每个单词的向量表示在整个模型中是一致的。
层归一化参数共享:在Transformer架构中,层归一化(Layer Normalization)的尺度(scale)和偏移(shift)参数通常在每个注意力机制和前馈网络层中共享。
注意力机制中的参数共享:在多头注意力(Multi-Head Attention)中,每个头的缩放因子(scaling factor)可以共享。
前馈网络参数共享:在前馈网络(Feed-Forward Network)中,线性变换的权重可以在不同的层中共享。
跨任务共享:在多任务学习中,模型的一部分可以在不同的任务之间共享,以利用任务之间的共同特征。
跨层共享:在某些模型架构中,如LeBERT(Layer-wise Efficient BERT),不同Transformer层的权重可以共享,以提高效率。
跨模态共享:在处理不同类型数据(如文本、图像和声音)的模型中,可以在处理不同模态的共享层中使用相同的参数
应用:ALBERT
ALBERT通过两种主要的技术来减少参数数量:分解嵌入参数化和跨层参数共享。
分解嵌入参数化:ALBERT将词嵌入矩阵分解成两个较小的矩阵,从而减少了模型的参数量。具体来说,它首先将one-hot编码的词向量映射到一个较低维度的嵌入空间,然后再映射到隐藏空间,这样做有效地将嵌入参数从O(V×H)减少到O(V×E + E×H),其中V是词汇表大小,H是隐藏层大小,E是嵌入空间的维度。
跨层参数共享:在ALBERT中,所有层的参数都是共享的。这意味着不同层的Transformer网络使用相同的权重,从而进一步减少了模型的参数量。这种设计决策在实验中被证明是有效的,并且与BERT相比,ALBERT在层与层之间的转换更加平滑,这表明权重共享有助于稳定网络参数。
相比于bert,其对NSP任务进行了改进,因为bert的NSP任务正例就是用的一个文档里面连续的两句话,但是负例使用的是不同文档里面的两句话。这就导致任务包含了主题预测,而主题预测又要比两句话连续性的预测简单太多。新的方法使用了sentence-order prediction(SOP), 正例的构建和NSP是一样的,不过负例则是将两句话反过来。
低秩分解
模型压缩之模型分解篇:SVD分解,CP分解和Tucker分解 - 知乎 (zhihu.com)
低秩分解是一种在大模型压缩中常用的技术,它通过将模型中的大矩阵分解为两个或多个小矩阵的乘积来减少模型的参数数量和计算复杂度。这样做不仅可以减少模型的存储需求,还可以加快模型的运算速度。
大模型QA
目前主流的开源LLM(语言模型)模型体系
- GPT:自回归模型,采用transfomer的decoder部分
- bert:自编码模型,采用transfomer的encoder部分
- RoBERTa:对bert的改进,数据更多,更大的batch size等,还有一些改进,例如不在使用NSP(Next Sentence Prediction)任务,将静态mask换成动态mask
- RoBERTa中引入了动态mask的策略,原论文中将原始数据复制n份,每份都进行随机的静态mask,从而每份数据的mask结果都不太一样。huggingface中data allcator使用的是动态mask,但不是复制数据,而是每一个epoch的mask策略都不同,这样就可以达到动态mask的效果了,从而使得每一个epoch的mask的情况都不同,更方便更胜内存。
- T5:encoder-decoder模型
- XLNet
DeepSpeed
一文读懂deepSpeed:深度学习训练的并行化-CSDN博客
微软开发的一个深度学习优化库,主要优化策略包括三个方面
高效的并行化策略:DeepSpeed支持多种并行化方法,包括数据并行、模型并行和流水线并行。这些方法可以灵活组合,以适应不同规模和复杂度的深度学习模型。通过并行化,DeepSpeed能够显著提高训练速度和可扩展性。
内存优化技术:为了降低内存占用和提高训练效率,DeepSpeed引入了ZeRO(Zero Redundancy Optimizer)技术。ZeRO通过将优化器的状态、梯度和参数在分布式环境中进行分割,从而减少了冗余的内存占用。这使得在有限的内存资源下训练更大的模型成为可能。
混合精度训练支持:DeepSpeed支持混合精度训练,即同时使用单精度和半精度浮点数进行训练。这种方法可以在保持模型性能的同时,减少内存占用和计算时间,降低能耗。