当前位置:   article > 正文

LLM之预训练模型_llm预训练模型

llm预训练模型

什么是预训练

预训练是指通过自监督学习从大规模数据中获得与具体任务无关的预训练模型的过程,最终产出为预训练模型(Pretrained Model)。

模型类型常用预训练模型适用任务
编码器模型,自编码模型ALBERT,BERT,DistilBERT,RoBERTa文本分类、命名实体识别、阅读理解
解码器模型,自回归模型GPT,GPT-2,Bloom,LLaMA文本生成
编码器解码器模型,序列到序列模型BART,T5,Marian,mBART文本摘要、机器翻译

预训练任务

主要分为三大类:

  1. 掩码语言模型,自编码模型
    • 将一些位置的token替换成特殊的[MASK]字符,预测这些被替换的字符
    • 只计算掩码部分的loss,其余部分不计算loss
  2. 因果语言模型,自回归模型
    • 将完整序列输入,基于上文的token预测当前的token
    • 结束位置要有特殊token,eos_token
  3. 序列到序列模型,前缀语言模型(Prefix Language Model)
    • 任务较为多样化,只是采用编码器解码器的方式,预测部分放在解码器中
    • 采用编码器解码器的方式进行实现,计算解码器部分的loss

代码实战

掩码语言模型


# Step1 导入相关包
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForMaskedLM, DataCollatorForLanguageModeling, TrainingArguments, Trainer
from torch.utils.data import DataLoader

# Step2 加载数据集
ds = Dataset.load_from_disk(data_path)

# Step3 数据集处理
def process_func(examples):
    return tokenizer(examples["completion"], max_length=384, truncation=True)

tokenizer = AutoTokenizer.from_pretrained(model_path)
tokenized_ds = ds.map(process_func, batched=True, remove_columns=ds.column_names)

dl = DataLoader(tokenized_ds, batch_size=2, collate_fn=DataCollatorForLanguageModeling(tokenizer, mlm=True, mlm_probability=0.15))
print(next(enumerate(dl)))

# Step4 创建模型
model = AutoModelForMaskedLM.from_pretrained(model_path)

# Step5 配置训练参数
args = TrainingArguments(
    output_dir="./masked_lm",
    per_device_train_batch_size=32,
    logging_steps=10,
    num_train_epochs=1
)

# Step6 创建训练器
trainer = Trainer(
    args=args,
    model=model,
    train_dataset=tokenized_ds,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=True, mlm_probability=0.15)
)

# Step7 模型训练
trainer.train()

# Step8 模型推理
from transformers import pipeline
pipe = pipeline("fill-mask", model=model, tokenizer=tokenizer, device=0)
print(pipe("西安交通[MASK][MASK]博物馆(Xi'an Jiaotong University Museum)是一座位于西安交通大学的博物馆"))
print(pipe("下面是一则[MASK][MASK]新闻。小编报道,近日,游戏产业发展的非常好!"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

因果语言模型

# Step1 导入相关包
from datasets import load_dataset, Dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForLanguageModeling, TrainingArguments, Trainer, BloomForCausalLM
from torch.utils.data import DataLoader

# Step2 加载数据集
ds = Dataset.load_from_disk(data_path)

# Step3 数据集处理
def process_func(examples):
    contents = [e + tokenizer.eos_token for e in examples["completion"]]
    return tokenizer(contents, max_length=384, truncation=True)
tokenizer = AutoTokenizer.from_pretrained(model_path)
tokenized_ds = ds.map(process_func, batched=True, remove_columns=ds.column_names)
dl = DataLoader(tokenized_ds, batch_size=2, collate_fn=DataCollatorForLanguageModeling(tokenizer, mlm=False))
print(next(enumerate(dl)))
print(tokenizer.pad_token, tokenizer.pad_token_id)
print(tokenizer.eos_token, tokenizer.eos_token_id)

# Step4 创建模型
model = AutoModelForCausalLM.from_pretrained(model_path)

# Step5 配置训练参数
args = TrainingArguments(
    output_dir="./causal_lm",
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
    logging_steps=10,
    num_train_epochs=1
)

# Step6 创建训练器
trainer = Trainer(
    args=args,
    model=model,
    train_dataset=tokenized_ds,
    data_collator=DataCollatorForLanguageModeling(tokenizer, mlm=False)
)

# Step7 模型训练
trainer.train()

# Step8 模型推理
from transformers import pipeline
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0)
print(pipe("西安交通大学博物馆(Xi'an Jiaotong University Museum)是一座位于西安", max_length=128, do_sample=True))
print(pipe("下面是一则游戏新闻。小编报道,近日,游戏产业发展的非常", max_length=128, do_sample=True))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

ps:补充知识
Q:因果语言模型中的错位计算Loss在哪里实现的呢?
A:在模型部分的forward函数中实现
在这里插入图片描述

参考文献

https://www.bilibili.com/video/BV1B44y1c7x2/?spm_id_from=333.788&vd_source=ff7eedd3479d8f6f369e631ec961cc05

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/842644
推荐阅读
相关标签
  

闽ICP备14008679号