.center { width: auto; display: table; margin-left: auto; margin-right: auto }

基于元学习(Meta-Learning)的方法:

Few-shot问题或称为Few-shot学习是希望能通过少量的标注数据实现对图像的分类,是元学习(Meta-Learning)的一种。

Few-shot学习,不是为了学习、识别训练集上的数据,泛化到测试集,而是为了让模型学会学习。也就是模型训练后,能理解事物的异同、区分不同的事物。如果给出两张图片,不是为了识别两张图片是什么,而是让模型知道两张图片是相同的事物还是不同的事物。

Few-shot可以被定义为K-way,N-shot问题,表示支持集有k个类别,每个类别有n个样本。不同于训练深度深度神经网络每个类有大量样本的数据集,Few-shot的训练数据集规模很小

Meta-Learning的核心思想就是先学习到一个先验知识(prior),这需要经历多个task的训练,每个task的分为支持集(support set)和查询集(query set),支持集包含了k个类、每个类n张图,模型需要对查询集的样本进行归类以训练模型的学习能力。

经过了很多个task学习先验知识,才能解决新的task,新的task涉及的类,不包含在学习过的task! 我们把学习训练的task称为meta-training task,新的task称为meta-testing task。最后的评价指标就是根据红色部分表现结果。

meta training task
support query
support query
...
support query
meta testing task
support query

需要注意查询集和测试集的区别,因为在Few-shot训练过程也有查询集,在Few-shot测试中,接触的支持集和测试集都是全新的类。

Supervised Learning vs. Few-shot Learning

传统监督学习 Few-shot 学习
测试样本未在训练集中见过 查询样本没见过
测试样本的类在训练集中见过 查询样本的类属于未知

基于微调(Fine-Tuning)的方法:

基于微调的Few-shot方法封为三个步骤:

  1. 预训练:使用模型在大规模的数据集进行预训练作为特征提取器\(f\)。
  2. 微调:在支持集上训练分类器。
  3. Few-shot预测:
    1. 将支持集上的图像通过分类器转为特征向量;
    2. 对每一个类的特征向量求平均,得到类的特征向量:\(\mu_1,\dots,\mu_k\);
    3. 将查询的特征与\(\mu_1,\dots,\mu_k\)比较。

先省略第二步的微调,看看一般的预训练Few-shot预测。


以上图为例,将每一个类的平均特征堆叠得到矩阵\(M\in\mathbb{R}^{3\times n}\),这里\(n\)表示特征数。

\[M =\begin{bmatrix} \mu_1 \\ \mu_2 \\ \mu_3 \end{bmatrix}\tag{1}
\]

将查询的图片提取特征、做归一化得到\(q\in\mathbb{R}^{1\times n}\),并进行预测。

\[p = \mathrm{Softmax}(Mq) \tag{2} = \mathrm{Softmax}(\begin{bmatrix} \mu_1^Tq \\ \mu_2^Tq \\ \mu_3^Tq \end{bmatrix})
\]

本例中,输出的第一类的概率最大。

归纳一下上述使用预训练模型预测查询集图像的步骤:

  1. 设置查询集的标记样本:\((x_j,y_j)\)。
  2. 用预训练模型提取特征:\(f(x_j)\)。
  3. 进行预测:\(p_j = \mathrm{Softmax}(W\cdot f(x_j)+b)\)。

以上固定了\(W=M, b=2\)。但可以在支持集进行训练,微调\(W\)和\(b\)。于是设置损失函数去学习\(W\)和\(b\),由于支持集较小,需要加入正则项防止过拟合:

\[\min\sum_j\mathrm{CrossEntropy}(y_j,p_j)+\mathrm{Regularization}\tag{3}
\]

大量实验证明,微调确实能提高精度。以下是一些常用的技巧:

  1. 对于预测分类器\(p=\mathrm{Softmax}=(W\cdot f(x)+b)\),可以进行初始化\(W=M,b=0\)。
  2. 对于正则项的选择可以考虑Entropy Regularization,相关的解释可以参考文献[3]。
  3. 将余弦相似度加入Softmax分类器,即:
\[p=\mathrm{Softmax}=(W\cdot f(x)+b)=\mathrm{Softmax}(\begin{bmatrix}
w^T_1q+b_1 \\
w^T_2q+b_2 \\
w^T_3q+b_3
\end{bmatrix})
\\ \Downarrow
\\
p=\mathrm{Softmax}(\begin{bmatrix}
\mathrm{sim}(w_1,q)+b_1 \\
\mathrm{sim}(w_2,q)+b_2 \\
\mathrm{sim}(w_3,q)+b_3
\end{bmatrix}) \tag{4}
\]

其中\(\mathrm{sim}=\frac{w^Tq}{\lVert w\rVert_2\cdot \lVert q\rVert_2}\)。

对比

基于两种方式解决Few-shot问题的对比

元学习(Meta-Learning) 微调(Fine-Tuning)
策略 基于元学习的方法旨在通过在元任务上训练来使模型学会更好地适应新任务。它们通常涉及在多个元任务(task)上进行训练,以使模型能够从不同任务中学到共性。 基于微调的方法通常涉及在一个预训练的模型上进行微调,以适应特定的 few-shot 任务。在训练阶段,模型通常会使用大规模的数据集进行预训练,然后在少量训练数据上进行微调。
适用性 基于元学习的方法特别适用于 few-shot 任务,因为它们的目标是使模型从少量示例中快速学习。它们在少量数据和新任务上通常表现出色。 基于微调的方法在具有大量预训练数据的情况下通常表现出色。它们适用于很多不同类型的任务,但在数据稀缺或新领域的 few-shot 问题上可能表现不佳。
泛化能力 基于元学习的方法旨在提高模型在新任务上的泛化能力,因为它们通过从多个元任务中学习共性来实现这一目标。它们在适应新任务和未见数据上的表现通常较好。 基于微调的方法通常在预训练领域上有较强的泛化能力,但在新任务上的泛化能力可能有限,特别是当训练数据非常有限时。

