清水泥沙

Transformer 学习之路 - 因果语言模型训练实例

Transformer 学习之路 - 因果语言模型训练实例

在自然语言处理(NLP)领域,因果语言模型(Causal Language Model)和自回归模型(Autoregressive Model)是生成任务中的核心概念。它们通过利用已生成的内容来预测下一个单词,从而实现连贯的文本输出。本文将深入解析因果语言模型的技术原理,并结合代码示例,带你一步步实现一个完整的训练流程。


什么是因果语言模型?

因果模型关注的是因果关系,旨在理解一个变量对另一个变量的影响。在 NLP 中,因果语言模型通常指的是模型如何根据先前的输入生成后续的输出。换句话说,模型在生成每个单词时,只依赖于之前生成的单词,而不考虑后续单词。


自回归模型的工作原理

自回归模型是一种生成模型,其中每个输出单词(或 token)的生成依赖于前面生成的单词。这种模型的核心特点是顺序生成,即生成当前单词时只考虑过去的单词。这种结构确保了生成过程的因果性。

例如,生成句子 "今天天气不错,我想去公园。" 的过程如下:

  1. 初始输入:"今天天气"
  2. 模型生成下一个单词:"不错"
  3. 当前输入变为:"今天天气不错"
  4. 模型再次生成下一个单词:"我想去公园。"

在这个过程中,模型在生成每个单词时只依赖于之前生成的单词,这体现了因果性和自回归性。


结合因果与自回归

因果自回归模型是一种强大的文本生成工具,广泛应用于对话生成、故事创作等任务。最著名的因果自回归模型是 GPT(Generative Pre-trained Transformer)系列。GPT 模型使用自回归机制生成文本,在输入序列中,模型根据之前的单词生成下一个单词,直到达到指定的长度或遇到结束标记。


代码实现:训练一个因果语言模型

接下来,我们将通过代码示例,详细讲解如何训练一个因果语言模型。

Step 1: 导入相关包

from datasets import Dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, DataCollatorForLanguageModeling, Trainer, TrainingArguments

Step 2: 加载数据集

ds = Dataset.load_from_disk("/content/drive/MyDrive/ai-learning/2.NLP Task/07-language_model/wiki_cn_filtered/")

Step 3: 数据预处理

tokenizer = AutoTokenizer.from_pretrained("Langboat/bloom-389m-zh")

def process_func(examples):
    contents = [e + tokenizer.eos_token for e in examples["completion"]]
    return tokenizer(contents, max_length=384, truncation=True)

tokenized_ds = ds.map(process_func, batched=True, remove_columns=ds.column_names)

Step 4: 创建数据加载器

from torch.utils.data import DataLoader

dl = DataLoader(tokenized_ds, batch_size=2, collate_fn=DataCollatorForLanguageModeling(tokenizer, mlm=False))

Step 5: 创建模型

model = AutoModelForCausalLM.from_pretrained("Langboat/bloom-389m-zh")

Step 6: 配置训练参数

import os
os.environ["WANDB_DISABLED"] = "true"

args = TrainingArguments(
    per_device_train_batch_size=2,
    gradient_accumulation_steps=16,
    logging_steps=10,
    num_train_epochs=1,
    fp16=True,
    output_dir="./output"
)

Step 7: 创建 Trainer

trainer = Trainer(
    args=args,
    model=model,
    tokenizer=tokenizer,
    train_dataset=tokenized_ds,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False)
)

Step 8: 训练模型

for param in model.parameters():
    if not param.is_contiguous():
        param.data = param.contiguous()

trainer.train()

Step 9: 评估模型

from transformers import pipeline

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
pipe("西安交通大学博物馆(Xi'an Jiaotong University Museum)是一座位于西安", max_length=128, do_sample=True)

Step 10: 保存模型

model_save_path = "/content/drive/MyDrive/ai-learning/2.NLP Task/07-language_model/causal_lm"
tokenizer.save_pretrained(model_save_path)
model.save_pretrained(model_save_path)

总结

因果自回归模型通过利用已生成的内容来预测下一个单词,实现连贯的文本输出。本文详细解析了其技术原理,并结合代码示例,展示了如何训练一个因果语言模型。希望这篇文章能帮助你更好地理解 Transformer 技术,并将其应用到实际项目中。