前言
在NLP领域,预训练模型(准确的说应该是预训练语言模型)似乎已经成为各大任务必备的模块了,经常有看到文章称后BERT时代或后XXX时代,分析对比了许多主流模型的优缺点,这些相对而言有些停留在理论层面,可是有时候对于手上正在解决的任务,要用到预训练语言模型时,面对烟火缭乱的语言模型,需要如何挑选合适的模型应用到任务上来。
一个非常直接的方法就是把每一个候选模型针对任务都做一遍微调,因为微调涉及到模型训练,时间至少几个小时起步。有些预训练模型的微调还需要进行超参数搜索,想要决定一个预训练模型的迁移效果就需要将近50个小时!对于没有足够算力的我,苦苦寻觅一个能够高效的选择适合的预训练语言模型的方法,不过资料不好找呀,偶然间我才发现了这篇论文,里面提到的LogME方法值得一试。下图是该方法适配的任务:
多提一下,我这里说的是预训练语言模型,即在适用于NLP领域内的模型选择打分,而对于适用于CV的一些打分方案,像LEEP、NCE、H scores感兴趣的小伙伴可以找论文看看。
本文在LogME方法的相关描述上,组织基于论文作者所在学院的官方公众号上的一篇文章,可直戳原文阅读。原Paper中开源的代码使用Pytorch进行GPU加速,我在本文的最后附上我改成TensorFlow2的代码,方便直接应用在TensorFlow2的相关模型上。
前情提要
将上面提到的问题,描述成图模型,就是论文中所画出如下的这样:
在这个任务中,我们假设有 M M M 个预训练模型组成的集合 { ϕ m } m = 1 M \{\phi_m\}^M_{m=1} {ϕm}m=1M 和 含有 n n n 个标签的数据集 { ( x i , y i ) } i = 1 n \{(x_i,y_i)\}^n_{i=1} {(xi,yi)}i=1n,正常情况下,我们是通过微调使用各种评判指标作为衡量模型 ϕ \phi ϕ 的表现 T m T_m Tm,而现在我们想要通过一种方法得到 S m S_m S