paper:Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer
T5 本身是一个 Text-to-Text 模型,但其不仅仅能做传统的 text2text 任务 (如对话、QA、文本摘要等等),也能做文本分类这种任务,T5 基本可以用于所有的 NLP 任务,并且拥有很好的性能。
简单来说输入就是文本句子,输出就是类别词(如 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?
作者在论文中写了在训练时使用的优化器是 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
Paper
Tricks
Code