To Top
首页 > 机器学习 > 正文

few-shot learning

标签:few-shot, fewshot, 小样本, zero-shot, 零样本, 特征混淆, feature confusion, afc-gan


目录

cvpr2019相关的参考CVPR 2019提前看:少样本学习专题

参考小样本学习(Few-shot Learning)综述

参考当小样本遇上机器学习 fewshot learning

参考Few-shot Learning: A Survey

关于meta learning,可以参考https://daiwk.github.io/posts/dl-meta-learning.html

参考基于小样本学习的意图识别冷启动

定义

Few-shot Learning 是 Meta Learning 在监督学习领域的应用

Meta Learning,又称为learning to learn,在meta training阶段将数据集分解为不同的meta task,去学习类别变化的情况下模型的泛化能力,在meta testing阶段,面对全新的类别,不需要变动已有的模型,就可以完成分类。

few-shot的训练集中包含了很多的类别,每个类别中有多个样本。

  • 在训练阶段,会在训练集中随机抽取C个类别,每个类别K个样本(总共CK个数据),构建一个 meta-task,作为模型的支撑集(support set)输入;
  • 再从这C个类剩余的数据中抽取一批(batch)样本作为模型的预测对象(batch set)

即要求模型从C*K个数据中学会如何区分这C个类别,这样的任务被称为C-way K-shot(C类,每个类K个样本)问题。

训练过程中,每次训练 (episode)都会采样得到不同meta-task。这种机制使得模型学会不同meta-task中的共性部分,比如如何提取重要特征及比较样本相似等,忘掉 meta-task中task相关部分,因此,在面对新的未见过的 meta-task时,也能较好地进行分类。

分类

主要分为Mode Based,Metric Based 和 Optimization Based三大类。

model based

通过模型结构的设计快速在少量样本上更新参数,直接建立输入\(x\)和预测值\(P\)的映射函数。

\[ P_{\theta}(y | x, S)=f_{\theta}(x, S) \]

One-shot learning with memory-augmented neural networks

One-shot learning with memory-augmented neural networks使用记忆增强的方法。基于记忆的神经网络方法早在2001年被证明可以用于meta-learning。通过权重更新调节bias,并且通过学习将表达快速缓存记忆中来调节输出。

利用循环神经网络的内部记忆单元无法扩展到需要对大量新信息进行编码的新任务上。因此,需要让存储在记忆中的表达既要稳定又要是元素粒度访问的,前者是说当需要时就能可靠地访问,后者是说可选择性地访问相关的信息;另外,参数数量不能被内存的大小束缚神经图灵机(NTMs)和记忆网络就符合这种必要条件。

参考https://daiwk.github.io/posts/dl-ntm-memory-networks.html

文章基于神经网络图灵机(NTMs)的思想,因为 NTMs 能通过外部存储(external memory)进行短时记忆,并能通过缓慢权值更新来进行长时记忆,NTMs可以学习将表达存入记忆的策略,并如何用这些表达来进行预测。由此,文章方法可以快速准确预测那些只出现过一次的数据

基于LSTM等RNN的模型,将数据看成序列来训练,在测试时输入新的类的样本进行分类。

如下图,在\(t\)时刻,模型输入\(\left(\mathbf{x}_{t}, y_{t-1}\right)\),即当前时刻样本\(x_t\)上一时刻真实label \(y_{t-1}\),然后基于这两个来预测当前时刻的类别。在新episode开始时,要对样本和label进行shuffle。



如下图,在external memory里面里存储绑定好(bind & encode,得到bound information)的上一次的输入的表示和对应的label(representation-class label)。具体地,当前时间步的输入\(x_t\)的label\(y_t\)是在下一时间步给出的(上面那段话说的)。如果后面的时间步(图中的\(t+n\))中的样本\(x_{t+n}\),有这个class的样本出现的时候,应该能够直接从external memory中retrieve到bound information,并直接进行预测。从这个prediction step进行反向传播时对之前时间步的权重更新进行shape,从而提升这种bind strategy。



Meta networks

Meta Networks的快速泛化能力源自其“快速权重”的机制,在训练过程中产生的梯度被用来作为快速权重的生成。模型包含一个meta learner和一个base learner

  • meta learner:用于学习meta task之间的泛化信息,并使用memory机制保存这种信息
  • base learner:用于快速适应新的task,并和meta learner交互产生预测输出

metric based

通过度量batch集中的样本和support集中样本的距离,借助最近邻的思想完成分类

\[ P_{\theta}(y | x, S)=\sum_{\left(x_{i}, y_{i}\right) \in S} k_{\theta}\left(x, x_{i}, S\right) y_{i} \]

如果在 Few-shot Learning 的任务中去训练普通的基于cross-entropy的神经网络分类器,那么几乎肯定是会过拟合,因为神经网络分类器中有数以万计的参数需要优化。

所以,很多非参数化的方法(最近邻、K-近邻、Kmeans)是不需要优化参数的,因此可以在meta-learning的框架下构造一种可以端到端训练的 few-shot 分类器。该方法是对样本间距离分布进行建模,使得同类样本靠近,异类样本远离

