1.[CVPR'2018]Unsupervised Feature Learning via Non-Parametric Instance Discrimination
2.用PointNet分类3D点云
3.CNTK101:使用CNTK进行线性回归
4.MQL-Meta Q Learning
[CVPR'2018]Unsupervised Feature Learning via Non-Parametric Instance Discrimination
作者在CVPR'的加权研究中揭示了视觉数据本身蕴含的表观相似性,而非完全依赖于语义标签。稀疏他们质疑:能否通过无标签的分类纯判别学习,构建一个反映图像外观相似性的器源权分有效度量?为此,他们提出了一种新颖的码加方法,即实例判别,类法输送设备 网站源码将每个视为独特的加权类别,模型的稀疏任务转变为区分这些实例,这是分类对比学习中常见的代理任务。
然而,器源权分面对大量类别的码加问题,传统的类法softmax分类可能面临挑战。为解决这一难题,加权研究者采用noise-contrastive estimation (NCE)技术,稀疏模拟softmax的分类完整分布,并引入近似正则化来优化学习过程,使得模型在面对众多类别时仍能稳定学习。
核心目标是通过无监督学习,学习图像的表征,它能反映间的相似度。公式表达为:[公式],通过神经网络映射到特征向量v,并用这个特征计算间的距离,相似的距离应更近。学习的目标可以看作一个无参数的分类任务,每个对应一个类别,特征通过神经网络映射为[公式]。
传统分类器的问题在于依赖于权重,且类别过多可能导致参数过多。作者提出无参数的softmax分类器,将类别权重简化为每个类别的表征,目标是最大化[公式](对数似然估计)。为了减少计算,作者引入Memory Bank,安卓网站源码下载存储所有类别特征,通过迭代更新。
在解决类别过多问题上,研究者采用NCE和近端正则化,将多分类转化为二分类问题,以优化训练效率。至于测试阶段,通过模型得到表征,找出与之最相似的k个类别,并以加权K近邻的方式进行预测。
用PointNet分类3D点云
在本教程中,我们将学习如何训练PointNet进行分类。我们将主要关注数据和训练过程;展示如何从头开始编码 Point Net 的教程位于此处。本教程的代码位于这个 Github库中,我们将使用的笔记本位于这个 Github库中。一些代码的灵感来自于这个 Github库。
推荐:用 NSDT设计器快速搭建可编程3D场景
1、获取数据
我们将使用只有 个类的较小版本的 shapenet 数据集。如果你使用的是Colab,可以运行以下代码来获取数据。警告,这将需要很长时间。
如果你想在本地运行,请访问上面第一行的链接,数据将自动下载为 zip 文件。
该数据集包含 个带有类标识符的文件夹(自述文件中称为“synsetoffset”)。文件夹结构为:
自定义 PyTorch 数据集位于此处,解释代码超出了本教程的范围。需要了解的重要一点是,数据集可以获取 (point_cloud, class) 或 (point_cloud, seg_labels)。在训练和验证期间,我们向点云添加高斯噪声,并围绕垂直轴(本例中为 y 轴)随机旋转它们。iocp服务器 源码我们对点云进行最小-最大归一化,以便它们的范围为 0-1。我们可以像这样创建 shapenet 数据集的实例:
2、探索数据
在开始任何训练之前,让我们先探讨一些训练数据。为此,我们将使用 Open3d 版本 0..0(必须为 0..0 或更高版本)。
我们现在可以使用以下代码查看示例点云。你应该注意到,每次运行代码时点云都会以不同的方向显示。
你可能不会注意到噪音有太大差异,因为我们添加的量很小;我们添加了少量,因为不想极大地破坏结构,但这一小量足以对模型产生影响。现在我们就来看看训练分类的数据频率。
从图2中我们可以看出,这绝对不是一个平衡的训练集。因此,我们可能想要应用类别权重,甚至使用焦点损失来帮助我们的模型学习。
3、PointNet损失函数
当训练PointNet进行分类时,我们可以使用 PyTorch 中的标准交叉熵损失,但我们还想添加包括论文中提到的正则化项。
正则化项强制特征变换矩阵正交,但为什么呢?特征变换矩阵旨在旋转(变换)点云的高维表示。我们如何确定这种学习的高维旋转实际上是在旋转点云?为了回答这个问题,让我们考虑一些所需的旋转属性。
我们希望学习到的旋转是仿射的,这意味着它保留结构。我们希望确保它不会做一些奇怪的事情,例如将其映射回较低维度的空间或弄乱结构。我们不能只绘制 nx 点云来检查这一点,android x86 源码但我们可以通过鼓励旋转正交来让模型学习有效的旋转。这是因为正交矩阵同时保留长度和角度,而旋转矩阵是一种特殊类型的正交矩阵。我们可以“鼓励”模型通过使用以下项进行正则化来学习正交旋转矩阵:
我们利用正交矩阵的一个基本属性,即它们的列和行是正交向量。对于完全正交的矩阵,图 3 中的正则化项将等于 0。
在训练期间,我们只需将此项添加到我们的损失中。如果你已经完成了之前关于如何编码PointNet的教程,可能还记得特征转换矩阵 A 由分类头返回。
现在让我们编写PointNet损失函数的代码。我们已经添加了加权(平衡)交叉熵损失和焦点损失的术语,但解释它们超出了本教程的范围。其代码位于此处。该代码改编自这个 Github库。
4、训练PointNet用于分类
现在我们已经了解了数据和损失函数,我们可以继续进行训练。
对于我们的训练需要量化模型的表现。通常我们会考虑损失和准确性,但对于这个分类问题,我们需要一个衡量错误分类和正确分类的指标。想想典型的混淆矩阵:真阳性、假阴性、真阴性和假阳性;我们想要一个在所有这些方面都表现良好的分类器。
马修斯相关系数 (MCC) 量化了我们的模型在所有这些指标上的表现,并且被认为是比准确性或 F1 分数更可靠的单一性能指标。MCC 的范围从 -1 到 1,其中 -1 是最差的性能,1 是最好的性能,0 是随机猜测。我们可以通过 torchmetrics 将 MCC 与 PyTorch 结合使用。php培训网站源码
训练过程是一个基本的 PyTorch 训练循环,在训练和验证之间交替。
我们使用 Adam 优化器和我们的点净损失函数以及上面图 3 中描述的正则化项。对于点净损失函数,我们选择设置 alpha,它对每个样本的重要性进行加权。
我们还设置了 gamma 来调节损失函数并迫使其专注于困难示例,其中困难示例是那些以较低概率分类的示例。有关更多详细信息,请参阅笔记本中的注释。人们注意到,使用循环学习率时模型训练得更好,因此我们在这里实现了它。
请按照笔记本进行训练循环,并确保你有 GPU。如果没有,请删除调度程序并将学习率设置为 0.,几个 epoch 后你应该会得到足够好的结果。如果遇到任何 PyTorch 用户警告(由于 nn.MaxPool1D 的未来更新),可以通过以下方式抑制它们:
5、训练结果
我们可以看到,训练和验证的准确率都上升了,但 MCC 仅在训练时上升,而在验证时却没有上升。这可能是由于验证和测试分组中某些类的样本量非常小造成的;因此在这种情况下,MCC 可能不是用于验证和测试的最佳单一指标。这需要更多的调查来确定 MCC 何时是一个好的指标;即多少不平衡对于 MCC 来说是过多?每个类别需要多少样本才能使 MCC 有效?
我们来看看测试结果:
我们看到测试准确度约为 %,但 MCC 略高于 0。由于我们只有 个类,让我们查看笔记本中的混淆矩阵,以更深入地了解测试结果。
大多数情况下,分类是可以的,但也有一些不太常见的类别,例如“火箭”或“滑板”。该模型在这些类别上的预测性能往往较差,而在这些不太常见的类别上的性能是导致 MCC 下降的原因。
另一件需要注意的事情是,当你检查结果(如笔记本中所示)时,将在更频繁的分类中获得良好的准确性和自信的表现。然而,在频率较低的课程中,你会发现置信度较低且准确性较差。
6、检查关键集
现在我们将研究本教程中最有趣的部分,即关键集。关键集是点云集的基本基础点。这些点定义了它的基本结构。这里有一些代码展示了如何可视化它们。
这里有一些可视化,请注意,我使用“draw()”来获得更大的点大小,但它在 Colab 中不起作用。
我们可以看到,关键集展示了其对应点云的整体结构,它们本质上是稀疏采样的点云。这表明训练后的模型实际上已经学会了区分差异结构,并表明它实际上能够根据每个点云类别的区别结构对其进行分类。
7、结束语
我们学习了如何从头开始训练PointNet以及如何可视化点集。如果你真的感兴趣,请尝试提高整体分类性能。以下是一些帮助你入门的建议:
CNTK:使用CNTK进行线性回归
如果你刚开始接触CNTK或者机器学习,我们的专栏正适合你!在这一讲中,你将会接触到一种在机器学习中简单高效且广泛应用的模型:该模型通过利用其可伸缩性,以最快的方式对海量数据集,利用现有的计算资源(一个或多个 CPU 内核、一个或多个 GPU、一组 CPU 或一组 GPU)通过 CNTK 库直观地进行数据分析。
我们的问题:一家癌症医院为我们提供了一批患者的数据,并希望我们能确定患者是否患有致命的恶性肿瘤:这是一个分类(classification)问题。为了能让我们对每个病人进行分类,医院提供的数据是:患者的年龄和肿瘤的大小。有了这些数据,我们就有了一个主观的想法:也许年轻的病人和/或小肿瘤患者不太可能患上恶性肿瘤?
在这一讲中,我们将机器生成的模拟数据集进行练习:每个病人在图表中表示成为一个点,这个点被称为数据实例(instance)。其中红色的点表示其患有恶性肿瘤、蓝色则表示良性。
我们的目标是构建一个分类器(classifier),它可以根据每个病人的属性(年龄和肿瘤大小)来进行学习,从而分辨出病人所患的肿瘤是良性还是恶性的。在这一讲中,我们会使用 CNTK 构造一个线性分类器(linear classifier)——这是一种深度学习网络中的基础元素。
逻辑回归(Logistic regression)是一种常用而基础的机器学习算法,它使用线性加权的特征组合,生成预测样本属于不同类的概率。在我们的例子中,分类器将产生一个区间在 [公式] 之间的概率,我们可以将它与某一个阈值 (如 [公式]) 相比,从而判断其所属的类别 ( [公式]类或 [公式]类 )。我们的方法也可以很容易地扩展到存在多个类的情况。
逻辑回归(logistic regression,LR)网络是一种简单的模型。在过去的十年里,逻辑回归驱动了许多重要的机器学习算法及其应用。它属于一种线性模型,我们能将一组存储待分类实例特征的向量 [公式] (又称特征向量,下图中蓝色的点集)作为模型的输入,得出证据(evidence) [公式] (绿色节点的输出,又称激活)。在输入层的每一个特征都与输出层存在一个连接权重 [公式] (以不同粗细的黑线表示,见下图)
在本教程中,我们将使用 NumPy 库生成的合成数据。在真实世界的问题中,你会用到CNTK中的读取器(Reader),读取特征值(年龄 和 肿瘤大小),并与每个患者对应。模拟的年龄变量被缩小到与另一个变量的范围相似:这是数据预处理的一个关键方面,我们将在以后的教程中进一步了解这些内容。
在CNTK中,输入变量是面向用户代码的容器(container)。用户通过向输入变量提供不同的实例数据(数据点或数据点示例),等同于 (年龄、肿瘤大小) 元组在我们的例子中) 作为模型函数的输入 (也就是训练) 和模型评估 (又称测试)。因此,输入的形状必须与将提供的数据的形状相匹配。
在本例中,每一次迭代将对[公式] 个样本进行处理(上面图中的 [公式] 个点),也就是 [公式] 。我们想训练 [公式] 个数据点。如果数据中的样本数仅为 [公式] 个,则训练器将通过数据进行 [公式] 轮传递。这由 [公式]表示。注意:在现实世界中,我们会得到一定数量的标记数据 (在这个例子中,(年龄, 大小) 观察及其标签 (良性/恶性))。我们将其中的大量的数据(比如说 [公式] %)用于训练,并将剩下的部分用于评估训练过的模型。
对于评估, 我们将网络的输出[公式] 为两个类的概率分布, 每个观察的概率是恶性的或良性的。让我们比较一下真实的标签和预测出来的分类,他们应该一致。
对于数据可视化, 我们可以将结果可视化。在我们的示例中,可以使用患者的两个维度的属性作为输入 ([公式] 轴上的患者年龄和 [公式] 轴上的肿瘤大小) 来绘制数据,患者的肿瘤性质,即我们的输出表示为图像上点的颜色 (红色为恶性、蓝色为良性)。对于具有较高维度的数据,对数据进行可视化是一件充满挑战性的工作。还好我们有先进的降维技术, 如 [公式],允许我们来做这样的可视化。
MQL-Meta Q Learning
本文首先观察到,即使不借助meta-RL算法,通过轨迹作为context也能实现与meta-RL当前最佳效果相当的结果,如图所示。
在此基础上,本文提出了名为MQL的新算法,其meta-training目标简单明了,即最大化训练任务的平均性能,具体表示为[公式],它衡量的是策略在任务k中轨迹的评估性能。
MQL通过以下目标调整策略参数,旨在策略适应新任务时保持稳定。新任务上的性能由第一项衡量,[公式] 是新任务或meta训练任务的轨迹概率,用于加权旧数据在新任务上的表现。第三项[公式] 评估新任务与meta训练任务的相似性,防止策略在适应过程中过度适应某一特定情况。
在MQL的背景中,状态记为x,策略为u,策略网络采用确定性网络[公式],值函数使用TD-loss进行训练。倾向性得分和ESS的计算涉及两个分布的比较,使用重要性采样方法定义,具体公式见文中。
MQL分为meta-training和适应新任务两个阶段。在meta-training阶段,目标是减小TD error,与传统基于梯度的meta-RL方法如MAML有所不同,MAML是通过最大化每个任务的fine-tune后性能。
在适应新任务阶段,MQL初始化策略参数采用元训练后的θ,并引入了off-policy adaptation。通过重要性采样权重,MQL利用meta-training的replay-buffer,通过logistic分类器对数据进行加权更新,以处理新任务的差异性。
实验结果表明,MQL在meta-RL基准上的表现优于现有方法,且具有较高的采样效率。尽管在特定环境下(如Ant-Goal-2D)存在性能下降,但MQL的适应性修正能够弥补这个问题。一系列消融实验验证了超参数设置的合理性,尽管MQL和TD3+context算法表现接近,但MQL展现出了独特的性能。
最后,通过可视化实验数据,λ值在ant-fwd-back训练过程中保持在0.左右,反映任务间的差异;而β值稳定在0.8,证明了权重设置的有效性。