Transformer T5 模型慢慢读(我也省略了很多细节,只是大体的阐述,具体,大家可以参看论文.....)
代码地址:https://github.com/google-research/text-to-text-transfer-transformer
微调测试:T5 的尝试_冬炫的博客-CSDN博客
其他参考地址:
先从他的论文走起,但是很多页...
论文地址:https://arxiv.org/abs/1910.10683
一、模型粗略认识
T5 的由来,就是prompt 思想演变的,将所有的下游任务转换成一种任务 让所有任务共用一种解题方式(极大减轻了参数量,如果2个任务,每个任务10万参数,那么此种生成式方法仍然10万,而传统的针对下游的模型需要20万参数),生成式去生成答案。至于损失函数还要看后面的设计。(在下面的图中显示的是啥都一样的意思)
二、模型一些基本设置
数据集是C4 一个网络爬虫的大数据集,整体模型是基于Transformer 的生成模型。
1.模型框架:
其与经典的 Transformer 模型的区别有3点,
2.输入形式:
①可以分别对下游进行微调,并不需要所有下游任务一起微调。②利用prefix 的前缀提示词来表示不同的学习任务。
3.模型
选用经典的Transformer 框架,既有编码器也有解码器。并且发现此种预训练后的模型对分类和生成任务都有好的性能。
基准模型与Bert BASE 相似(12个层,12个头 , 隐层维度768,220百万参数...,dropout 0.1)
4. 训练策略
所有的任务都变成 “text -to - text” 形式的任务。所以可以统一使用标准的最大似然目标函数来训练(teacher forcing自回归, cross-entropy loss ),优化器AdaFactor,训练阶段在搜索的C4数据集上,epoch 524,288。batch size 128, 最大序列长度512
测试阶段,使用greedy decoding策略生成文本,“inverse square root” learning rate schedule
微调阶段,是在所有数据集上微调262,144 次,学习率0.001,
生成方式,仿照Bert 的掩码预测形式,设计了哨兵标记,将需要屏蔽预测的位置利用特殊标记进行注明。dropout 率15%
上面的意思是,连续的词只用一个哨兵表示,最终的输出形式是“哨兵+所预测的单词或短语+....+结尾哨兵词。
5. 基准性能
Baseline average 还是很强的,上面是在下游任务的基准模型的结果。
下游任务为:GLUE,CNNDM,SQuAD,SGLUE,EnDe,EnFr,EnRo。
其中前两行,基准模型的均值与方差。第三行为,不经过预训练,直接用相同的框架直接用于下游任务的性能。可以发现,在翻译任务中应该没有太大差异。但是在问答等推理任务中,预训练的优势显现!但是它与单纯的Encoder stack 的预训练Bert 的性能差不多。这里唯一的区别是,用的步数是Bert的四分之一。
6. 各种架构性能比较
这里显示了预测序列的变化。这里显示的self attention 。我这里理解为自己生成自己,也就是相同的语句预测相同的语句。所以说第一个图片基本不能使用,你不能直接泄露要预测的所有文本吧。之前的常见的生成文本的形式如中间图:每步只能看到前面单词,而不能看到当前词之后的未来词语。第三个图片是prefix 的形式。它首先要符合想要预测的词汇要满足Causal 因果关系,不能看到未来预测的词汇。但是给你开了个头,告诉你前几个词的词汇,让你接着预测,这个图显示的就是告诉你前三个timestamp 的预测词,也就是3个单词,然后接着预测。
当然Encoder 可以采用Fully visible 。 第一张图为常见的生成模型,比如看图说话任务。给一堆图片目标对象特征,去生成一堆话。第二种是语言模型,可以认为是自己生成曲子的任务,随意创作。第三种图片是prefix 形式,给几个词开头,继续生成后面的词语。
后面说了一些,L-L 层Encoder-Decoder模型的计算量与一个L层的LM模型是近似的,参数量是2L 大小的LM模型。(所以很难去对比比较,,,,,,,)
从上面的表格可以发现,利用Denoising 策略(本文用的哨兵,代替Mask 的词 )整体上要好于LM 策略。在Denosing 策略中, 共享编码器和解码器的参数,与不共享的效果差不多,但是如果减半了编码器和解码器,效果降低。
下面展示了一堆目标函数所使用输入和输出形式,在C4的数据集上
1)目标形式
下面展示了下游任务中,Bert-style 格式仍然非常强劲。相比之下,可能Prefix 和Deshuffling显得逊色。 Deshuffling 效果不佳,他是将句子所有单词颠倒顺序,然后生成正常语序的句子。
2)Mask 率
下面展示了Mask 率。总体来说,还是15% 这个超参数挺抗打
3)掩码的连续长度
下面展示了掩码的连续长度的最大值。这里发现对对问答任务敏感。默认基准模型是独立同分布,只针对每个单词进行mask 策略。而下面讨论span 的大小,可以一下子屏蔽一个连续词而不是判断单个词。
当然,作者这次将上面的实验都进行了总结(见下图),到底干了哪些事情,分别是什么
4)数据集种类
下面作者开始讨论预训练的数据集对模型精度的 影响(星号指的是默认的基准模型采取的数据集C4,经过过滤的)
作者发现预训练模型的数据集领域如果很契合下游任务的领域,那么通常比多样化的数据集(各种领域)的效果能提升的明显!
5)训练数据集规模
训练数据集规模大点好一些,如果重复多次影响模型。大数据集对大模型的性能提升有一定影响。
我感觉这里Training loss 在小样本多重复次数的实验比基准情况的小,说明了模型已经读懂记忆小样本的信息。
关于训练如何冻结基础框架神经网络层,下面列出了各自性能。通常对于小样本数据集,最好不要对整个预训练模型的参数全部微调,通常只微调个别层。
6)尺寸Scaling 策略超参数
如果按照4× 比起原先的基准模型,可以有以下可相比较的实验设置
① 训练的epoch 是原来的4 倍
② 训练的epoch 是原来的2倍,但是模型的参数是原来的2 倍
③ 训练的模型是原来的4 倍
④ 训练的batch 大小是原来的4倍
增大模型的尺寸大小和训练epoch 的大小确实能提高模型的下游任务的精度。
Putting It All Together
将上面又总结了一遍!(关于基准模型的超参数调整策略)
- Small<Base<Large<3B<11B
T5运行实例
题外话:
其实我是为了运行VL-T5 模型 跨模态T5模型(GitHub - j-min/VL-T5: PyTorch code for "Unifying Vision-and-Language Tasks via Text Generation" (ICML 2021))