本文GitHub地址https://github.com/panda-like-bamboo/Study-CS324
语言模型的训练方式:
挑战与优势:
例子分析:
这个例子是一个自然语言推理(NLI)任务的样本,其中包括前提(Premise)和假设(Hypothesis)。在这个任务中,模型的目标是判断给定的前提和假设之间是否存在蕴涵(entailment)关系。
分析:
总体而言,这个例子强调了在自然语言推理任务中,模型需要理解前提和假设之间的逻辑关系,以正确判断它们之间是否存在蕴涵关系。
下面提供使用预训练语言模型(LM)的参数来适配(adapt)下游任务的一般设置。下面我将这个过程分为相关且逐渐递进的各个部分:
预训练语言模型(Pre-trained LM):
在适配阶段的开始,我们已经有了一个预训练的语言模型,用参数 θ L M θLM θLM表示。这个模型被训练来理解和生成语言,但不是特别针对任何特定任务。
下游任务数据集(Downstream Task Dataset):
我们获得了一组来自下游任务分布 P t a s k P_{task} Ptask的样本数据。这些数据可以是文本分类、情感分析等任务的特定实例,每个样本由输入x和目标输出y组成,如: ( x ( 1 ) , y ( 1 ) ) , … , ( x ( n ) , y ( n ) ) \left(x^{(1)}, y^{(1)}\right), \ldots,\left(x^{(n)}, y^{(n)}\right) (x(1),y(1)),…,(x(n),y(n))。
适配参数(Adaptation Parameters):
为了使预训练的LM适合特定的下游任务,我们需要找到一组参数 γ \gamma γ,这组参数可以来自现有参数的子集或引入的新的参数, Γ \Gamma Γ。这些参数将用于调整模型,以便它在特定任务上的表现更好。
任务损失函数(Task Loss Function):
我们需要定义一个损失函数 ℓ task \ell_{\text {task }} ℓtask 来衡量模型在下游任务上的表现。例如,交叉熵损失是一种常见的选择,用于衡量模型预测的概率分布与真实分布之间的差异。
优化问题(Optimization Problem):
我们的目标是找到一组适配参数 γ adapt \gamma_{\text {adapt }} γadapt ,使得任务损失在整个下游数据集上最小化。数学上,这可以通过以下优化问题表示:
γ adapt = argmin γ ∈ Γ 1 n ∑ i = 1 n ℓ task ( γ , θ L M , x i , y i ) . \gamma_{\text {adapt }}=\operatorname{argmin}_{\gamma \in \Gamma} \frac{1}{n} \sum_{i=1}^n \ell_{\text {task }}\left(\gamma, \theta_{\mathrm{LM}}, x_i, y_i\right) . γadapt =argminγ∈Γn1i=1∑nℓtask (γ,θLM,xi,yi).
公式注释:
目标:找到一组适配参数 γ(gamma),使得在整个下游数据集上执行某个任务的平均损失最小化。
符号说明:
公式表示:
这个公式的目标是找到适配参数的最优组合,以最小化整个下游数据集上任务的平均损失。
通过这个过程,我们可以取得一组适配参数 γ adapt \gamma_{\text {adapt }} γadapt ,用于参数化适配后的模型 p a d a p t p_{adapt} padapt。这样,我们就可以将通用的、任务无关的预训练语言模型适配到特定的下游任务上,以实现更好的性能。这种适配方法将模型的通用性与特定任务的效能结合在一起,既保留了模型的灵活性,又确保了在特定任务上的高效表现。
交叉熵损失(Cross-Entropy Loss)通常用于衡量两个概率分布之间的差异性,常用于分类问题中的损失函数。在深度学习中,交叉熵损失经常用于衡量模型输出的概率分布与真实标签之间的差异。
假设有一个分类问题,每个样本有多个类别,交叉熵损失的一般形式可以表示为:
[
\ell_{\text{CE}}(p,q) = -\sum_{i} p_i \log(q_i)
]
其中:
在实际应用中,交叉熵损失可用于训练分类模型,通过最小化损失来调整模型参数,使得模型的输出更接近真实标签的分布。
Probing(探针)策略是一种在大规模预训练阶段广泛使用的微调策略。以下是Probing方法的引入及其应用,以及固定长度表示的策略的讨论。
在自然语言处理(NLP)领域,探针通常指的是一种用于检查和理解预训练语言模型内部知识表示的技术。预训练语言模型,如BERT(Bidirectional Encoder Representations from Transformers)或GPT(Generative Pre-trained Transformer),在大规模语料库上进行预训练,学到了丰富的语言知识。为了深入了解这些模型学到的内容,研究人员使用探针任务,这些任务通常是简单的监督学习任务,通过模型内部表示来解决。
下面是探针在NLP中的一般过程:
选择探针任务: 为了了解模型在特定语言方面的知识,研究人员选择一个特定的任务,例如语法分析、情感分析、语义角色标注等。这个任务通常是监督学习任务,有已标注的数据集可用。
冻结预训练模型: 预训练的语言模型被冻结,不再更新。这样,模型在探针任务上的学习主要通过微调来实现。
微调探针任务: 使用探针任务的标注数据,对冻结的预训练模型进行微调。微调过程中,模型学习适应特定任务的特征,但并不改变其在大规模预训练语料上学到的通用知识。
分析结果: 完成微调后,研究人员分析模型在探针任务上的性能。通过观察模型在这个任务上的表现,研究人员可以推断出模型对于特定语言特性的理解程度,以及模型在学习过程中保留了哪些知识。
通过使用探针技术,研究人员能够更详细地了解预训练语言模型的内部表示,揭示模型在处理语言任务时的认知能力和语言知识。这有助于我们理解模型的强弱之处,进一步优化模型或提出改进的训练方法。
Probing是一种用于分析和理解模型内部表示的技术,通过引入一个新的参数集 Γ \Gamma Γ,定义了线性或浅前馈网络的Probing。例如,通过预测词性标注(POS)来检查表示是否包含POS信息。
Probing适用于仅编码器模型,例如BERT,但也可用于解码器模型。对于Adaptation,可以从语言模型(LM)的最后一层表示中训练一个Probing到输出.
Probing方法通过线性或浅前馈网络学习预训练模型的输出,分析和理解模型表示。固定长度表示的策略包括CLS token策略和平均化token策略,为适应任务提供了有效的解决方案。
Probing作为分析工具,通过冻结语言模型表示编码器和优化特定任务的探针来工作。固定长度表示的策略进一步促进了这一目的,提供了灵活而有效的解决方案。
Fine-tuning使用语言模型参数 θ L M θLM θLM作为初始化,并在微调过程中更新语言模型参数和任务特定的预测头参数。下面是微调对于zero-shot能力、人类对齐语言模型以及零样本性能的影响进行了讨论。
“Fine-tuning”(微调)是指在一个已经经过预训练的模型基础上,通过在特定任务上进行进一步的训练,使其适应特定任务或领域的过程。微调的目的是将预训练模型的泛化能力应用于具体任务,从而提高模型在任务上的性能。
以下是微调的一般步骤:
预训练模型: 通常,微调开始于一个在大规模语料库上进行了预训练的模型。这个预训练可以是在自然语言处理(NLP)任务中,如语言建模、文本生成、或其他相关任务中进行的。
选择任务: 确定要在预训练模型上执行微调的具体任务。这可以是分类、命名实体识别、情感分析等各种自然语言处理任务。
准备数据: 收集并准备用于微调的标注数据。这些数据包含了模型在任务上需要学习的样本。对于监督学习任务,数据通常包括输入和相应的标签。
调整模型结构: 在某些情况下,可能需要微调模型的结构,以适应特定任务的要求。这可能包括添加、修改或删除某些层次或组件。
微调过程: 使用任务相关的标注数据,对预训练模型进行进一步的训练。在这个微调阶段,模型的权重将根据任务特定的数据进行调整,以使其更好地适应目标任务。
评估性能: 完成微调后,通过使用验证集或其他评估数据集来评估模型在目标任务上的性能。这有助于确定微调是否成功,并且模型是否达到了预期的性能水平。
微调的优势在于能够在相对较小的标注数据集上获得良好的性能,因为模型已经在大规模的通用数据上学到了许多有用的特征。微调是迁移学习的一种形式,通过利用预训练模型的知识,可以在特定任务上实现更好的泛化性能。
ero-shot learning(零样本学习)是一种机器学习范式,在训练阶段没有见过的任务或类别上进行泛化的能力。它允许模型在没有任何具体示例的情况下解释和处理全新的信息。这个能力对于许多实际应用至关重要,特别是当新任务或类别的样本难以获得时。
零样本学习的能力使得模型具有更高的灵活性和泛化能力,能够在未见过的任务上迅速适应。这在现实世界中极为重要,因为我们常常会遇到一些新的、未在训练数据中出现过的任务或情境。零样本学习模型可以迅速解决这些问题,而无需每次都进行繁琐的重新训练。
微调在人类对齐语言模型中发挥关键作用,通过收集人类示例和使用强化学习目标微调,可以使模型更好地理解和满足人类需求。
微调的过程包括收集人类书写的示范行为、基于指令的采样与人类偏好以及使用强化学习目标微调。微调可以显著提高模型在特定任务和场景下的性能,但需要关注偏见和虚构信息等问题。
微调是强大的工具,可以使预训练的语言模型更好地符合人类期望和需求。虽然存在挑战和限制,如偏见和虚构信息的产生,但微调仍然是现代机器学习中的重要工具。
轻量级微调(Lightweight Fine-Tuning)是一种特殊的微调技术,旨在结合全面微调的表现力和更节省资源的优点。轻量级微调试图在不需要为每个任务存储完整语言模型的同时,保持与全面微调相同的表现力。换句话说,它希望在减小模型存储需求和计算负担的同时,仍然实现出色的性能。
轻量级微调是微调(Fine-tuning)的一种变体,它注重在具有较小标注数据集的情况下对预训练模型进行调整。在轻量级微调中,主要考虑到数据稀缺或有限的情况,通常涉及一些策略以防止模型在小规模数据上过拟合。以下是轻量级微调的一些关键特点和步骤:
小规模数据集: 轻量级微调通常应用于只有少量标注数据的情况,这可能是因为特定任务的数据成本较高,或者是由于某些领域的特殊性导致标注数据的有限性。
特征提取: 轻量级微调可能会侧重于仅微调模型的顶层或几个顶层,而不是对整个模型进行全面的微调。这个过程有时被称为特征提取,因为底层的预训练特征在大多数情况下是通用的,而任务特定的信息主要集中在模型的上层。
冻结底层: 在轻量级微调中,可以选择冻结底层的模型参数,使其在微调过程中不再更新。这有助于保留预训练模型在通用任务上学到的知识,减少在小规模数据集上的过拟合风险。
使用预训练模型的学习率: 为了避免在微调过程中引入大量噪声,可以选择使用相对较小的学习率。这意味着对于底层的预训练模型,保留其在大规模数据上学到的权重,而对上层使用较小的学习率以更好地适应任务特定的信息。
数据增强: 数据增强是一种常见的策略,特别在数据有限的情况下。通过对训练数据进行轻微的变换,例如旋转、翻转或缩放,可以生成更多的训练样本,有助于提高模型的泛化性能。
早停策略: 为了防止在小规模数据上过拟合,可以使用早停(early stopping)策略。这意味着在验证性能不再提高时停止微调,以避免在训练集上的过度拟合。
轻量级微调是在资源有限或标注数据受限的情况下,有效利用预训练模型的一种策略。通过这种方式,可以在小规模数据上实现相对较好的性能,同时最大限度地减少对大量标注数据的需求。
让我们更加具体地讨论轻量级微调,并使用一个自然语言处理(NLP)的示例来说明。
场景: 假设我们有一个预训练的语言模型(例如,BERT或GPT),我们想要将其应用于一个特定的任务,如情感分析,但是我们只有很小规模的情感标注数据。
具体步骤:
选择任务和数据: 我们选择情感分析作为我们的任务,并且只有一个包含有限标注数据的小型数据集,其中包含一些句子和对应的情感标签(例如,正面或负面)。
加载预训练模型: 我们加载预训练的语言模型,例如BERT。这个模型在大规模语料库上进行了预训练,已经学到了语言的一般特征。
冻结底层: 我们选择冻结预训练模型的底层(例如,冻结BERT的前几个层),以防止在微调过程中过度调整通用特征。这有助于防止在小规模数据上出现过拟合。
定义顶层任务: 我们添加一个新的顶层(输出层)来适应我们的情感分析任务。这一层将根据我们的情感标签进行训练,连接到预训练模型的输出。
微调顶层: 我们只微调我们新添加的顶层,而不对整个模型进行全面的微调。通过使用较小的学习率,我们保留底层模型在大规模数据上学到的通用知识。
数据增强: 由于我们的标注数据很有限,我们可以应用数据增强技术,如对句子进行轻微的扰动、替换或翻转,以生成更多的训练样本。
早停策略: 我们使用早停策略来监控验证集上的性能。如果性能不再提高,我们停止微调,以防止在小规模数据上过拟合。
示例代码(使用Python和PyTorch):
# 加载预训练模型
pretrained_model = BertModel.from_pretrained('bert-base-uncased')
# 冻结底层
for param in pretrained_model.parameters():
param.requires_grad = False
# 添加新的情感分析顶层
num_labels = 2 # 正面和负面
emotion_classifier = nn.Sequential(
nn.Linear(pretrained_model.config.hidden_size, 512),
nn.ReLU(),
nn.Dropout(0.2),
nn.Linear(512, num_labels)
)
# 定义模型
model = nn.Sequential(pretrained_model, emotion_classifier)
# 定义优化器和损失函数
optimizer = optim.Adam(emotion_classifier.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()
# 进行微调
for epoch in range(num_epochs):
for inputs, labels in dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 在验证集上评估性能,使用早停策略
# 如果性能不再提高,停止微调
if performance_not_improving():
break
这个示例演示了轻量级微调的基本步骤,其中重点是冻结底层、添加任务特定顶层、微调顶层、使用数据增强和早停策略。这样的策略可以帮助在小规模数据上有效地使用预训练模型,并取得良好的性能。
轻量级微调有许多变体,其中一些主要的方法包括:
提示调整,主要应用于文本分类任务。与传统微调方法不同,Prompt Tuning侧重于优化输入提示而不是改变模型的内部参数。以下是主要观点的总结:
Prompt Tuning的核心思想: Prompt Tuning通过在输入前添加可学习的、连续的标记嵌入,这些嵌入定义为 Γ,来进行工作。这些额外的标记嵌入通过在带标签的任务数据上进行训练来学习,从而优化输入提示。
输入长度的改变: 添加了k个标记嵌入后,新的输入长度为 L’ = L + k,其中L是原始输入的长度。这些额外的标记嵌入的学习是在带标签的任务数据上进行的。
冻结预训练语言模型: 整个预训练的语言模型在Prompt Tuning过程中被冻结,使模型的主体部分不会在微调中发生改变。这突显了通过调整输入提示而不改变预训练参数,可以获得竞争性能。
性能与冻结规模的关系: 随着冻结语言模型规模的增加,Prompt Tuning的性能越来越有竞争力,可以与全面微调(模型调整)相媲美。这表明即使在不改变预训练参数的情况下,通过调整输入提示可以实现出色的性能。
初始化策略: 提示调整涉及不同的初始化策略,包括随机词汇词嵌入、类标签词嵌入以及随机初始化。提示调整的第二个版本(Prompt tuning v2)是全层版本,对文本分类和生成任务都有助益。
轻量级微调的创新方法: 总体而言,Prompt Tuning是一种创新的轻量级微调方法,通过在输入上添加可学习的嵌入而不是改变整个模型的结构来实现任务特定的优化。这不仅减少了计算和存储需求,还允许使用较大的冻结模型来实现与全面微调相当的性能。在文本分类等任务中,Prompt Tuning提供了一种灵活和高效的解决方案。
以下是对文中7.2.3.3节关于"Prefix Tuning"(前缀调整)的详细解释:
1. Prefix Tuning简介:
2. 区别于Prompt Tuning的关键特征:
3. 注意力操作的定义:
4. 对自注意力头的定义:
5. 参数学习与模型性能:
6. 总结:
1. Adapter Tuning简介:
2. 适配器的计算方式:
更详细地解释一下适配器的计算方法:
适配器的计算过程由以下公式定义:
$ \text{Adapter}(x) = x + W_{\text{up}}\sigma(W_{\text{down}}x) $
其中, x x x 是输入向量, W down W_{\text{down}} Wdown 和 W up W_{\text{up}} Wup 是学习到的权重矩阵, σ \sigma σ 是非线性激活函数。这个公式可以分为几个步骤:
投影到瓶颈维度:
非线性激活:
再投影回原维度:
与原始输入相加:
总的来说,适配器通过引入可学习的权重矩阵,在每个输入向量上执行两次线性投影,并使用非线性激活函数进行非线性变换,最终得到一个适应性更强的输出。这允许模型在每个 Transformer 层之间引入微小的调整,以适应特定任务的需求,而不必对整个模型进行大规模的调整。
3. 整体效果和灵活性:
4. 适配器设计的优势:
5. 在自然语言处理中的应用:
总的来说,Adapter Tuning是一种强大的微调方法,通过在Transformer层之间引入适配器层,为模型提供了灵活性,使其能够在不改变整体结构的情况下进行任务特定的优化。
1. 表达能力的复杂性:
2. 个性化模型的实现方法:
3. 方法的鲁棒性提升:
4. Prefix Tuning提高领域外准确性:
我们需要将大型语言模型适配到各种不同的下游任务中,这些任务可能与语言建模有很大不同。
[1]datawhale讲义: https://github.com/datawhalechina/so-large-lm
[2]CS324: https://stanford-cs324.github.io/winter2022/lectures/
[3]Designing and Interpreting Probes with Control Tasks
[4]Prompt Tuning
[5]Prompt tuning v2
[6]Prefix Tuning
[7]Adapter Tuning
[8]Prompt Tuning方法提高了OOD的准确性
[9]LoRA
[10]BitFit