半监督学习中的Teacher-Student Module

1. 什么是半监督学习

半监督学习(Semi-Supervised Learning)是一种机器学习范式,旨在利用同时包含有标签数据和无标签数据的数据集进行模型训练。在半监督学习中,有限数量的有标签数据和大量的无标签数据被用于训练模型。

半监督学习尝试利用无标签数据中的额外信息来提高模型的性能。半监督学习的目标是利用无标签数据中的潜在结构或分布信息,以提高模型的泛化能力、降低过拟合风险和提高模型的鲁棒性。

半监督学习的一种方法就是自训练(Self-training):该方法基于初始的有标签数据训练模型,并使用该模型对无标签数据进行预测,然后将置信度较高的预测结果作为伪标签(pseudo-labels)加入到训练集中,不断迭代这个过程,直至收敛。

这种做法的关键是我们要能相信模型对未标签数据的预测结果,但是在半监督学习中,有标签数据的数量远远少于无标签数据,这就导致通过有标签数据训练的模型容易过拟合,会导致pseudo-labels不那么"正确"。

我们知道,对于人而言,图片发生一些小的扰动或变化是不影响人的判断的,但是模型不是这样,我们希望模式足够强大能够抵抗这些扰动或变化,这时我们就想到了Data augment, Dropout, Shake-Shake等等,Data augment是对数据做处理,Dropout、 Shake-Shake 是对model做处理,但这些解决不了无标签数据的问题。

这时就有了Consistency Regularization:一种在半监督学习中常用的正则化技术。它旨在通过利用模型在不同输入条件下的稳定性来提高模型的泛化能力。这种方法的核心思想是:对于同一份数据的不同版本(例如,通过随机扰动或不同的数据增强方法得到的),模型的预测输出应该是一致的。Consistency Regularization 通过鼓励模型对相似输入生成相似的输出来实现这一点。

而Teacher-Student Module就用到了这种思想。

有关Teacher-Student Module的介绍可以看我的另一篇文章:什么是知识“蒸馏”?-Teacher-Student模型-CSDN博客

2. 几种Teacher-Student Module

接下来我会依次介绍TEMPORAL ENSEMBLING FOR SEMI-SUPERVISED LEARNING​​​​​​​中的两个模型和​​​​​​​Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results中的模型。

2.1 介绍

我们知道,多个神经网络的集成通常比集成中的单个网络产生更好的预测。当通过dropout训练单个网络时,也间接地利用了这种ensemble(集成)思想。

这种ensemble prediction(集成预测)可以用于半监督学习,如果我们将集成预测与正在训练的网络的当前输出进行比较,则集成预测可能更接近无标记数据的正确未知标签。因此,以这种方式推断的标签可以用作未标记输入的训练目标。

第一篇论文中的两个模型就用到了上面的ensemble的思想。

2.2 TEMPORAL ENSEMBLING FOR SEMI-SUPERVISED LEARNING​​​​​​

这篇文章提出了两种实现self-ensembling(自集成)的模型:Π-model and temporal ensembling。

2.2.1 Π-model

模型结构如上图所示。假设训练数据由总共N个输入组成,其中M个被标记。输入为x_{i},其中i \in\{1 \ldots N\}。设集合L包含有标签输入的索引,则|L|=M。对于每个i \in L,我们有一个已知的正确标签y_i \in\{1 \ldots C\},其中C是不同类的数量。

在训练过程中,我们对输入x_{i}计算两次,得到预测向量z_{i}\tilde{z}_{i}。由于stochastic augmentation和dropout的原因,这两个预测向量z_{i}\tilde{z}_{i}可能是有点不同的。我们的loss function由两部分组成,第一个分量是标准交叉熵损失,由y_{i}z_{i}计算得到,第二个分量是均方差损失,由z_{i}\tilde{z}_{i}计算得到。总的损失由这两部分加权平均得到,通过与时间相关的加权函数w(t)来缩放后者。

损失函数的第二个分量其实很好理解,对于相同的输入,我们希望模型的两次计算得到相同的结果(这就对应了前面说过的,我们希望模型能够识别有扰动的图像)。

我的理解是:对于同一个问题,我们希望通过两种方式(由于stochastic augmentation和dropout的原因)得到的答案是相同的(第二个分量),并且对于其中有正确答案的问题,我们希望我们得到的答案与正确答案是相同的(第一个分量)。

这与Teacher-Student Module的实现是一样的。

模型的伪代码如下图:

伪代码很好理解,这里不做阐述。

