transformers模型预训练

模型预训练是指在深度学习领域中,先在一个大规模数据集上对模型进行初步训练,使模型能够学习到基本的特征表示和模式,然后再针对具体任务或特定数据集进行微调的过程。本次主要介绍掩码语言模型预训练以及因果语言模型预训练。

掩码语言模型预训练是自然语言处理领域中的一种重要技术,主要用于学习文本的上下文表征。其中最具代表性的模型是BERT(Bidirectional Encoder Representations from Transformers)。
在BERT的预训练过程中,它引入了“遮蔽语言模型”(Masked Language Model, MLM)的任务。具体来说,模型会随机地对输入序列中的部分词汇进行遮蔽(通常遮蔽比例为15%左右),然后让模型根据上下文信息预测这些被遮蔽掉的词汇内容。
例如,在一个句子"猫喜欢吃鱼"中,模型可能会将"吃"字遮蔽并用特殊标记[MASK]替代,然后通过理解上下文"猫喜欢"和"鱼"来预测出"吃"这个动作词。
这种预训练方法使得模型能够从双向上下文中学习到词汇的语义和句法特征,从而获得强大的语言理解和生成能力。预训练结束后,可以将得到的模型参数用于下游各种自然语言处理任务,如分类、问答、命名实体识别等,只需在此基础上进行微调即可。

因果语言模型(Autoregressive Language Model)预训练是一种自然语言处理中基于自回归机制的模型训练方法,与掩码语言模型(如BERT)不同,因果语言模型在预训练时是单向预测序列中的下一个词。
以GPT(Generative Pre-training Transformer)系列模型为例,它们在预训练阶段主要遵循的是左到右(或右到左)的顺序建模原则。对于一个给定的文本序列,模型会根据当前时刻之前的所有词汇来预测下一个词汇的概率分布。换句话说,在训练过程中,每个时间步仅能看到历史信息而不能看到未来信息。
例如,在句子"狗喜欢吃骨头"中,预训练过程会对模型进行训练,使其学会根据"狗喜欢"预测出下一个词“吃”,然后根据"狗喜欢吃"预测出“骨头”。
通过这种自回归的方式学习大量未标注文本数据,因果语言模型能够捕获词语间的长期依赖关系和潜在的语言规律,并在预训练完成后应用于各种下游任务,如文本生成、问答系统等,同样需要微调来适应特定任务的需求。

1、掩码语言模型预训练:

# 导包
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForMaskedLM, TrainingArguments, Trainer, DataCollatorForLanguageModeling
# 加载数据集
dataset = Dataset.load_from_disk("/wiki_cn_filtered")
print(dataset[0])
# 数据处理
tokenizer = AutoTokenizer.from_pretrained("../models/bert-base-chinese")
# 数据处理函数
def process_fun(examples):
    model_inputs = tokenizer(examples["completion"], max_length=128, truncation=True)
    return model_inputs
# 数据处理
tokenizer_data = dataset.map(process_fun, batched=True, remove_columns=dataset.column_names)
print(tokenizer_data)
# 创建模型
model = AutoModelForMaskedLM.from_pretrained("../models/bert-base-chinese")
# 配置模型训练参数
args = TrainingArguments(
    output_dir="./masked_lm",
    per_device_train_batch_size=32,
    logging_steps=10,
    num_train_epochs=1
)
# 创建训练器
trainer = Trainer(
    args=args,
    model=model,
    train_dataset=tokenizer_data,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=True, mlm_probability=0.15)
)
# 模型训练
trainer.train()
# 模型推理
from transformers import pipeline
pipe = pipeline("fill-mask", model=model, tokenizer=tokenizer)
pipe("中国的首都是[MASK]京")

2、因果语言模型预训练:

# 导包
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForLanguageModeling
# 加载数据集
dataset = Dataset.load_from_disk("/wiki_cn_filtered")
print(dataset[0])
# 数据预处理
tokenizer = AutoTokenizer.from_pretrained("../models/bloom-389m-zh")
# 数据处理函数
def process_func(examples):
    # 加上结束标志
    contents = [e + tokenizer.eos_token for e in examples["completion"]]
    model_inputs = tokenizer(contents, max_length=384, truncation=True)
    return model_inputs
# 数据处理
tokenizer_data = dataset.map(process_func, batched=True,remove_columns=dataset.column_names)
print(tokenizer_data)
# 模型创建
model = AutoModelForCausalLM.from_pretrained("../models/bloom-389m-zh")
# 配置训练参数
args = TrainingArguments(
    output_dir="./causal_lm",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
    logging_steps=2,
    num_train_epochs=1
)
# 创建训练器
trainer = Trainer(
    args=args,
    model=model,
    train_dataset=tokenizer_data,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False)
)
# 模型训练
trainer.train()
# 模型推理
from transformers import pipeline

pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)
pipe("重庆,是中国的四个直辖市之一", max_length=128, do_sample=True)
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灯下夜无眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值