三个阶段
在一个很庞大的通用领域无关语料上,进行语言模型的训练,以捕捉语言的通用规律
在特定任务的领域相关语料上,进行语言模型的finetune,来学习任务数据的特定语言特征分布
进行目标任务分类器的总体学习,直接学习到任务的分类目标
Tricks
discriminative fine-tuning
对不同的层使用不同的学习率去学习。因为越靠近最下层Embedding层,模型参数就会含有更多通用信息,不应随任务目标发生很大变化。所以为了降低灾难性遗忘的可能,越下层,就会用更小的学习率来学习,而上层为了让模型能够更快地学习到目标任务的独有信息,会用相对大的学习率。一般层之间的学习率会等比地变化,在这篇文章里,这个比值为2.6,
Slanted triangular learning rates (SLTR)
让模型在训练初期快速收敛到一个合适的参数区域,接着再进行细致地优化。这就是一种warmup策略
Concat pooling
在语言模型最后,很多信息蕴含在之前的层或时间步中,将几个时间步或者几层进行concat,再接上全连接层一般会获得更好的结果
Gradual unfreezing
一下子把模型的全部层一起训练,通用信息容易丢失,从而增加灾难性遗忘的风险
第一个epoch,“解冻”最后一层进行训练(只改变了最后一层参数)。接着“解冻”倒数第二层训练(改变了最后两层参数)。直到把所有层“解冻”为止
How to Fine-Tune BERT for Text Classification(2019)
在通过任务相关数据进行语言模型finetune后,多加了一步可选的stage: 把BERT在领域内相关的其他任务上进行多任务的训练,我认为这是对于ULMFiT的补充
BERT模型能一次处理的最长文本长度为512,为了降低模型运行时间和占用空间,可能要对文本进行截断;<br>好的截断方式既不是截头,也不是截尾,应该头尾都截一部分保留最重要信息<br>
在某一层后直接接分类器进行分类查看BERT的不同层对文本分类任务的效果,把最后四层concat或者max pooling效果最好。
层间学习率的下降。越接近底层,含有的通用信息越多,越不应该随着特定任务进行大规模的参数改变,否则有灾难性遗忘风险