深度堆栈自编码网络
2017-12-02 14:17
204 查看
为什么会引进自编码网络?
我们都是知道深度神经网络里面的网络一般是比较深的,在训练之初,模型参数的初始化对模型影响十分深远的。当初始化选的好时,模型可以很快的收敛,可以避开一些局部最优点。当初始化选的不好是,模型要么就收敛到局部最优的马鞍点,要么就是收敛的特别慢。所以为了解决参数初始化的问题,Hinton大佬提出了使用大量的没label的数据来“无监督”算法逐层预训练网络的初值,再使用有label的数值来微调网络参数的算法。
也就是说白了:1.自编码网络的提出是为了预训练网络参数,给网络参数一个合适的初值
另外一个重要的原因来引进自编码网络的原因是:现实生活中,那些打好标签的数据其实是很少的,在有监督学习中 这些没有label是用不来的;可以我们又想用这些数据咋个办嘞?自编码网络就提供一种无监督聚类的能力!
逐层学习策略
逐层学习就是一层一层的学习,这个是什么意思嘞?就是说将相邻的层级视为一个简单的只有2层的特别浅的神经网络,对于这种浅层神经网络先有的方法的可以很好的训练,浅层网络也没得深度网络所面临的梯度爆炸和衰减的麻烦事,然后再将逐层学习后的层级“迭”在一些形成深度神经网络,从来加快学习速率,提高网络的泛化能力。自编码网络
自编码网络是浅层神经网络,它希望尽可能让输入和输出保持一致。自编码训练方式的”无监督“训练,其实它这个的无监督是指 自编码网络的训练集可以是那些没有打上label的数据,而不是我们通常意思上说的监督学习的监督(通常监督学习是把样本真实的label当做期望输出,并以此监督学习的过程)。基本网络结构:
典型的自编码网络包含三层:输入层,隐含层,输出层。其中输入层与输出层的节点数一直。从输入层到隐层叫做数据的分析,而从隐层到输出层叫做数据的合成。
设输入层有u个神经元,隐层成有v个神经元,输出层有u个神经元。
训练集
自编码的训练集样本无须打上label.TrainSet={xi,其中x∈Ru,i∈{0,1,2,…,n−1,n}}
训练集共n个样本,每个样本都是u维空间的向量。
模型
X=σa(Wa×x+ba)x^=σs(Ws×X+bs)
其中X是隐层的输出,Wa∈Ru×v,ba∈Rv, σa是隐层的激活函数。
其中x^是输出层的输出,Ws∈Rv×u,bs∈Ru, σs是输出层的激活函数。
这两种激活一般使用非线性函数,比如sigmoid函数,双曲正切函数,Relu等等。
误差函数:
根据不同的准则可以选取不同的误差函数,比如 Li范数,或者熵等等。
这里我们任意选择一L2范数的平方来:
loss(W,b)=1n∑ni=1||xi^−xi||22+αR(W,b)
其中R(W,b)是权值衰减的正则化项,定义:
R(W,b)=||Wa||+||Ws||
训练
有了上面的模型和数据集,使用梯度下降计算∂loss∂Wa,∂loss∂Ws,∂loss∂ba,∂loss∂bs,然后更新各参数即可:Wa=Wa−η∂loss∂Wa
Ws=Ws−η∂loss∂Ws
ba=ba−η∂loss∂ba
bs=bs−η∂loss∂bs
深度堆栈自编码网络
上面介绍了简单的自编码网络,下面我们将自编码网络复合起来组成一个复杂的网络。我们在分类问题里面使用这个深度自编码网络。
深度堆栈自编码网络有两个设计和模型训练步骤。第一个是设计自编码网络进行初始化参数进行预先学习,第二个步骤是设计分类器,然后使用分类器利用第一步学习到的初始化参数对模型进行微调。
数据集
数据集分成两个部分:一部分是有label的数据(很少),另外一部分是无label的数据(很大),他们记为:有label的数据:T={(xi,yi),i=1,2,…,n},其中yi是第i个样本的label。
没有label的数据:T2={(xi),i=1,2,…,m}
两个数据集一共有m+n个样本。
模型网络结构
预学习阶段一共L个隐层,每个隐层上的神经元数目为ni,i∈{1,2,3,…,L},每个隐层上的激活函数为σi,i∈{1,2,3,…,L};最后一个输出层使用softmax进行分类。学习过程
因为有L个隐层,所以一个会有L个浅层自编码神经网络。对于每一层的自编码网络:Xl=σal(Wal×Xl−1+bal)
Xl−1^=σsl(Wsl×Xl+bsl)
其中Xl是每一层自编码网络里面的隐层输出,X^l−1表示第l层自编码网络的输出,这个输出也就是上一层输入期望的输出。然后使用上面提到的自编码网络的学习方法进行学习。
之后我们只保留每一自编码层的分析阶段的参数:Wal和bal,直接丢弃合成阶段的参数:Wsl和bsl进行完成的学习。把保留的参数当做最后网络的初始化参数,然后使用带标签的数据使用传统的神经网络的训练方法进行参数的微调即可。
相关文章推荐
- 深度堆栈网络训练Python代码
- 深度学习算法原理——栈式自编码神经网络
- UFLDL教程笔记及练习答案四(建立分类用深度学习---栈式自编码神经网络)
- 如何用70行Java代码实现深度神经网络算法
- 深度卷积网络CNN与图像语义分割
- 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记
- Linux 网络堆栈的排队机制
- 损失函数减肥用,神经网络调权重(深度学习入门系列之六)
- 深度学习与神经网络-吴恩达(Part1Week3)-单隐层神经网络编程实现(python)
- (转)神经网络和深度学习简史(第一部分):从感知机到BP算法
- Coursera | Andrew Ng (02-week1)—改善深层神经网络:深度学习的实用层面 正则化
- 深度学习笔记1:神经网络理解
- 深度剖析WinPcap之(二)——网络分析与嗅探的基础知识(3)
- 七分钟带你读懂深度学习之什么是神经网络
- 深度学习与神经网络全局概览:核心技术的发展历程
- 深度学习-利用卷积网络识别动物
- windbg设置调用堆栈显示深度
- TensorFlow 深度学习框架(9)-- 经典卷积网络模型 : LeNet-5 模型 & Inception-v3 模型
- 网络堆栈配置工具
- ubuntu14使用python绘制caffe的深度学习网络结构