在训练刚开始的时候,consistency loss的加权系数为0,随着epoch的增加,系数越来越大。因为模型刚开始的时候需要cross-entropy loss来监督模型学习。这里teacher和student是一个模型,\tilde{z}_{i}是teacher的输出,z_{i}是student的输出。

Π-model是有缺点的,前面说到\tilde{z}_{i}是teacher的输出,因为有标签的数据很少,所以Teacher Module就很弱,输出结果就不那么可靠,这样就不能很好的监督Student学习。因此我们需要提高Teacher Module的表现,我们可以用ensemble。

怎么ensemble呢?一种做法是模型可以对输入计算多次,然后再ensemble,但是这种做法计算开销很大,模型迭代慢。另一种做法是利用模型之前的epoch来ensemble,这样做计算开销会减小,但是空间开销大,需要存储历史epoch的结果,我们可以采用滑动平均来实现这一想法,因此不需要存储所有历史epoch的结果。Temporal ensembling采用第二种办法。

解释一下滑动平均:滑动平均(Moving Average)是一种常用的平均计算方法。在滑动平均中,针对一个时间序列或一系列数据,取固定窗口大小的数据块,然后计算这个数据块内的平均值作为平滑后的数值,接着向前或向后移动一个单位窗口大小,并再次计算新窗口内的平均值。不断重复这个过程,直到覆盖所有数据点。

2.2.2 Temporal ensembling

Temporal ensembling通过将多个先前网络评估的预测(之前epoch的结果)聚合来实现。它还允许我们在训练过程中只对输入进行一次计算(Π-model是计算两次),从而获得近似2倍的加速比。

模型结构图如下图:

与Π-model不同的是,输入x_{i}只被计算一次得到z_{i},而\tilde{z}_{i}来自之前的epoch。

伪代码如下图:

在伪代码中,每次计算完一个epoch后,通过公式Z \leftarrow \alpha Z+(1-\alpha) z,其中z是刚刚的epoch计算得到的,它和之前的Z做加权平均得到新的Z,也就是新的模型预测结果。之前我们提到\tilde{z}来自之前的epoch,通过公式\tilde{z} \leftarrow Z /\left(1-\alpha^t\right)计算得到,因为Z是通过ensemble得到的,直接用这个Z不就好了吗,为什么还要除以因子\left(1-\alpha^t\right)来修正呢。因为随着每个epoch结束,我们的模型会变得比上一个epoch更好。

公式中的\alpha是个超参数。

Temporal ensembling模型相比于Π-model有两个优点:第一是计算开销小了,因为只对输入进行一次计算,第二是Temporal ensembling模型的\tilde{z}_{i}相比较于Π-model更有说服力。

2.2 Mean teachers are better role models: Weight-averaged consistency targets improve semi-supervised deep learning results

前面提到,Temporal ensemble的缺点是空间开销大,特别是当label信息比较多的时候。另外一个缺点就是,\tilde{z}是历史的预测ensemble得到的,每一个epoch才更新一次,不能每一个batch更新,存在滞后性。

为了克服这个缺点,文章提出了Mean Teacher Module:

该图描绘了具有单个标记示例的training batch。学生模型和教师模型都在其计算中应用噪声\left(\eta, \eta^{\prime}\right)来evaluate输入。学生模型的softmax输出与真实标签计算均方误差,并与教师输出计算一致性损失。

在使用梯度下降更新学生模型的权重之后,教师模型权重被更新为学生权重的指数移动平均EMA。两个模型输出都可以用于预测,但在训练结束时,教师预测更有可能是正确的。未标记数据的训练步骤与此类似,只是不应用分类成本。

该模型在每个minibatch之后通过EMA来更新教师模型的权重,所以它改善了网络中所有层的输出,而不仅仅是网络顶部的输出,因此目标模型具有更好的中间表示。

这些方面改善了Temporal ensembling:首先,更准确的标签预测结果导致学生和教师模型之间的反馈循环更快,从而提高了测试准确性。其次,该方法可扩展到大型数据集和在线学习。

一致性损失J被定义为:

J(\theta)=\mathbb{E}_{x, \eta^{\prime}, \eta}\left[\left\|f\left(x, \theta^{\prime}, \eta^{\prime}\right)-f(x, \theta, \eta)\right\|^2\right]

以上提到的三种模型Π-model、Temporal ensembling和Mean Teacher Module的区别就在于教师模型的预测结果是如何产生的。Π-model使用\theta^{\prime}=\theta,emporal ensembling使用连续预测的加权平均值来近似f\left(x, \theta^{\prime}, \eta^{\prime}\right),Mean Teacher Module我们在第t个训练步骤将{\theta }'_{t}定义为连续\theta权重的EMA:

