few shot learnning笔记

课程地址 https://youtu.be/hE7eGew4eeg?si=KBM0lY7eY_AdD8Wr
PPT地址 https://github.com/wangshusen/DeepLearning
第一节 Few-Shot Learning Basics
第二节 Siamese Network
第三节 Pretraining + Fine Tuning

(以图像识别举例)

基础

support set:数量很少的样本集合,为模型完成任务而提供更多的信息。

query:模型的输入样本,其并未出现在训练集中,其所属类别肯定包含在支持集中。

小样本学习(few shot learnning)是一种元学习(meta learning)方法。

元学习:自己学会学习(learn to learn)。

监督学习:测试样本之前并未见过(这个样本并不在训练集中),样本属于已知类(这个类别在训练集中有)。

小样本学习:查询样本之前并未见过,样本属于未知类。

k-way:支撑集有k类,k越大预测准确率越低。

n-shot:每个类别有n个样本,n越大预测准确率越高。

称呼支持集时,带上前缀k-way n-shot support set。

小样本学习的基本思想:学习一个相似度函数(similarity function)。

1、用一个很大的训练集学习一个相似度函数。

2、给定一个query样本,用相似度函数与support set判断出其所属类别(计算support set中的样本与query样本的相似度,取相似度最高的类别作为预测)

下面介绍两种方法:连体网络,预训练+微调。

siamese network(连体网络,孪生网络)

将训练集 D = { I 1 , . . . , I n } D=\{I_1, ..., I_n\} D={I1,...,In}重新构造为包含同样数量的正样本与负样本的新训练集。

正样本: ( I i , I j ) (I_i, I_j) (Ii,Ij),两张图像属于同一类,其标签为1。

负样本: ( I i , I j ) (I_i, I_j) (Ii,Ij),两张图像属于不同类,其标签为0。

给卷积神经网络 f ( ⋅ ) f(\cdot) f(⋅)输入正样本,其输出为输入的特征:
h i = f ( I i ) h_i = f(I_i) hi=f(Ii)
h j = f ( I j ) h_j = f(I_j) hj=f(Ij)
z i j = ∣ h i − h j ∣ z_{ij} = |h_i - h_j| zij=∣hi−hj∣

将 z i j z_{ij} zij输入至全连接层,得到一个标量,预测两个图片间的相似度,其中激活函数用sigmoid,输出区间为 [ 0 , 1 ] [0,1] [0,1]。

注: h , z h, z h,z为向量

计算样本的标签与预测值的损失函数,反向传播更新卷积网络与全连接网络的权重。

预测:

将支持集中的所有样本分别与query构造成一对新样本 ( q , s i ) (q,s_i) (q,si)输入给网络,预测两者相似度。

选出相似度最高的一对样本 ( q , s j ) (q,s_j) (q,sj),query便属于 s j s_j sj的类别。

triplet loss

这是另一种训练卷积神经网络的方法。

训练集中随机抽样作为一个anchor(锚点)。

从achor所属的类别中随机抽样一个样本,记为正样本。

再从除achor所属的类别外的剩余训练集中随机抽样一个样本,记为负样本。

三个样本同时输入卷积网络:
f ( x + ) , f ( x a ) , f ( x − ) f(x^+), f(x^a), f(x^-) f(x+),f(xa),f(x−)

计算特征间的距离:
d + = ∣ f ( x + − f ( x a ) ) ∣ 2 d^+ = |f(x^+ - f(x^a))|_2 d+=∣f(x+−f(xa))∣2
d − = ∣ f ( x − − f ( x a ) ) ∣ 2 d^- = |f(x^- - f(x^a))|_2 d−=∣f(x−−f(xa))∣2

注: d d d为标量

计算损失函数:

如果 d − ≥ d + + α d^- \geq d^+ + \alpha d−≥d++α,则 l o s s = 0 loss=0 loss=0;否则 l o s s = d + + α − d − loss=d^+ + \alpha - d^- loss=d++α−d−。

其中, α > 0 \alpha > 0 α>0。

注:上述就是max函数。

补充:卷积神经网络将图片映射为特征空间中的一点

通过损失函数,训练出卷积网络 f ( ⋅ ) f(\cdot) f(⋅)。

预测:

