使用 T5 模型来做文本分类任务的一些总结
使用 T5 (Text-to-Text Transfer Transformer) 来做文本分类任务的一些总结
T5
paper:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
T5 本身是一个 Text-to-Text 模型,但其不仅仅能做传统的 text2text 任务 (如对话、QA、文本摘要等等),也能做文本分类这种任务,T5 基本可以用于所有的 NLP 任务,并且拥有很好的性能。
text2text 模型如何做 text classification?
简单来说输入就是文本句子,输出就是类别词(如 positive
, negative
),当然,这可能有一个问题:模型生成的输出的单词如果不是类别词呢?但作者也在论文中说了,一个在相应数据集上训练过的 T5 模型如果在做文本分类时,模型的输出肯定是类别词,不会出现非类别词,如果模型输出是非类别词,那么很有可能就是模型训练不充分。
在训练时,以下代码即可,其中 labels 就是类别词的编码结果
outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
推理的代码如下:
out = model.generate(input_ids=input_ids, attention_mask=attention_mask, max_length=2)
具体如何做推理的代码可以参考:T5: classification using text2text?
优化器和调度器(optimizer and scheduler)
作者在论文中写了在训练时使用的优化器是 Adafactor,Adafactor 是专门为 Transformer 类模型所设计的,相比于 Adam 占用更少的显存,能够有效减少训练时所需的显存。
paper: Adafactor: Adaptive Learning Rates with Sublinear Memory Cost
关于如何调用 Adafactor,可以参考 HuggingFace Adafactor:
可以通过以下示例使用:
Adafactor(model.parameters(), scale_parameter=False, relative_step=False, warmup_init=False, lr=1e-3)
有人发现下面这个设置更好:
Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None)
如果设置 lr=None
,那么最好调度器使用 AdafactorSchedule
from transformers.optimization import Adafactor, AdafactorSchedule
optimizer = Adafactor(model.parameters(), scale_parameter=True, relative_step=True, warmup_init=True, lr=None)
lr_scheduler = AdafactorSchedule(optimizer)
使用 Adafactor 可以大大减少训练所需的显存,尤其是对于 t5-large
、t5-3b
这类参数量大的模型,如果数据量也比较大的话,训练时对 GPU 显存的要求比较高,对训练造成了一定困难。
当然也可以选择其他的优化器和调度器,比如 AdamW+线性衰减
等等,这个可选择的就比较多了,但正如上面所说的,Adam 类的优化器在训练时占用的显存比较多,需要足够大的显存来训练。
学习率设置
1e-4 和 3e-4 几乎适用于所有问题(classification, QA, que-gen, summ)
完整训练代码
https://github.com/friedrichor/NLP-HuggingFace-Tutorial/tree/main/text_classification/T5
Reference
-
Paper
-
Tricks
-
Code
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)