\theta_t^{\prime}=\alpha \theta_{t-1}^{\prime}+(1-\alpha) \theta_t

这个公式是不是和Temporal ensembling里的Z \leftarrow \alpha Z+(1-\alpha) z很像,其实道理是一样的,只不过是对象和计算时期变了。

3. 这样做为什么能work?

“光滑”(Smoothness)假设:这个假设用于描述数据分布的性质。这个假设指的是相似的样本在输入空间中通常相互靠近,并且对应于标签空间中相似的样本也具有相似的标签。换句话说,相似的输入样本倾向于在数据空间中彼此靠近,且其对应的标签也应该相互靠近。

这个假设源自于"流形假设"(Manifold Hypothesis),该假设认为真实世界中的高维数据通常分布在低维流形上,即使数据是高维的,但在局部区域内,它们可能呈现出低维的结构。并且位于同一流形上的数据点具有相同的标签。

简单来说,流形假设表明高维数据的内在结构可能远比其表面看起来的复杂性要低。这种假设源自于对真实世界数据的观察,许多自然和人造数据都显示出具有低维结构的特点。例如,在图像数据中,相邻像素之间通常存在相关性,而在文本数据中,相关词语之间也可能存在某种关联。这些现象都暗示了数据在更低维度的子空间内可能具有更简单的结构。

许多算法(尤其是降维方法和非线性方法)利用了流形假设,试图在数据集中找到潜在的低维结构,并以此来简化问题、减少数据维度或提取数据的重要特征。

低密度(Low Density)假设:分类器的决策边界最好通过输入空间中的低密度区域。在半监督学习或者普通的监督学习任务中,输入空间中的数据点分布可以是不均匀的。有些区域可能包含大量数据点,而有些区域可能只包含很少的数据点。而低密度区域指的是在输入空间中数据分布稀疏、数据点较少的区域。为什么说决策边界最好位于低密度区域呢?这是因为在低密度区域,数据点较少,因此决策边界更不可能穿过具有噪声或不确定性的区域。相反,如果决策边界穿过高密度区域,可能会因为噪声、异常值或数据分布不均匀而导致过拟合,影响模型的泛化能力。

因此,理想情况下,分类器的决策边界应该更倾向于通过数据分布稀疏、数据点较少的低密度区域,这有助于提高模型的鲁棒性和泛化能力,使其对新样本的分类能力更为可靠。

基于低密度假设,许多半监督学习算法试图通过在学习过程中保持数据空间中相似样本的光滑性,使得模型能够更好地利用未标记数据来改善模型性能。这些算法通常会鼓励模型在输入空间中保持局部光滑性,以便在未标记数据的空间中产生更有意义的预测。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用TensorFlow实现的半监督学习神经网络的代码示例,同样使用MNIST数据集。 ```python import tensorflow as tf from tensorflow import keras import numpy as np # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # 将像素值归一化到0到1之间 x_train = x_train.astype('float32') / 255. x_test = x_test.astype('float32') / 255. # 将标签转换为独热编码 y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) # 构造半监督学习神经网络模型 inputs = keras.layers.Input(shape=(784,)) encoded = keras.layers.Dense(256, activation='relu')(inputs) decoded = keras.layers.Dense(784, activation='sigmoid')(encoded) outputs = keras.layers.Dense(10, activation='softmax')(encoded) autoencoder = keras.models.Model(inputs=inputs, outputs=[decoded, outputs]) # 编译模型 autoencoder.compile(optimizer='adam', loss=['binary_crossentropy', 'categorical_crossentropy'], metrics=['accuracy']) # 训练模型 autoencoder.fit(x_train, [x_train, y_train], epochs=10, batch_size=128, validation_data=(x_test, [x_test, y_test])) # 预测测试集 decoded_imgs, predicted_labels = autoencoder.predict(x_test) ``` 这个示例和前面的Keras示例非常相似,只是使用了TensorFlow来实现。我们首先加载MNIST数据集,并将像素值归一化到0到1之间。然后,我们将标签转换为独热编码。接下来,我们构造了一个具有编码器、解码器和分类器的半监督学习神经网络模型。我们使用Adam优化器和两个损失函数(二元交叉熵和分类交叉熵)来编译模型,并将训练数据输入模型进行训练。最后,我们使用测试集对模型进行预测,得到解码图像和预测标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值