Datawhale八月组队学习--使用Transformers解决NLP任务(文本分类)--Day08-09

Datawhale八月组队学习之笔记系列文章:

往期指路:Datawhale打卡小程序使用
     Transformer图解
     Bert&GPT图解
     Bert知识笔记
     Bert实践



前言

  提示:详细代码指路:这里

  本篇博客主要记录在学习《篇章4-使用Transformers解决NLP任务》中4.1小节的文本分类问题时的。如何使用Transformers代码库中的模型来解决文本分类任务,任务来源于GLUE Benchmark


一、GLUE基准数据集介绍

GLUE榜单包含了9个句子级别的分类任务,分别是:

  • CoLA (Corpus of Linguistic Acceptability) 鉴别一个句子是否语法正确.
  • MNLI (Multi-Genre Natural Language Inference) 给定一个假设,判断另一个句子与该假设的关系:entails, contradicts 或者 unrelated。
  • MRPC (Microsoft Research Paraphrase Corpus) 判断两个句子是否互为paraphrases.
  • QNLI (Question-answering Natural Language Inference) 判断第2句是否包含第1句问题的答案。
  • QQP (Quora Question Pairs2) 判断两个问句是否语义相同。
  • RTE (Recognizing Textual Entailment)判断一个句子是否与假设成entail关系。
  • SST-2 (Stanford Sentiment Treebank) 判断一个句子的情感正负向.
  • STS-B (Semantic Textual Similarity Benchmark) 判断两个句子的相似性(分数为1-5分)。
  • WNLI (Winograd Natural Language Inference) 确定带有匿名代词的句子和替换了该代词的句子是否包含在内。

注:关于GLUE数据集的详细介绍参考:知乎地址

二、微调预训练模型进行文本分类

1. 加载数据

  使用Datasets库来加载数据和对应的评测方式,数据加载和评测方式加载只需要简单使用load_dataset和load_metric即可。

from datasets import load_dataset, load_metric

actual_task = "mnli" if task == "mnli-mm" else task
dataset = load_dataset("glue", actual_task)
metric = load_metric('glue', actual_task)

  1. Dataset是一个包装类,用来将数据包装为Dataset类,然后传入DataLoader中,我们再使用DataLoader这个类来更加快捷的对数据进行操作。
  2. datasets对象本身是一种DatasetDict数据结构. 对于训练集、验证集和测试集,只需要使用对应的key(train,validation,test)即可得到相应的数据。
  3. 给定一个数据切分的key(train、validation或者test)和下标即可查看数据。

dataset["train"][0]

  4. 评估metic是datasets.Metric的一个实例。直接调用metric的compute方法,传入labels和predictions即可得到metric的值。

import numpy as np

fake_preds = np.random.randint(0, 2, size=(64,))
fake_labels = np.random.randint(0, 2, size=(64,))
metric.compute(predictions=fake_preds, references=fake_labels)

注意:每一个文本分类任务所对应的metic有所不同,具体点:这里,所以一定要将metric和任务对齐。

HuggingFace Datasets 详细用法点:这里

2. 数据预处理

  预处理的工具叫Tokenizer。Tokenizer首先对输入进行tokenize,然后将tokens转化为预模型中需要对应的token ID,再转化为模型需要的输入格式。
  为了达到数据预处理的目的,我们使用AutoTokenizer.from_pretrained方法实例化我们的tokenizer,这样可以确保:

  • 我们得到一个与预训练模型一一对应的tokenizer。
  • 使用指定的模型checkpoint对应的tokenizer的时候,我们也下载了模型需要的词表库vocabulary,准确来说是tokens vocabulary。
from transformers import AutoTokenizer
    
tokenizer=AutoTokenizer.from_pretrained(model_checkpoint, use_fast=True)

  注意:use_fast=True要求tokenizer必须是transformers.PreTrainedTokenizerFast类型,因为我们在预处理的时候需要用到 fast tokenizer 的一些特殊特性(比如多线程快速tokenizer)。如果对应的模型没有fast tokenizer,去掉这个选项即可。
  Tokenizer详细用法请点击:tokenizer使用指南

3. 微调预训练模型

  1. 使用AutoModelForSequenceClassification 这个类,和tokenizer相似,from_pretrained方法同样可以帮助我们下载并加载模型,同时也会对模型进行缓存,就不会重复下载模型啦。
  2. 为了能够得到一个Trainer训练工具,我们还需要3个要素,其中最重要的是训练的设定/参数TrainingArguments。这个训练设定包含了能够定义训练过程的所有属性。

metric_name = "pearson" if task == "stsb" else "matthews_correlation" if task == "cola" else "accuracy"

args = TrainingArguments(
    "test-glue",
    evaluation_strategy = "epoch",
    save_strategy = "epoch",
    learning_rate=2e-5,
    per_device_train_batch_size=batch_size,
    per_device_eval_batch_size=batch_size,
    num_train_epochs=5,
    weight_decay=0.01,
    load_best_model_at_end=True,
    metric_for_best_model=metric_name,
)

  3. 由于不同的任务需要不同的评测指标,我们定一个函数来根据任务名字得到评价方法,然后全部传给 Trainer后开始模型训练,训练完成后进行评估。

4. 超参数搜索

  1. Trainer同样支持超参搜索,使用optuna or Ray Tune代码库,执行下面代码安装依赖:

! pip install optuna
! pip install ray[tune]

  2. 超参搜索时,Trainer将会返回多个训练好的模型,所以需要传入一个定义好的模型从而让Trainer可以不断重新初始化该传入的模型:

def model_init():
    return AutoModelForSequenceClassification.from_pretrained(model_checkpoint, num_labels=num_labels)

  3. 和之前调用 Trainer类似,调用方法hyperparameter_search。注意,这个过程可能很久,我们可以先用部分数据集进行超参搜索,再进行全量训练。 比如使用1/10的数据进行搜索 ,hyperparameter_search会返回效果最好的模型相关的参数,将Trainner设置为搜索到的最好参数,进行训练。


总结

  以上就是本篇博客的全部内容了,主要是针对代码中的一些方法进行了记录,关于整个微调任务的理解还不是很透彻,新手需要继续去学习了,See you again。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦想拯救世界_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值