Siamese Network

siamese的经典论文:

Siamese neural networks for one-shot image recognition

通过有监督的方式训练孪生网络来学习,然后重用网络所提取的特征进行one/few-shot学习。

孪生网络是一个双路的神经网络,训练时,通过组合的方式构造不同的成对样本,输入网络进行训练,在最上层通过样本对的距离判断他们是否属于同一个类,并产生对应的概率分布。

预测阶段,孪生网络处理测试样本和支撑集之间每一个样本对,最终预测结果为支撑集上概率最高的类别

可以参考下https://yq.aliyun.com/articles/209297,翻译自https://sorenbouma.github.io/blog/oneshot/,代码:https://github.com/sorenbouma/keras-oneshot

Match Network

Matching networks for one shot learning

支撑集和Batch集构建不同的编码器,最终分类器的输出是支撑集样本和query之间预测值的加权求和



建模过程的创新,文章提出了基于memoryattention的matching nets,使得可以快速学习。

训练过程的创新,文章基于传统机器学习的一个原则,即训练和测试是要在同样条件下进行的,提出在训练时不断地让网络只看每一类少量样本,这将和测试的过程保持一致

构建一个从有\(k\)个image-label的pair对的样本的支撑集\(S=\left\{\left(x_{i}, y_{i}\right)\right\}_{i=1}^{k}\)到分类器\(c_{S}(\hat{x})\)的一个map,使得given一个测试样本\(\hat{x}\)能得到他的输出\(\hat{y}\)的概率分布。

定义\(P(\hat{y} | \hat{x}, S):S \rightarrow c_{S}(\hat{x})\),其中\(P\)是通过nn的参数构建的。所以,给定一个没见过的样本\(\hat{x}\)和支撑集\(S\),最终的预测结果就是\(\arg \max _{y} P(y | \hat{x}, S)\)

模型的最终输出形式就是:

\[ \hat{y}=\sum_{i=1}^{k} a\left(\hat{x}, x_{i}\right) y_{i} \]

其中,\(x_{i}, y_{i}\)来自于支撑集\(S=\left\{\left(x_{i}, y_{i}\right)\right\}_{i=1}^{k}\)。而\(a\)是attention机制,是\(X \times X\)上的一种kernel,所以类似于一个kernel density estimator。

attention kernel一个常见的形式如下,对cos距离\(c\)求softmax:

\[ a\left(\hat{x}, x_{i}\right)=e^{c\left(f(\hat{x}), g\left(x_{i}\right)\right)} / \sum_{j=1}^{k} e^{c\left(f(\hat{x}), g\left(x_{j}\right)\right)} \]

其中的\(f\)是对测试集样本\(\hat{x}\)的emb,\(g\)是对支撑集样本\(x\)的emb。

进一步地,期望支撑集学到的\(g\)可以modify测试集的emb函数\(f\)。可以通过如下两种方式来:

  • 把整个支撑集的数据都告诉\(g\),也就是\(g\)不只是\(g(x_i)\),应该是\(g(x_i,S)\)。可以把整个支撑集看成一个sequence,然后用一个双向lstm来根据整个支撑集这个context来进行emb。
  • Fully Conditional Embeddings (FCE):使用一个对整个set \(S\)有read-attention的LSTM。

\[ f(\hat{x}, S)=\operatorname{attLSTM}\left(f^{\prime}(\hat{x}), g(S), K\right) \]

其中,\(f^{\prime}(\hat{x})\)是LSTM的输入features(在每个时间步都是常量);\(K\)是LSTM的unrolling steps的一个固定数目;\(g(S)\)是对集合\(S\)中每个元素\(x_i\)的emb函数。

参考附录,attLSTM的一个时间步的运算如下:

\[ \begin{aligned} \hat{h}_{k}, c_{k} &=\operatorname{LSTM}\left(f^{\prime}(\hat{x}),\left[h_{k-1}, r_{k-1}\right], c_{k-1}\right) \\ h_{k} &=\hat{h}_{k}+f^{\prime}(\hat{x}) \\ r_{k-1} &=\sum_{i=1}^{|S|} a\left(h_{k-1}, g\left(x_{i}\right)\right) g\left(x_{i}\right) \\ a\left(h_{k-1}, g\left(x_{i}\right)\right) &=\operatorname{softmax}\left(h_{k-1}^{T} g\left(x_{i}\right)\right) \end{aligned} \]

假设\(g^{\prime}\left(x_{i}\right)\)是一个神经网络(类似上面提到的\(f^{\prime}\)),定义\(g\left(x_{i}, S\right)=\vec{h}_{i}+\overleftarrow{h}_{i}+g^{\prime}\left(x_{i}\right)\),从而\(g(S)\)如下:

