为什么使用伪标记会轻而易举地影响结果?


19

我一直在研究半监督学习方法,并遇到了“伪标签”的概念。

据我了解,使用伪标签时,您将拥有一组标记的数据以及一组未标记的数据。首先,您仅根据标记的数据训练模型。然后,您可以使用该初始数据对未标记的数据进行分类(向其附加临时标签)。然后,您可以将标记和未标记的数据反馈回模型训练中,以(重新)拟合已知标记和预测标记。(重复此过程,并使用更新的模型重新标记。)

所声称的好处是您可以使用有关未标记数据的结构的信息来改进模型。经常显示下图的变体,“表明”该过程可以根据(未标记)数据所在的位置制定更复杂的决策边界。

半监督方法中的决策边界

图片来自Techerin CC BY-SA 3.0的Wikimedia Commons

但是,我不太喜欢那种简单的解释。天真的,如果原始的仅加标签的训练结果是上决策边界,则将基于该决策边界分配伪标签。也就是说,上部曲线的左手将被伪标记为白色,下部曲线的右手将被伪标记为黑色。重新训练后,您将不会获得很好的弯曲决策边界,因为新的伪标签只会增强当前的决策边界。

或者换种说法,当前仅标记的决策边界将对未标记的数据具有完美的预测精度(因为这就是我们用来制作它们的方式)。没有驱动力(没有梯度)会导致我们仅通过添加伪标记数据即可更改决策边界的位置。

我是否认为缺少该图所体现的解释是正确的?还是我想念的东西?如果没有,什么伪标签的利益,考虑到-再培训预决策边界已超过伪标签完美的准确性?

Answers:


16

伪标签在给定的玩具问题上不起作用

奥利弗(Oliver)等人。(2018)评估了不同的半监督学习算法。他们的第一张图显示了伪标签(和其他方法)如何在与您的问题相同的玩具问题(称为“双月”数据集)上执行:

在此处输入图片说明

该图显示了标记的和未标记的数据点,以及使用不同的半监督学习方法训练神经网络后获得的决策边界。正如您所怀疑的那样,伪标签在这种情况下效果不佳。他们说伪标签“是一种简单的启发式方法,可能由于其简单性和通用性而在实践中得到了广泛应用”。但是:“尽管直观,但是当预测功能为[未标记的数据]产生无用的目标时,它仍然会产生错误的结果,如图1所示。”

伪标签为何以及何时起作用?

伪标签是Lee(2013)引入的,因此您可以在此处找到更多详细信息。

聚类假设

Lee为伪标签提供的理论依据是它类似于熵正则化。熵正则化(Grandvalet和Bengio 2005)是另一种半监督学习技术,它鼓励分类器对未标记的数据做出自信的预测。例如,我们希望为未标记的点分配较高的概率处于特定类别中,而不是将分散的概率分布在多个类别中。目的是利用数据根据类聚类的假设(在半监督学习中称为“集群假设”)。因此,附近的点具有相同的类别,而不同类别中的点则相隔较远,因此,真正的决策边界贯穿输入空间的低密度区域。

为什么伪标签可能会失败

鉴于上述情况,可以合理地猜测聚类假设是伪标记起作用的必要条件。但是,显然这是不够的,因为上面的两个月问题确实满足了聚类假设,但是伪标签不起作用。在这种情况下,我怀疑问题在于标记点很少,并且无法从这些点中识别出正确的聚类结构。因此,正如奥利弗(Oliver)等人。描述(以及您在问题中所指出的)时,生成的伪标签将分类器引向错误的决策边界。如果提供更多带标签的数据,则可能会起作用。例如,将此与以下描述的MNIST情况进行对比,在该情况下,伪标签确实起作用。

它在哪里工作

Lee(2013)指出伪标记可以帮助MNIST数据集(带有100-3000个标记的示例)。在图。在该论文的1中,您可以看到经过600个带标签的示例训练的神经网络(没有任何半监督的学习方法)已经可以恢复类之间的集群结构。伪标记似乎可以帮助改善结构。请注意,这与两个月的示例不同,在两个月的示例中,几个标记点不足以学习适当的聚类。

该论文还提到,只有100个带标签的示例结果不稳定。这再次支持了伪标记对初始预测敏感的想法,并且良好的初始预测需要足够数量的标记点。

