Python元学习-通用人工智能的实现 第3章 阅读笔记

本书代码:https://github.com/sudharsan13296/Hands-On-Meta-Learning-With-Python
本书ISBN号:9787115539670

在这里插入图片描述

第1章:元学习

第2章:基于度量的单样本学习算法——孪生网络

第3章:原型网络及其变体

3.1 原型网络

与孪生网络一样,原型网络试图学习度量空间来进行分类。原型网络的基本思想是创建每个类的原型表示,并根据类原型与查询点之间的距离对查询点(新点)进行分类

假定我们有一个由狮子、大象和狗的图像组成的支撑集(提供查询的小数据集),我们有3 个类:{狮子, 大象, 狗}。(多分类的情况)
我们为这3 个类中的每个类创建一个原型表示,使用卷积网络为每个数据点提取特征
在这里插入图片描述
上例中,共三个类别,每个类别均有2张图片,经过卷积网络处理后得到6个图像的特征向量,我们对每一个类别的特征向量求均值,总共得到3个类别的类原型(每个类仅一个类原型)
在这里插入图片描述
当我们需要对一个新数据进行分类时,使用与创建类原型相同的卷积网络为该数据点提取特征
在这里插入图片描述
这张狮子图片并未出现在支撑集,是新的数据(称为 查询点)

得到查询点的特征向量后 与 类原型的所有特征向量比较距离(欧氏距离)从而确定查询点属于哪个类
在这里插入图片描述
在找到类原型和查询点嵌入之间的距离之后,我们对这个距离应用softmax并得到概率。因为我们有3 个类——狮子、大象和狗,所以会得到3 个概率。概率最大的类就是查询点的类。
此处采用softmax函数,需要将 欧式距离 取相反数变成负值

3.1.1 算法

  1. 假设有个数据集D = {(x1 , y1 ),(x2 , y2 ), … ,(xn , yn )},其中x是特征, y 是类标签,共有k个类别。

  2. 从数据集D 的各类别中分别随机抽样n 个数据点,以组成支撑集S,共n×k张图片 。

  3. 选择m 个数据点组成查询集Q(需带上标签)。

  4. 利用卷积神经网络提取支撑集S中的特征向量,并按类别求出这些特征向量的平均值,得到类原型

  5. 利用卷积神经网络提取查询集Q中的特征向量。

  6. 计算查询集与类原型之间的欧氏距离d

  7. 通过对d 取负值使用 softmax,预测查询集属于它本身类别的概率 pk
    在这里插入图片描述

  8. 计算负对数概率损失 [其实就是交叉熵损失] L = -log(pk),并使用随机梯度下降法最小化损失。

3.1.2 使用原型网络执行分类

记住,不使用整个数据集进行训练。因为我们使用单样本学习,所以从每个类中抽取一些数据点作为支撑集,并阶段性地使用支撑集训练网络,对于每一个阶段,我们抽样数据点,构建支撑集和查询集,并训练模型。

# 支撑集中每个类的样本数量
num_shot = 5

3.2 高斯原型网络

参考链接:元学习—高斯原型网络
论文:Gaussian Prototypical Networks for Few-Shot Learning on Omniglot
代码:https://github.com/hjhdaniel/cv-prototypical-network


在高斯原型网络中,编码器的输出是特征向量以及半径分量表示的协方差矩阵对角分量表示的协方差矩阵

  • 半径分量:如果使用协方差矩阵的半径分量,那么协方差矩阵的维数就是1,因为半径只是一个数字。
  • 对角分量:如果使用协方差矩阵的对角分量,那么协方差矩阵的维数会与特征向量矩阵维数相同

协方差矩阵的逆的运算法则:设 Sraw 为协方差矩阵,S 为逆协方差矩阵

  1. S = 1 + softplus( Sraw )
  2. S = 1 + sigmoid( Sraw )
  3. S = 1 + 4×sigmoid( Sraw )
  4. S = offset + scale×softplus( Sraw / div),offset ,scale,div 初始化为1.0,是可训练参数

其中 softplus(x) = log (1 + ex )、sigmoid(x) = 1/ (1 + e−x )


