Tensorflow 学习入门(三) 自编码器实现

背景知识

早期深度学习

早期深度学习被认为是一种无监督的特征学习(Unsupervised Feature Learning) ——《Tensorflow 实战》黄文坚 唐源

换言之在较早时期深度学习是在模拟人脑对于特征逐层抽象提取归纳的过程在这个过程中有两个关键点。

  1. 无监督学习,即在其学习过程中不提供编著数据。这种学习仅仅是对数据内容组织形式的学习最终提取出频繁出现的特征。
  2. 逐层抽象,特征是从底层向高层不断抽象的。就像人的学习也是从基础概念走向复杂概念。从简单向复杂,从微观到宏观。

编码规律发展

图像的编码发展的早期,学者们在研究稀疏编码(Spare Coding)时从大量的黑白风景照中提取了16*16pixel的图像碎片。而从这些图像碎片中他们发现,这些碎片都可以由64种正交的边组合形成。更重要的是,学者们发现声音也有这种情况,并从大量未标注的因品种发现了20种基础结构。通过将这些声音碎片线性组合,我们可以获得绝大多数的声音。而这种线性组合正是稀疏编码。
而发展至神经网络后,我们可以通过多层神经网络组合低级特征来形成高级特征。在这个加工过程中,对于每一层神经网络而言,他们的前一层(接收到的上一层的输出)都被认为是未加工的像素,而这一层的工作就是将这些像素组合为更加高阶的特征。

自编码器(AutoEncoder)

在上一节的练习中,我们的所有操作都离不开Label,也就是标注的数据,才最终完成了简易的神经网络训练。但我们并不能确保所有的数据集都有Label数据,但是我们依旧可以通过无监督学习的自编码器来提取数据特。
自编码器,即自动归纳自身的特征(无监督学习)逐渐形成高阶特征并将高阶特征编码。故此,自编码器也是一种神经网络,他的输入、输出是一致的,只是运用稀疏编码的思想以求用高阶特征重新组合重构自身。因而,它具有以下特点。

  1. 期望输入输出一致
  2. 输出用高阶特征重构而非简单的像素点复制

简单总结自编码器的实用价值就是在没有存在数据标注的情况下通过非监督学习来输出一个类似于Label的高级特征的总结。

Xavier Initialization

这是一种根据某一层网络的输入、输出节点数量自动调整最合适分布的算法。该算法由Xavier Glorot和深度学习三巨头之一的Yoshua Bengio 在一篇论文中指出,如果深度学习模型的权重初始化得太小,则信号将在每层传递时逐渐缩小最后难以产生作用,但如果初始权重太大,那么信号将在每层见传递时逐渐放大并导致发散和失效。
从数学的角度分析, Xavier算法就是在权重均值为0的同时令方差为 2 n i n + n o u t \frac{2}{n_{in}+n_{out}} nin+nout2,这个分布可以为均匀分布或者高斯分布。

Adam Optimizer

在上一个实战例子中我们使用的是SGD(随机梯度下降)优化器,而在这个例子里我们需要使用的是一个名为Adam Optimizer优化器来判断调整方向。Adam不是指人名而是Adadelta算法 和 Momentum的组合。Adadelta算法指的是一种根据隐含层的不同位置参数来选择不同learning rate的算法,其基本概念是在sample中出现的多就调小learning rate 来确保学习准确率,相反则调高来加快学习速度。而Momentum 则和SDG的思路基本一致。

Soft Plus Algorithm

ln ⁡ ( exp ⁡ ( ∣ f e a t u r e ( x ) + 1 ) ) \ln(\exp(|feature(x)+1)) ln(exp(feature(x)+1))

程序设计思路

理论指导

书中提供的思路来源于Hinton 教授在Science杂志上发表的文章Reducing the dimensionality of data with neural networks,即自编码器对数据进行降维的方法。当然了这个方法并非是我们在自编码器设计中直接套用的毕竟如果真的降维了,输出肯定不会等于输入。结合Hinton教授在文中提出的由多层RBM堆叠成的深度信念网络(Deep Belief Networks一个进行无监督逐层训练贪心算法的设计思路),我们形成了自编码器的设计思路。
当然,深度信念网络的设计原本是一个为训练深度很大的网络而形成的设计方案,具体做法为用无监督的训练提取特征最后将权重初始化到一个比较好的位置以辅助后面的监督训练。

具体限制(设计)

  1. 隐含层节点设计

    我们需要提取的是高级特征这就难免会让我们筛选去除一些不必要的内容。书中提到假设通过限制中间隐含层节点的数量我们将数据进行降维。尽管我们要确保最终输出和输入一致,但经过这些降维处理我们确实可以有效去除我们不需要的(不相关或低相关)信息。
    此外为了为了确保最终的输出可以与输入一致我们需要向隐含蹭的权重添加一个正则,这样便可根据惩罚系数控制隐含节点的系数程度。 这种情况下,惩罚系数越大则学到的特征组合越系数,即实际使用(非零权重)的特征数量越少。

  2. 隐含层设计

    加入层数仅有一层,那么其原理就会类似于主成分分析(PCA)。所以正常而言我们需要多个隐含层。值得注意的是DBN训练在每两层间需要进行无监督的预训练,而这种预训练相当于一个多层自编码器(到这里笔者也被书中的说法绕晕了),可以将整个网络的权重初始化到一个理想的分布。最后通过反向传播算法调整模型权重。而这个反向传播调整权重的过程中我们将会使用经过标注的信息(应该是指完成无监督训练后的信息)来进行分类训练。

  3. 加入噪声(Denoising AutoEncoder)

    虽然我们的操作是给数据加入噪声,但实际上这个过程被称作去噪自编码。噪声并不影响我们的特征学习。并且在有噪声的情况下我们便不能直接复制原数据。在这个过程中也有效地规避在无监督学习下直接复制数据作为输出的错误情况。

    去噪自编码常用的噪声为加性高斯噪声(Additive Gaussian Noise)或者Masking Noise,即随机遮挡噪声,会将图像中一部分像素值被设定为0,在学习过程中需要根据像素的结构来推算被遮挡的像素。

代码实现

书中使用的例子为最具代表性的去噪自编码器其他的编码器有无噪声编码器(去掉噪声并确保隐含层的几点小鱼输入层节点)、Masking Noise(将代码中的高斯噪音改为随机遮挡噪声)、Variational AutoEncoder(VAE)(相对较复杂,引起对中间节点的分布有强假设并拥有额外损失,另外还需要特殊的SGVB(Stochastic Gradient Variational Bayes)算法进行训练)。详情可以自行百度。

引入库和数据

import numpy as np
# sklearn 来自库Scikit-learn
# 我们仅取用其中的预处理模块,方便我们之后用其将数据标准化
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data',one_hot = True
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值