论文笔记 – Matching networks for one shot learning

Vinyals, Oriol, et al. “Matching networks for one shot learning.” NeuralIPS 2016

这篇文章既引经据典(和各种模型类比),又非常哲学(一切公式附录见),感觉就跟浙江高考满分作文一样,非常难懂。不过有 [1] 这篇笔记,就非常好懂(或者看 [3] 这个中文版也很好)。既然有很多人都总结了这个论文,我就不再重复,说一说自己的感悟。(别人写过的我也没必要写了,不是嘛)

训练方式

先说说本文的最大亮点:全新的训练方式。

训练过程中,迭代一次的流程如下:

  • 选择少数几个类别(例如5类),在每个类别中选择少量样本(例如每类5个);
  • 将选出的集合划分:参考集,测试集;
  • 利用本次迭代的参考集,计算测试集的误差;
  • 计算梯度,更新参数 这样的一个流程文中称为episode。

在测试过程中,同样遵守此流程:

  • 选择少数几个类别,在每个类别中选择少量样本;
  • 将选出的集合划分:参考集,测试集;
  • 利用本次迭代的参考集,计算测试集的误差;

注意,在完成训练之后,所有训练中用过的类别,都不再出现在后续真正测试中。换言之,训练集和测试集的类别互不包含。

这是一种什么感觉呢?每个 episode 都相当于传统的机器学习的一次训练,多个 episode 就仿佛在学习“我该怎么学习”。而小样本的评测过程,也是给了学习的机会(support set)——这才是训练出来的小样本模型的用法!还是那句话,怎么用,怎么训!

不过,提出了这种训练方式,在实验部分就应该对比这种方式和其它方式的性能区别。而作者实验全部使用的是这种方式,只是将不同的“特征提取”和“相似度计算”进行对比。这篇文章的实验还是不够充分。

non-parametric & parametric

参数模型,比如神经网络,就是结构不太重要,学到的参数重要。比如一个 FCN,结构就是那样,但是要为每个不同的问题学习参数,相当于学习一个函数 $f$,使得 $f($图像$)=$标签类别的概率,$f($文本$)=$文本的 embedding 等等。不同的神经网络结构,其实只是为了参数共享(比如 CNN 与 FCN 的区别)、舍弃一些参数(比如 CNN 与 ResNet 的区别)等等,是出于“优化比较方便”考虑的。

而非参数模型,比如谱聚类,就是算法已经决定了一切。按步骤操作下来,就能得到结果。这个结果是训练数据自带的(比如,谱聚类 embedding 的特征空间,就是由数据原先的位置关系决定的)所以非参数模型,就只需要考虑算法。在这篇文章里,作者说“非参数模型只需要考虑 metric”也是类似的意思,欧氏距离或者曼哈顿距离,就决定了谱聚类 embedding 空间的样子嘛!

参数模型的好处就是,训练出参数 $f()$ 之后,就可以直接用,比如训练出的自编码器,用它 embedding 就只需要 $O(n)$ 复杂度。但是非参数模型,一旦换个数据,就都要重新开始,非常慢。

非参数模型的好处是,即使数据集变了很多,也能继续用。比如如果 CNN 训练了猫狗的识别器,就不能用在 iris 上,但是用非参数的方法,在什么数据集都是一样的训练。我们现在面临的小样本学习,是从大规模的通用数据学习,然后在某个特定 domain 小样本学习,这数据就有很大的变化,我们需要非参数模型的这个优点。

这篇文章的目标就是要利用到二者的优点结合,换句话说就是,既要从新的样本快速学到知识,也要从通用的样本里进行总结。于是作者提出了下面这个关键的思路。

Full Context Embeddings

$$\hat{y} = \sum_{i=1}^k a(\hat{x},x_i)y_i$$

