Prototypical Networks for Few-shot Learning阅读笔记
K-means算法
K-means是一种常用的聚类算法,其特点主要是简单、运算速度快、好理解,但是其职能应用于连续型的数据,并且在聚类前需要手工指定要分成几类。
K-means算法的过程:
- 首先输入k的值,即我们希望将数据经过聚类得到k个不同的分组。
- 从数据集中随机选择k个数据点作为初始中心(就是k个中心点)
- 对集合的每一个元素,计算其与每个初始质心的距离(距离的度量方式有多种,通常使用欧式距离、曼哈顿距离),选择最近的初始质心的类别作为其当前的类别。
- 然后重新计算聚类中心点(通过每个类的所有数据点计算均值得到新的聚类中心)
- 重复以上步骤直到满足收敛条件(通常是确定的中心点不再发生改变)
原型网络(Prototypical Networks)
在这篇文章中,作者提出了一种可以应用于小样本分类的原型网络(Prototypical networks), 该网络可以对训练过程中从未见过的类进行正确的分类,并且对于每个类别只需要很少的样例数据。
原型网络将每个类别的样例数据映射到一个空间中,并且提取他们的"均值"来表示每个类的原型(prototypical,就类似于K-means中的中心点一样),使用欧几里得距离作为距离度量的标准。原型网络的的主要思想就是通过每个类都可以通过原型进行表示,其中的原型就是通过对于每个类的数据进行嵌入然后求均值得到的。
在训练阶段,使得本类别的数据到本类的原型表示(就是类别的中心)的距离最近,到其他类的原型表示的距离较远;测试阶段,对测试数据到各个类别的原型数据的距离通过softmax来判断测试数据类别的标签。其思想和k-means较为相似。
如上图所示,左边是Few-shot,其原型
c
k
c_k
ck就是Support集中每个类别样本嵌入的均值;右边是Zero-shot,其原型
c
k
c_k
ck是通过嵌入的类的元数据
v
k
v_k
vk计算的。
模型要做的就是将support set中的数据映射到一个embedding空间中,然后对同类数据的embedding平均作为原型的embedding;同时在预测的时候将输入数据也映射到这个embedding空间中,计算出该embedding与各个原型的距离后,选择距离最小的类别作为预测结果。也就是说这个模型需要做的事为:
- 训练一个encoder
- 选择合适的距离度量方法
Notation(符号说明)
在few-shot任务中,我们首先给定一个包含K个类别的N个带标签的样本作为支持集Support set: S = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } S = \left \{ (x_1,y_1),... ,(x_N,y_N) \right \} S={(x1,y1),...,(xN,yN)},其中 x i ∈ R D x_i\in \mathbb{R}^{D} xi∈RD 是一个D维向量, y i ∈ { 1 , 2 , . . . , K } y_i\in\left\{1,2,...,K\right\} yi∈{1,2,...,K} 表示K个类别中的一个。特别的记 S k S_k Sk为S中所有输入k类的样本集合。
Model(模型)
原型网络通过带有学习参数的嵌入函数 f ϕ f_\phi fϕ(将向量从D维转换到M维)来计算每个类的M维表示向量或原型。每个原型就是该类嵌入的Support中点嵌入向量的平均值。第k个类别的原型就可以表示为:
c k = 1 ∣ S k ∣ ∑ ( x i , y i ) ∈ S k f ϕ ( x i ) c_{k}= \frac{1}{\left | S_k\right |}\sum_{(x_i,y_i)\in S_k}f_\phi(x_i) ck=∣Sk∣1∑(xi,yi)∈Skfϕ(xi),其中 f ϕ : R D → R M f_\phi:\mathbb{R}^{D}\rightarrow\mathbb{R}^{M} fϕ:RD→RM就是需要学习的encoder。
预测的时候,选定一个距离函数 d : R M × R M → [ 0 , + ∞ ] d:\mathbb{R}^{M}\times\mathbb{R}^{M}\rightarrow[0,+\infty] d:RM×RM→[0,+∞],原型网络基于softmax在嵌入空间中与原型之间的距离得出查询集中的点 x x x的类别分布:
p ϕ ( y = k ∣ x ) = e x p ( − d ( f ϕ ( x ) , c k ) ) ∑ k ′ e x p ( − d ( f ϕ ( x ) , c k ′ ) ) p_\phi(y=k|x)=\frac{exp(-d(f_\phi(x),c_k))}{\sum_{k'} exp(-d(f_\phi(x),c_k'))} pϕ(y=k∣x)=∑k′exp(−d(fϕ(x),ck′))exp(−d(fϕ(x),ck))
相应的,通过最小化由SGD的真类k的负对数概率 J J J来学习,训练的目标就是最小化损失函数,即最小化 :
J ( ϕ ) = − l o g p ϕ ( y = k ∣ x ) J(\phi )=-logp_\phi(y=k|x) J(ϕ)=−logpϕ(y=k∣x)
Algorithm(算法)
符号定义:
N
N
N是训练集中样本的个数,
K
K
K是训练集中样本类别的个数,
N
c
⩽
K
N_c\leqslant K
Nc⩽K是每个episode包含的样本类别总数,
N
s
N_s
Ns表示支持集中每个类别的样本个数,
N
Q
N_Q
NQ表示查询集中每个类别的样本个数,RANDOMSAMPLE(S,N)代表从S中均匀的随机选择N个样本。
算法: 计算原型网络训练时episode的损失
J
J
J
输入: 训练集
D
=
{
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
}
D=\left \{(x_1,y_1),...,(x_N,y_N) \right \}
D={(x1,y1),...,(xN,yN)},其中
y
i
∈
{
1
,
2
,
.
.
.
,
K
}
y_i\in\left\{1,2,...,K\right\}
yi∈{1,2,...,K} ,
D
k
D_k
Dk表示k类别的元素的一个子集。
输出: 随机生成的训练episode的损失
J
J
J
下图是训练过程的伪代码描述:
Prototypical Networks as Mixture Density Estimation(混合密度估计)
这部分不是很懂就没写出来。(哈哈哈哈哈)
Design Choices (设计选择)
1. Distance metric(距离度量)
在Matching Networks中使用consine(余弦距离)进行度量,然而对于匹配网络和原型网络,任何距离都是可允许的,我们发现使用平方欧几里得距离能够大大提高两者的结果。对于原型网络,我们推测这主要是由于余弦距离不是Bregman散度,因此在2.3节中讨论的混合密度估计的等价性并不成立。
2. Episode composition
一种构造episode的直观方式,选择
N
c
N_c
Nc个类,每个类选择
N
s
N_s
Ns个支持点,以便在测试时匹配预期的情况。结果发现训练时的类别数量(
N
c
N_c
Nc)比测试时多时,效果会更好;训练和测试时每个类别中样本数量(
N
s
N_s
Ns)一样时,效果会更好。
Zero-Shot Learning(零样本学习)
零样本学习对于每个类给出类的元数据向量 v k v_k vk而不是给出一个类的多个点。定义 c k = g ϑ ( v k ) c_k=g_\vartheta(v_k) ck=gϑ(vk),将元数据向量 v k v_k vk进行嵌入得到每个类的原型。
Experiments(实验部分)
作者在Omniglot和miniImageNet上进行了few-shot的实验,在UCSD上进行了zero-shot实验。
Omniglot Few-shot Classification
Omniglot是从50个字母表中收集的1623个手写字符的数据集。每一种字符有20个由不同人写的样本。作者通过将每张图像旋转90度进行数据的扩充,然后使用1200个类别的字符进行训练,剩下的用于测试。
实验中使用平方欧几里得距离,训练集episode包括60个类,每个类包含5个查询样本。
在Omniglot数据集上的实验,对模型做如下的设置:
- 使用一个四层的 CNN 作为 f ϕ f_\phi fϕ
- 每层由 64 个 3x3 的卷积核组成,并使用 Batch Normalization,激活函数用 ReLU,最后来一个 2x2 的 max-pooling
- 使用 Adam 优化算法
- 学习率初始化为
1
0
−
3
10^{−3}
10−3,每 2000 个 episodes 学习率减半
结论: - 训练样本和测试样本的每个类别的样本数量shot( N k N_k Nk)相匹配是有利的
- 训练时每个episode中使用更多的类way(
N
c
N_c
Nc)也是有利的
miniImageNet Few-shot Classification
miniImageNet是一个彩色图片数据集,其中有100个类别,每个类别有600个样本。实验中使用64个类作为训练集,16个作为验证集,20个作为测试集。在64个类上进行训练,使用16个验证类用来监控模型的泛化性能。
模型设置:
- 仍然使用四层的CNN作为 f ϕ f_\phi fϕ
- 每层由 64 个 3x3 的卷积核组成,并使用 Batch Normalization,激活函数用 ReLU,最后来一个 2x2 的 max-pooling
3.学习率使用与Omniglot相同的学习速率,并且一直训练直到验证集的损失停止增加为止。
结论:
- 使用欧式距离比余弦距离要好,这个结论不光是对 Prototypical Networks 而言,甚至在 Matching Networks 上也成立;
- 进行 N-way k-shot 训练时,N 的值越大,总体上看来模型效果会越好,可能是因为训练时类别数多会导致模型能更好地学习到不同类别之间的细微差别,从而提高了泛化性
CUB Zero-shot Classification
CUB数据集中包含200种鸟的11788张图片。作者将100个类别作为训练集,50个作为验证集,50个作为测试集。
模型设置:
- 学习一个简单的线性映射,来产生一个1024维的输出空间。
- 嵌入由SGD的Adam进行优化
- 学习率固定为
1
0
−
4
10^{-4}
10−4,权重衰减为
1
0
−
5
10^{-5}
10−5
参考链接:
原文链接:Prototypical Networks for Few-shot Learning
论文笔记:Few-Shot Learning.
论文笔记:Prototypical Networks for Few-shot Learning