《昇思 25 天学习打卡营第 23 天 | 基于MindSpore的GPT-2文本摘要 》
活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp
签名:Sam9029
概述
文本摘要任务旨在从给定的文本中生成简短的摘要,同时保留关键信息。本案例使用MindSpore框架实现基于GPT-2模型的文本摘要。
实验环境配置
确保安装了MindSpore及相关库:
!pip install mindspore==2.2.14
!pip install tokenizers==0.15.0
!pip install mindnlp
数据集加载与处理
使用NLPCC2017摘要数据集,包含新闻正文及其摘要。
from mindnlp.utils import http_get
url = 'https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt'
path = http_get(url, './')
数据集分割
将数据集分为训练集和测试集:
from mindspore.dataset import TextFileDataset
dataset = TextFileDataset(str(path), shuffle=False)
train_dataset, test_dataset = dataset.split([0.9, 0.1], randomize=False)
数据预处理
使用BertTokenizer进行中文文本的分词和标记化处理。
from mindnlp.transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
定义数据处理流程,包括合并文本、填充至最大序列长度等。
def process_dataset(dataset, tokenizer, batch_size=6, max_seq_len=1024, shuffle=False):# ...return dataset
train_dataset = process_dataset(train_dataset, tokenizer, batch_size=4)
模型构建
构建GPT-2摘要模型,并对模型输出进行Shift Right操作以适应摘要任务。
from mindnlp.transformers import GPT2LMHeadModelclass GPT2ForSummarization(GPT2LMHeadModel):def construct(self, input_ids, attention_mask, labels):# ...return loss
动态学习率
定义动态学习率,使用线性预热和衰减策略。
from mindspore.nn.learning_rate_schedule import LearningRateScheduleclass LinearWithWarmUp(LearningRateSchedule):# ...
模型训练
设置训练参数,初始化模型、优化器和学习率调度器。
num_epochs = 1
warmup_steps = 2000
learning_rate = 1.5e-4config = GPT2Config(vocab_size=len(tokenizer))
model = GPT2ForSummarization(config)
使用MindSpore的Trainer进行模型训练。
from mindnlp._legacy.engine import Trainertrainer = Trainer(network=model, train_dataset=train_dataset, epochs=num_epochs, optimizer=optimizer)
trainer.run(tgt_columns="labels")
模型推理
加载训练好的模型,进行文本摘要生成。
model = GPT2LMHeadModel.from_pretrained('./checkpoint/gpt2_summarization_epoch_0.ckpt', config=config)
model.set_train(False)
定义推理数据处理流程,将输入文本转换为模型可接受的格式。
def process_test_dataset(dataset, tokenizer, batch_size=1, max_seq_len=1024, max_summary_len=100):# ...return dataset
test_dataset = process_test_dataset(test_dataset, tokenizer, batch_size=1)
使用模型生成摘要。
for (input_ids, raw_summary) in test_dataset.create_tuple_iterator():output_ids = model.generate(input_ids, max_new_tokens=50, num_beams=5, no_repeat_ngram_size=2)output_text = tokenizer.decode(output_ids[0].tolist())print(output_text)
GPT-2模型在文本摘要任务上展现出了强大的能力,但模型的训练和调优需要大量的计算资源和时间。在实际应用中,需要根据具体需求和资源情况选择合适的模型规模和训练策略。
此外,文本摘要的质量很大程度上依赖于预处理和后处理步骤。在本案例中,使用BertTokenizer进行中文文本的处理,这需要对分词器进行适当的配置以适应不同的文本结构。
最后,动态学习率的设置对模型的训练效果有显著影响。预热和衰减策略有助于模型在训练初期快速收敛,在训练后期避免过拟合。