使用语言模型(例如在上下文学习中)通过仅给出提示,我们已经能够执行一些任务。然而,提示方法并不适用于全部的下游任务,如自然语言推理(NLI)、问题回答(QA)、将网络表格转换为文本、解析电子健康记录(EHR)等。
下游任务与语言模型的训练数据(例如,Pile数据集)可能在格式和主题上有所不同,或者需要随时间更新新知识。因此,语言模型需要使用特定于任务的数据或领域知识来针对下游任务进行适配。
11.1 引言
11.1.1 为什么需要Adaptation?
在自动化和人工智能的时代,语言模型已成为一个迅速发展的领域。这些模型被训练为对各种各样的任务作出响应,但它们真的适合所有的任务吗?在探讨这一问题之前,我们需要理解语言模型如何被训练,并明确下游任务与原始训练任务之间可能存在的不同之处。
从语言模型的训练方式来说,语言模型,例如GPT-3,通常是任务不可知(task-agnostic)的,这意味着它们在一个广泛的领域内进行训练,而不是针对特定任务。这种方法的优点在于模型具有广泛的适用性,但也带来了一些挑战。比如下游任务的多样性,不同的下游任务与语言模型的预训练方式可以非常不同,这可能导致问题。例如,自然语言推理(NLI)任务与Pile数据集上的语言建模任务可能完全不同。考虑以下例子:
- Premise: I have never seen an apple that is not red.
- Hypothesis: I have never seen an apple.
- Correct output: Not entailment (the reverse direction would be entailment)
这种格式对模型来说可能并不自然,因为它远离了模型的训练范围。
另外在处理下游任务时,与原始训练任务之间的差异可能造成一些挑战。这些不同之处可以从以下几个方面进行详细探讨:
格式的不同:
- 自然语言推理(NLI): 下游任务如NLI涉及两个句子的比较以产生单一的二进制输出。这与语言模型通常用于生成下一个标记或填充MASK标记的任务截然不同。例如,NLI的逻辑推理过程涉及多层次的比较和理解,而不仅仅是根据给定的上下文生成下一个可能的词。
- BERT训练与MASK标记: BERT训练过程中使用了MASK标记,而许多下游任务可能并不使用这些标记。这种不同可能导致在针对具体任务时需要对模型进行显著的调整。
- 特定领域的需求: 下游任务可能集中在特定的主题或领域上,例如医疗记录分析或法律文档解析。这些任务可能涉及专门的术语和知识,与模型的通用训练任务相去甚远。
- 广泛主题的灵活性: 语言模型可能需要处理各种不同的主题。如果下游任务突然聚焦在一个新的或非常独特的领域上,这可能会超出模型的训练范围。
- 时间转变:
新知识的需求: 随着时间的推移,新的信息和知识不断涌现。例如,GPT-3在拜登成为总统之前就已训练完毕,因此可能缺乏有关他总统任期的最新信息。 - 非公开信息的需求: 有时下游任务可能涉及在训练期间不公开的信息。这可能需要更多特定领域的专业知识和调整。
因此可以总结一下”为什么需要语言模型的Adaptation?“,下游任务与语言模型的训练任务之间的不同之处非常复杂。这些差异可以从格式、主题和时间三个方面来探讨,每个方面都可能涉及许多具体的挑战和需求。通过深入了解这些不同之处,我们可以更好地理解如何有效地适配语言模型以满足各种下游任务的需求。
11.1.2 通用的adaptation配置
下面提供使用预训练语言模型(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) .