通过 f ( ⋅ ) f(\cdot) f(⋅)计算query与所有支持集样本的特征,然后计算出query与所有支持集样本的距离 d ( q , s i ) d(q,s_i) d(q,si)。

选出距离最近的一对样本 ( q , s j ) (q,s_j) (q,sj),query便属于 s j s_j sj的类别。

预训练与微调

两个向量的cosine similarity: c o s θ = x T w / ( ∣ x ∣ 2 ⋅ ∣ w ∣ 2 ) cos \theta = x^Tw/(|x|_2 \cdot |w|_2) cosθ=xTw/(∣x∣2⋅∣w∣2)。

如果 x , w x,w x,w为单位向量,则 c o s θ = x T w cos \theta = x^Tw cosθ=xTw,即相似度为两个单位向量内积。

单位向量内积较大表示,一个向量在另一个向量上的投影较大。

softmax函数:将向量 ϕ \phi ϕ映射为一个概率分布 p p p。
p i > 0 , Σ i p i = 1 p_i > 0, \Sigma_i p_i = 1 pi>0,Σipi=1.

预训练(pretraining)一个卷积网络用于特征提取。

注:特征提取也称embeding。

(以3-way 2-shot support set举例)

支撑集每个类别的特征向量为该类所有样本的特征向量求平均,再进行归一化,得到 μ 1 , μ 2 , μ 3 \mu_1, \mu_2, \mu_3 μ1,μ2,μ3。

同理,对query也做同样的步骤,得到 q q q

矩阵 M = [ μ 1 μ 2 μ 3 ] M = \begin{bmatrix} \mu_1 \\ \mu_2 \\ \mu_3\end{bmatrix} M= μ1μ2μ3

计算一个三维向量 p = s o f t m a x ( M q ) p = softmax(Mq) p=softmax(Mq)
p p p中最大元素为 p i p_i pi,则 q q q属于支持集中的 i i i类

微调

在卷积网络后面接一层全连接: p = s o f t m a x ( W ⋅ f ( x ) + b ) p = softmax(W \cdot f(x) + b) p=softmax(W⋅f(x)+b)

之前不进行微调,即 W = M , b = 0 W=M, b=0 W=M,b=0,而学习 W , b W,b W,b称为微调。

损失函数: l o s s = c o r s s E n t r o p y ( y , p ) loss = corssEntropy(y, p) loss=corssEntropy(y,p)

其中, y y y为真实标签,是一个one hot向量。

反向传播,训练出 W , b W,b W,b

介绍三个小技巧:

1、初始化权重 W = M , b = 0 W=M, b=0 W=M,b=0

2、为防止过拟合,加入正则化。(下面介绍熵正则化)

一个query预测结果为 p = s o f t m a x ( W ⋅ f ( x ) + b ) p = softmax(W \cdot f(x) + b) p=softmax(W⋅f(x)+b)

熵 H ( p ) = − Σ i p i l o g ( p i ) H(p)=-\Sigma_i p_i log(p_i) H(p)=−Σipilog(pi)

熵正则化为所有query的熵的平均。
我们希望熵正则化越小越好。

3、结合余弦相似度与softmax分类器,即先将 W W W的行向量与 f ( x ) f(x) f(x)作归一化,再计算矩阵向量乘积。
p = s o f t m a x ( W ⋅ f ( x ) + b ) p = softmax(W \cdot f(x) + b) p=softmax(W⋅f(x)+b)

相关推荐
努力变厉害的小超超5 分钟前
ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染
笔记·鸿蒙
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
dsywws6 小时前
Linux学习笔记之vim入门
linux·笔记·学习
A-超8 小时前
vue3展示pag格式动态图
笔记
u0101526588 小时前
STM32F103C8T6学习笔记2--LED流水灯与蜂鸣器
笔记·stm32·学习
weixin_518285058 小时前
深度学习笔记10-多分类
人工智能·笔记·深度学习
丘狸尾9 小时前
ubuntu【桌面】 配置NAT模式固定IP
笔记
王俊山IT9 小时前
C++学习笔记----10、模块、头文件及各种主题(二)---- 预处理指令
开发语言·c++·笔记·学习
慕卿扬9 小时前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
齐 飞11 小时前
MongoDB笔记02-MongoDB基本常用命令
前端·数据库·笔记·后端·mongodb