Lee还表明,使用去噪自动编码器的无监督预训练会进一步提供帮助,但这似乎是在未标记数据中利用结构的另一种方法。不幸的是,没有单独的无监督预训练(没有伪标签)的比较。

Grandvalet和Bengio(2005)报告说,伪标签优于CIFAR-10和SVHN数据集上的监督学习(分别带有4000和1000个标记示例)。如上所述,这比两月问题中的6个标记点要多得多。

参考文献


5

您可能会忽略自我训练的工作原理:

  1. 它是迭代的,而不是一次性的。

  2. 您使用返回概率值的分类器。在每次迭代中,仅在​​算法最确定的情况下才添加伪标签。

在您的示例中,也许第一次迭代仅足以确定一个或两个非常接近每个标记点的点。在下一次迭代中,边界将略微旋转以适应这四个到六个标记的点,并且如果它是非线性的,也可能会开始略微弯曲。重复。

不能保证能正常工作。这取决于您的基本分类器,算法(为确定伪标签而必须具有的确定性等),数据等等。

如果您可以使用其他算法,它们的功能也会更强大。我相信您所描述的是自我训练,很容易编写代码,但是您使用的是单个分类器,该分类器反复查看相同的信息。协同训练使用多个分类器,每个分类器针对每个点查看不同的信息。(这在某种程度上类似于“随机森林”。)还有其他半监督技术,例如那些显式集群的技术,尽管没有整体的“总能奏效,而这才是赢家”。

回应评论:我不是这个领域的专家。我们认为它非常适用于我们通常与客户一起做的事情,因此我正在学习并且没有所有答案。

当我搜索半监督学习概述时,最受欢迎的是: 从2008年开始的半监督学习文学调查

我听说您,分类器可以最确定地对距离标记节点最远的未标记点进行评分。另一方面,我们的直觉可能欺骗我们。例如,让我们考虑您从Wikipedia获得的带有黑色,白色和灰色节点的图形。

首先,这是二维的,最现实的问题将出现在更高的维度上,而我们的直觉常常会误导我们。高维空间在许多方面有不同的作用-有些消极而有些实际有用。

其次,我们可能会猜测,在第一次迭代中,最右边的两个灰点将被标记为黑色,因为黑色标记的点比白色标记的点更靠近它们。但是,如果双方都发生这种情况,则垂直决策边界仍将倾斜并且不再是垂直的。至少在我的想象中,如果它是一条直线,它将沿着两个最初标记的点之间的对角空白区域下降。它仍然会错误地分割两个月牙,但现在它会更符合数据。持续迭代(尤其是在非线性决策边界的情况下)可能会产生比我们预期更好的答案。

第三,我不确定曾经标记过,始终标记过的标签实际上应该如何工作。根据您的操作方式和算法的工作方式,您可能最终会在弯曲边界时先倾斜边界(假设是非线性的),然后新月形的一些错误分类的部分可能会移动标签。

我的直觉是,这三点结合适当的(可能是高维的)数据以及适当的分类器,比起用很少数量的训练(标记)样本进行监督的直截了当的方法要好。不能保证,在我的实验中,我发现-我将其归咎于过于简单的数据集-半监督可能仅比监督略有改善,有时可能会严重失败。再说一次,我正在使用自己创建的两种算法,它们可能会或可能不会很好。


2
您能否扩展其适用的分类器/情况?我对大多数显示示例数据的分类器的理解是,距离决策边界较远的点(相对于已知点较近)将获得较高的置信度,因此这些末尾将被可靠地错误分类。例。(此外,您可能会指向任何有关有效使用伪标签和相关技术的参考文献或其他读物。)
RM

@RM编辑。怎么样?
韦恩

1

警告,我不是此过程的专家。我未能产生良好的结果并不能证明该技术无法奏效。此外,您的图像具有“半监督”学习的一般描述,这是使用各种技术的广泛领域。

我同意您的直觉,但我看不出这种技术如何可以立即使用。换句话说,我认为您需要付出很多努力才能使其在特定应用程序中正常运行,而这种努力不一定会对其他应用程序有所帮​​助。

我尝试了两个不同的实例,一个实例具有香蕉形数据集(如示例图像中的一个),另一个实例具有两个简单的正态分布群集的简单数据集。在这两种情况下,我都无法改善初始分类器。

