【学习笔记】小样本学习(Few-shot Learning)

article/2025/10/24 21:30:31

参考视频:https://www.youtube.com/watch?v=UkQ2FVpDxHg

文章目录

  • 基本概念
  • 孪生网络(Siamese Network)
  • Pretraining and Fine Tuning
  • Few-shot常用数据集
  • 参考资料

基本概念

小样本学习(few-shot learning)是什么:就是使用很少的样本来进行分类或回归

Few-shot Learning的目标:让机器学会自己学习

小样本学习的直观理解

① 前提:首先要知道,训练一个模型的目的不是为了让模型如何分辨大象和蚂蚁,而是让模型具有判断图片“异同”的能力,即让模型看到两张图片后,它能分别出这俩是不是一个类别。这样,当我们在用大数据集训练出一个分类器后,在测试阶段给模型一个从来没见过的类别的图片(假设给了一个水獭图片),此时模型虽然不知道它是什么类别,但是依然能知道它不属于之前的所有类别。这时如果再给一个相同类别的图片(假设又给了一张水獭图片),此时虽然模型从来没见过这种类别的图片(模型从来没见过水獭),但模型依然能知道这俩是一种类别(模型能判断出这两张图片是一种动物)
② 思路:先用大的训练数据集训练出一个具备判断“异同”能力的模型,在测试阶段,再给一个小样本数据集(称为Support Set),里面会包含模型没见过的样本类别,然后让模型判断当前给的图片属于 Support Set 中的哪一个类别。

例如:

在这里插入图片描述
上图中,假设目前有一个训练好的图片分类器,但是该模型没见过水獭(otter),此时测试阶段希望模型可以分辨水獭,这样就可以给模型一个support set,让它从这里面选,query的图片是support set中的哪一种


Few-shot learning 是 Meta Learning 的 一种,Meta Leanring 就是去学习如何学习(Learn to learn)


k-way n-shot support Set:Support Set 就是帮助模型去分辨新类别的小样本数据集。 k k k 代表小样本中类别的数量, n n n 代表每个类别有多少数据。例如,有3个类别,每个类别只有一个样本,那么就是 3-way one-shot.

  • k-way: k 的数量越多,分类准确率越低
  • n-shot: n 的数量越多,分类准确率越高

