本页展示了如何构建基于longformer的分类。
import pandas as pd
import datasets
from transformers import LongformerTokenizerFast, LongformerForSequenceClassification, Trainer, TrainingArguments, LongformerConfig
import torch.nn as nn
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
from sklearn.metrics import accuracy_score, precision_recall_fscore_support
from tqdm import tqdm
import wandb
import os
# load model and tokenizer and define length of the text sequence
model = LongformerForSequenceClassification.from_pretrained('allenai/longformer-base-4096',
gradient_checkpointing=False,
attention_window = 512)
tokenizer = LongformerTokenizerFast.from_pretrained('allenai/longformer-base-4096', max_length = 1024)
我注意到标记器对数据的大小写很敏感。单词do
和Do
在下面得到不同的标记。我不需要这样的行为。我总是可以在输入longformer之前小写我的数据。但是有没有其他更好的方法来告诉标记器忽略数据的大小写呢?
encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input)
{'input_ids': [0, 8275, 45, 31510, 459, 11, 5, 5185, 9, 44859, 6, 13, 51, 32, 12405, 8, 2119, 7, 6378, 4, 2], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
encoded_input3 = tokenizer("do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input3)
{'input_ids': [0, 5016, 45, 31510, 459, 11, 5, 5185, 9, 44859, 6, 13, 51, 32, 12405, 8, 2119, 7, 6378, 4, 2], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
在我看来,最好不要修改预训练的变压器的标记化方案:它们是用一定的词汇进行预训练的,改变它可能会导致它们的退化。
如果您仍然希望系统对大写不敏感,并且如果您希望使用相同的模型和相同的标记器而不进行过多修改,那么仅将输入数据小写是一个明智的策略。
但是,如果您愿意花费资源来更新模型和标记器,则可以执行以下操作:
- 修改标记器:在其管道中添加小写规范化器
- (可选)修改标记器的词汇表:删除包含大写字符的未使用的单词,并可能添加一些小写单词。应该对模型的嵌入层和输出层进行相应的修改,并且没有标准化的代码,因此不建议进行此类操作,除非您非常了解自己在做什么。尽管如此,这样的操作可以提高模型的性能。
- 使用更新的tokenizer在大型数据集上微调模型(使用原始屏蔽语言建模任务)。这将使神经网络更好地意识到它可能发现的新小写文本。
这将使系统更好地适应非大小写文本,但它将花费您时间(编写用于更新词汇表的代码)和计算资源(调整模型)。