深度学习(自编码器AutoEncoder)

自编码器是用于无监督学习,高效编码的神经网络,自动编码器的目的就在于,学习一组数据的编码,通常用于数据的降维,自编码是一种无监督的算法,网络分为:输入层,隐藏层(编码层),解码层,该网络的目的在于重构输入,使其隐藏层的数据表示更加好,利用了反向传播,将输入值和目标值设置一样,就可以不断的进行迭代训练。

这一讲我们将讲解2006年hinton在赛事上发表的自编码器
auto encoder模型
基于这个模型
它部分地解决了神经网络参数初始化的问题
自编码器采用的是分层初始化的思想
例如我们想要训练途中n层的神经网络
首先第一步我们先训练图中下面这个小的网络
它的输入是原来网络的输入x中间只有一层
就是上面网络的第一层
而输出同样是原网络的输入x
例如假设输入x的维度是四维
而第一层有三个神经元
下面这个小的网络可以详细地化成如下的形式
在这里可见原有的数据x是视为而通过第一层there one
后四维数据被压缩为三维
而这三维的数据通过后面一层能够大致地恢复原有的四维数据x
换句话说
通过这个网络使中间的三维数据浓缩了原有的四维数据的信息
我们可以把它看作是对原有的思维数据的编码
又由于这是从x到其自身的编码
因此我们将这种算法叫做自编码器
我们可以用后向传播算法来训练这个神经网络
当训练好第一层过后
我们下一个步骤是接着训练第二场
假设第一层的输出为x1
在上面那个例子中
x一是一个三维的向量
我们仍然采用自编码器的方法
将第二层的输出也设定为x1
然后用后向传播算法训练第二层
如图所示
注意这里后向传播算法仅仅作用在第二层
而第一层的参数是固定不动的
如果我们画出详细的图
将是如下的形式
尤其请大家注意的是
在训练完第一层过后
会将上面那里左边的参数原封不动地拿下来
作为第二层训练的基础
以此类推
用同样的方法
在训练好前m减一层的前提下
我们可以用后向传播算法训练dm层
当完成所有n层的自编码器训练过后
我们将训练后获得的网络参数作为初始值
然后再次用后向传播算法调整整个网络的参数
由于网络每一层初始值都不同程度的编码了训练样本的信息
因此这样的初始化大概率保证了找到的局部极值点还是不错的
我们也给出了自编码器的matlab程序供大家参考
它主要是基于前面我们自己写的人工神经网络工具包
我们可以通过代码大致的回顾一下自编码器的思想
例如在函数saa一下划线create中
输入和输出都是同一维度
size one中间一层的维度
success to
这是自编码器中对各层训练初始化的过程
而在函数saa一下划线train中
可以看到它直接调用了原来的神经网络训练函数
n n下划线train
我们进一步观察可以发现输入和输出都是同一个村下划线x
这也是我们前面讲到的用自编码器初始化每一层参数的标准步骤
我们在手写体数字数据库m上进行测试
在这个数据集上
我们设置的网络结构为784
410 694 19和十
相当于总共有四层
神经网络激活函数是sigmoid
目标函数是交叉熵
cross entropy
batch size等于100
iteration等于2000
用同样的参数设置
我们使用自编码器训练的神经网络识别率为94.59%
而不使用自编码器训练的网络识别率为90.68%
可以看到自编码器将识别性能提高了将近五个百分点
具体的程序请大家参阅我们给出的my type程序
在这一讲中
我们详细的讲解了如何利用自编码器进行神经网络参数初始化的过程
最近几年来
自编码器作为一种特征提取器
其相关思想的应用非常广泛
例如最近流行的生成对抗网络
简单说tv adversary network就部分的借鉴了自编码器思想
最后留一道思考题给大家
请大家通过上网查找近年来自编码器的典型应用
总结出自编码器适合于什么样的应用场景
同时在你的科研中有可能用到自编码器思想的场景吗
如果有的话
你将会如何的利用呢
本节内容就到这里
谢谢同学们

发表评论

邮箱地址不会被公开。 必填项已用*标注