Vinyals, Oriol, et al. “Matching Networks for One Shot Learning.” arXiv preprint arXiv:1606.04080 (2016).
简介
问题
DeepMind团队的这篇文章解决小样本学习问题:对于训练过程中从未见过的新类,只借助每类少数几个标定样本,不改变已经训练好的模型,能够对测试样本进行分类。
举例:使用大规模人脸数据库训练好的人脸模型,应用于小规模人脸识别。每个使用者只提供较少几张注册图像。
亮点
Li Feifei老师的高徒,在ImageNet中为#科学献身#的人肉参照者,现供职于OpenAI的Andrej Karpathy对该论文给出了“可不咋地!”的崇高评价,并撰写了读文笔记。本文较大程度参考了该笔记。
本文创新之处有二:
- 模型设计中,借鉴了当下流行的注意力LSTM,考虑了整个参考集合的贡献;
- 训练过程中,尽量模拟测试流程,使用小样本构造minibatch。
模型
问题建模
给出的参考集中有
k
k
k个样本:
(
x
i
,
y
i
)
i
=
1
:
k
(x_i, y_i)_{i=1:k}
(xi,yi)i=1:k。注意
k
k
k往往很小,类别的数量也不多。
对于测试样本
x
^
\hat x
x^,预测其标定
y
^
\hat y
y^。
注意力模型
本文使用参考集标定的加权和作为预测:
y
^
=
∑
i
=
1
k
a
(
x
^
,
x
i
)
y
i
\hat y = \sum_{i=1}^ka(\hat x, x_i)y_i
y^=i=1∑ka(x^,xi)yi
充当权重的注意力函数
a
a
a是softmax形式,用其他所有参考集样本归一化:
a
(
x
^
,
x
i
)
=
exp
[
C
(
f
(
x
^
)
,
g
(
x
i
)
)
]
∑
j
=
1
k
exp
[
C
(
f
(
x
^
)
,
g
(
x
j
)
)
]
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_j))]}
a(x^,xi)=∑j=1kexp[C(f(x^),g(xj))]exp[C(f(x^),g(xi))]
C C C是余弦距离,用于比较测试样本 x ^ \hat x x^和参考样本 x i x_i xi的相似度。
f , g f,g f,g分别是测试样本和参考样本的特征提取函数(论文里称为embedding),使用深度网络实现,以下逐一说明。
参考样本特征g
首先使用一个简单的网络(例如VGG或者Inception)提取单个样本的原始特征: g ′ ( x i ) g'(x_i) g′(xi)。
每个样本 x i x_i xi维护四个状态变量
. | 前向 | 后向 |
---|---|---|
隐状态 | h → i \overrightarrow{h}_i hi | h ← i \overleftarrow{h}_i hi |
记忆 | c → i \overrightarrow{c}_i ci | c ← i \overleftarrow{c}_i ci |
前向变量由前一个参考样本的隐状态和上下文经过LSTM确定,当前样本的原始特征作为输入:
h
→
i
,
c
→
i
=
L
S
T
M
(
g
′
(
x
i
)
,
h
→
i
−
1
,
c
→
i
−
1
)
\overrightarrow{h}_i,\overrightarrow{c}_i=\mathrm{LSTM}(g'(x_i), \overrightarrow{h}_{i-1},\overrightarrow{c}_{i-1})
hi,ci=LSTM(g′(xi),hi−1,ci−1)
后向变量由后一个参考样本的隐状态
h
h
h和记忆
c
c
c经过LSTM确定,当前样本的原始特征作为输入:
h
←
i
,
c
←
i
=
L
S
T
M
(
g
′
(
x
i
)
,
h
←
i
+
1
,
c
←
i
+
1
)
\overleftarrow{h}_i,\overleftarrow{c}_i=\mathrm{LSTM}(g'(x_i), \overleftarrow{h}_{i+1},\overleftarrow{c}_{i+1})
hi,ci=LSTM(g′(xi),hi+1,ci+1)
参考集特征由其隐状态
h
h
h和原始特征共同决定:
g
(
x
i
)
=
h
→
i
+
h
←
i
+
g
′
(
x
i
)
,
i
=
1
,
2...
k
g(x_i)=\overrightarrow h_i + \overleftarrow h_i + g'(x_i),i=1,2...k
g(xi)=hi+hi+g′(xi),i=1,2...k
实际上,这里将原本无序的参考样本集进行了排序1。对于排序后的参考集使用LSTM,使得每个样本的特征 g ( x i ) g(x_i) g(xi)不但和自身有关 g ′ ( x i ) g'(x_i) g′(xi),还间接和其他参考样本相关。
测试样本特征f
同样使用简单的网络提取单个样本的原始特征: f ′ ( x ) f'(x) f′(x)。
接下来对于每一个测试样本, 通过 l = 1 , 2... L l=1,2...L l=1,2...L次迭代,使用一个注意力LSTM模型(attLSTM)计算测试样本的特征2。
每一步维护四个状态变量
隐变量 | 读数 | 记忆 |
---|---|---|
h l , h ^ l h_l,\hat h_l hl,h^l | r l r_l rl | c l c_l cl |
在第
l
l
l步,首先用LSTM模型计算原始隐变量
h
h
h和记忆
c
c
c:
h
^
l
,
c
l
=
L
S
T
M
(
f
′
(
x
^
)
,
[
h
l
−
1
,
r
l
−
1
]
,
c
l
−
1
)
\hat h_l, c_l=\mathrm{LSTM}(f'(\hat x), [h_{l-1}, r_{l-1}], c_{l-1})
h^l,cl=LSTM(f′(x^),[hl−1,rl−1],cl−1)
加上原始特征,获得本步骤隐变量:
h
l
=
h
^
l
+
f
′
(
x
^
)
h_l=\hat h_l+f'(\hat x)
hl=h^l+f′(x^)
本步骤读数是参考集特征的加权和3:
r
l
=
∑
i
=
1
k
a
(
h
l
−
1
,
g
(
x
i
)
)
⋅
g
(
x
i
)
r_l=\sum_{i=1}^ka(h_{l-1},g(x_i))\cdot g(x_i)
rl=i=1∑ka(hl−1,g(xi))⋅g(xi)
和之前类似,注意力函数也是softmax形式,用其他所有参考集样本归一化:
a
(
h
l
−
1
,
g
(
x
i
)
)
=
exp
[
h
l
−
1
T
g
(
x
i
)
]
∑
j
=
1
k
exp
[
h
l
−
1
T
g
(
x
j
)
]
a(h_{l-1}, g(x_i))=\frac{\exp [h_{l-1}^Tg(x_i)]}{\sum_{j=1}^k \exp [h_{l-1}^Tg(x_j)]}
a(hl−1,g(xi))=∑j=1kexp[hl−1Tg(xj)]exp[hl−1Tg(xi)]
换言之,除了以测试样本作为输入,在每一个步骤中,还要根据LSTM状态 h h h,决定把注意力放在哪一些参考集样本上。
最后一步的读数即为测试样本特征:
f
(
x
^
)
=
r
L
f(\hat x) = r_L
f(x^)=rL
训练与测试
训练策略是本文的闪光之处,再一次验证了机器学习实战中这条颠扑不破的真理:怎么用,怎么训。
训练过程中,迭代一次的流程如下4:
- 选择少数几个类别(例如5类),在每个类别中选择少量样本(例如每类5个);
- 将选出的集合划分:参考集,测试集;
- 利用本次迭代的参考集,计算测试集的误差;
- 计算梯度,更新参数
这样的一个流程文中称为episode。
在测试过程中,同样遵守此流程:
- 选择少数几个类别,在每个类别中选择少量样本;
- 将选出的集合划分:参考集,测试集;
- 利用本次迭代的参考集,计算测试集的误差;
注意,在完成训练之后,所有训练中用过的类别,都不再出现在后续真正测试中。换言之,训练集和测试集的类别互不包含。
实验
在此只介绍和图像有关的两组实验。
基本设置
模型
此处的“模型”指的是特征提取方法。
Pixels:直接对比原始图片像素。
Baseline Classifier:用训练集数据训练一个4层卷积分类网络;用此网络的倒数第二层(去除最后的分类层)提取特征。详参原文4.1.1。
Inception Classifier:用Inception网络提取特征,使用方法同上。详参原文4.1.2。
MANN:参见5。
Convolutional Siamese Net:参见6。用训练集数据训练一个同类/不同类分类器;用此网络的倒数第二层(去除最后的分类层)提取特征。
Inception Oracle:用Inception在全部类别(训练集+测试集)上训练分类器,作为上限对比。
匹配函数
相当于前述函数 a ( x ^ , x i ) a(\hat{x},x_i) a(x^,xi),即如何考察测试样本特征 x ^ \hat{x} x^和参考集样本特征 x i x_i xi之间的匹配程度。
Cosine: a ( x ^ , x i ) = c ( x ^ , x i ) a(\hat{x},x_i)=c(\hat{x},x_i) a(x^,xi)=c(x^,xi)
Softmax: a ( x ^ , x i ) = exp [ c ( x ^ , x i ) ] / ∑ j exp [ c ( x ^ , x j ) ] a(\hat{x},x_i)=\exp[c(\hat{x},x_i)]/\sum_j \exp[c(\hat{x},x_j)] a(x^,xi)=exp[c(x^,xi)]/∑jexp[c(x^,xj)]
Cosine(FCE): a ( x ^ , x i ) = c ( f ( x ^ ) , g ( x i ) ) a(\hat{x},x_i)=c(f(\hat{x}),g(x_i)) a(x^,xi)=c(f(x^),g(xi))
其中 c c c为余弦距离,FCE表示Fully Conditional Embedding。
调优
在使用训练集完成训练后,是否使用测试集中的参考样本进行调优。
Omniglot
Omniglot数据集包含50个字母表,共计1623类字符,每类包含20个不同人绘制的20个样本。
本文在使用时,添加了90°为倍数的4种旋转,进一步扩展类别数。使用其中的12004类字符作为训练,剩余4234类作为测试。
ImageNet
将原始ImageNet重新组织为以下三个数据集。
miniImageNet:选择100类,80类训练,20类测试。每类包含600张84*84的彩色图像。
randImageNet:随机选择118类作为测试集;剩余类作为训练集。
dogsImageNet:选择dogs的118个子类作为测试集;剩余类作为训练集。
总结
本文提供了一个端到端(end-to-end)、可以直接优化的模型。这个模型本身即包含了参考集样本的信息。换句话说,“如何利用参考集”这件事,也在优化的内容中。
本文的书写和实验部分尚有不尽如意之处,但理念富有创新性,值得持续关注。
原文没有提及如何将无序的参考集样本排序。Karpathy的笔记中猜测可能随机,并建议参考同作者文章:Order Matters: Sequence to Sequence for Sets. ↩︎
为与参考样本部分区分,此处符号和论文中有所不同。 ↩︎
此处原文公式(5)有误 ↩︎
此处原文说明不详,待研究。 ↩︎
A Santoro, S Bartunov, M Botvinick, D Wierstra, and T Lillicrap. Meta-learning with memory-augmented
neural networks. In ICML, 2016. ↩︎G Koch, R Zemel, and R Salakhutdinov. Siamese neural networks for one-shot image recognition. In
ICML Deep Learning workshop, 2015. ↩︎