微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么类相似度不正确?

如何解决为什么类相似度不正确?

我创建了一个神经网络,可以将数据分为大量类别。我在 Keras 中使用了 softmax分类交叉熵。训练很成功,我达到了 95% 的准确率。问题如下,当我删除带有类别的最后一层并使用神经网络作为具有余弦相似性的编码器时,预测是不正确的。这些课程彼此不匹配。为什么以及如何解决这个问题?理论上,神经网络应该以类似的类在附近的方式来创建数据空间。

解决方法

您不一定期望相似的类在“附近”,或者相同类的数据点在潜在空间中“靠近”,除非您的目标鼓励这样的属性。为了使这种期望有效,您至少必须对距离有一个有用的定义。当然,你可以用欧几里德距离、某种负余弦相似度等来测量距离。但是没有理由期望这些距离度量中的任何一个与数据的语义(类)高度相关,所以虽然它们是距离度量,它们不太可能代表潜在空间中有用的任何内容。

换句话说,最后一层正在做一些重要的事情。我不确定它是什么类型的层(也许是一个完全连接的线性层),但无论它在做什么,它都负责将潜在空间映射到 logits,然后通过 softmax 函数将其映射到分类概率。线性层和softmax函数的组成是非线性变换。因此,虽然 softmax 层的输出具有有用的距离(例如,0 类数据点都可能映射到 <1,...> 附近),但移除线性层和 softmax 很容易破坏此属性。我认为想出一个在潜在空间中彼此非常“接近”但在 softmax 输出中彼此“远离”的两个点的示例相对容易,反之亦然。

因此,如果您希望您的潜在空间拥有这样的属性,您必须以某种有意的方式鼓励该属性。 度量学习是一个例子,它通过损失函数有意鼓励同一类的点在潜在空间中彼此靠近,而不同类的点彼此远离(“接近”和“远”由给定的距离度量定义)。 VAE 是另一个具有损失分量的示例,它有意鼓励潜在空间以已知方式运行(最小化 KL 散度,使潜在空间遵循已知分布,例如标准高斯分布)。

如果你想在多类分类器的潜在空间中鼓励这样的属性,你可以做类似的事情。但是你可能会问自己为什么你想要这样的财产;例如,考虑到您只是简单地丢弃了最终的线性层和 softmax 层无论如何,您是否真的需要开始使用分类器?交叉熵损失甚至是您任务的合理选择吗?很可能像度量学习这样的方法实际上已经解决了您的问题。

,

当我删除带有类别的最后一层并使用神经网络作为具有余弦相似度的编码器时,问题如下所示。

原因很简单。 倒数第二个密集层应被视为后续层的特征提取步骤,而不是输入数据的表示。这是因为该层的权重专门针对下游任务(多类分类)进行训练,并具有非线性特征。另一方面,在训练自动编码器时,下游任务是重新生成输入本身,该层最终成为原始输入的压缩。

enter image description here

这是你可以做的。

  1. 多输出模型:创建一个带有多类分类辅助输出的自动编码器。这意味着您将训练模型以最小化重建损失和分类交叉熵。

  2. 引导式训练: - 另一种方法是为分类任务训练模型,然后移除最后一层以将其用作编码器。然后用解码器替换最后一层。现在,继续训练编码器-解码器,通过使用它在分类任务中学到的权重初始化编码器来重新生成输入数据。 (初始化权重但不要使它们不可训练)。这允许编码器从它从分类任务中获得的知识开始,然后进一步训练权重以能够重新生成自己的输入。该层现在可以为您提供所需的正确嵌入。

  3. 简单且简单的嵌入层: - 如果您有大量数据,最可靠的方法是简单地训练嵌入层作为分类任务的一部分。与专注于后续层的特征提取而不是输入表示的 Dense 层相比,来自该嵌入层的权重将为您提供明显更好的结果(就欧几里德空间的相似性而言)。

还请记住,在经过适当训练的深度神经网络中,输入的更准确表示在于初始层而不是后者,后者更接近输出分布。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。