**
Prototypical Networks for Few-shot Learning.(用于少样本分类的原型网络)
**
摘要
文章提出了一种用于少样本分类的原型网络,其中分类器必须可以推广(泛化)到在训练集里面没有见过的新的类别,并且每个新的类别只有很少一部分样本。原型网络学习一个度量空间,执行分类只需要简单的计算到每个类的原型表示的距离。与其他方法的主要一点不同是原型网络反映了一种在数据集不足情况下的归纳偏差。最后一点是原型网络可以用于zero-shot learning(零样本学习)。
简单的设计选择带来了实质性的改进
本质思想
使用一个神经网络学习一个 embedding 将输入映射到一个映射空间里面,而每个类的原型就是简单的这个类的 support set 所有样本(support set 的定义参见后文)的均值。分类的执行:将需要分类的样本用学习到的映射函数映射到嵌入空间里面,然后离他最近的原型就是我们的预测类。
介绍
- few-shot learning 问题的本质之一是样本很少,一般每个类的样本少于20个。另外一个本质是这些类是全新的类。few-shot learning 问题的分类器必须调整以适应新的类,并且新的类中每个类的样本很少。传统的方法是在新的数据上重新训练新的模型,但是由于样本太少,往往会导致过拟合 (overfitting)。但是**我们人类是可以做到 few-shot learning **的,因此迈向普世的人工智能,few-shot leanring 问题是一个重要问题。
- 文章假设:由于样本有限,我们的分类器会有一个归纳偏差 (inductive bias)。 原型网络基于这样的想法:存在一种 embedding,使得其中每个类的点(可能多个)聚集在每个类的单个原型表示周围。
- 方法概述:使用一个神经网络学习一个 embedding 将输入映射到一个映射空间里面,而每个类的原型就是简单的这个类的 support set 所有样本(support set 的定义参见后文)的均值。分类的执行:将需要分类的样本用学习到的映射函数映射到嵌入空间里面,然后离他最近的原型就是我们的预测类。zero-shot learning 类似,只不过每个类没有标记 (label),而是一个关于类的高级描述 (high-level description of the class)。
方法
- 符号定义:support set 是我们具有的 N N N 个标记的样本 S = { ( x 1 , y 1 ) , … , ( x N , y N ) } S=\left\{\left(\mathbf{x}_{1}, y_{1}\right), \ldots,\left(\mathbf{x}_{N}, y_{N}\right)\right\} S={(x1,y1),…,(xN,yN)},其中 x i ∈ R D \mathbf{x}_{i} \in \mathbb{R}^{D} xi∈RD 是一个 D D D维的向量, y i ∈ { 1 , … , K } y_{i} \in\{1, \ldots, K\} yi∈{1,…,K} 使对应的类, S k S_{k} Sk 表示类别为 k k k 的样本的集合。
- 模型:首先一个映射函数 (embedding): f ϕ : R D → R M f_{\phi} : \mathbb{R}^{D} \rightarrow \mathbb{R}^{M} fϕ:RD→RM 参数为 ϕ \phi ϕ,将输入空间映射到嵌入空间 (嵌入空间的维度为 M M M),然后计算每个类的原型: c k = 1 ∣ S k ∣ ∑ ( x i , y i ) ∈ S k f ϕ ( x i ) \mathbf{c}_{k}=\frac{1}{\left|S_{k}\right|} \sum_{\left(\mathbf{x}_{i}, y_{i}\right) \in S_{k}} f_{\phi}\left(\mathbf{x}_{i}\right) ck=∣Sk∣1∑(xi,yi)∈Skfϕ(xi)。这个公式很简单,就是嵌入空间中属于 k k k 类的所有点的 embedding 向量先求和在除以点的个数(就是简单的均值)。执行分类:距离函数 d : R M × R M → [ 0 , + ∞ ) d : \mathbb{R}^{M} \times \mathbb{R}^{M} \rightarrow[0,+\infty) d:RM×RM→[0,+∞) 根据两个 M M M 维的向量,使用距离函数 d d d,求出距离。对于一个需要分类的样本点 x \mathbf{x} x , x \mathbf{x} x 属于类别 k k k 的概率为: p ϕ ( y = k ∣ x ) = exp ( − d ( f ϕ ( x ) , c k ) ) ∑ k ′ exp ( − d ( f ϕ ( x ) , c k ′ ) ) p_{\phi}(y=k | \mathbf{x})=\frac{\exp \left(-d\left(f_{\phi}(\mathbf{x}), \mathbf{c}_{k}\right)\right)}{\sum_{k^{\prime}} \exp \left(-d\left(f_{\phi}(\mathbf{x}), \mathbf{c}_{k^{\prime}}\right)\right)} pϕ(y=k∣x)=∑k′exp(−d(fϕ(x),ck′))exp(−d(fϕ(x),ck)),即与原型距离的相反数的softmax(归一化),取相反数的原因是相距最小的原型最有可能使这个样本点对应的类。
- 学习过程是通过 SGD (Stochastic Gradient Descent, 随机梯度下降) 最小化正确类别 k k k 的负对数概率 J ( ϕ ) = − log p ϕ ( y = k ∣ x ) J(\phi)=-\log p_{\phi}(y=k | \mathbf{x}) J(ϕ)=−logpϕ(y=k∣x)。最小化 J ( ϕ ) = − log p ϕ ( y = k ∣ x ) J(\phi)=-\log p_{\phi}(y=k | \mathbf{x}) J(ϕ)=−logpϕ(y=k∣x) 等价于最大化 log p ϕ ( y = k ∣ x ) \log p_{\phi}(y=k | \mathbf{x}) logpϕ(y=k∣x),等价于最大化 p ϕ ( y = k ∣ x ) p_{\phi}(y=k | \mathbf{x}) pϕ(y=k∣x),其中 x \mathbf{x} x 属于类 k 。
- 训练剧集 (training episodes) 的构造,这也是我第一次在论文中看到以算法的形式介绍如何构建 meta-training task。
首先 N N N 是训练集样本的数量, K K K是训练集中样本的类, N C ≤ K N_{C} \leq K NC≤K 是每次 training episodes 中类别个数, N S N_{S} NS 是 support set 中每个类的的样本个数, N Q N_{Q} NQ 使 query set 中每个类的的样本个数。RANDOMSAMPLE ( S , N ) (S, N) (S,N) 表示在 S S S 中随机均匀采样 N N N 个样本,没有替换。
Input:训练集 D = { ( x 1 , y 1 ) , … , ( x N , y N ) } \mathcal{D}=\left\{\left(\mathbf{x}_{1}, y_{1}\right), \ldots,\left(\mathbf{x}_{N}, y_{N}\right)\right\} D={(x1,y1),…,(xN,yN)},其中 y i ∈ { 1 , … , K } y_{i} \in\{1, \ldots, K\} yi∈{1,…,K}, D k \mathcal{D}_{k} Dk 表示一个包含所有 y i = k y_{i}=k yi=k 的元素 ( x i , y i ) \left(\mathbf{x}_{i}, y_{i}\right) (xi,yi) 集合 D \mathcal{D} D。
Output: training episodes 的损失 J J J 。
过程:
V ← V \leftarrow V← RANDOMSAMPLE ( { 1 , … , K } , N C ) \left(\{1, \ldots, K\}, N_{C}\right) ({1,…,K},NC) 从 K K K 个类中随机取出 N C N_{C} NC 个类作为这个 training episode 的类别。
对其中的每个类别 k k k: S k ← S_{k} \leftarrow Sk← RANDOMSAMPLE ( D V k , N S ) \left(\mathcal{D}_{V_{k}}, N_{S}\right) (DVk,NS),在所有类别为 k k k 的样本中采样 N S N_{S} NS个样本作为这个类的 support。
对其中的每个类别 k k k: Q k ← Q_{k} \leftarrow Qk← RANDOMSAMPLE ( D V k \ S k , N Q ) \left(\mathcal{D}_{V_{k}} \backslash S_{k}, N_{Q}\right) (DVk\Sk,NQ),在所有类别为 k k k 的样本中采样 N Q N_{Q} NQ个样本作为这个类的 query(需要先去掉已经选作 support set 的样本点)。
使用每个类的 support set 计算每个类的原型: c k ← 1 N C ∑ ( x i , y i ) ∈ S k f ϕ ( x i ) \mathbf{c}_{k} \leftarrow \frac{1}{N_{C}} \sum_{\left(\mathbf{x}_{i}, y_{i}\right) \in S_{k}} f_{\phi}\left(\mathbf{x}_{i}\right) ck←NC1∑(xi,yi)∈Skfϕ(xi)。这里我觉得原论文有错:我用红色标记的地方,分母应该是 ∣ S k ∣ \left|S_{k}\right| ∣Sk∣ 或者 N s N_{s} Ns。
J ← 0 J \leftarrow 0 J←0:初始化 loss 为 0 。
for k k k in { 1 , … , N C } \left\{1, \ldots, N_{C}\right\} {1,…,NC} do: for ( x , y ) (\mathbf{x}, y) (x,y) in Q k Q_{k} Qk do: J ← J + 1 N C N Q [ d ( f ϕ ( x ) , c k ) ) + log ∑ k ′ exp ( − d ( f ϕ ( x ) , c k ) ) ] J \leftarrow J+\frac{1}{N_{C} N_{Q}}\left[d\left(f_{\phi}(\mathbf{x}), \mathbf{c}_{k}\right)\right)+\log \sum_{k^{\prime}} \exp \left(-d\left(f_{\phi}(\mathbf{x}), \mathbf{c}_{k}\right)\right) ] J←J+NCNQ1[d(fϕ(x),ck))+log∑k′exp(−d(fϕ(x),ck))]:叠加每个类的 query set 节点的损失作为损失函数。
进一步分析 (混合密度估计,距离度量的选择,训练剧集的构造)以及实验部分请参考原论文
这里讲一下我对归纳偏差的理解:对于 support set 中每个类的样本点不止一个的情况下,取任意一点作为这个类的基准都不合适,原型网络的思想是最简单的求平均,这样考虑到了某个类的每个样本点以及每个样本点相对于这个类的原型表示的偏差。我们不妨认为其实每个样本点和这个类的原型表示点都有一点距离(偏差),求平均就是归纳偏差。当然一个想法就是不求平均,用别的方法找这个类的原型表示点,如果效果提升并且可以给出一定的理论证明,这是一个不错的future work 方向。另外距离欧式度量不一定的最好的选择,论文在欧氏距离和余弦距离中做出选择是根据实验得到的,至于为什么并没有理论证明(准确说有一点证明,但是有点牵强,作者文中也使用的猜测【conjecture】来表达的结论)。另外有没有一个更好的甚至最好的度量也是未来研究一个方向(后面会介绍的Relation Network就是从这个方向入手的)。