机器学习在数据密集型的应用中取得了极佳的效果,但在数据集很小的场景下,多数机器学习算法的效果会严重受限。在计算机视觉、自然语言处理等大领域下,从深度学习最初大放异彩的图像分类、文本分类,到进一步的图像生成、文本关系预测,机器学习算法取得的成就大多建立在大量数据驱动的训练算法之上。然而,高质量的标注数据在大多数领域都是很难获得的,这限制了诸多机器学习算法在相应场景下的应用能力。
在这样的背景下,小样本学习(Few Shot Learning, FSL)的提出将解决数据集规模严重受限条件下的机器学习应用问题。小样本学习方法可以在利用先验知识的前提下,仅由极少量受监督的样本,使模型通过极少步的更新快速提升泛化性能,以应用在新的相关任务上。近年来,小样本学习已经应用于计算机视觉、自然语言处理、人机交互、知识图谱乃至生物计算等领域的诸多应用中。
小样本学习的研究者在编码实践过程中通常会面临原型实现和方法复现两方面的问题。为了方便飞桨开发者和使用飞桨的科研人员方便地执行以下操作,基于飞桨的小样本学习工具包PaddleFSL应运而生,它:
- 提供简单、易用、稳定的经典小样本学习方法;支持拓展新的小样本学习方法;
- 统一的数据集处理,便于模型效果比较;易于定制化新数据集;
- 具备翔实的注释,如模块的功能、参数的功能和使用样例;
- 依托PaddlePaddle生态,便于拓展到不同数据应用领域;
PaddleFSL提供了低层次的工具函数与接口,以供使用者设计新的小样本学习方法或构建新的小样本学习数据集,同时也提供了经典小样本学习方法的高层次实现,以及经典的小样本数据集。
项目链接:
https://github.com/tata1661/F...
框架概览
PaddleFSL完整项目包含了以下几个部分:
1、包主体(paddlefsl):python包的主体。
- paddlefsl.backbones:诸如MLP、卷积网络、ResNet等基准模型;
- paddlefsl.datasets:小样本数据集构建接口,以及诸多经典的小样本数据集的预处理实现;
- paddlefsl.model_zoo:高层次经典小样本方法实现;
- paddlefsl.task_sampler:任务集的划分:将训练和测试数据划分为N-ways, K-shots以及Q query points;
2、paddlefsl.utils:与环境、输入输出或模型参数有关的工具函数;
3、样例(examples):项目中高层次小样本算法接口的使用样例;
4、测试(test):包主体每一函数和类的单元测试;
5、数据文件(raw_data):存放原始数据文件的目录;
此外,在包主体的每一个外部接口处,我们都提供了翔实的注释,包括了模块的功能、参数的功能和使用样例。
在接下来的几个章节中,我们将从数据集加载到训练完成,逐项介绍PaddleFSL的功能及其使用方法。
安装与测试
本项目依赖飞桨开源框架v2.0或更新的版本,请提前前往飞桨官网安装。
本项目在GitHub开源,可以直接克隆GitHub项目,配置环境变量后直接使用:
# 克隆项目
git clone https://github.com/tata1661/FSL-Mate.git
# 安装依赖
cd FSL-Mate/PaddleFSL
pip install -r requirements.txt
# 修改env.sh,将其中的路径设置为PaddleFSL所在路径
# 随后激活环境变量
source env.sh
# 若希望长期使用本项目,可以将修改后的env.sh内容追加到.bashrc文件
cat env.sh >> ~/.bashrc
source ~/.bashrc
本项目也同时在pypi发布,可以通过更便捷的pip安装包主体(paddlefsl),但这种方式不包含样例(examples)、数据文件(raw_data)与测试文件(test):
pip install paddlefsl
安装完成后,可以通过以下的指令快速测试安装是否成功:
# 启动一个python解释器
python
>>> import paddlefsl
>>> paddlefsl.__version__
'1.0.0'
数据集
我们的项目提供了计算机视觉数据集(CVDataset)和关系分类数据集(RCDataset)两种模板数据集接口,以及继承自CVDataset的六种图像分类数据集(Omniglot, Mini-ImageNet, Tiered-ImageNet, CIFAR-FS, FC100, CU-Birds)与继承自RCDataset的一种关系分类数据集(FewRel1.0)。此外,我们还提供了中文自然语言处理小样本领域的评测基准数据集FewCLUE。
以Mini-ImageNet为例,若要使用该数据集,仅需从项目提供的地址下载原始数据文件(mini-imagenet.tar.gz),并将其放置在raw_data目录下,包主体代码会自动解压并处理数据文件:
# python代码
from paddlefsl.vision.datasets import MiniImageNet
# 训练数据集,使用默认的numpy模式,数据集返回的格式是numpy数组
training_set = MiniImageNet(mode='train')
image, label = training_set[0]
print(image) # 打印出一个numpy数组
# 验证数据集,使用pil模式,数据集返回的格式是pil图像
validation_set = MiniImageNet(mode='valid', backend='pil')
image, label = validation_set[0]
image.show() # 拥有图形界面的系统会显示一只鸟的图像
用户也可以将原始数据文件放置在任意一个有权限的目录下,并将该目录通过root参数传递给数据集。
在小样本学习的框架下,数据集常被划分为N-ways(一个任务中有N种类别的样本待分类)、K-shots(K个有标签的样本用于模型更新)和Q query points(Q个有标签的样本用于模型效果的评估或进一步更新),因而本项目在数据集类中预置了随机任务集划分:
# 划分一个任务:task是paddlefsl.task_sampler中TaskSet类的实例
task = training_set.sample_task_set(ways=5, shots=5)
# 返回shape为(25, 3, 84, 84)的numpy数组,25代表了任务中5个类(5 ways)每类5个样本(5 shots)
print(task.support_images.shape)
而在关系分类数据集(RCDataset)中,返回值的类型有text(文本)和numpy(numpy数组)两种可选项,若选择numpy则需要为数据集传入一种初始化器:
from paddlefsl.datasets import FewRel
from paddlefsl.backbones import RCInitVector
# 选择基于wiki语料库的GloVE词向量作为文本初始化
init_vector = RCInitVector('glove-wiki')
# 训练数据集,使用默认的numpy模式,传入文本初始化器
train_dataset = FewRel(mode='train', max_len=100, vector_initializer=init_vector)
print(train_dataset[0]) # 一个numpy数组和一个关系标签
valid_dataset = FewRel(mode='valid', backend='text')
print(valid_dataset[0]) # 一个语句、关系头、关系尾和一个关系标签
此外,用户可以直接通过继承CVDataset和RCDataset构建自己的数据集:根据用户自己的原始数据文件格式,在新的数据集类中实现获取元素、数据集长度、划分随机任务集三个接口,即可构建新的小样本数据集。用户也可以直接效仿本项目给出的原始数据格式,将新数据的数据格式调整后,直接通过传递root参数给已有的数据集,从而更便捷地构建新数据集。
经典小样本方法的高层次接口
我们的项目在paddlefsl.model_zoo中提供了五种经典的小样本方法的高层次接口:
- Siamese (Convolutional Siamese Networks)[Koch et al. ICML workshop 2015]
- ProtoNet(Prototypical Networks)[Snell et al. NeurIPS 2017]
- RelationNet(Relation Network)[Sung et al. CVPR 2018]
- MAML(Model-Agnostic Meta-Learning)[Finn et al. ICML 2017]
- ANIL(Almost No Inner Loop)[Raghu et al. ICLR 2020]
以及三种小样本FewCLUE方法的直接实现:
- PET [Schick et al. EACL 2020]
- P-Tuning [Liu et al. 2021]
- EFL [Wang et al. 2021]
FewCLUE的任务将额外地依赖PaddleNLP包,其实现过程中使用了百度的中文NLP预训练模型ERNIE1.0,并汇报了三种算法的效果。
我们在paddlefsl.model_zoo中实现了上述五种算法的完整的训练和测试逻辑。以MAML为例,用户仅需传入待测数据集和相关的算法超参和训练配置,即可直接开始训练或测试,并自动保存训练得到的模型参数:
import paddle
import paddlefsl
from paddlefsl.model_zoo import maml
# MAML, Mini-ImageNet, Conv, 5 Ways, 1 Shot
TRAIN_DATASET = paddlefsl.datasets.MiniImageNet(mode='train')
VALID_DATASET = paddlefsl.datasets.MiniImageNet(mode='valid')
TEST_DATASET = paddlefsl.datasets.MiniImageNet(mode='test')
MODEL = paddlefsl.backbones.Conv(input_size=(3, 84, 84), output_size=5)
def main():
train_dir = maml.meta_training(train_dataset=TRAIN_DATASET,
valid_dataset=VALID_DATASET,
ways=5,
shots=1,
model=MODEL,
meta_lr=0.002,
inner_lr=0.03,
iterations=10000,
meta_batch_size=32,
inner_adapt_steps=5,
report_iter=10)
if __name__ == '__main__':
main()
我们利用本项目实现的经典算法高层次接口测试了所有数据集上的效果,并与原论文或其他论文复现的效果做了比对。结果显示,我们的实现均达到了原论文方法使用其他机器学习框架汇报的结果,在多数任务上提升了原有的效果。具体的结果数据在样例(examples)中给出。
https://github.com/tata1661/F...
低层次常用工具函数
除了完整的训练和测试实现接口外,本项目还提供了丰富的低层次工具函数,用以实现常用的小样本学习基本操作,例如原型特征(prototype)的计算、模型的克隆(clone)、固定步长的单步梯度下降等等。丰富的工具函数。用户可以在源码或样例中查看并体验。
https://github.com/tata1661/F...
小样本学习资源库
PaddleFSL代码整合在小样本学习综述与前沿论文追踪项目FSL-Mate中共同开源发布。FSL-Mate项目是一个旨在整合小样本学习研究成果与最新研究进展的资源仓库。该项目基于王雅晴博士于2020年6月发表在ACM Computing Surveys (CSUR)上的小样本学习综述文章Generalizing from a few examples: A survey on few-shot learning扩展而来。CSUR是计算机领域权威顶刊,JCR 1区,Core A* ,该小样本学习综述为CSUR 2019-2021年间最高引论文,也是ESI 2021高引论文。我们将持续更新和维护该仓库,携手对小样本学习感兴趣的开发者和研究人员,共同推进小样本学习领域的发展。敬请关注与下载体验。
开发者简介
王雅晴,PaddleFSL负责人、高级飞桨开发者技术专家。2019年毕业于香港科技大学计算机科学及工程学系。通过百度公司AIDU计划加入百度研究院商业智能实验室,现任资深研发工程师及研究员。研究方向为机器学习,并主要聚焦小样本学习、稀疏和低秩学习、生物计算等方向。现有多篇一作成果发表在ICML、NeurIPS、WWW、EMNLP、TIP、ACM Computing Surveys等顶会顶刊上。
百度自然语言处理(Natural Language Processing,NLP)以『理解语言,拥有智能,改变世界』为使命,研发自然语言处理核心技术,打造领先的技术平台和创新产品,服务全球用户,让复杂的世界更简单。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。