【3.2-3.8学习周报】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 摘要
- Abstract
- 一、方法介绍
- 1.任务适应性持续预训练(TACP)
- 2.领域自适应连续预训练(DACP)
- 3.ETS-DACP和ETA-DACP
- 二、实验
- 1.实验概况
- 2.实验代码
- 3.实验结果
- 总结
摘要
本博客介绍了论文《Efficient Continual Pre-training for Building Domain
Specific Large Language Models》通过持续预训练构建特定领域大语言模型的策略。研究以金融领域为例,创建了包含160亿单词的大规模金融语料库,训练了基于Pythia的FinPythia模型。实验表明,领域自适应持续预训练能提升模型在金融任务上的表现,且不损害其开放领域能力。此外,提出了ETS - DACP和ETA - DACP两种高效的持续预训练方法,通过数据选择策略,仅用10%的语料和成本就能取得优于普通持续预训练的效果,为低成本构建特定领域大语言模型提供了新途径。
Abstract
This blog introduces the paper “Efficient Continual Pre-training for Building Domain Specific Large Language Models” which discusses strategies for constructing domain-specific large language models through continual pre-training. Taking the financial sector as an example, a large-scale financial corpus containing 16 billion words was created, and the Pythia-based FinPythia model was trained. Experiments show that domain-adaptive continual pre-training can enhance the model’s performance on financial tasks without compromising its open-domain capabilities. Additionally, two efficient continual pre-training methods, ETS - DACP and ETA - DACP, are proposed, which achieve better results than ordinary continual pre-training using only 10% of the corpus and cost, providing a new approach for low-cost construction of domain-specific large language models.
一、方法介绍
1.任务适应性持续预训练(TACP)
任务适应性持续预训练(TACP)是指旨在提高目标任务绩效的持续预训练。TACP已经在较小的语言模型(如BERT)的背景下进行了研究,通过对来自任务的标记和未标记数据预训练语言模型,显示了对任务的改进。虽然任务数据通常非常有限,但TACP对BERT等较小的语言模型有相当大的影响。
2.领域自适应连续预训练(DACP)
域自适应连续预训练(DACP)是从头开始建造的直接替代方案。域自适应持续的预训练表明能够适应语言模型以更好地拟合内域分布。 它们还使大型语言模型能够获取新知识,因为出现了新数据,而不是从头开始训练模型。
3.ETS-DACP和ETA-DACP
TACP的主要局限性在于它专注于构建特定于任务的LLM,而不是基础LLM,这是因为它只使用未标记的任务数据进行训练。虽然DACP使用的领域语料库要大得多,但它的成本非常高。针对这些局限性,研究者提出了两种方法:高效任务相似领域自适应连续预训练(ETS-DACP)和高效任务不可知域自适应连续预训练(ETA-DACP)。ETS-DACP旨在通过定制DACP来为一系列任务建立基础LLM,以强调这些任务的重要性,而ETA-DACP则更加通用,从领域语料库中选择信息最丰富的样本进行持续的预培训。
ETS-DACP(任务感知的领域自适应持续预训练)
目标:从领域语料库中选择与任务数据分布相似的样本。
实现:
1.使用嵌入模型(如Spacey)计算任务数据和领域数据的文档级嵌入。
2.采用余弦相似度来衡量领域文档d与任务文档t之间的相似度:
3.选择相似度最高的样本或按相似度分配权重进行训练。
ETA-DACP(任务无关的领域自适应持续预训练)
目标:在无任务数据的情况下,选择领域语料库中新颖性和多样性较高的样本。
实现:新颖性:通过困惑度Perplexity衡量样本的新颖性。
使用小模型作为代理计算困惑度,选择困惑度高的样本(模型不熟悉的文本)。
多样性:通过词性标签的熵衡量,选择熵高的样本:
理论支撑:
泛化误差界限:
DHPΔHP是由界限的D和T之间的分布差异距离:
核心思想:通过最小化领域数据分布 D和T之间的分布差异距离DHPΔHP,提升模型在任务上的泛化性能。
实现方式:选择与任务数据分布接近的领域数据(ETS-DACP)或高信息量的领域数据(ETA-DACP)。
二、实验
1.实验概况
以金融领域为研究场景,基于Pythia模型构建持续预训练模型FinPythia,通过实验对比不同方法在金融任务和开放领域标准任务上的表现。从金融新闻CommonCrawl和SEC filings两个来源收集数据,构建包含160亿单词的大规模金融语料库。采用领域自适应持续预训练(DACP)、任务自适应持续预训练(TACP),并提出高效任务相似领域自适应持续预训练(ETS - DACP)和高效任务无关领域自适应持续预训练(ETA - DACP)。
使用相似度、困惑度和词元类型熵三个指标进行数据选择,有硬采样和软采样两种方式。
在金融任务上采用FLARE框架评估模型,在开放领域标准任务上使用MMLU和TruthfulQA等进行评估。通过对比不同模型在各任务上的表现,分析不同预训练方法和数据选择策略的效果。
2.实验代码
完整代码链接:https://github.com/EleutherAI/lm-evaluation-harness
以下展示实验关键代码及相应注释说明:
import os
from itertools import islice
import datasets
import pytest
import lm_eval.tasks as tasks
from lm_eval.api.task import ConfigurableTask
from lm_eval.evaluator_utils import get_task_list
from .utils import new_tasks
# 设置HuggingFace数据集信任远程代码(与论文中使用的第三方金融数据相关)
datasets.config.HF_DATASETS_TRUST_REMOTE_CODE = True
# 禁用tokenizers并行处理(防止多进程冲突)
os.environ["TOKENIZERS_PARALLELISM"] = "false"
# 默认测试任务列表(对应论文中Table 4的开放域评估任务)
TASKS = ["arc_easy"]
def get_new_tasks_else_default():
"""
检查是否有修改后的新任务,否则返回默认任务列表
(对应论文中第3章实验设置,支持自定义金融评估任务)
"""
global TASKS
task_classes = new_tasks() # 获取新增/修改的任务(如论文提出的FLARE金融评估框架)
return task_classes if task_classes else TASKS
def task_class(task_names=None, task_manager=None) -> ConfigurableTask:
"""
将任务名称转换为可配置任务实例
(支持论文中第4节的多任务评估设置)
"""
if task_manager is None:
task_manager = tasks.TaskManager()
res = tasks.get_task_dict(task_names, task_manager) # 加载任务配置
res = [x.task for x in get_task_list(res)] # 实例化任务对象
return res
@pytest.fixture()
def limit() -> int:
return 10 # 测试文档数量限制(加速测试过程)
# 基础测试类(验证任务配置的完整性)
class BaseTasks:
"""测试语言模型评估任务的核心功能"""
def test_download(self, task_class: ConfigurableTask):
"""验证数据集下载功能(对应论文附录E的金融语料库构建流程)"""
task_class.download()
assert task_class.dataset is not None
def test_has_training_docs(self, task_class: ConfigurableTask):
"""检查是否包含训练文档(用于持续预训练的数据准备)"""
assert task_class.has_training_docs() in [True, False]
def test_doc_to_text(self, task_class, limit):
"""验证文档到文本的转换(对应论文3.1节的指令提示设计)"""
task = task_class
arr = list(islice(task.test_docs(), limit)) if task.has_test_docs() else list(islice(task.validation_docs(), limit))
_array = [task.doc_to_text(doc) for doc in arr]
# 检查文本格式是否符合论文中的空间约定(防止目标分隔符冲突)
def test_create_choices(self, task_class, limit):
"""验证多选任务选项生成(对应论文Table 1中的分类任务设置)"""
task = task_class
if "multiple_choice" in task._config.output_type:
_array = [task.doc_to_choice(doc) for doc in arr]
assert all(isinstance(x, list) for x in _array) # 确保选项格式正确
def test_build_all_requests(self, task_class, limit):
"""构建评估请求(对应论文4.1节的5-shot评估设置)"""
task_class.build_all_requests(rank=1, limit=limit, world_size=1)
assert task_class.instances is not None
# 参数化测试:使用论文提出的新任务或默认任务
@pytest.mark.parametrize(
"task_class",
task_class(get_new_tasks_else_default()),
ids=lambda x: f"{x.config.task}", # 显示任务名称
)
class TestNewTasksElseDefault(BaseTasks):
"""测试新增/修改的任务配置(验证论文3.2节的实验设置有效性)"""
# 单元测试:专门测试Unitxt格式任务(对应论文中FLARE评估框架的实现)
@pytest.mark.parametrize(
"task_class",
task_class(["arc_easy_unitxt"], tasks.TaskManager(include_path="./tests/testconfigs")),
)
class TestUnitxtTasks(BaseTasks):
"""测试自定义任务格式(验证论文附录B中数据分布分析的实现)"""
def test_doc_to_text(self, task_class, limit: int):
"""验证复杂文本生成(对应论文Table 2的定性评估案例)"""
task = task_class
_array = [task.doc_to_text(doc) for doc in arr]
if not task.multiple_input:
for x in _array:
assert isinstance(x, str) # 确保生成文本格式正确
核心测试类:BaseTasks中的每个测试方法对应论文不同章节:
test_download验证附录E的金融语料库构建
test_create_choices对应Table 1的多分类任务设置
test_build_all_requests实现4.1节的5-shot评估
3.实验结果
为了监控预训练过程,研究者随机抽取了0.1%的金融语料作为金融测试数据集。该模型还在Pile测试数据集上进行了评估。FinPythia6.9B的损失轨迹如下图所示:
研究者观察到在持续预训练的早期阶段,财务测试(Fin测试)损失急剧减少,并且进展逐渐饱和。
为了评估金融领域的任务,研究者将Finpythia与Pythia和其他相似大小的开源模型进行了比较,将OPT-7B ,BLOOM-7B [和GPT-J-6B作为基准模型。
结果如下表所示:
FinPythia-6.9B和FinPythia-1B在任务FPB、标题和NER上表现出上级性能,而在FiQA SA任务上表现出相对较低的结果。DACP将1B模型的平均任务性能提高了2.8%,将6.9B模型的平均任务性能提高了8.3%。这些结果直接证实了领域适应性持续预训练对提高领域内任务绩效的影响。此外,Pythia-6.9B的平均性能优于OPT-7 B、BLOOM-7 B和GPT-J-6 B。
使用Efficient DACP方法,研究者选择了10%的金融语料子集用于每种方法,还创建了另一个版本的ETS-DACP,称为ETS-DACP-com,通过使用其他两个具有相似性的指标,对所有三个指标进行平均排名/加权。为了减轻过拟合,TACP和Efficient DACP方法都运行单个epoch,采用与DACP相同的预训练配置,以确保公平比较,实验结果如下所示:
虽然与原始Pythia-1B相比,TACP在模型性能上有显着改善,但ETS-DACP在平均任务性能方面突出,成为DACP,TACP和高效DACP方法中表现最好的方法。
在10%语料库上训练的ETS-DACP在100%数据的情况下优于DACP;TS-DACP在所有三个同行中具有最好的性能,并且与三个度量的组合- ETS-DACP-com相当;采用硬采样的DACP方法优于采用软采样的DACP方法。
总结
研究者提出ETS - DACP和ETA - DACP两种高效领域自适应持续预训练方法,通过数据选择策略提升预训练效果。首次在大语言模型持续预训练中进行数据选择,提出基于相似度、困惑度和标记类型熵的选择策略。首次在大语言模型持续预训练中进行数据选择,提出基于相似度、困惑度和标记类型熵的选择策略。