深度堆栈自编码网络
为什么会引进自编码网络?
我们都是知道深度神经网络里面的网络一般是比较深的,在训练之初,模型参数的初始化对模型影响十分深远的。当初始化选的好时,模型可以很快的收敛,可以避开一些局部最优点。当初始化选的不好是,模型要么就收敛到局部最优的马鞍点,要么就是收敛的特别慢。
所以为了解决参数初始化的问题,Hinton大佬提出了使用大量的没label的数据来“无监督”算法逐层预训练网络的初值,再使用有label的数值来微调网络参数的算法。
也就是说白了:1.自编码网络的提出是为了预训练网络参数,给网络参数一个合适的初值
另外一个重要的原因来引进自编码网络的原因是:现实生活中,那些打好标签的数据其实是很少的,在有监督学习中 这些没有label是用不来的;可以我们又想用这些数据咋个办嘞?自编码网络就提供一种无监督聚类的能力!
逐层学习策略
逐层学习就是一层一层的学习,这个是什么意思嘞?就是说将相邻的层级视为一个简单的只有2层的特别浅的神经网络,对于这种浅层神经网络先有的方法的可以很好的训练,浅层网络也没得深度网络所面临的梯度爆炸和衰减的麻烦事,然后再将逐层学习后的层级“迭”在一些形成深度神经网络,从来加快学习速率,提高网络的泛化能力。
自编码网络
自编码网络是浅层神经网络,它希望尽可能让输入和输出保持一致。自编码训练方式的”无监督“训练,其实它这个的无监督是指 自编码网络的训练集可以是那些没有打上label的数据,而不是我们通常意思上说的监督学习的监督(通常监督学习是把样本真实的label当做期望输出,并以此监督学习的过程)。
基本网络结构:
典型的自编码网络包含三层:输入层,隐含层,输出层。其中输入层与输出层的节点数一直。从输入层到隐层叫做数据的分析,而从隐层到输出层叫做数据的合成。
设输入层有u个神经元,隐层成有v个神经元,输出层有u个神经元。
训练集
自编码的训练集样本无须打上label.
训练集共n个样本,每个样本都是u维空间的向量。
模型
其中X是隐层的输出,
其中
这两种**一般使用非线性函数,比如sigmoid函数,双曲正切函数,Relu等等。
误差函数:
根据不同的准则可以选取不同的误差函数,比如
这里我们任意选择一
其中R(W,b)是权值衰减的正则化项,定义:
训练
有了上面的模型和数据集,使用梯度下降计算
深度堆栈自编码网络
上面介绍了简单的自编码网络,下面我们将自编码网络复合起来组成一个复杂的网络。
我们在分类问题里面使用这个深度自编码网络。
深度堆栈自编码网络有两个设计和模型训练步骤。第一个是设计自编码网络进行初始化参数进行预先学习,第二个步骤是设计分类器,然后使用分类器利用第一步学习到的初始化参数对模型进行微调。
数据集
数据集分成两个部分:一部分是有label的数据(很少),另外一部分是无label的数据(很大),他们记为:
有label的数据:T=
没有label的数据:T2=
两个数据集一共有m+n个样本。
模型网络结构
预学习阶段一共L个隐层,每个隐层上的神经元数目为
学习过程
因为有L个隐层,所以一个会有L个浅层自编码神经网络。对于每一层的自编码网络:
其中
之后我们只保留每一自编码层的分析阶段的参数: