Lora方法的核心是在大型语言模型上对指定参数增加额外的低秩矩阵,也就是在原始PLM旁边增加一个旁路,做一个降维再升维的操作。并在模型训练过程中,固定PLM的参数,只训练降维矩阵A与升维矩阵B。
Ptuning方法的核心是使用可微的virtual token替换了原来的discrete tokens,且仅加入到输入层,并使用prompt encoder(BiLSTM+MLP)对virtual token进行编码学习。
更详细请查阅使用 LoRA(低阶适应)微调 LLM
Stable Diffusion 总共包含三个主要的组件,其中每个组件都拥有一个独立的神经网络:
1)Clip Text 用于文本编码。 输入:文本 输出:77 个 token 嵌入向量,其中每个向量包含 768 个维度
2)UNet + Scheduler 在信息(潜)空间中逐步处理 / 扩散信息。 输入:文本嵌入和一个由噪声组成的初始多维数组(结构化的数字列表,也叫张量 tensor)。 输出:一个经过处理的信息阵列
3)自编码解码器(Autoencoder Decoder),使用处理过的信息矩阵绘制最终图像的解码器。 输入:处理过的信息矩阵,维度为(4, 64, 64) 输出:结果图像,各维度为(3,512,512)
更详细请查阅從頭開始學習Stable Diffusion
更详细请查阅十分钟理解Stable Diffusion
大模型从模型架构上主要分为三种:Only-encoder, Only-Decoder, Encoder-Decoder三种模型架构
-
Only-encoder:例如BERT,通过在大规模无标签文本上进行预训练,然后在下游任务上进行微调,具有强大的语言理解能力和表征能力。
-
Only-Decoder: 例如GPT,通过在大规模无标签文本上进行预训练,然后在特定任务上进行微调,具有很强的生成能力和语言理解能力。
-
Encoder-Decoder:例如T5(Text-to-Text Transfer Transformer)可以用于多种自然语言处理任务,如文本分类、机器翻译、问答等。
而LLM之所以主要都用Decoder-only架构,除了训练效率和工程实现上的优势外,在理论上是因为Encoder的双向注意力会存在低秩问题,这可能会削弱模型表达能力,就生成任务而言,引入双向注意力并无实质好处。而Encoder-Decoder架构之所以能够在某些场景下表现更好,大概只是因为它多了一倍参数。所以,在同等参数量、同等推理成本下,Decoder-only架构就是最优选择了。
- 多样性训练数据:在训练阶段,尽量使用多样性的语料库来训练模型,避免数据偏差和重复文本的问题。
- 引入噪声:在生成文本时,可以引入一些随机性或噪声,例如通过采样不同的词或短语,或者引入随机的变换操作,以增加生成文本的多样性。
- 温度参数调整:温度参数是用来控制生成文本的多样性的一个参数。通过调整温度参数的值,可以控制生成文本的独创性和多样性,从而减少复读机问题的出现。
- 后处理和过滤:对生成的文本进行后处理和过滤,去除重复的句子或短语,以提高生成文本的质量和多样性。
- Beam搜索调整:在生成文本时,可以调整Beam搜索算法的参数。Beam搜索是一种常用的生成策略,它在生成过程中维护了一个候选序列的集合。通过调整Beam大小和搜索宽度,可以控制生成文本的多样性和创造性。
- 人工干预和控制:对于关键任务或敏感场景,可以引入人工干预和控制机制,对生成的文本进行审查和筛选,确保生成结果的准确性和多样性。
更详细请查阅大模型常见面试题解
Batch Normalization 是对这批样本的同一维度特征做归一化, Layer Normalization 是对这单个样本的所有维度特征做归一化。LN不依赖于batch的大小和输入sequence的长度,因此可以用于batchsize为1和RNN中sequence的normalize操作。
-
为什么BN在NLP中效果差
- BN计算特征的均值和方差是需要在batch_size维度,而这个维度表示一个特征,比如身高、体重、肤色等,如果将BN用于NLP中,其需要对每一个单词做处理,让每一个单词是对应到了MLP中的每一个特征明显是违背直觉得;
- BN是对单词做缩放,在NLP中,单词由词向量来表达,本质上是对词向量进行缩放。词向量是什么?是我们学习出来的参数来表示词语语义的参数,不是真实存在的。
-
为什么LayerNorm单独对一个样本的所有单词做缩放可以起到效果
- layner-norm 针对每一个样本做特征的缩放。换句话讲,保留了N维度,在C/H/W维度上做缩放。
- layner-norm 也是在对同一个特征下的元素做归一化,只不过这里不再是对应N(或者说batch size),而是对应的文本长度。
多头保证了transformer可以注意到不同子空间的信息,捕捉到更加丰富的特征信息。论文原作者发现这样效果确实好,更详细的解析可以查阅Multi-head Attention
SFT(Supervised Fine-Tuning)是一种常见的微调技术,它通过在特定任务的标注数据上进行训练来改进模型的性能。然而,SFT可能会导致模型的泛化能力下降,这是因为模型可能过度适应于微调数据,而忽视了预训练阶段学到的知识。这种现象被称为灾难性遗忘,可以使用一些策略,如:
- 使用更小的学习率进行微调,以减少模型对预训练知识的遗忘。
- 使用正则化技术,如权重衰减或者早停,以防止模型过度适应微调数据。
- 使用Elastic Weight Consolidation(EWC)等技术,这些技术试图在微调过程中保留模型在预训练阶段学到的重要知识。
全参数微调的显存需求取决于多个因素,包括模型的大小(参数数量),批次大小,序列长度,以及是否使用了混合精度训练等。对于GPT-3这样的大模型,如果想要在单个GPU上进行全参数微调,可能需要数十GB甚至上百GB的显存。
当样本量规模增大时,可能会出现OOM(Out of Memory)错误,这是因为模型需要更多的内存来存储和处理数据。为了解决这个问题,可以尝试以下方法:
- 减小批量大小:这可以减少每次训练需要处理的数据量,从而减少内存使用。
- 使用梯度累积:这种方法可以在不减小批量大小的情况下,减少内存使用。
- 使用模型并行:这种方法可以将模型的不同部分放在不同的设备上进行训练,从而减少每个设备需要的内存。
CLIP 把自然语言级别的抽象概念带到计算机视觉里了。确定一系列query,然后通过搜索引擎搜集图像,最后通过50万条query,搜索得到4亿个图像文本对。然后将Text Decoder从文本中提取的语义特征和Image Decoder从图像中提取的语义特征进行匹配训练。
- 代码中的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是输入序列的长度。为了降低计算复杂度,可以采用以下几种方法:
- 使用自注意力机制,减少计算复杂度。自注意力机制不需要计算输入序列之间的交叉关系,而是计算每个输入向量与自身之间的关系,从而减少计算量。
- 使用局部注意力机制,只计算输入序列中与当前位置相关的子序列的交互,从而降低计算复杂度。
- 采用基于近似的方法,例如使用随机化和采样等方法来近似计算,从而降低计算复杂度。
- 使用压缩注意力机制,通过将输入向量映射到低维空间来减少计算量,例如使用哈希注意力机制和低秩注意力机制等。
在分类任务中,BERT的结构中包含了双向的Transformer编码器,这使得BERT能够更好地捕捉文本中的双向上下文信息,从而在文本分类任务中表现更好。BERT的后续改进工作主要包括以下方面:
- 基于BERT的预训练模型的改进,例如RoBERTa、ALBERT等;
- 通过调整BERT的架构和超参数来进一步优化模型性能,例如Electra、DeBERTa等;
- 改进BERT在特定任务上的应用方法,例如ERNIE、MT-DNN等;
Transformer本身是一个典型的encoder-decoder模型,Encoder端和Decoder端均有6个Block,Encoder端的Block包括两个模块,多头self-attention模块以及一个前馈神经网络模块;Decoder端的Block包括三个模块,多头self-attention模块,多头Encoder-Decoder attention交互模块,以及一个前馈神经网络模块;需要注意:Encoder端和Decoder端中的每个模块都有残差层和Layer Normalization层。
- DoLa:通过对比层解码提高大型语言模型的真实性:大型预训练 LLM 中的简单解码策略可减少幻觉;
- 在高质量数据上微调模型——在高质量数据上微调小型法学硕士模型已显示出有希望的结果,并有助于减少幻觉;
- 上下文学习:使用上下文学习为模型提供更好的上下文;
- 限制:将输出限制为受限列表,而不是自由浮动文本;
-
𝗣𝗿𝗲-𝘁𝗿𝗮𝗶𝗻𝗶𝗻𝗴:预训练,大型语言模型在来自互联网的广泛数据集上进行训练,其中 Transformer 架构是自然语言处理的最佳选择,这里的主要目标是使模型能够预测给定文本序列中的下一个单词。此阶段使模型具备理解语言模式的能力,但尚未具备理解指令或问题的能力。
-
监督微调或者指令微调。模型将用户消息作为输入,模型通过最小化其预测与提供的响应之间的差异来学习生成响应,此阶段标志着模型从仅仅理解语言模式到理解并响应指令的转变。
-
采用人类反馈强化学习 (RHFL) 作为后续微调步骤。
将输入文本分解为多个片段,每一部分大约是一个单词大小的序列,我们称之为子词标记,该过程称为标记化。标记可以是单词或只是字符块。
Stable Diffusion是一种潜在扩散模型,主要通过自动编码器(VAE),U-Net以及文本编码器三个核心组件完成用文本来控制生成的图像。Unet的Attention模块Latent Feature和Context Embedding作为输入,将两者进行Cross Attenetion操作,将图像信息和文本信息进行了融合,整体上是一个经典的Transformer流程。
Diffusion的缺点是在反向扩散过程中需要把完整尺寸的图片输入到U-Net,这使得当图片尺寸以及time step t足够大时,Diffusion会非常的慢。
训练过程包含:每一个训练样本选择一个随机时间步长,将time step 对应的高斯噪声应用到图片中,将time step转化为对应embedding;
模型在训练过程中 loss 会逐渐降低,越到后面 loss 的变化幅度越小。如果时间步长是递增的,那么必然会使得模型过多的关注较早的时间步长(因为早期 loss 大),而忽略了较晚的时间步长信息。
为了解决这个问题通常在领域训练的过程中加入通用数据集。那么这个比例多少比较合适呢?目前还没有一个准确的答案。主要与领域数据量有关系,当数据量没有那么多时,一般领域数据与通用数据的比例在1:5到1:10之间是比较合适的。
- Qformer
- Detecting Everything in the Open World: Towards Universal Object Detection
一般来说,强化学习 (RL) 系统由两个主要组件组成:代理和一个环境;
- 环境是智能体正在作用的设置,智能体代表强化学习算法。
- 当环境向代理发送一个状态时,强化学习过程就开始了,然后代理根据其观察结果采取行动来响应该状态。
- 反过来,环境将下一个状态和相应的奖励发送回代理。代理将使用环境返回的奖励来更新其知识,以评估其最后的行动。
- 循环继续,直到环境发送终止状态,这意味着代理已完成其所有任务。
为了更好地理解这一点,我们假设我们的智能体正在学习玩反击游戏。RL 过程可以分为以下步骤:
- RL 代理(玩家 1)从环境中收集状态 S⁰(反恐精英游戏)
- 基于状态 S⁰,RL 代理采取操作 A⁰(操作可以是任何导致结果的操作,即代理在游戏中向左或向右移动)。最初,动作是随机的
- 境现在处于新状态 S1(游戏中的新阶段)
- 强化学习代理现在从环境中获得奖励 R1。该奖励可以是额外的积分或金币
- 这个 RL 循环一直持续到 RL 代理死亡或到达目的地为止,并且它不断输出一系列状态、动作和奖励。
奖励最大化是强化学习的一个关键概念。人工智能代理试图采取行动,随着时间的推移从其环境中获得最大的回报。代理从奖励或惩罚形式的输入中学习,并改变其行为方式以更好地完成工作。目标是让智能体足够聪明,能够从经验中学习并做出选择,帮助他们尽快实现长期目标。
- 使用多个不同的prompt,从而增加模型学习的样本多样性。
- 通过在prompt中添加随机噪声或变换,来增加数据集的丰富性,从而提高模型的泛化性能。
- 采用迁移学习或元学习等方法,从先前学习的任务中提取知识,并将其应用于新的任务中。
- Prompt tuning:针对每个任务,单独生成prompt模板(hard prompt or soft prompt),然后在每个任务上进行full-shot微调与评估,其中预训练模型参数是freeze的。Prompt是去激发语言模型的补全能力,比如给出上半句生成下半句、或者做完形填空,都还是像在做language model任务。
- Instruction Tuning:针对每个任务,单独生成instruction(hard token),通过在若干个full-shot任务上进行微调,然后在具体的任务上进行评估泛化能力(zero shot),其中预训练模型参数是unfreeze的。Instruction Tuning则是激发语言模型的理解能力,通过给出更明显的指令/指示,让模型去理解并做出正确的action。
- 使用不同类型的损失函数和温度参数来获得更好的知识蒸馏效果。
- 引入额外的信息来提高蒸馏的效果,例如将相似性约束添加到模型训练中。
- 将蒸馏方法与其他技术结合使用,例如使用多任务学习和迁移学习来进一步改进知识蒸馏的效果。
在标准的Transformer中,attention计算的时间复杂度为O(N^2),其中N是输入序列的长度。为了降低计算复杂度,可以采用以下几种方法:
- 使用自注意力机制,减少计算复杂度。自注意力机制不需要计算输入序列之间的交叉关系,而是计算每个输入向量与自身之间的关系,从而减少计算量。
- 使用局部注意力机制,只计算输入序列中与当前位置相关的子序列的交互,从而降低计算复杂度。
- 采用基于近似的方法,例如使用随机化和采样等方法来近似计算,从而降低计算复杂度。
- 使用压缩注意力机制,通过将输入向量映射到低维空间来减少计算量,例如使用哈希注意力机制和低秩注意力机制等。
在进行SFT实验的时候,大模型选用Chat还是Base作为基座,需要根据SFT的数据量进行决定。如果你只拥有小于10k数据,建议你选用Chat模型作为基座进行微调;如果你拥有100k的数据,建议你在Base模型上进行微调。
进行大模型预训练时书籍和论文的文本就按照段落拆分就可以。如果进行有监督的微调任务,就需要转成指令格式的数据集,可以用标题或者关键短语作为提示。
一致性问题是指模型的目标和行为与人类价值观和期望的一致性程度。大语言模型,例如GPT-3,接受来自互联网的大量文本数居的训练,并且够生成类似人类的文本,但它们可能并不总是产生与人类期望或理想值一致的输出。大型语言模型中的对齐问题通常表现为
- 缺乏帮助: 当模型没有遵循用户的明确指令时
- 幻觉: 当模型编造不存在或错误的事实时。
- 缺乏可解释性: 人类很难理解模型如何得出特定决策或预测
- 生成有偏见或有毒的输出: 当受有偏见/有毒数据训练的语言模型可能会在其输出中重现该输出时,即使没有明确指示这样做。
自适应Softmax在大型语言模型中非常有用,因为它可以在处理大型词汇表时进行有效的训练和推理,传统的Softmax涉及计算词汇表中每个单词的概率率,随着词汇量的增长,计算成本可能会变得昂贵。
自适应Softmax根据单词的常见程度将单词分组到簇中,从而减少了所需的计算量。这减少了计算词汇表概率分布所需的计算量。通过使用自适应softmax,可以更有效地训练和运行大型语言模型,从而实现更快的实验和开发。