那么协方差矩阵和嵌入有什么用呢?如前所述,它拓宽了数据点周围的置信区域,这在有噪声的数据中非常有用。假设有两个类,A 和B。黑点表示数据点的嵌入,黑点周围的圆圈表示协方差矩阵,大的虚线圆表示一个类的总体协方差矩阵,中间的星号表示类原型。正如你所看到的,嵌入周围的协方差矩阵给了我们一个围绕数据点和类原型的置信区域。
在这里插入图片描述

代码实现时 将最后的特征图经过卷积运算得到 (D+D)×1×1 的向量,其中 1×1 表示经过卷积后特征图的大小,(D+D)是维度。将此向量拆分为特征嵌入向量和协方差矩阵的对角分量表示

embeddings, raw_covariance_matrix = tf.split(X_encoded, [embedding_dim, covariance_matrix_dim], 1)

接下来,使用任意讨论过的方法计算协方差矩阵的逆 Sci.
然后计算类原型 Pc
在这里插入图片描述
其中,Sci 是逆协方差矩阵的对角分量, xci 是嵌入,上标 c 代表类。

在计算了每个类的原型后,我们学习查询点的嵌入。设x’ 为查询点的嵌入,然后计算查询点嵌入到类原型之间的距离:
在这里插入图片描述
最后,预测查询集 ˆy 的类,它与类原型的距离最小:
在这里插入图片描述

3.3 论文补充

对于高斯原型网络,协方差矩阵的半径或对角线与嵌入向量(更准确地说,其原始形式是,详见第3.1节)一起输出。然后,这些都被用来加权对应于某一特定类别支持点的嵌入向量,以及计算该类别的总协方差矩阵。然后,从一个类的原型c到一个查询点i的距离dc(i)被计算为
在这里插入图片描述
其中pc 是类c的中心点,或原型,Sc = Σ-1c 是其协方差矩阵的逆。因此,高斯原型网络能够在嵌入空间中学习类和方向相关的距离度量。我们发现,训练的速度和其准确性在很大程度上取决于如何使用距离来构建损失。我们得出结论,最好的选择是使用线性欧氏距离,即dc(i)。所用损失函数的具体形式在算法1中提出。图2显示了高斯原型网络的嵌入空间图。附录中的图10和图11显示了训练期间嵌入空间的一个样本。它说明了用于分类的类似字符的聚类。
在这里插入图片描述

图2:显示高斯原型网络的嵌入空间的图。一幅图像被编码器映射到它的嵌入向量(暗点)。它的协方差矩阵(暗椭圆)也由编码器输出。然后,每个类别的总体协方差矩阵被计算出来(大的浅色椭圆),以及类别的原型(星星)。一个类别的协方差矩阵被用来局部修改查询点的距离指标(灰色显示)。

我们研究的是协方差矩阵是对角线的设置,如第3.1节中所总结的。对于半径情况,S = sI,其中I是身份矩阵,s∈R1是从每个图像的原始编码器输出中计算出来的。对于对角线的情况,S = diag (s),其中s同样是从每个图像的原始编码器输出中计算出来的。

原型网络的一个关键部分是从特定类别的可用支持点中创建一个类别原型。我们提出用单个支持实例的嵌入向量的方差加权线性组合作为我们的解决方案。让类c有支持图像 Ii,这些图像被编码为嵌入向量xci,以及协方差矩阵Sci的逆矩阵,其对角线为sci。原型,即该类的中心点,被定义为
在这里插入图片描述
其中 ◦ 表示分量上的乘法,除法也是分量上的。然后,类协方差矩阵的对角线被计算为
在这里插入图片描述
这相当于将以各个点为中心的高斯优化组合成一个整体的类高斯,因此网络的名字就叫高斯。s的元素实际上是1/σ2。因此,方程5和6对应于用1/σ2对例子进行加权。这使得网络可以降低对定义类别不太重要的例子的权重,因此使我们的架构更适合于嘈杂、不均匀或其他不完善的数据集。

对于一个一次性的制度,也就是我们的网络被训练的方式,有一个单一的标记向量xc来定义每个类别。这意味着该向量本身成为类的原型,其协方差矩阵也被类所继承。然后,协方差在修改与查询点的距离中发挥作用。算法1中描述了完整的算法。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_56039091/article/details/127527785