当前位置: 代码迷 >> 综合 >> 元学习 Meta Learning Few-Shot Learning 三 || Pretraining and Fine Tuning
  详细解决方案

元学习 Meta Learning Few-Shot Learning 三 || Pretraining and Fine Tuning

热度:65   发布时间:2023-11-30 19:57:04.0

准备知识

  1. 余弦相似度

    假设有 x 和 w 两个单位向量,那么它们间的余弦相似度计算方法如图

    在这里插入图片描述

    计算公式

    image-20220423232727621

    python代码

    import numpy as npvec1= np.array([1,2,3,4,5])
    vec2 = np.array([3,4,5,6,7])
    vec3 = np.array([1,2,3,4,5])
    # np.linalg.norm() 是 np 内置的函数用来求算范数,向量的 norm 范数就是向量的模长
    simi12 = np.sum(vec1 * vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
    simi13 = np.sum(vec1 * vec3) / (np.linalg.norm(vec1) * np.linalg.norm(vec3))
    print(simi12,simi13)
    

    如果 x 和 w 不是单位长度向量,那么需要归一化后求余弦相似度

    image-20220423202403788

Pretraining

  1. 用孪生网络或者监督学习预训练一个CNN分类器,如果使用传统的监督学习,那么训练完成后,将全连接层去掉

    image-20220424093443462

  2. 训练好的网络用在 Support Set 上面

    假设我们现在是 3-way 2-shot Support Set ,训练好的网络使用方法如下

    image-20220424093946885

    mean 表示对两个向量求平均,normalize 表示对向量归一化

    # 对向量归一化
    import torch
    import torch.nn.functional as F
    a = torch.arange(9, dtype= torch.float)
    a = a.reshape((3,3))
    print(a)
    ''' tensor([[0., 1., 2.],[3., 4., 5.],[6., 7., 8.]]) '''
    # 对二维数组按行归一化
    # p=2表示二范式, dim=1表示按行归一化
    b = F.normalize(a, p=2, dim=1)
    print(b)
    ''' tensor([[0.0000, 0.4472, 0.8944],[0.4243, 0.5657, 0.7071],[0.4915, 0.5735, 0.6554]]) '''
    

    由此得到三个 μ 向量:μ1,μ2,μ3

  3. 将训练好的网络用在Query上面进行预测

    image-20220424094725992

    得到q向量

    然后求出q向量 与 μ1,μ2,μ3 的余弦相似度

    另一种方法(论文中常用,本节重点)

    将 μ1,μ2,μ3 堆叠起来,成为一个矩阵 M

    然后将矩阵M与q.T向量乘起来 得到p ,p就是一个概率值,p是一个3*1的矩阵,哪行值越大,那么q就归属于哪个类别

Fine Tuning

  1. 不使用Fine Tuning时,P = Softmax( M*q )

    但是 P的原型是 P = Softmax( W*f(x) + b ) , 这里W=M ,b=0,f(x) = q

    如果我们不固定W=M ,b=0,而是在 Support Set上学习这两个参数,那么称之为 Fine Tuning

    这样做可以提升准确率

  2. 使用Fine Tuning,这里是使用 Support Set中的样本和标签来学习

    i 表示属于哪个类别

    ( xi, yi ) 是Support Set 中的图像样本与标签

    f(xi) 是CNN 输出的Query 的特征向量

    pi = Softmax(W*f(xi) + b) 是输出Query属于哪一个类别的概率

    损失函数:

    loss = ∑i CrossEntropy( pi, yi),把每个样本的CrossEntropyLoss 都加起来作为目标函数,然后最小化这个 loss 函数,可将这些梯度传播到CNN网络中,让神经网络提取参数更有效。

    因为Support Set比较小,模型可能会发生过拟合,所以需要加上一个参数 Regularization ,得到

    loss = ∑i CrossEntropy( pi, yi) + Regularization

    1. 训练 Fine Tuning 的技巧

      1. 初始化参数 W 和 b

        我们不要随机初始化 W 和 b 参数,而是初始就让 W = M,b = 0

      2. Regularization怎么求(上一点说到的参数 Regularization 的选择)(下述算法是其中一种比较有效的)

        image-20220424103549019

        注意:

        • 此处的 f(x) 的输入是 Query中的图片,可能只有一个,也可能有多个
        • Entropy的计算公式 是将所有Query中的图片算出的 -p*logp 相加
        • Entropy regularization 是将Entropy 求平均得到的结果

        Entropy regularization 的原理

        image-20220424104400178

        ? 左图是难分类的样本,对应的Entropy值很高;

        ? 右图是易分类的样本,对应的Entropy值很低;

        ? 我们希望分类器得到右图的 低Entropy 的结果,所以把Entropy regularization 加进 Loss 函数中,使 得其在训练过程中变小

      3. 将余弦相似度和Softmax分类器结合起来 (显著提升准确率)

        image-20220424105437743

        image-20220424105607738

回顾

image-20220424153353237

?

?

  相关解决方案