什么是半监督学习(Semi-supervised Learning)?
在有标签数据+无标签数据混合成的训练数据中使用的机器学习算法。
默认的要求:
其实,半监督学习的方法大都建立在对数据的某种假设上,只有满足这些假设,半监督算法才能有性能的保证,这也是限制了半监督学习应用的一大障碍。
半监督学习算法分类:
简单自训练(simple self-training): 用有标签数据训练一个分类器,然后用这个分类器对无标签数据进行分类,这样就会产生伪标签(pseudo label)或软标签(soft label),挑选你认为分类正确的无标签样本(此处应该有一个挑选准则),把选出来的无标签样本用来训练分类器。
协同训练(co-training): 其实也是 self-training 的一种,但其思想是好的。假设每个数据可以从不同的角度(view)进行分类,不同角度可以训练出不同的分类器,然后用这些从不同角度训练出来的分类器对无标签样本进行分类,再选出认为可信的无标签样本加入训练集中。由于这些分类器从不同角度训练出来的,可以形成一种互补,而提高分类精度;就如同从不同角度可以更好地理解事物一样。
半监督字典学习: 其实也是 self-training 的一种,先是用有标签数据作为字典,对无标签数据进行分类,挑选出你认为分类正确的无标签样本,加入字典中(此时的字典就变成了半监督字典了)
标签传播算法(Label Propagation Algorithm): 是一种基于图的半监督算法,通过构造图结构(数据点为顶点,点之间的相似性为边)来寻找训练数据中有标签数据和无标签数据的关系。是的,只是训练数据中,这是一种直推式的半监督算法,即只对训练集中的无标签数据进行分类,这其实感觉很像一个有监督分类算法…,但其实并不是,因为其标签传播的过程,会流经无标签数据,即有些无标签数据的标签的信息,是从另一些无标签数据中流过来的,这就用到了无标签数据之间的联系
半监督支持向量机: 监督支持向量机是利用了结构风险最小化来分类的,半监督支持向量机还用上了无标签数据的空间分布信息,即决策超平面应该与无标签数据的分布一致(应该经过无标签数据密度低的地方)(这其实是一种假设,不满足的话这种无标签数据的空间分布信息会误导决策超平面,导致性能比只用有标签数据时还差)
半监督深度学习算法可分为以下三类:
对于神经网络来说,一个好的初始化可以使得结果更稳定,迭代次数更少。因此如何利用无标签数据让网络有一个好的初始化就成为一个研究点了。
目前我见过的初始化方式有两种:无监督预训练和伪有监督预训练
无监督预训练:如果你有很多未标记的训练数据,你可以尝试逐层训练层,从最低层开始,然后上升,使用无监督的特征检测算法,如限制玻尔兹曼机(Restricted Bolzmann Machine, RBM)或自动编码器(Autoencoder, AE)(自动编码器是神经网络的一种,其基本思想就是直接使用一层或者多层的神经网络对输入数据进行映射,得到输出向量,作为从输入数据提取出的特征)。 每个层都被训练成先前训练过的层的输出(除了被训练的层之外的所有层都被冻结)。 一旦所有层都以这种方式进行了训练,就可以使用监督式学习(即反向传播)对网络进行微调
Reference:
受限制玻尔兹曼机(RBM)以及自编码器(Autoencoder)
受限玻尔兹曼机(RBM)原理总结
受限制玻尔兹曼机(RBM)的能量函数及其梯度求解
伪有监督预训练:通过某种方式/算法(如半监督算法,聚类算法等),给无标签数据附上伪标签信息,先用这些伪标签信息来预训练网络,然后在用有标签数据来微调。
先用有标签数据训练网络(此时网络一般过拟合),从该网络中提取所有数据的特征,以这些特征来用某种分类算法对无标签数据进行分类,挑选你认为分类正确的无标签数据加入到训练集,再训练网络;如此循环。
由于网络得到新的数据(挑选出来分类后的无标签数据)会更新提升,使得后续提出来的特征更好,后面对无标签数据分类就更精确,挑选后加入到训练集中又继续提升网络。
这个想法往往不能很好地 work ,可能的原因是噪声,你挑选加入到训练无标签数据一般都带有标签噪声(就是某些无标签数据被分类错误),这种噪声会误导网络且被网络学习记忆。
前面的两种类别虽然是都用了有标签数据和无标签数据,但就神经网络本身而言,其实还是运行在一种有监督的方式上。
下面的方法让深度学习真正地成为一种半监督算法:
这是一篇发表在 ICML 2013 的文章,是一个相当简单的让网络 work in semi-supervised fashion 的方法。就是把网络对无标签数据的预测,作为无标签数据的标签(即 Pseudo label),用来对网络进行训练,其思想就是一种简单自训练。但方法虽然简单,但是效果很好,比单纯用有标签数据有不少的提升。
网络使用的代价函数如下:
代价函数的前面是有标签数据的代价,后面的无标签数据的代价,在无标签数据的代价中, y ′ y' y′无标签数据的 pseudo label,是直接取网络对无标签数据的预测的最大值为标签。
虽然思想简单,但是还是有些东西需要注意的,就是这个 α ( t ) \alpha(t) α(t),其决定着无标签数据的代价在网络更新的作用,选择合适的 α ( t ) \alpha(t) α(t) 很重要,太大性能退化,太小提升有限。在网络初始时,网络的预测时不太准确的,因此生成的 pseudo label 的准确性也不高。在初始训练时, α ( t ) \alpha(t) α(t)要设为 0,然后再慢慢增加,论文中给出其增长函数。在后面的介绍中,有两篇论文都使用了一种高斯型的爬升函数。
感觉这种无标签数据代价达到一种正则化的效果,其减少了网络在有限有标签数据下的过拟合,使得网络泛化地更好。
2015年诞生半监督 ladderNet,ladderNet是其他文章中先提出来的想法,但这篇文章使它 work in semi-supervised fashion,而且效果非常好,达到了当时的 state-of-the-art 性能。
ladderNet 是有监督算法和无监督算法的有机结合。前面提到,很多半监督深度学习算法是用无监督预训练这种方式对无标签数据进行利用的,但事实上,这种把无监督学习强加在有监督学习上的方式有缺点:两种学习的目的不一致,其实并不能很好兼容。
无监督预训练一般是用重构样本进行训练,其编码(学习特征)的目的是尽可能地保留样本的信息;而有监督学习是用于分类,希望只保留其本质特征,去除不必要的特征。
ladderNet 通过 skip connection 解决这个问题,通过在每层的编码器和解码器之间添加跳跃连接(skip connection),减轻模型较高层表示细节的压力,使得无监督学习和有监督学习能结合在一起,并在最高层添加分类器,ladderNet 就变身成一个半监督模型。
ladderNet 有机地结合了无监督学习和有监督学习,解决兼容性问题,发展出一个端对端的半监督深度模型。
Temporal Ensembling 是 Pseudo label 的发展,ICLR2017的一篇文章,是半监督学习领域的一篇经典文章,目的是构造更好的 pseudo label。
多个独立训练的网络的集成可取得更好的预测,论文扩展了这个观点,提出自集成(self-ensembling),通过同一个模型在不同的迭代期,不同的数据增强和正则化的条件下进行集成,来构造更好的 target。
论文提出了两种不同的实现: π \pi π Model 和 Temporal Ensembling
构造的损失函数,可以不借鉴标签值。因此学者提出了一个一致性约束假设:
对于无标签数据,模型或数据加一定扰动,预测结果一致。
而这个约束就可以抽象为一个loss函数 m i n ( f ( x ) − f ∗ ( x ∗ ) ) min(f(x)-f^*(x^*)) min(f(x)−f∗(x∗))
注:*代表数据或者模型经过扰动
无监督代价是对同一个输入在不同的正则和数据增强条件下的一致性。即要求在不同的条件下,模型的估计要一致,以鼓励网络学习数据内在的不变性。
缺点也是相当明显,每个迭代期要对同一个输入在不同的正则和数据增强的条件下预测两次,相对耗时。还好不同的正则可以使用 dropout 来实现,不然也很麻烦。文章中提到的另外一个创新点:Temporaral Ensembling带来的一个好处可以弥补这种缺陷。
如上所述, π \pi π Model的引入事实上是一种非常直观的一致性假设的具体实现。在介绍Temporal Ensembling是怎么做之前,试着也尽量以一种更加容易接受的思想来引入该操作。
模型是对每一次迭代期的预测进行移动平均来构造更好的 target,然后用这个 target 来计算无监督 loss,继而更新网络。
缺点也有,记录移动平均的 target 需要较多空间。但 temporal ensembling 的潜力也更大,可以收集更多的信息,如二阶原始矩,可基于这些信息对不同的预测加权等。
Temporal ensembling 还对标签噪声具有鲁棒性,即使有标签数据的标签有误的话,无监督 loss 可以平滑这种错误标签的影响。
再回到半监督学习一开始无标签的困境上来看,我们在无标签的情形下,除了可以通过一致性假设来构造损失函数,我们还可以从原来的预测值-GroundTruth标签值的传统思路出发,但我们这里是给无标签的数据一个伪标签。再来看这个公式: m i n ( f ( x ) − f ∗ ( x ∗ ) ) min(f(x)-f^*(x^*)) min(f(x)−f∗(x∗))
我们可以把 π \pi π Model中一个batch里面两次预测中的一个作为另外一个的伪标签,这个伪标签可能害怕它不准,但抛开性能好坏,这也算作是一种打伪标签的方式,先接受这一点。而Temporal Ensembling则是给我们一种能够更好的一种打伪标签的方式。这个就用到了 Ensembling Learning(集成学习) 的思想。本文称之为self-ensembling,之所以self,是因为不同的模型来自于自己,只不过是不同epoch的模型,具体的是通过滑动平均,来将当前的伪标签值与之前的epoch的标签预测值都做一个投票,只不过,越靠近当前的epoch,其权重会越大。
结合了以往所有epoch得到的伪标签值显然是一个更好的打标签方式。而且它带来的一个好处是每一个batch不用同一张图片预测两次,但是为了记录当前epoch下,每一张测试图片对应的伪标签值,需要一个N大小的空间来存储(N对应于训练数据的大小)。因此再计算复杂度和空间复杂度上算是典型的空间换时间吧。
更详细的流程可以参看下图
Reference:
半监督学习之Temporal Ensembling For Semi-supervised Learning
半监督深度学习小结
Mean Teacher 这篇文章一上来就说“模型成功的关键在于 target 的质量”,一语道破天机啊。而提高 target 的质量的方法目前有两:1.精心选择样本噪声;2. 找到一个更好的 Teacher model。而论文采用了第二种方法。
Mean teacher 也是坚信“平均得就是最好的”(不知道是不是平均可以去噪的原因…orz),但是时序上的平均已经被 temporal ensembling 做了,因此 Mean teacher 提出了一个大胆的想法,我们对模型的参数进行移动平均(weight-averaged),使用这个移动平均模型参数的就是 teacher model 了,然后用 teacher model 来构造高质量 target。
一思索就觉得这想法好,对模型的参数进行平均,每次更新的网络的时候就能更新 teacher model,就能得到 target,不用像 temporal ensembling 那样等一个迭代期这么久,这对 online model 是致命的。
然后一做实现,效果特别好,一篇 state-of-the-art paper 就出来了。
Reference:
半监督深度学习小结