大模型常用微调方法 LoRA 和 Ptuning 的原理
LoRA (Low-Rank Adaptation) 方法的核心是在大型语言模型上对指定参数增加额外的低秩矩阵。具体而言,对于原始权重矩阵 W,LoRA 将其分解为两个低秩矩阵 A 和 B 的乘积 (W + BA)。在模型训练过程中,固定 PLM 的参数,只训练降维矩阵 A 与升维矩阵 B。这种方法大幅减少了可训练参数量,同时保持了模型的生成能力,使得在消费级显卡上进行微调成为可能。
Ptuning 方法的核心是使用可微的 virtual token 替换了原来的 discrete tokens,且仅加入到输入层。它使用 prompt encoder(通常由 BiLSTM+MLP 组成)对 virtual token 进行编码学习。与传统的 hard prompt 不同,Ptuning 通过连续向量表示引导模型,无需人工设计提示词,更适合自动化场景。
Stable Diffusion 原理介绍
Stable Diffusion 总共包含三个主要的组件,其中每个组件都拥有一个独立的神经网络:
- Clip Text:用于文本编码。输入为文本,输出为 77 个 token 嵌入向量,其中每个向量包含 768 个维度。它将自然语言转换为模型可理解的语义空间。
- UNet + Scheduler:在信息(潜)空间中逐步处理 / 扩散信息。输入包括文本嵌入和一个由噪声组成的初始多维数组(张量)。通过去噪过程,输出了一个经过处理的信息阵列。
- 自编码解码器(Autoencoder Decoder):使用处理过的信息矩阵绘制最终图像的解码器。输入处理过的信息矩阵,维度为(4, 64, 64),输出结果图像,各维度为(3,512,512)。
为何现在的大模型大部分是 Decoder-only 结构
大模型从模型架构上主要分为三种:Only-encoder, Only-Decoder, Encoder-Decoder 三种模型架构。
- Only-encoder:例如 BERT,通过在大规模无标签文本上进行预训练,然后在下游任务上进行微调,具有强大的语言理解能力和表征能力,但缺乏生成能力。
- Only-Decoder:例如 GPT,通过在大规模无标签文本上进行预训练,然后在特定任务上进行微调,具有很强的生成能力和语言理解能力。其核心在于使用了因果掩码(Causal Masking),确保预测时只能看到当前时刻之前的信息。
- Encoder-Decoder:例如 T5,可以用于多种自然语言处理任务,如文本分类、机器翻译、问答等。
而 LLM 之所以主要都用 Decoder-only 架构,除了训练效率和工程实现上的优势外,在理论上是因为 Encoder 的双向注意力会存在低秩问题,这可能会削弱模型表达能力。就生成任务而言,引入双向注意力并无实质好处。而 Encoder-Decoder 架构之所以能够在某些场景下表现更好,大概只是因为它多了一倍参数。所以,在同等参数量、同等推理成本下,Decoder-only 架构就是最优选择了。
如何缓解 LLMs 复读机问题
LLMs 复读机问题指模型在生成长文本时出现重复段落或句子的现象。缓解策略包括:
- 多样性训练数据:在训练阶段,尽量使用多样性的语料库来训练模型,避免数据偏差和重复文本的问题。
- 引入噪声:在生成文本时,可以引入一些随机性或噪声,例如通过采样不同的词或短语,或者引入随机的变换操作,以增加生成文本的多样性。
- 温度参数调整:温度参数是用来控制生成文本的多样性的一个参数。通过调整温度参数的值,可以控制生成文本的独创性和多样性,从而减少复读机问题的出现。
- 后处理和过滤:对生成的文本进行后处理和过滤,去除重复的句子或短语,以提高生成文本的质量和多样性。
- Beam 搜索调整:在生成文本时,可以调整 Beam 搜索算法的参数。通过调整 Beam 大小和搜索宽度,可以控制生成文本的多样性和创造性。
- 人工干预和控制:对于关键任务或敏感场景,可以引入人工干预和控制机制,对生成的文本进行审查和筛选,确保生成结果的准确性和多样性。
为什么 Transformer 块使用 LayerNorm 而不是 BatchNorm
Batch Normalization 是对这批样本的同一维度特征做归一化,Layer Normalization 是对这单个样本的所有维度特征做归一化。LN 不依赖于 batch 的大小和输入 sequence 的长度,因此可以用于 batchsize 为 1 和 RNN 中 sequence 的 normalize 操作。
为什么 BN 在 NLP 中效果差:
- BN 计算特征的均值和方差是需要在 batch_size 维度,而这个维度表示一个特征,比如身高、体重、肤色等,如果将 BN 用于 NLP 中,其需要对每一个单词做处理,让每一个单词是对应到了 MLP 中的每一个特征明显是违背直觉得;
- BN 是对单词做缩放,在 NLP 中,单词由词向量来表达,本质上是对词向量进行缩放。词向量是什么?是我们学习出来的参数来表示词语语义的参数,不是真实存在的。
为什么 LayerNorm 单独对一个样本的所有单词做缩放可以起到效果:
- Layernorm 针对每一个样本做特征的缩放。换句话讲,保留了 N 维度,在 C/H/W 维度上做缩放。
- Layernorm 也是在对同一个特征下的元素做归一化,只不过这里不再是对应 N(或者说 batch size),而是对应的文本长度。
Transformer 为何使用多头注意力机制
多头注意力机制允许模型在不同的子空间中关注不同的信息。多头保证了 transformer 可以注意到不同子空间的信息,捕捉到更加丰富的特征信息。论文原作者发现这样效果确实好,更详细的解析可以查阅相关文献。通过多个头并行计算,模型能够同时关注来自不同表示子空间的不同位置的信息,增强了模型的表达能力。
监督微调 SFT 后 LLM 表现下降的原因
SFT(Supervised Fine-Tuning)是一种常见的微调技术,它通过在特定任务的标注数据上进行训练来改进模型的性能。然而,SFT 可能会导致模型的泛化能力下降,这是因为模型可能过度适应于微调数据,而忽视了预训练阶段学到的知识。这种现象被称为灾难性遗忘,可以使用一些策略:
- 使用更小的学习率进行微调,以减少模型对预训练知识的遗忘。
- 使用正则化技术,如权重衰减或者早停,以防止模型过度适应微调数据。
- 使用 Elastic Weight Consolidation(EWC)等技术,这些技术试图在微调过程中保留模型在预训练阶段学到的重要知识。
微调阶段样本量规模增大导致的 OOM 错误
全参数微调的显存需求取决于多个因素,包括模型的大小(参数数量),批次大小,序列长度,以及是否使用了混合精度训练等。对于 GPT-3 这样的大模型,如果想要在单个 GPU 上进行全参数微调,可能需要数十 GB 甚至上百 GB 的显存。
当样本量规模增大时,可能会出现 OOM(Out of Memory)错误,这是因为模型需要更多的内存来存储和处理数据。为了解决这个问题,可以尝试以下方法:
- 减小批量大小:这可以减少每次训练需要处理的数据量,从而减少内存使用。
- 使用梯度累积:这种方法可以在不减小批量大小的情况下,减少内存使用,模拟更大的 batch size。
- 使用模型并行:这种方法可以将模型的不同部分放在不同的设备上进行训练,从而减少每个设备需要的内存。
- 使用混合精度训练:利用 FP16 或 BF16 格式减少显存占用。
连接文本和图像的 CLIP 架构简介
CLIP (Contrastive Language-Image Pre-training) 把自然语言级别的抽象概念带到计算机视觉里了。确定一系列 query,然后通过搜索引擎搜集图像,最后通过 50 万条 query,搜索得到 4 亿个图像文本对。然后将 Text Decoder 从文本中提取的语义特征和 Image Decoder 从图像中提取的语义特征进行匹配训练。通过对比损失函数,拉近图文对的相似度,推远负样本的距离,实现了零样本迁移能力。
Attention 计算复杂度以及如何改进
代码中的 to_qkv() 函数,即用于生成 q、k、v 三个特征向量:
self.to_qkv = nn.Linear(dim, inner_dim * 3, bias=False)
self.to_out = nn.Linear(inner_dim, dim)
在标准的 Transformer 中,Attention 计算的时间复杂度为 O(N^2),其中 N 是输入序列的长度。为了降低计算复杂度,可以采用以下几种方法:
- 使用稀疏注意力机制,减少计算复杂度。不需要计算所有输入向量之间的交叉关系,而是计算每个输入向量与自身之间的关系,从而减少计算量。
- 使用局部注意力机制,只计算输入序列中与当前位置相关的子序列的交互,从而降低计算复杂度。
- 采用基于近似的方法,例如使用随机化和采样等方法来近似计算,从而降低计算复杂度。
- 使用压缩注意力机制,通过将输入向量映射到低维空间来减少计算量,例如使用哈希注意力机制和低秩注意力机制等。
- FlashAttention:通过优化 IO 路径,减少 HBM 访问次数,显著提升计算效率。
BERT 用于分类任务的优点及后续改进工作
在分类任务中,BERT 的结构中包含了双向的 Transformer 编码器,这使得 BERT 能够更好地捕捉文本中的双向上下文信息,从而在文本分类任务中表现更好。BERT 的后续改进工作主要包括以下方面:
- 基于 BERT 的预训练模型的改进,例如 RoBERTa、ALBERT 等,优化了预训练目标和模型结构。
- 通过调整 BERT 的架构和超参数来进一步优化模型性能,例如 Electra、DeBERTa 等,引入了新的掩码策略。
- 改进 BERT 在特定任务上的应用方法,例如 ERNIE、MT-DNN 等,结合了领域知识和多任务学习。
此外,随着大模型的发展,Bert 类模型逐渐被更高效的 Decoder-only 架构所补充,但在特定 NLP 任务中仍具有重要价值。