Few-shot Learning的基本思路(Basic Idea)
学习一个相似度函数(similarity function): sim ( x , x ′ ) \text{sim}(x, x') sim(x,x) ,来判别样本 x x x x ′ x' x 的相似度,相似度越高,表示这两个样本越可能是同一个类别。例如,可以通过一个很大的数据集学习出一个相似度函数,然后用该函数进行预测。

这里的相似度函数指的是整个模型。


孪生网络(Siamese Network)

Siamese Network 是一种用于小样本学习的网络


该网络所用训练数据集(Training Data)包含两部分:

  1. 正样本(Positive Samples ):两个“同类别”的样本构成的样本对 ( x i , x j , 1 ) (x_i, x_j, 1) (xi,xj,1), 其中 1 表示 x i x_i xi x j x_j xj 是同一个类别的样本,例如: ( 老虎 a , 老虎 a , 1 ) (老虎a, 老虎a, 1) (老虎a,老虎a,1)
  2. 负样本(Negative Samples):两个“不同类别”的样本构成的样本对 ( x i , x j , 0 ) (x_i, x_j, 0) (xi,xj,0),其中 0 表示 x i x_i xi x j x_j xj 不是同一个类别的样本,例如 ( 汽车 a , 大象 a , 0 ) (汽车a, 大象a, 0) (汽车a,大象a,0)

Siamese Network的网络结构:

在这里插入图片描述

  • 模型 f f f :可以是CNN卷积神经网络;注意:上下两个 f f f 是同一个网络
  • 向量 h 1 , h 2 h_1, h_2 h1,h2:网络 f f f 的输出向量
  • 向量 z z z:对 h 1 h_1 h1 h 2 h_2 h2 进行处理,例如,令 z = ∣ h 1 − h 2 ∣ z=|h_1-h_2| z=h1h2
  • Dense Layers:全连接层
  • 在这里插入图片描述:全连接层输出的数值(scalar)

该网络前向传播的过程:

  1. 将两张图片 x 1 x_1 x1 x 2 x_2 x2 分别送给同一个卷积神经网络 f f f ,得到输出向量 h 1 h_1 h1 h 2 h_2 h2
  2. h 1 h_1 h1 h 2 h_2 h2 求差的绝对值,得到向量 z z z
  3. 将向量 z z z 送给全连接网络,得到一个scalar
  4. 将scalar送给Sigmoid的到最终的输出,最终的输出就是这两张图片的相似度。

对于负样本(Negative Sample)同理。


进阶架构Triplet Loss
在这里插入图片描述

  1. 从训练集中选取一个样本作为锚点(anchor) x a x^a xa,然后根据锚点,选择一个正样本 x + x^+ x+ 和一个负样本 x − x^- x
  2. 然后将三个样本送到“同一个”卷积神经网络 f f f 中,并计算正样本与锚点之间的距离 d + d^+ d+ 和 负样本与锚点之间的距离 d − d^- d 。其中 d + = ∥ f ( x + ) − f ( x a ) ∥ 2 2 d^{+}=\left\|\mathbf{f}\left(\mathbf{x}^{+}\right)-\mathbf{f}\left(\mathbf{x}^{\mathrm{a}}\right)\right\|_{2}^{2} d+=f(x+)f(xa)22 d − = ∣ ∣ f ( x a ) − f ( x − ) ∣ ∣ 2 2 d^{-}=|| \mathbf{f}\left(\mathrm{x}^{\mathrm{a}}\right)-\mathbf{f}\left(\mathrm{x}^{-}\right)||_{2}^{2} d=∣∣f(xa)f(x)22。 其中 ∣ 2 2 |_2^2 22 是二范数的平方。
  3. 显然,我们希望 d + d^+ d+ 越小越好, d − d^- d 越大越好。用图表示则为:
    在这里插入图片描述
  4. 对于损失函数,定义为 L o s s ( x a , x + , x − ) = m a x { 0 , d + + α − d − } Loss(x^a, x^+, x^-)= max\{0, d^+ +\alpha -d^-\} Loss(xa,x+,x)=max{0,d++αd} 其中 α \alpha α 为大于0的超参数,含义为:①如果负样本到锚点的距离比正样本到锚点的距离大 α \alpha α,我们就认为分对了,损失函数为0; ②否则,就将 d + + α − d − d^+ + \alpha - d^- d++αd 作为损失函数

Pretraining and Fine Tuning

另一种熊Few-shot Learning的思路:使用别人预训练好的模型来进行Few-shot Learning。

CNN的预训练模型:用别人训练好的CNN模型,把最后的全连接层砍掉即可。保留下来的卷积层的作用是提取图像的特征,相当于对图像进行了编码(embedding)操作。

具体做法
在这里插入图片描述

  1. 用预训练模型 f f f 对所有的小样本进行特征提取,得到它们的特征向量(feature Vectors)
  2. 将同类别的Feature Vectors进行合并(上图使用的求平均),然后再进行正则化(normalize),最终的得到每个类别的向量 u i u_i ui
  3. 此时准备工作已经完毕,接下来可以开始做预测了
    在这里插入图片描述
  4. 将要预测(query)的图片按照步骤1,2的方式得到向量 q q q
  5. 然后比较向量 q q q 和类别向量 u i u_i ui,距离谁最近,那么该图片就是什么类别

计算过程的数学公式为:

p = Softmax ( M q ) = Softmax ( [ u 1 T q u 2 T q u 3 T q ] ) \textbf{p} = \text{Softmax}(Mq) = \text{Softmax}( \begin{bmatrix} u^T_1q \\ u^T_2q\\ u^T_3q\\ \end{bmatrix}) p=Softmax(Mq)=Softmax( u1Tqu2Tqu3Tq )

选取 p \textbf{p} p 中数值最大的类别即可。


如何进行Fine Tuning? 上面的方法只用了预训练模型,但并没有对预训练模型进行微调(Fine Tuning),一些文献表示,对预训练模型微调后,效果会更好。

Fine Tuning 思路:把预训练好的CNN的全连接层换成自己的,再用support set 训练一下全连接层就完了。用数学公式表示就是:

p j = Softmax ( W ⋅ f ( x j ) + b ) p_j = \text{Softmax}(W \cdot f(x_j) + b) pj=Softmax(Wf(xj)+b)

其中 f f f 是不包含全连接层的预训练模型, W W W b b b 是自己的全连接层的权重和偏置。损失函数采用 CrossEntropy 即可。

其实,上面没有Fine Tuning的版本就是将 W W W 固定为 M M M,而 b b b 固定为0.

Fine Tuning小技巧:

  1. W W W 初始化为 M M M b b b 初始化为0,效果更佳
  2. 损失函数使用Regularization效果会更好
  3. 改造 W q Wq Wq,具体为:将 w q wq wq 改为 sim(wq),听说是可以大幅提高准确率。详见下图:在这里插入图片描述

Few-shot常用数据集

  • Omniglot:手写字母识别,适合学术界,只有几M,有1600多个类,但每个类别样本很少
  • Mini-ImageNet:图片识别,有100个类别,每个类别有600个样本





参考资料

参考视频:https://www.youtube.com/watch?v=UkQ2FVpDxHg


http://chatgpt.dhexx.cn/article/wySHxlAf.shtml

相关文章

localStorage与location的用法

1、localStorage 是h5提供的客户端存储数据的新方法: 之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高。 设置存储时localStorage.s…

Locality-sensitive hashing

Locality-sensitive hashing (LSH) reduces the dimensionality of high-dimensional data. LSH hashes input items so that similar items map to the same “buckets” with high probability (the number of buckets being much smaller than the universe of possible inp…

localStorage 简介

localStorage是全局的公共对象 浏览器关闭了后不丢失,是永久存在的。(runoob.com上Window localStorage 属性里的笔记很清晰) // localStorage.user"sky"; console.log(localStorage.user);能够看出,存储过localStora…

localStroage

一、什么是localStroage、sessionStroage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的…

localstorage用法

一、什么是localStorage、sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的…

Locality Sensitive Hashing

今天介绍Locality Sensitive Hashing(LSH)。不同以往,这次我先放参考文献,因为本文都是基于这些参考文献的个人理解和消化,强烈推荐先看我的再去看参考文献,以便能更好的理解参考文献。 文章目录 ReferencesIntroductionChalleng…

thread_local

一、介绍 thread_local这个关键字的是C11之后的产物,主要适用的场景是:本线程这个生命周期里面修改和读取,不会与别的线程相互影响。 在C中全局变量和static变量一般都是针对与整个进程里面共享的,一旦声明之后,所有的…

localStorage是什么???

一、什么是localStorage、sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的…

什么是localStorage?

一、什么是localStorage、sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的…

Locale 及Locale.getDefault()

1.什么是Locale? Locale对象表示了一个特定的地理,政治或文化区域。需要使用到Locale执行其任务的操作称为区域设置敏感,并使用Locale为用户定制信息。 例如显示一个数字就是一个区域设置敏感的操作–该数字应根据用户所在国家,…

LocalStorage

目录 1.什么是Web存储? 2.localStorage、sessionStorage、Cookie和Session 3.Storage接口 4.localStorage基本操作 5.storage事件 参考书籍:《JavaScript 权威指南----ECMAScript5HTML5DOMHTML5BOM》编著:张亚飞 1.什么是Web存储&…

在net core npoi导入excel 所遇到的问题PublicKeyToken=0df73ec7942b34e1

在vs中测试一切正常 发布到iis,是使用的是***独立发布,x64***,部署好之后,执行nopi导入读取数据功能,提示 PublicKeyToken0df73ec7942b34e1,找不到系统文件 尝试过修改nopi的版本,由2.51.变成…

.net 查看程序集(*.dll)的PublicKeyToken

1.运行>powershell ([system.reflection.assembly]::loadfile("C:\Users\wangbinbin\Desktop\bin\log4net.dll")).FullName 2.使用vs的Tools Command Prompt命令行工具,输入SN -T "path",就会显示这个dll 的PublicKeyToken SN -…

查看PublicKeyToken和生成PublicKeyToken

http://hi.baidu.com/honfei/item/7777500b20d8ff8a02ce1bd2

未能加载文件或程序集“Newtonsoft.Json,Version = 13.0.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed“..

未能加载文件或程序集"Newtonsoft.Json,Version 13.0.0.0,Culture neutral,PublicKeyToken 30ad4fe6b2a6aeed"或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配.(异常来自HRESULT:0x80131040) 今天把生成的exe文件&a…

WinForm转Console Message=未能从程序集“, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“没有 RVA

1.异常截图 2.源代码及运行结果 3.相关异常及解决办法 1.异常截图 异常具体信息如下: 未处理System.TypeLoadException HResult-2146233054 Message未能从程序集“LockTestV2, Version1.0.0.0, Cultureneutral, PublicKeyTokennull”中加载类型“LockTestV2…

能加载文件或程序集“System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖

能加载文件或程序集“System.Web.Mvc, Version3.0.0.0, Cultureneutral, PublicKeyToken31bf3856ad364e35”或它的某一个依赖项。 解决方法: 安装ASP.NET MVC 3 MVC3下载地址: https://www.microsoft.com/en-us/download/details.aspx?id1491 下载之…