这个式子中,$x_i,y_i$ 是 support set 中的样本和标签,$\hat{x}$ 是测试样例。$a()$ 就是一个函数。

  • 如果 $a()$ 是衡量相似度的函数,那么这个式子的意思就是,找到跟 support set 里最接近的样本,她的标签就是我的标签。
  • 如果 $a()$ 是一个核函数(就是可以表示成内积的函数),那么这个式子就是核密度估计(我理解就是用核函数做一个平滑),而这种平滑,实际上就是对图像的主要特征进行提取。
  • 如果 $a()$ 是对于离 $\hat{x}$ 最远的 support set 样本取 0,那么这个式子实际上就是计算 与 $\hat{x}$ 最近的 $k-b$ 个的质心,实际上就是最近邻算法。

从以上三个角度来看,这个式子都代表非参数的模型。

那实际上,$a()$ 的表达式如下:$$a(\hat{x},x_i) = \frac{\exp[C(f(\hat{x}),g(x_i))]}{\sum_{j=1}^k \exp [C(f(\hat{x}),g(x_i))]}$$

整体是个 softmax 的形式,就是归一化的相似度函数。$f,g$ 是 embedding 的函数,分别使用 attLSTM 和 Bi-LSTM 实现,具体后面再说。$f,g$ 可以学到更 general 的特征,这样就用上了参数模型的优点,而剩余部分,即“找最近的复制标签”,是非参数模型的优点。毕竟,embedding 如果整得好,是有可能跨领域的(比如 BERT),非参数模型更是可以跨领域的,整体就能满足在新的 domain 小样本学习的要求。且到了新的领域,大模型不变,不用 fine-tune,只需要学一个新的 $f$。

不过,我感觉由于 support set 很小,因此 $f()$ 肯定也学不到啥。实验结果上,用 embedding 好了 4%,还是挺出我的意料,感觉是由于 $g()$ 学得好。作者应该做一个实验,就是把 $f$ 换成 $g$,再看看效果的。

attLSTM & Bi-LSTM

首先,为啥要用 LSTM 呢?感觉作者的意思是要让同一类的图片有上下文的关系(这说的是人话?)。原来的 CNN,只是让最后得到的特征空间里,每个样本的特征表示能按照类别分散开来,而没有引入其他的信息。这个使用 LSTM,可以从一开始就在遍历样本的过程中,记住关键的特征,遗忘个体差异。这一段是我强行编的,切勿相信!

[4] 说的我也觉得有道理:

有人可能会疑惑为什么要用 LSTM,像 LSTM、RNN 这种模型都要记住一些东西,可是这些样本的类别又不同,所以是想要记住什么?我的理解是将各个类别的样本作为序列输入到 LSTM 中,是为了模型纵观所有的样本去自动选择合适的特征去度量,例如如果我们的目标是识别人脸,那么就需要构建一个距离函数去强化合适的特征(如发色,脸型等);而如果我们的目标是识别姿势,那么就需要构建一个捕获姿势相似度的距离函数,这里需要参考一下度量学习 [2]。

下一个问题,怎么把集合变成序列呢?不同顺序对结果是有很大影响的,顺序怎么确定呢?作者说他自己有写 [5],我以后有时间再看。

NLP 的评测

作者脑洞真的很大,他设计了一个 one-shot language task,感觉所有 FSL 模型都可以这样评测。

在 support set 里面,给出 K 个句子,每个句子缺一个词(用 one-hot 向量给出),label 就是缺的词;query 即预测缺的词。

Matching Network 在这上似乎很差,因此作者就没多说。。。

总结

这篇文章真是让人摸不着头脑,我在文章里至少还标着几十处不能理解的地方。不过,这种训练方式非常有启发性(现在也应该广泛使用了已经),对 non-param 模型我还需要更深入的思考。先好好学学 SVM 啥的叭。

引用和拓展阅读

[1] https://github.com/karpathy/paper-notes/blob/master/matching_networks.md

[2] 度量学习 (Metric Learning)(一)

[3] 【平价数据】One Shot Learning

[4] 论文笔记:Matching Networks for One Shot Learning – 精分少女的文章 – 知乎

[5] O Vinyals, S Bengio, and M Kudlur. Order matters: Sequence to sequence for sets. arXiv preprint arXiv:1511.06391, 2015.

发表评论