自编码器介绍:
深度学习可以解决一些人工难以提取有效特征的问题。在深度学习的早期,它一直被认为是一种无监督特征学习的方法。对于深度学习用于特征学习有两个关键点:
1)无监督学习,即不需要标注的数据就可以对数据进行一定程度的学习,提取频繁出现的特征;
2)逐层抽象,即从简单的微观的特征开始,不断抽象特征的层级,逐渐往复杂的宏观特征转变。例如以汽车图片为例,深度学习的特征学习过程为:将一张图片的原始像素慢慢抽象,从像素组成点、线,再将点线组成小零件,再将小零件组成车轮、车窗、车身等高阶特征,这便是深度学习在训练过程中所做的特征学习。
特征是可以进行不断抽象转化为高一级的特征,那我们如何找到一些基本的结构,然后如何抽象呢?主要可以分为两种情况:
1)在有很多标注的数据时,可以使用训练一个深层的神经网络来获得;
2)在没有标注数据时,我们可以使用无监督的自编码器来提取特征。
自编码器,即可以使用自身的高阶特征编码自己。自编码器也是一种神经网络,它的输入和输出是一致的,它借助稀疏编码器的思想,目标是使用稀疏的一些高阶特征重新组合来重构自己。
它的特点:
1)期望输入和输出一致,自编码器的输入节点和输出节点的数量是一致的;
2)希望使用高阶特征来重构自己,而不是复制像素点。
自编码器通常希望使用少量稀疏的高阶特征来重构输入,因此我们可以加入几种限制:
1)如果限制训练中间隐含层的节点数量,比如使中间隐含层节点的数量小于输入/输出节点的数量,就相当于一个降维的过程。只能够学习到数据中最重要的特征复原,将可能不相关的内容去除。如果再给中间隐含层的权重加入L1正则,则可以根据惩罚系数控制隐含节点的稀疏程度,系数越大,学到的特征组合越稀疏,实际使用的特征数量越少。
2)如果给数据加入噪声,那么就是去噪自编码器。我们将从噪声中学习出数据的特征,这时我们只有学习数据中频繁出现的模式和结构,将无规律的噪声略去,才可以复原数据。去噪自编码器中最长使用的噪声是加性高斯噪声。
如果自编码器的隐含层只有一层,那么其原理类似于主成分分析(PCA)。
自编码器的结构图如下图所示:
在训练很深的神经网络时,直接训练会变得非常困难,Hinton提出了一种可行的方案:
1)可以使用无监督的逐层训练提取特征,将网络权重的初始化到一个比较好的位置,辅助后面的监督训练。
2)利用监督方法训练整个网络。
其中无监督的逐层训练,其思想和自编码器非常相似。
同时,Hinton提出的DBN模型,它包括多个隐含层,每个隐含层都是限制玻尔兹曼机。DBN在训练时,需要对每两层间进行无监督的预训练,这个过程其实就相当与一个多层的自编码器,可以将整个网络的权重初始化到一个理想的分布,最后通过反向传播算法调整模型的权重,这个过程会使用经过标注信息来做监督性的分类训练。上述两个过程,能够很好的解决由于神经网络过深导致的梯度弥散的问题。
下面我们以去噪自编码器为例,简单介绍一下如何使用TensorFlow实现自编码器。
import numpy as np
import sklearn.preprocessing as prep
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
def xavier_init(fan_in, fan_out, constant=1):
# 权重初始化,使得权重满足(low, high)的均匀分布
# fan_in: 输入节点的数量; fan_out: 输出节点的数量
low = -constant * np