您的位置:首页 > 理论基础 > 计算机网络

深度学习(三十二)半监督阶梯网络学习笔记-NIPS 2015

2016-03-13 14:26 155 查看
半监督阶梯网络学习笔记

原文地址:/article/7649436.html

作者:hjimce

一、相关理论

这几年深度学习声名鹊起,一个又一个AI领域被深度学习攻破,然而现在大部分深度学习所采用的算法都是有监督学习的方法,需要大量的标注数据,需要耗费大量的人力物力。因此如何充分利用大量的无标签数据资源,必将成为未来深度学习领域的研究焦点。

本篇博文主要讲解2015年 NIPS的一篇牛逼paper:《Semi-Supervised Learning with Ladder Networks》,号称2015年深度学习领域"五大佳文"之一。这篇文献采用半监督的方法,充分利用了无标签数据+少量有标签数据,相比于以往的方法精度上有了大幅的提升。因为最后的网络结构像梯子一样,所以我就把它翻译为“阶梯网络”。这篇博文是我综合了《Deconstructing
the Ladder Network Architecture》、《From Neural PCA to Deep Unsupervised Learning》、《Lateral Connections in Denoising Autoencoders》、《Semi-Supervised Learning with Ladder Networks》这四篇文献所写的个人笔记总结。

众所周知,机器学习主要划分为:有监督、无监督、半监督学习三类方法。可能有监督学习、无监督学习这两者,我们经常碰到,然而半监督的学习方法却很少接触。半监督学习是有监督学习和无监督学习的结合体,其主要思想是:利用少量的有标签数据和大量的无标签数据相结合,训练出牛逼的结果。下面用一个例子介绍下半监督学习,了解下怎么充分利用无标签数据资源的,进行分类:



如上图所示,我们有两个有标签数据样本,两个样本属于不同类别,我们用黑和白表示。数据量很少,我们仅仅有两个有标签的数据而已,现在如果利用上面这两个样本对下面图片中的未知标签的样本(下图中的灰色,带问号的圆圈),进行分类的话,那么根据已有的机器学习算法,就会把这个未知的样本分类为:白色类别。



然而如果我们除了那两个有标签的样本之外,还有大量的无标签数据(用灰色表示无标签数据):



从上面的数据分布上看,我们这两类数据服从某种数据分布,我们从直观上看,可以用一条曲线把数据划分为两个部分:



这个时候,如果还是要判别上面一开始我们要分类的那个样本,我们就会把它归属于类别:黑色。因此利用无标签数据,可以帮助我们找到数据的潜在分布,提高我们分类的精度。我们人类学习事物的大部分过程都是如此,通过观察少量的东西有标签数据,结合大量无标签数据,用先验知识做出推断。

二、深度学习半监督难点

半监督是一种有监督和无监督相结合的模型。在深度学习领域,无监督学习常见的有自编码、受限玻尔兹曼机等,在以前这些无监督方法一般是用于网络的预训练、参数初始化(像用于DBM、栈式自编码等深度网络的参数初始化)。简而言之,它们所采用的思路都是无监督预训练+有监督微调,也就是所有监督和无监督是分开的,两个阶段的训练相互独立,并不能称之为真正的半监督学习。

一般来说,无监督学习的目标函数都是:



其中X是原始输入、X'是重构数据。无监督学习的目标其实是为了学习原始数据X的另外一种表征H,同时要保证这个新的特征H,尽可能的能够保留原始数据信息;或者说经过H=f(x)映射后,尽可能不要丢失信息。

然而恰恰相反,有监督学习方法要求只有与任务相关的信息保留下来;或者说有监督学习会过滤掉与我们任务无关的相关信息。打个比方:我们的分类任务判断一张人脸图片是单眼皮,还是双眼皮;那么有监督学习经过训练完毕后,就会尽可能的把与这个分类任务无关的信息过滤掉,过滤的越好,那么分类的精度将会更高。比如一个人的嘴巴、鼻子信息这些都是与这个分类任务无关的,那么就要尽量的过滤掉。

因此这就存在着一个冲突问题:无监督学习是要尽可能的保留原始数据的信息,而有监督学习是过滤与任务无关的信息,这个原因以至于一直以来有监督学习和无监督学习不能很好的兼容在一起,半监督学习算法不能很好的work。然而如果我们可以设计一个网络模型,这个网络有两个分支,可以把监督任务相关的信息和无关的信息尽可能的分开,如下图所示,这也正是阶梯网络的设计思想。



