大模型-Bert+PET实战

PET(Pattern-Exploiting Training)

背景:预训练语言模型(比如BERT)知识全面,但是没有针对下游任务做针对训练,所以效果一般,所以需要根据任务做微调。

核心思想:根据先验知识人工定义模版,将目标分类任务转换为与MLM一致的完形填空,然后再去微调MLM任务参数。

项目介绍:一般情况,我们可以直接用bert模型对评论进行分类,这种效果一般,尤其是比较少小众的场景。但如果用少量带标签的评论样本对Bert模型进行Tuning,那模型效果就会大幅提升

AutoTokenizer
from transformers import AutoModelForMaskedLM, AutoTokenizer
#使用bert-base-chinese模型
tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
my_text = '有时候我常常在想,人活着的意义究竟是什么' #19个字+1个标点符号
sb = tokenizer(text=my_text,truncation=True,max_length=15,padding='max_length')

#得到sb:
{'input_ids': [101, 3300, 3198, 952, 2769, 2382, 2382, 1762, 2682, 8024, 782, 3833, 4708, 4638, 102], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

tokenizer.decode(sb['input_ids'])#解码'[CLS] 有 时 候 我 常 常 在 想 , 人 活 着 的 [SEP]'
  • bert的tokenizer是字符级别的编码,而不是词,标点符号也会编码。
  • 截断15,这15个已经包含了[CLS]和[SEP]。
  • Bert是一种MLM(Masked Language Modeling)模型。
  • tokenizer在使用训练结构后,也需要保存。(可能训练的过程它会自动新增token?)
ClassEvaluator(验证模型效果)
    def __init__(self):
        self.goldens = []
        self.predictions = []
  • 在计算验证集指标时,只需要记录两个list,一个是模型预测的标签,另一个是真实的标签,例如self.goldens=["体育","财经"]。
  • 模型评估:训练集有几十条,测试集有几百条。

  • 每10步打印一次loss,每20步用验证集评估一下效果,当f1得分上涨就保存模型。

  • 模型评估:不仅要看整体的评估指标,还要看在每个类别的指标表现。{'衣服': {'precision': 0.55, 'recall': 0.97, 'f1': 0.7}, '酒店': {'precision': 1.0, 'recall': 0.86, 'f1': 0.93}}

HardTemplate
#根据prompt文本创建prompt对象,文本为“这是一条{MASK}评论:{textA}。”
prompt = open('data/prompt.txt','r', encoding='utf8').readlines()[0].strip()
hard_template = HardTemplate(prompt=prompt)  # 模板转换器定义
#input_dict为 {'textA': '天台很好看,躺在躺椅上很悠闲...', 'MASK': '[MASK]'}
encoded_inputs = hard_template(inputs_dict=my_dic,tokenizer=tokenizer,max_seq_len=128,mask_length=2)

  • 流程:①根据文本创建prompt对象②把query文本传入prompt的call方法进行处理。
  • mask_position是那input_ids中哪个位置需要填充。
模型predict:
  • 流程:先把要待分类的数据(评论)放到prompt中,然后用tokenizer编码放入模型,然后将预测得到的logit转换成ids,然后convert_ids_to_tokens转成子类别名称,然后再查询verbalizer,得到主标签。
  • verbalizer:有两列第一列主标签(业务需要的分类) 第二列子标签(模型输出分类),模型输出不同分类可能映射到同一个主标签。
model = AutoModelForMaskedLM.from_pretrained(model_path) #读取微调后的预训练模型
logits = model(input_ids= ,token_type_ids= ,attention_mask= ).logits #调用模型

input_ids:[5, 128]  # 输入 5个长度128的样本
logits:[5, 128, 21128]  # 挖掉某个位置的进行预测,对所有的可能性打分。(一共21128个词)

环境
  • transformer 4.24.0
  • python 3.8
  • pytorch 1.7.1
  • datasets 2.19.1

持续更新中。。欢迎加群Q 329019348


 

                

相关推荐

  1. 部署模型API的实战教程

    2024-07-16 10:36:13       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 10:36:13       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 10:36:13       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 10:36:13       58 阅读
  4. Python语言-面向对象

    2024-07-16 10:36:13       69 阅读

热门阅读

  1. 实车部署 TARE 入门教程

    2024-07-16 10:36:13       27 阅读
  2. git环境编译升级

    2024-07-16 10:36:13       27 阅读
  3. Ubuntu系统和硬件问题

    2024-07-16 10:36:13       25 阅读
  4. 抽象工厂模式与工厂方法(简单工厂)的区别

    2024-07-16 10:36:13       26 阅读
  5. 力扣第八题——字符串转换整数

    2024-07-16 10:36:13       26 阅读