为了鼓励事物,我尝试将噪声添加到所有预测的概率中,希望这会带来更好的结果。

第一个示例我尽可能地忠实地重新创建了上面的图像。我认为伪标签不会在这里提供任何帮助。

示例一,香蕉形数据

第二个示例要容易得多,但是即使在这里,它也无法在初始分类器上进行改进。我专门从左类的中心选择了一个标记点​​,而右类的右侧则希望它可以沿正确的方向移动,而没有这样的运气。

示例二,二维正态分布数据] =

示例1的代码(示例2足够相似,在此不再赘述):

import numpy as np
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
import seaborn

np.random.seed(2018-10-1)
N = 1000

_x = np.linspace(0, np.pi, num=N)
x0 = np.array([_x, np.sin(_x)]).T
x1 = -1 * x0 + [np.pi / 2, 0]

scale = 0.15
x0 += np.random.normal(scale=scale, size=(N, 2))
x1 += np.random.normal(scale=scale, size=(N, 2))

X = np.vstack([x0, x1])

proto_0 = np.array([[0], [0]]).T # the single "labeled" 0
proto_1 = np.array([[np.pi / 2], [0]]).T # the single "labeled" 1

model = RandomForestClassifier()
model.fit(np.vstack([proto_0, proto_1]), np.array([0, 1]))
for itercount in range(100):
    labels = model.predict_proba(X)[:, 0]
    labels += (np.random.random(labels.size) - 0.5) / 10 # add some noise
    labels = labels > 0.5
    model = RandomForestClassifier()
    model.fit(X, labels)

f, axs = plt.subplots(1, 2, squeeze=True, figsize=(10, 5))

axs[0].plot(x0[:, 0], x0[:, 1], '.', alpha=0.25, label='unlabeled x0')
axs[0].plot(proto_0[:, 0], proto_0[:, 1], 'o', color='royalblue', markersize=10, label='labeled x0')
axs[0].plot(x1[:, 0], x1[:, 1], '.', alpha=0.25, label='unlabeled x1')
axs[0].plot(proto_1[:, 0], proto_1[:, 1], 'o', color='coral', markersize=10, label='labeled x1')
axs[0].legend()

axs[1].plot(X[~labels, 0], X[~labels, 1], '.', alpha=0.25, label='predicted class 0')
axs[1].plot(X[labels, 0], X[labels, 1], '.', alpha=0.25, label='predicted class 1')
axs[1].plot([np.pi / 4] * 2, [-1.5, 1.5], 'k--', label='halfway between labeled data')
axs[1].legend()
plt.show()

1

这是我的猜测(我对这个话题也不是很了解,只是想在这次讨论中加上我的两分钱)。

我认为您是对的,训练经典模型并将其预测用作数据没有任何意义,因为正如您所说,优化者没有动力去做得更好。我猜想随机启动算法更有可能找到相同的最优值,因为由于数据集更大,它们会“更确定”先前找到的最优值是正确的,但这无关紧要。

就是说,您收到的第一个答案很有意义-Wikipedia上的示例谈到了聚类,而我认为一切都与众不同。当您获得未标记的数据时,与其他已标记的点一样,您实际上会在一些共享的“潜在特征空间”上放置一堆未标记的点。如果您可以发现一个事实,那就是要比在标签数据上训练的分类算法做得更好,如果您可以发现一个事实,那就是可以在此潜在特征空间上分离未标记的点,然后根据标记点所属的类别对其进行分类。

我的意思是,您需要这样做:

labelleddataclusteringclassification

...然后重复未标记的数据。在这里,学习到的聚类边界是不同的,因为聚类并不关心类标签,它所考虑的全部只是在变换特征空间。聚类生成一个潜在特征空间,在该潜在特征空间上学习分类边界,而这仅取决于标记的数据。

我认为,不执行任何聚类的算法将无法基于未标记的数据集更改其最佳值。

顺便说一句,您链接的图像做得很不错,我想解释一下这里发生了什么。仅基于聚类算法学习决策边界。您不知道这里的正确类是什么-可能是它们都是随机的-我们不知道。现在我们所能做的就是在特征空间中似乎有某种结构,并且似乎存在从特征空间到类标签的某些映射。

真正没有参考文献,但据我了解,在Reddit上,有关于GAN执行半监督学习的讨论。隐式地执行聚类,然后进行分类是我的直觉。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.