三、从深度自编码网络到阶梯网络

因为阶梯网络是深度自编码网络的进化版,所以我这边就先从深度自编码网络讲起,先复习一下深度自编码网络。

(1)深度自编码网络复习

可能在我们以前所接触的自编码网络一般是一个单层的网络结构,即使是栈式自编码也是单层自编码网络堆叠起来的,所以我这边就简单啰嗦一下深度自编码网络结构,多层自编码网络其实也很简单,只不过是自编码网络的隐藏层数增加罢了。单层自编码网络的前向传导公式:



x(t)表示输入数据、h(t)表示隐藏层神经元。我们喜欢把f函数当成是编码映射函数,g函数表示解码映射函数。如果是多层的自编码网络就是:



具体网络结构图如下:



无监督自编码网络存在我们前面所讲的问题:顶层特征hL(t)要尽量的保留原始x(t)所包含的全部信息;如果我们要用hL(t)做有监督训练,那么高层特征hL(t)就应该尽量的只包含与我们的分类任务相关的信息,因此阶梯网络作者就提出了横向连接,这样可以缓解最高层特征需要表达X的全部信息压力。
(2)阶梯网络
A、下面是阶梯网络结构图,与深度自编码网络相比,在编码部分的每一层都有一条横向连接线,连接到解码层。
B、除此之外,阶梯网络在编码层的每一层都引入了噪声(类似于降噪自编码器,不过降噪自编码器只对输入层加入噪声,而阶梯网络是对编码层的每一层都加入了噪声)
C、另外,阶梯网络网络的损失函数是每一层的构建误差损失函数C0、C1……CL(与降噪自编码器不同在于:降噪自编码器只对解码输出层构建损失函数C0)。最后无监督阶梯网络的总损失函数就是C0+C1……+CL。



四、半监督阶梯网络

OK,上面我们仅仅只是讲解了阶梯网络结构图,我们这部分就来详细讲解,具体要怎么实现半监督学习。其实半监督阶梯网络也很简单:



只不过是在编码最高层接入有监督损失函数;Ladder Network采用的是在网络训练过程中,直接把有监督和无监督的损失函数相加起来,作为总损失函数,进行梯度下降整体训练。这个思路和文献:《Stacked
What-Where Auto-encoders》非常之相似。。

给定N个有标签的样本数据(x(1),y(1))、(x(2),y(2))……,以及M个无标签的样本数据x(N+1)、x(N+2)、x(N+3)……并且有标签的样本数据个数远小于无标签数据。我们的目标是学习出一个函数用来判别数据的标签P(y|x)。在阶梯网络中,这个函数是一个深度降噪自编码器,噪声加入所有的隐藏层,然后最后的损失函数是有标签样本数据的交叉熵损失函数+无监督各层噪声解码器重构误差欧式损失函数:



X,y,y*分别表示输入数据,无噪声输出、有噪声输出。公式中的超参数λ表示的是每一层解码层损失函数的权重,因为每一层的重要性不同,因此每一层的权重不同。
五、训练细节
1、算法前向传导流程:
(1)首先是有噪声通道编码、解码前向计算;
(2)无噪声通道前向计算;
(3)通过无噪声通道各层数据Z与解码器Z'构建损失函数;这样就可以得到无监督部分损失函数。
(4)有监督部分损失函数计算:直接在噪声通道的编码器顶层接入分类器,构建损失函数。
2、其它细节
需要注意的是:在训练的时候,有监督部分输出采用的是噪声通道y’,构建损失误差的;而在测试使用阶段,采用的是无噪声通道计算y。编码阶段和解码阶段有采用tied-weight、采用参数权值共享,CNN反卷积过程也是一样。在训练的时候,有标签样本随机抽取但是需要保证每批各个类别的样本个数相同,保证类别平衡。
3、横向阶梯连接
这个在文献《Deconstructing the Ladder Network Architecture》第3节分析了横向连接的公式,对半监督结果的影响。

参考文献:

1、http://rinuboney.github.io/2016/01/19/ladder-network.html

2、《Deconstructing the Ladder Network Architecture》

3、《Semi-Supervised Learning with Ladder Networks》

4、《From Neural PCA to Deep Unsupervised Learning》

5、《Lateral Connections in Denoising Autoencoders》

**********************作者:hjimce 时间:2016.3.13 联系QQ:1393852684 原创文章,转载请保留原文地址、作者等信息***************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: