持续学习语言模型
新闻
🔥 我们已在Hugging Face添加了检查点,以便更轻松地复现!
🔥 我们添加了continual_pretrain.ipynb作为软掩蔽场景的自包含示例。它无需GPU也能很好地运行!
🔥 软掩蔽也可以应用于常规持续微调中。请查看我们最新的EMNLP23论文!
🔥 想知道如何在不担心参数更新的情况下适应黑盒大语言模型吗?请查看我们最新的检索增强生成(RAG)论文!
快速链接
介绍
2021年,我们推出了Pycontinual,这是一个简单灵活的持续学习框架。我们的研究从这个框架中受益匪浅。今天,我们很高兴分享ContinualLM,这是一个专注于语言模型(LMs)的可扩展持续学习框架,旨在保持持续学习(CL)在这一领域的优势。
语言模型的持续学习与传统的CL不同,因为:
- 每个任务都被视为一个特定领域的语料库(目前,我们主要关注领域适应性预训练,也称为预微调或后训练)。
- 此外,评估过程涉及对相应的最终任务进行微调。
我们的仓库包含了一系列最先进(SoTA)方法的PyTorch实现,使用相同的训练和评估流程。该仓库致力于推进语言模型持续学习领域的发展。包括的方法有:
-
来自我们团队的:
- DAS: 语言模型的持续学习,ICLR 2023
- CPT: 语言模型的持续训练用于少样本学习,EMNLP 2022
- DGA: 在保留通用知识的同时适应语言模型,EMNLP 2022
- CTR: 在持续学习中实现遗忘预防和知识转移,NeurIPS 2021
- CLASSIC: 方面情感分类任务的持续和对比学习,EMNLP 2021
- B-CL: 适应BERT以持续学习一系列方面情感分类任务,NAACL 2021
-
来自其他团队的**(更多即将推出)**:
- DEMIX: Demix层:解耦领域以实现模块化语言建模,Gururangan等人,NAACL 2022
- EWC: 克服神经网络中的灾难性遗忘,Kirkpatrick等人,PNAS 2017
- DER++: 通用持续学习的黑暗经验:一个强大、简单的基线,Buzzega等人,NeuriPS 2020
- HAT: 通过对任务的硬注意力克服灾难性遗忘,Serrà等人,ICML 2018
-
广泛使用的持续学习基线:
- NCL: 朴素持续学习:对一系列领域进行持续领域适应性预训练,不特别关注遗忘或迁移问题。
- ONE: 为每个领域单独进行领域适应性预训练。
- Adapter-ONE: 为每个领域在Transformer中添加适配器
- Prompt-ONE: 为每个领域在Transformer中添加提示
- KD: 朴素知识蒸馏
简单示例
我们添加了continual_pretrain.ipynb
作为软掩码场景的独立示例。它无需GPU也能很好地运行!
数据集
在语言模型(LMs)的持续学习中,找到适当的数据集至关重要。我们提供的数据集遵循以下原则:
- **领域特定:**领域语料库必须足够特定,以提高最终任务的性能。
- **可用的最终任务:**我们倾向于通过最终任务而不是依赖困惑度来评估训练好的语言模型,因为前者代表了一种更可靠的评估方法。
我们发布了包含6个不同领域的数据集,每个领域都有相应的最终任务。数据集可以在这里找到。以下是每个领域的一些统计数据:
领域语料库 | 大小 | 终端任务 | 任务 | #训练 | #测试 | #类别 |
---|---|---|---|---|---|---|
Yelp 餐厅 | 758MB | 餐厅 | 方面情感分类 (ASC) | 3,452 | 1,120 | 3 |
亚马逊手机 | 724MB | 手机 | 方面情感分类 (ASC) | 239 | 553 | 2 |
亚马逊相机 | 319MB | 相机 | 方面情感分类 (ASC) | 230 | 626 | 2 |
ACL 论文 | 867MB | ACL | 引用意图分类 | 1,520 | 421 | 6 |
AI 论文 | 507MB | AI | 关系分类 | 2,260 | 2,388 | 7 |
PubMed 论文 | 989MB | PubMed | 化学物质-蛋白质相互作用预测 | 2,667 | 7,398 | 13 |
架构
ContinualLM 的架构主要参考了 Pycontinual、CPT 和 DGA。
安装
conda create --name continuallm --file requirements.txt
:warning: 我们的模型基于 transformers==4.17.0
和 adapter-transformers==3.0.1
。我们建议使用这些特定版本,因为使用其他版本可能会导致意外的错误。
领域自适应预训练
这是持续学习发生的地方。我们将学习一系列领域。
max_samples=640000
for idrandom in 0
do
for pt_task in 0 1 2 3 4 5
do
python -m torch.distributed.launch --nproc_per_node 4 --use_env posttrain.py \
--per_device_train_batch_size 62 \
--fp16\
--max_seq_length 164 \
--max_samples ${max_samples} \
--idrandom ${idrandom} \
--ntasks 6 \
--pt_task ${pt_task} \
--baseline 'das'
done
done
--idrandom
:选择任务序列。更多详情请参见./sequences
。--baseline
:查看简介中可用的基线模型(参见config.py
中的choices
)。
终端任务微调
在语言模型的持续学习之后,现在我们可以通过单独运行终端任务微调来评估性能。
max_samples=640000
seed=(2021 111 222 333 444 555 666 777 888 999)
for round in 0; do
for idrandom in 0;
do
for pt_task in 0 1 2 3 4 5
do
for ft_task in $(seq 0 ${pt_task});
do
python finetune.py \
--max_seq_length 164 \
--pt_task ${pt_task} \
--ft_task ${ft_task} \
--idrandom ${idrandom} \
--ntasks 6 \
--max_samples ${max_samples} \
--seed ${seed[$round]} \
--baseline 'das'
done
done
done
done
Huggingface 上的检查点
对于那些只对最终模型感兴趣或想用自己的数据继续预训练模型的人来说,我们有好消息!我们通过 Hugging Face 提供检查点。
你可以轻松地使用 HuggingFace 的 transformers
导入我们持续后训练的模型!
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 导入我们的模型。该包会自动处理模型的下载
tokenizer = AutoTokenizer.from_pretrained("UIC-Liu-Lab/DAS-Rest2Cam")
model = AutoModelForSequenceClassification.from_pretrained("UIC-Liu-Lab/DAS-Rest2Cam", trust_remote_code=True)
# 对输入文本进行分词
texts = [
"有个孩子在玩滑板。",
"一个孩子正在玩滑板。",
"一个孩子在屋子里。"
]
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
# 获取模型输出!
res = model(**inputs)
如果你在直接使用 HuggingFace 的 API 加载模型时遇到任何问题,你也可以从仓库手动下载模型,然后使用 model = AutoModel.from_pretrained({下载模型的路径})
。
⚠ 持续预训练序列是位于 ./sequences/posttrain
的第一个序列(从餐厅到相机),您可以使用下载的权重来微调相应的终端任务。
⚠ 如果您对重要性文件感兴趣,请参考 before_distill0
和 after_mlm{domain_id}
。before
表示在预训练之前计算的重要性,这只在第一个领域之前进行一次,用于通用预训练知识。after
表示在 domain_id 预训练之后计算的重要性。
参考文献
我们非常感谢您的关注和引用。您对细节的关注和认可对我们来说非常宝贵。
@inproceedings{ke2022dgs,
title={Continual Learning of Language Models}, author={Ke, Zixuan and Shao, Yijia and Lin, Haowei and Konishi, Tatsuya and Kim, Gyuhak and Liu, Bing}, booktitle={International Conference on Learning Representations (ICLR)}, year={2023}}
@inproceedings{ke2022dga,
title={Adapting a Language Model While Preserving its General Knowledge}, author={Ke, Zixuan and Shao, Yijia and Lin, Haowei and Xu, Hu and Shu, Lei, and Liu, Bing}, booktitle={Empirical Methods in Natural Language Processing (EMNLP)}, year={2022}}
@inproceedings{ke2022continual,
title={Continual Training of Language Models for Few-Shot Learning}, author={Ke, Zixuan and Lin, Haowei and Shao, Yijia and Xu, Hu and Shu, Lei, and Liu, Bing}, booktitle={Empirical Methods in Natural Language Processing (EMNLP)}, year={2022}}
联系方式
如果您对代码有任何疑问,请随时发送电子邮件给柯子轩、邵义家或林浩伟。或者,您也可以提出一个问题。我们要感谢刘兵、徐虎和舒蕾提供的宝贵意见和建议。