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)
### Transformers 模型训练方法教程 #### 准备工作 为了成功地训练一个Transformers模型,需要准备几个关键组件。这包括但不限于安装必要的库、加载预训练模型和分词器、以及准备好要使用的数据集。 对于环境设置部分,在Python环境中可以通过pip命令来安装`transformers`和其他依赖项[^2]: ```bash pip install transformers datasets torch ``` #### 加载预训练模型与分词器 利用Hugging Face提供的API接口非常方便地获取已经预先训练好的Transformer模型及其对应的分词工具。例如,如果想要使用BERT作为基础模型,则可以这样做: ```python from transformers import BertTokenizer, BertForSequenceClassification tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) ``` 这段代码创建了一个基于BERT的基础序列分类模型实例,并指定了两个标签用于二元分类任务。 #### 数据处理 接下来就是对输入的数据做适当变换以便于喂给模型学习。这里涉及到将原始文本转化为token ID列表的过程,同时也可能涉及其他形式的特征工程操作。具体来说,可以采用如下方式完成此步骤: ```python import torch from datasets import load_dataset dataset = load_dataset("imdb") # 使用IMDB电影评论数据集为例 def preprocess_function(examples): return tokenizer(examples['text'], truncation=True) encoded_dataset = dataset.map(preprocess_function, batched=True) train_dataloader = torch.utils.data.DataLoader(encoded_dataset["train"], shuffle=True, batch_size=8) eval_dataloader = torch.utils.data.DataLoader(encoded_dataset["test"], batch_size=8) ``` 上述脚本展示了如何读取并预处理来自HuggingFace Datasets库中的IMDb情感分析数据集。 #### 设置Trainer对象 最后一步是配置好Trainer类来进行实际训练过程。该类封装了许多常用的超参数选项,使得整个流程更加简洁明了。下面是一个简单的例子说明怎样去做: ```python from transformers import TrainingArguments, Trainer training_args = TrainingArguments( output_dir='./results', evaluation_strategy="epoch", learning_rate=2e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=3, weight_decay=0.01, ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataloader.dataset, eval_dataset=eval_dataloader.dataset, tokenizer=tokenizer, ) trainer.train() ``` 以上代码片段定义了一些基本的学习策略,并初始化了一个新的Trainer实例;随后只需调用其内置的方法即可启动完整的训练周期[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

灯下夜无眠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值