参考文献

  1. Few-shot learning(少样本学习)入门
  2. Few-shot learning(少样本学习)和 Meta-learning(元学习)概述
  3. 小样本学习 Few-Shot Learning

解决Few-shot问题的两大方法:元学习与微调的更多相关文章

  1. 3、Object对象的两大方法(hashCode-equals)总结

    Object类是所有java类的父类. 用户定义了如下一个Person类 public class Person{} 在类定义中并没有明确继承Object类,但是编译器会自动的完成这个过程. 既然所有 ...

  2. 解决android 大图OOM的两种方法

    最近做程序中,需要用到一张大图.这张图片是2880*2180大小的,在我开发所用的华为3C手机上显示没有问题,但是给米3装的时候,一打开马上报OOM错误.给nexus5装,则是图片无法出来,DDMS中 ...

  3. Mysql使用binlog恢复数据解决误操作问题的两种方法

    为保证没有其他参数配置影响,重新安装配置了一台最小化安装的CentOS7虚拟机 1. 基础知识
 安装mysql5.6数据库Mysql binlog初步理解 2. 配置mysql 开启binlog.修 ...

  4. 解决php中文乱码的两种方法

    第一种是添加html标签变为如下格式: <html> <head> <meta http-equiv="Content-Type" content=& ...

  5. filter()和sort()这两个方法一块学习,案例中。

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. WPF多线程UI更新——两种方法

    WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...

  7. 解决多线程安全问题-无非两个方法synchronized和lock 具体原理(百度-美团)

    还有其他的锁,如果想要了解,参考:JAVA锁机制-可重入锁,可中断锁,公平锁,读写锁,自旋锁, 用synchronized实现ReentrantLock 美团面试题参考:使用synchronized ...

  8. HDU 1160 排序或者通过最短路两种方法解决

    题目大意: 给定一堆点,具有x,y两个值 找到一组最多的序列,保证点由前到后,x严格上升,y严格下降,并把最大的数目和这一组根据点的编号输出来 这里用两种方法来求解: 1. 我们可以一开始就将数组根据 ...

  9. 两种方法解决 "The License CNEKJPQZEX- has been cancelled..." 问题

    今天在使用 2017 的 IDEA 和 Pycharm 等IDE的时候,提示了如题的问题.之前实在 http://idea.lanyus.com/ 网站点击生成注册码,复制粘贴到 IDEA 中就好了, ...

  10. hive权威安装出现的不解错误!(完美解决)两种方法都可以

    以下两种方法都可以,推荐用方法一! 方法一: 步骤一: yum -y install mysql-server 步骤二:service mysqld start 步骤三:mysql -u root - ...

随机推荐

  1. Linux 命令:gpasswd 管理用户组

    工作中经常需要将用户加入docker组,可执行如下操作: sudo gpasswd -a ec2-user docker newgrp # 不用加sudo gpasswd gpasswd -h Usa ...

  2. npm install -g 错误集锦

    1.切换源安装:npm config set registry http://registry.cnpmjs.org,参考http://yijiebuyi.com/blog/b12eac891cdc5 ...

  3. 【游戏开发笔记】编程篇_C#面向对象 {下}

    @ 目录 7.定义类 7.1 C#中的类定义 7.1.1 接口的定义 7.1.2 修饰符 7.2 System.Object 7.3 构造函数和析构函数 7.4 结构类型 7.5 浅度和深度复制 8. ...

  4. Ubuntu 用户的切换

    1.普通用户转成root su root 输入密码 确认密码(此时root账户已经建立) 2. root 转回 普通用户 su  用户名

  5. 如何创建Windows 10 虚拟机

    一 ,新建Windows 10 虚拟机 1.1 创建新的虚拟机 1,点击创建新的虚拟机 2,选择典型,点击下一步 3,选择稍后安装操作系统,点击下一步. 4,操作系统选择windwos,版本选着Win ...

  6. 你知道ES6中的这些属性吗

    ES6,也称ESMAScript2015,这个版本增加了很多好用的特性 变量声明 ES6之前用var来定义变量,ES6增加了两个变量声明的方式,分别为const和let,const用来定义常量,let ...

  7. [nginx]lua控制请求头

    前言 nginx原生提供expires.add_header两个指令控制请求头,在Lua API中也有类似的指令. 添加请求头 指令:ngx.req.set_header 语法:ngx.req.set ...

  8. springboot jar thin

    springboot jar thin springboot 应用 jar 瘦身.springboot jar 太大.jar与依赖包分离. 两种方法,第一种,spring-boot-thin-laun ...

  9. springboot项目图片不显示的问题

    首先确认你的图片路径是对的,maven重新clean,install了,web服务也重启了 那么大概率就是浏览器缓存的原因,因为页面直接用的是缓存的旧数据,所以显示不出来. 在不修改浏览器设置的情况下 ...

  10. Ansible快速复习

    本文章是上一篇ansible自动化运维的快速复习以及项目上用到的一些命令,针对长时间未使用ansible,导致命令忘记的同学,帮助快速回忆.详细内容还是看上一章'ansible自动化运维'. 查看版本 ...