• 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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (以图像识别举例)

    基础

    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=hihj
    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(xf(xa))2
    注: d d d为标量

    计算损失函数:
    如果 d − ≥ d + + α d^- \geq d^+ + \alpha dd++α,则 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/(x2w2)
    如果 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 = [μ1μ2μ3]

    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(Wf(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(Wf(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(Wf(x)+b)

  • 相关阅读:
    Unity3d C# 实现AA包(Addressables)资源热更新的多个包异步加载并显示加载实时进度功能(含源码)
    【牛客网-前端笔试题】——Javascript专项练习
    华为OD 社招(Java后端)一面
    一个 Java 猿眼中 Vue3 和 Vue2 的差异
    如何做一个api接口
    rhcsa-文件内容显示
    Pdfjs使用
    自学Python 39 使用OS对象
    如何做专利挖掘,关键是寻找专利点,其实并不太难
    读书笔记-《你好哇,程序员》
  • 原文地址:https://blog.csdn.net/qq_37083038/article/details/133891200