\[ \begin{aligned} \vec{h}_{i}, \vec{c}_{i} &=\operatorname{LSTM}\left(g^{\prime}\left(x_{i}\right), \vec{h}_{i-1}, \vec{c}_{i-1}\right) \\ \overleftarrow{h}_{i}, \overleftarrow{c}_{i} &=\operatorname{LSTM}\left(g^{\prime}\left(x_{i}\right), \overleftarrow{h}_{i+1}, \overleftarrow{c}_{i+1}\right) \end{aligned} \]

Prototype Network

每个类别都存在一个原型表达,该类的原型是support setembedding空间中的均值。然后,分类问题变成在embedding空间中的最近邻

文章采用在Bregman散度下的指数族分布的混合密度估计,文章在训练时采用比测试更多的类别数,即训练时每个episodes采用20个类(20 way),而测试对在5个类(5 way)中进行,其效果相对训练时也采用5 way的提升了2.5个百分点。

Relation Network

前面介绍的几个网络结构在最终的距离度量上都使用了固定的度量方式,如cosine,欧式距离等,这种模型结构下所有的学习过程都发生在样本的embedding阶段。

Learning to compare: Relation network for few-shot learning认为,度量方式也是网络中非常重要的一环,需要对其进行建模,所以该网络不满足单一且固定的距离度量方式,而是训练一个网络来学习(例如 CNN)距离的度量方式,在 loss 方面也有所改变,考虑到relation network更多的关注relation score,更像一种回归,而非 0/1 分类,所以使用了MSE取代了cross-entropy。

optimization based

认为普通的梯度下降方法难以在few-shot场景下拟合,因此通过调整优化方法来完成小样本分类的任务。

\[ P_{\theta}(y | x, S)=f_{\theta(S)}(x) \]

Optimization as a model for few-shot learning

Optimization as a model for few-shot learning

文章发现:

  • 首先,这些梯度优化算法包括momentum, adagrad, adadelta, ADAM等,无法在几步内完成优化,特别是在非凸的问题上,多种超参的选取无法保证收敛的速度
  • 其次,不同任务分别随机初始化会影响任务收敛到好的解上。虽然 finetune 这种迁移学习能缓解这个问题,但当新数据相对原始数据偏差比较大时,迁移学习的性能会大大下降。我们需要一个系统的学习通用初始化,使得训练从一个好的点开始,它和迁移学习不同的是,它能保证该初始化能让finetune从一个好的点开始。

文章学习的是一个模型参数的更新函数,即更新规则。它不是在多轮的episodes学习一个单模型,而是在每个episode学习特定的模型

学习基于梯度下降的参数更新算法,采用LSTM表达meta learner,用其状态表达目标分类器的参数的更新,最终学会如何在新的分类任务上,对分类器网络(learner)进行初始化参数更新。这个优化算法同时考虑一个任务短时知识和跨多个任务长时知识

设定目标为通过少量的迭代步骤捕获优化算法的泛化能力,由此meta learner可以训练让learner在每个任务上收敛到一个好的解。另外,通过捕获所有任务之前共享的基础知识,进而更好地初始化learner。

以训练 miniImage 数据集为例,

训练过程中,从训练集(64 个类,每类 600 个样本)中随机采样 5 个类,每个类 5 个样本,构成支撑集,去学习learner;然后从训练集的样本(采出的 5 个类,每类剩下的样本)中采样构成Batch集,集合中每类有 15 个样本,用来获得learner的loss,去学习meta leaner

测试的流程一样,从测试集(16 个类,每类 600 个样本)中随机采样 5 个类,每个类 5 个样本,构成支撑集Support Set,去学习learner;然后从测试集剩余的样本(采出的 5 个类,每类剩下的样本)中采样构成Batch集,集合中每类有 15 个样本,用来获得learner的参数,进而得到预测的类别概率

这两个过程分别如下图中虚线左侧和右侧。



meta learner的目标是在各种不同的学习任务学出一个模型,使得可以仅用少量的样本就能解决一些新的学习任务。这种任务的挑战是模型需要结合之前的经验和当前新任务的少量样本信息,并避免在新数据上过拟合。

Model-agnostic meta-learning for fast adaptation of deep networks

Model-Agnostic Meta-Learning for Fast Adaptation of Deep Networks

使得可以在小量样本上,用少量的迭代步骤就可以获得较好的泛化性能,而且模型是容易 fine-tine 的。而且这个方法无需关心模型的形式,也不需要为 meta learning 增加新的参数,直接用梯度下降来训练 learner。

zero-shot相关

解决特征混淆:AFC-GAN

节后收心困难?这15篇论文,让你迅速找回学习状态

Alleviating Feature Confusion for Generative Zero-shot Learning

本文是电子科技大学和昆士兰大学发表于 ACM MM 2019 的工作。论文首次提出了生成式零样本学习中的特征混淆(feature confusion)问题,并提出了一种简单可行的解决特征混淆的方法。此外,作者还首次提出了一个特征混淆的度量指标。零样本学习结果在公开数据集上达到目前 SOTA 水平。

https://github.com/lijin118/AFC-GAN


原创文章,转载请注明出处!
本文链接:http://daiwk.github.io/posts/ml-few-shot-learning.html
上篇: 主动学习
下篇: 损失函数

comment here..