本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。
机器学习在数据密集型的应用中取得了极佳的效果,但在数据集很小的场景下,多数机器学习算法的效果会严重受限[1]。在计算机视觉、自然语言处理等大领域下,从深度学习最初大放异彩的图像分类、文本分类,到进一步的图像生成、文本关系预测,机器学习算法取得的成就大多建立在大量数据驱动的训练算法之上。然而,高质量的标注数据在大多数领域都是很难获得的,这限制了诸多机器学习算法在相应场景下的应用能力。
在这样的背景下,小样本学习(Few Shot Learning,FSL)的提出将解决数据集规模严重受限条件下的机器学习应用问题。小样本学习方法可以在利用先验知识的前提下,仅由极少量受监督的样本,使模型通过极少步的更新快速提升泛化性能,以应用在新的相关任务上[1]。近年来,小样本学习已经应用于计算机视觉、自然语言处理、人机交互、知识图谱乃至生物计算等领域的诸多应用中。
小样本学习的研究者在编码实践过程中通常会面临原型实现和方法复现两方面的问题[2]。为了方便飞桨开发者和使用飞桨的科研人员方便地执行以下操作:
- 在深度学习模型上应用经典的小样本学习方法,或使用经典小样本数据集测试模型与方法
- 设计新的小样本学习方法,或构建新的小样本数据集
- 比对各种小样本学习方法在多种数据集上的效果
我们开发了 PaddleFSL(Paddle toolkit for Few Shot Learning):基于飞桨的小样本学习工具包,旨在降低小样本学习研究和应用的设计与时间成本。PaddleFSL 提供了低层次的工具函数与接口,以供使用者设计新的小样本学习方法或构建新的小样本学习数据集,同时也提供了经典小样本学习方法的高层次实现,以及经典的小样本数据集。
项目链接:
https://github.com/tata1661/FSL-Mate/tree/master/PaddleFSL
框架概览
PaddleFSL 完整项目包含了以下几个部分:
样例(examples):
项目中高层次小样本算法接口的使用样例
包主体(paddlefsl):
python 包的主体
- paddlefsl.backbones:
诸如 MLP、卷积网络、ResNet 等基准模型
- paddlefsl.datasets:
小样本数据集构建接口,以及诸多经典的小样本数据集的预处理实现
- paddlefsl.model_zoo:
高层次经典小样本方法实现
- paddlefsl.task_sampler:
任务集的划分:将训练和测试数据划分为 N ways, K shots 以及 Q query points
- paddlefsl.utils:
与环境、输入输出或模型参数有关的工具函数
数据文件(raw_data):
存放原始数据文件的目录,附各个经典小样本数据集的介绍与下载地址
测试(test):
包主体每一函数和类的单元测试,同时也是使用样例文件
此外,在包主体的每一个外部接口处,我们都提供了详实的注释,包括了模块的功能、参数的功能和使用样例。
在接下来的几个章节中,我们将从数据集加载到训练完成,逐项介绍 PaddleFSL 的功能及其使用方法。
安装与测试
本项目依赖飞桨开源框架 v2.0 或更新的版本,需要提前前往飞桨官网安装。
本项目在 github 开源,可以直接克隆 github 项目,配置环境变量后直接使用:
本项目也同时在 pypi 发布,可以通过更便捷的 pip 安装包主体(paddlefsl),但这种方式不包含样例(examples)、数据文件(raw_data)与测试文件(test):
安装完成后,可以通过以下的指令快速测试安装是否成功:
数据集
我们的项目提供了计算机视觉数据集(CVDataset)和关系分类数据集(RCDataset)两种模板数据集接口,以及继承自 CVDataset 的六种图像分类数据集(Omniglot[3], Mini-ImageNet[4], Tiered-ImageNet[5], CIFAR-FS[6], FC100[7], CU-Birds[8])与继承自 RCDataset 的一种关系分类数据集(FewRel1.0[9])。此外,我们还提供了中文自然语言处理小样本领域的评测基准数据集 FewCLUE[15]。
以 Mini-ImageNet 为例,若要使用该数据集,仅需从项目提供的地址下载原始数据文件(mini-imagenet.tar.gz),并将其放置在 raw_data 目录下,包主体代码会自动解压并处理数据文件:
用户也可以将原始数据文件放置在任意一个有权限的目录下,并将该目录通过 root 参数传递给数据集。
在小样本学习的框架下,数据集常被划分为 N ways(一个任务中有N种类别的样本待分类)、K shots(K个有标签的样本用于模型更新)和 Q query points(Q个有标签的样本用于模型效果的评估或进一步更新),因而本项目在数据集类中预置了随机任务集划分:
而在关系分类数据集(RCDataset)中,返回值的类型有 text(文本)和 numpy(numpy 数组)两种可选项,若选择 numpy 则需要为数据集传入一种初始化器:
此外,用户可以直接通过继承 CVDataset 和 RCDataset 构建自己的数据集:根据用户自己的原始数据文件格式,在新的数据集类中实现获取元素、数据集长度、划分随机任务集三个接口,即可构建新的小样本数据集。用户也可以直接效仿本项目给出的原始数据格式,将新数据的数据格式调整后,直接通过传递 root 参数给已有的数据集,从而更便捷地构建新数据集。
经典小样本方法的高层次接口
我们的项目在 paddlefsl.model_zoo 中提供了五种经典的小样本方法的高层次接口(MAML, ANIL, ProtoNet, RelationNet, Siamese),以及三种小样本 NLP 方法的直接实现(PET[16], P-Tuning[17], EFL[18])。
MAML(Model-Agnostic Meta-Learning)是一种经典的,可应用于任何使用梯度下降训练的模型,并可以适用于包括分类、回归、强化学习等多种任务的小样本学习方法。MAML 不引入新的模块,仅使用先验知识调整目标模型的参数,使之具备出色的泛化性能,可以在很有限的几步梯度下降之后快速学习适应新任务[10]。
ANIL(Almost No Inner Loop)是一种针对 MAML 算法的分析与改进。MAML 算法对于目标模型的参数在外层循环(outer loop)与内层循环(inner loop)都进行了调整,而 ANIL 则在内层循环固定了模型的主体部分参数,仅对最后一层进行微调(fine-tune)。该方法使用更少的计算开销得到了与 MAML 同样好的效果,并同时证明了 MAML 的方法让模型取得了特征复用(feature reuse)的效果[11]。
ProtoNet(Prototypical Networks)是一种更为经典的、简单有效的小样本方法。它利用极少的带标签样本,让模型学得另一个参数空间的原型特征(prototype),然后比对待分类样本的原型特征和已知类别原型特征的距离,从而做出分类决策。该方法思路简单,计算复杂度低,且在分类问题上有着非常不错的表现,并且可以延伸至零样本学习(zero-shot learning)[12]。
RelationNet(Relation Network)是一种在 ProtoNet 基础上的提升改进。在使用目标模型学习到另一个参数空间的原型特征后,该方法增加了一个关系网络(relation network)用以专门学习比较待分类样本原型特征和已知类别原型特征的相似性,而不需要重新调整已知网络[13]。
Siamese (Siamese Networks)是一种早期的小样本学习方法。该方法设计了一种孪生结构,很自然地学习如何更好地度量输入内容的相似度,从而使用极少的标签样本来获得预测新样本的能力[14]。
我们在 paddlefsl.model_zoo 中实现了上述五种算法的完整的训练和测试逻辑。以 MAML 为例,用户仅需传入待测数据集和相关的算法超参和训练配置,即可直接开始训练或测试,并自动保存训练得到的模型参数:
此外,我们还在样例(examples)中提供了 PET[16]、P-Tuning[17]和 EFL[18]在 FewCLUE 任务上的实现。FewCLUE 的任务将额外地依赖 paddlenlp 包,其实现过程中使用了百度的中文 NLP 预训练模型 ERNIE1.0,并汇报了三种算法的效果。
我们利用本项目实现的经典算法高层次接口测试了所有数据集上的效果,并与原论文或其他论文复现的效果做了比对。结果显示,我们的实现均达到了原论文方法使用其他机器学习框架汇报的结果,在多数任务上提升了原有的效果。具体的结果数据在样例(examples)中给出(https://github.com/tata1661/FSL-Mate/tree/master/PaddleFSL/examples)
低层次常用工具函数
除了完整的训练和测试实现接口外,本项目还提供了丰富的低层次工具函数,用以实现常用的小样本学习基本操作,例如原型特征(prototype)的计算、模型的克隆(clone)、固定步长的单步梯度下降等等。
原型特征的计算和比较由 ProtoNet 提出(如上图),因此该功能在 paddlefsl.model_zoo.protonet 中封装并提供接口 get_prototype ()。该函数传入所有带标签样本的特征,以及其对应的标签,即可返回按标签顺序排列的各个类别对应原型特征。以 RelationNet 为例:
模型的克隆和单步梯度下降是 MAML 及其改进型 ANIL 所依赖的操作。该方法不引入其他模块,仅仅通过梯度对目标模型做调整,目标模型的参数将被通过外层循环和内层循环两次调整。在内层循环中,对于模型的调整不可以直接作用于原目标模型的所有参数,而是需要累积多个任务的梯度,最终对原模型加以调整,这就要求模型的梯度保留,最上层微调,而主体部分参数在累积后再做调整(如上图)。
因此,我们引入了模型克隆(clone)的功能:与机器学习框架中张量的克隆相同,被克隆的新模型并不与原模型共享内存,从而实现独立的调整,但同时要和原模型共享计算图,从而实现梯度的关联与累积。该功能在 paddlefsl.utils 中封装为接口 clone_model ():
同样是在基于梯度的 MAML 与 ANIL 方法中,由于模型主体参数梯度累积后调整与微调最上层的矛盾,在内层循环的微调中不可以直接使用模型的优化器进行梯度下降,而应该手动设置固定的步长(inner_loop_learning_rate)进行不干预优化器的梯度下降。该功能封装在 paddlefsl.utils 中,提供接口 gradient_descent ():
除了举例的三种低层次操作接口外,paddlefsl 还提供了更多丰富的工具函数。用户可以在源码或样例中查看并体验(https://github.com/tata1661/FSL-Mate/tree/master/PaddleFSL/paddlefsl/utils)
小样本学习资源库
PaddleFSL 代码整合在小样本学习综述与前沿论文追踪项目 FSL-Mate 中共同开源发布。FSL-Mate 项目是一个旨在整合小样本学习研究成果与最新研究进展的资源仓库,该项目基于王雅晴博士于 2020 年 6 月发表在 ACM Computing Surveys (CSUR)上的小样本学习综述文章 Generalizing from a few examples: A survey on few-shot learning 扩展而来。CSUR 是计算机领域权威顶刊,JCR1 区,Core A* ,该小样本学习综述为 CSUR 2019-2021 年间最高引论文,也是 ESI 2021 高引论文。我们将持续更新和维护该仓库,携手对小样本学习感兴趣的开发者和研究人员,共同推进小样本学习领域的发展,敬请关注与下载体验!
欢迎大家点开 Github 链接学习源码或获取工具包!
项目链接:
https://github.com/tata1661/FSL-Mate/tree/master/PaddleFSL
(另外,链接内附赠高质量领域理解手册【小样本学习综述】 ESI 2021 高引论文 / CSUR 2019-2021 最高引论文)
项目作者:
王雅晴,PaddleFSL 负责人、飞桨高级开发者技术专家(高级 PPDE)。2019 年博士毕业于香港科技大学计算机科学及工程学系。通过百度公司 AIDU 计划加入百度研究院商业智能实验室,现任资深研发工程师及研究员。研究方向为机器学习,并主要聚焦小样本学习、稀疏和低秩学习、生物计算等方向。现有多篇一作成果发表在 ICML、NeurIPS、WWW、EMNLP、TIP 等顶会顶刊上。
参考文献:
[1] Wang Y, Yao Q, Kwok J T, Ni L M. Generalizing from a few examples: A survey on few-shot learning[J]. ACM Computing Surveys (CSUR), 2020, 53(3): 1-34.
[2] Arnold S M R, Mahajan P, Datta D, et al. learn2learn: A library for meta-learning research[J]. arXiv preprint arXiv:2008.12284, 2020.
[3] Lake B M, Salakhutdinov R, Tenenbaum J B. Human-level concept learning through probabilistic program induction[J]. Science, 2015, 350(6266): 1332-1338.
[4] Vinyals O, Blundell C, Lillicrap T, et al. Matching networks for one shot learning[J]. Advances in neural information processing systems, 2016, 29: 3630-3638.
[5] Ren M, Triantafillou E, Ravi S, et al. Meta-learning for semi-supervised few-shot classification[J]. arXiv preprint arXiv:1803.00676, 2018.
[6] Bertinetto L, Henriques J F, Torr P H S, et al. Meta-learning with differentiable closed-form solvers[J]. arXiv preprint arXiv:1805.08136, 2018.
[7] Oreshkin B N, Rodriguez P, Lacoste A. Tadam: Task dependent adaptive metric for improved few-shot learning[J]. arXiv preprint arXiv:1805.10123, 2018.
[8] Wah C, Branson S, Welinder P, et al. The caltech-ucsd birds-200-2011 dataset[J]. 2011.
[9] Han X, Zhu H, Yu P, et al. Fewrel: A large-scale supervised few-shot relation classification dataset with state-of-the-art evaluation[J]. arXiv preprint arXiv:1810.10147, 2018.
[10] Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networks[C]//International Conference on Machine Learning. PMLR, 2017: 1126-1135.
[11] Raghu A, Raghu M, Bengio S, et al. Rapid learning or feature reuse? towards understanding the effectiveness of maml[J]. arXiv preprint arXiv:1909.09157, 2019.
[12] Snell J, Swersky K, Zemel R S. Prototypical networks for few-shot learning[J]. arXiv preprint arXiv:1703.05175, 2017.
[13] Sung F, Yang Y, Zhang L, et al. Learning to compare: Relation network for few-shot learning[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 1199-1208.
[14] Koch G, Zemel R, Salakhutdinov R. Siamese neural networks for one-shot image recognition[C]//ICML deep learning workshop. 2015, 2.
[15] Li Y, Zhao Y, Hu B, et al. GlyphCRM: Bidirectional Encoder Representation for Chinese Character with its Glyph[J]. arXiv preprint arXiv:2107.00395, 2021.
[16] Liu, Xiao, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, and Jie Tang. “GPT Understands, Too.” ArXiv:2103.10385 [Cs], March 18, 2021.
[17] Wang, Sinong, Han Fang, Madian Khabsa, Hanzi Mao, and Hao Ma. “Entailment as Few-Shot Learner.” ArXiv:2104.14690 [Cs], April 29, 2021.
[18] Wang, S., Fang, H., Khabsa, M., Mao, H., and Ma, H., “Entailment as Few-Shot Learner”, ArXiv:2001.07676 [Cs], 2021.