目录
⚠️ 本博客仅记录了组会里提及的内容
1 大语言模型概述
1.1 模型的架构
模型的训练过程包含以下步骤:
- 标记化:将文本划分为更小的片段,即标记,便于模型处理;
- 嵌入化:将标记转换为向量,以捕捉语义信息;
- 前向传播:向量在模型中逐层传递并计算输出,直到生成最终的预测值;
- 计算损失:使用损失函数计算预测值与真实值之间的差距;
- 反向传播:根据链式法则,计算损失函数相对于模型中每个参数的梯度;
- 优化器:根据计算出的梯度以及所采用的策略来更新模型的参数;
- 训练迭代:模型多次遍历数据,每次遍历称为一个 epoch,如此循环直至训练收敛。
1.2 模型的细节:标记化和嵌入化
标记化的步骤包括:
- 将输入文本分解为单个句子;
- 将句子进一步分解为标记,即一个小而有意义的单位。
说明:可以根据实际任务需求设置 "标记" 的大小,即它不仅可以是单词,还可以细分到标点,甚至是字母。
嵌入化的步骤包括:
- 将标记映射到词汇字典中的唯一 ID;
- 将 ID 转换为模型可以理解的向量。
注意:正如上周组会所提到的,Embedding 的过程中需要考虑上下文语境。比如,我们希望使用不同的向量来表示 "an apple and an orange" 和 "an apple phone" 中的 "apple" 一词,这是因为 "apple" 在两个句子中的语义不同。
1.3 模型的核心
语言模型的核心由编码器、解码器和注意力机制组成:
- 编码器:处理输入文本并生成丰富的语义表示;
- 解码器:利用编码器的表示生成输出文本,通常以自回归方式逐步预测;
- 注意力机制:帮助模型在生成输出文本时,关注于输入文本中最相关的部分。
我的理解:编码器负责转换为模型理解的形式,解码器负责转换为人类理解的形式。
2 多头注意力机制
这里回顾多头注意力机制,貌似是因为 LoRA 从中汲取了灵感 😇
先计算每个头,公式如下:
h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) head_i=\mathrm{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)
再拼接所有头,公式如下:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d n ) W O \mathrm{MultiHead}(Q,K,V)=\mathrm{Concat}(head_1,...,head_n)W^O MultiHead(Q,K,V)=Concat(head1,...,headn)WO
我们可以通过牺牲模型的表达能力,来换取更快的计算速度。
上图将 Q Q Q 和 K K K 分成四部分,而我们可以只将 Q Q Q 和 K K K 分成两部分。虽然 Q i Q_i Qi 和 K i K_i Ki 的个数减少了,但通过与个数保持不变的 V i V_i Vi 相乘,仍然可以保持 h e a d i head_i headi 的个数保持不变。如下图所示:
我的理解:本质上是减少了 W i Q W_i^Q WiQ 和 W i K W_i^K WiK 的个数。
3 LoRA 概述
3.1 冻结部分模型参数
之所以介绍本小节内容,是因为 LoRA 有用到
- 目的:优化内存使用
- 含义:冻结参数在模型训练过程中不会参与更新
- 该方式使得我们无需保存冻结参数的梯度,从而减少 GPU 内存的使用
例如,我们可以只保留 Transformer 中最后的线性层作为可训练部分,如下图所示:
虽然该方法减少了内存占用并加快了训练速度,但也限制了模型的表达能力和性能。
3.2 低秩适配(LoRA)
- 全称:Low-Rank Adaptation
- 作用:是一种高效的微调方法,旨在减少内存占用和计算资源,同时保持良好的性能表现
3.2.1 核心工作原理:冻结模型参数
- 在使用 LoRA 时,预训练模型的所有参数将被冻结,即这些参数在微调过程中不会被更新;
- 其目的是减少内存占用,同时保留预训练模型所具备的知识。
3.2.2 核心工作原理:添加低秩权重矩阵
- 含义:在模型的某些 "冻结模型参数" 矩阵上,添加一个新的、可训练的低秩矩阵;
- 其中低秩矩阵是两个较小的矩阵 A A A 和 B B B 的乘积结果,即: Δ W = A × B \Delta W=A\times B ΔW=A×B;
- 由于矩阵 A A A 和 B B B 的维度较小,因此能够显著减小可训练参数的数量。
上图中超参数 r r r 的取值为 8 8 8
超参数: r r r、 B e t a = A l p h a / r \mathrm{Beta}=\mathrm{Alpha}/r Beta=Alpha/r
B e t a \mathrm{Beta} Beta 参数的作用:
- 使得模型能够学习对新领域的适配方法,同时又不会偏离原始模型太远;
- 防止过拟合,同时避免遗忘预训练模型已经学到的知识。
GPT:Beta 参数用于控制低秩矩阵对原始模型输出的影响程度。如果 Beta 值较大,那么低秩矩阵的影响会更显著;如果 Beta 值较小,那么其影响则会减弱。
3.3 QLoRA
- QLoRA 在 LoRA 的基础上,进一步对模型参数进行了量化;
- 即在微调前,将模型参数从高精度(如 float32 或 float16)量化到低精度(如 float8 或更低);
- 该方法大幅减少了模型的内存占用,同时保持了较高的计算效率。