传统观点一般认为,深度神经网络通常比较擅长从高维数据中学习,例如图像或者语言,但这是建立在它们有大量标记的样本来训练的情况下。然而,人类却拥有单样本学习的能力——如果你找一个从来没有见过小铲刀的人,给他一张小铲刀的图片,他应该就能很高效的将它从其他厨房用具里面鉴别出来。
这是一种对人类来说很容易的任务,但是直到我们想写一个算法让它去做这件事……那就GG了 。很明显,机器学习系统很希望拥有这种快速从少量样本中去学习的能力,因为收集和标记数据是一个耗时费力的工作。而且,我认为这是通往通用人工智能的漫漫长路中很重要的一步。
最近涌现出来很多有趣的基于神经网络的单样本学习论文,它们已经得到了一些不错的结果。这是一个让我很激动的新领域,所以我想去对它做一个简要介绍,来让深度学习新手更好的认识它。
在这篇博客中,我想:
- 介绍并定义单样本学习问题
- 描述单样本分类问题的基准,并给出一个其性能的baseline
- 给出一个少样本学习的例子,并部分实现这篇论文中提到的模型
- 指出一些大家通常不会想到的小点子
定义问题:N类别单样本学习(One-shot Learning)
在我们解决任何问题之前,我们应该精准的定义出这个问题到底是什么,下面是单样本分类问题的符号化表示: 我们的模型只获得了很少的标记的训练样本S,它有N个样本,每个相同维度的向量有一个对应的标签 y
再给出一个待分类的测试样例。因为样本集中每个样本都有一个正确的类别 ,我们的目标是正确的预测 y∈S 中哪一个是的正确标签。
这里有很多种定义问题的方式,但上面是我们的定义,注意这里有一些事项需要记录一下:
- 现实生活中可能约束更少,可能一张图片并不见得只有一个正确的类别
- 这个问题很容易泛化到 k-shot 学习,我们只需要把每个类别 仅有单个样本换成 k 个样本就可以了
- 当N很高时候, 可能有更多可能的类别,所以正确预测类别更难
- 随机猜的正确率是
这里有一些在Omniglot数据集上单样本学习的例子,我会在下一部分介绍它。图示分别为9类,25类,36类的单样本学习任务。
关于数据集 Omniglot!
Omniglot数据集拥有50种文字,1623类手写字符。对于每类字符仅有20个样本,每个样本分别由不同的人绘制而成,分辨率为105*105。
上面是Omniglot数据集的一些例子,如图所示,这里有很多种字符,如果你喜欢机器学习,你肯定听说过 MNIST 数据集。Omniglot有时被成为 MNIST 的转置,因为它有1623类字符,每类只有20个样本,相比 MNIST 的10个类别,每个类别都有上千样本,正好相反。Omniglot 还有创作的笔画数据,但是我们这里用不到它。
通常,我们把样本分为30类训练样本,剩下20类作为评估。所有这些不同的字符可以组成很多种单样本学习任务,所以它确实是单样本学习的一个很好的评估标准。
一个单样本学习的 Baseline:1 近邻
最简单的分类方式是使用 k-近邻方法,但是因为每个类别只有一个样本,所以我们需要用 1近邻。这很简单,只需要计算测试样本与训练集中每个样本的欧式距离,然后选择最近的一个就可以了:
根据Koch等人的论文,在Omniglot数据集中的20类上,单样本分类,1-nn可以得到大约28%的精度,28%看起来很差,但是它已经是随机猜测(5%)的 6 倍了。这是一个单样本学习算法最好的baseline 或者“合理性测试”了。
Lake等人的 Hierarchical Bayesian Program Learning,层次贝叶斯程序学习(以下简称 HBPL)得到了大约 95.2%的精度,非常不错。我只看懂了30%,但它非常有趣,它与深度学习直接从原始像素上训练相比,是风马牛不相及的,因为:
- HBPL使用笔画数据,而不是仅仅用原始像素;
- HBPL在Omniglot数据集上学习一个笔画的生成模型,这个算法需