[机器学习] UFLDL笔记系列是以我学习UFLDL Tutorial(Andrew Ng老师主讲)时的笔记资料加以整理推出的,内容以无监督特征学习和深度学习为主,同时也参考了大量网上的相关资料。
本文的理论部分主要整理自UFLDL的“Autoencoders and Sparsity”章节和一些经典教材,同时也参考了网上的一些经典博客,包含了Autoencoders和Sparsity的一些基本概念、应用场景和推导,供读者参考。
文章小节安排如下:
1)自编码器(autoencoder)的基本原理
2)基于Autoencoder的数据压缩表示
3)基于Autoencoder的数据稀疏表示
4)Autoencoder的可视化
5)参考资料
自编码器是一种无监督学习算法,它采用神经网络的形式,令目标值等于输入值,利用反向传播算法学习数据内在的结构。因此自编码器也可以称作是自编码神经网络(autoencoder neural network),自动编码体现在哪里?体现在它无需标签,利用数据本身就可以学习出数据内在的有趣结构。
Autoencoders were first introduced in the 1980s by Hinton and the PDP group (Rumelhart et al., 1986 [18]) to address the problem of backpropagation without a teacher, by using the input data as the teacher.
更多的关于Autoencoder的发展历史可以参考论文:Baldi P, Guyon G, Dror V, et al. Autoencoders, Unsupervised Learning, and Deep Architectures Editor: I[J]. Journal of Machine Learning Research, 2012.
UFLDL给出的Autoencoder神经网络结构如下:
Autoencoder尝试学习一个恒等函数:
假设Autoencoder的输入是100维的数据,其中隐层L2的神经元数量是50,输出层是100维。此时由于只有50个隐藏神经元,也就相当于迫使Autoencoder去学习输入数据的压缩表示,即,它必须从隐层L2的50维激励值向量中重构出100维的输入数据。
当然这种学习是有前提的, 如果输入的数据中各项是完全随机的,也就是每一项都是跟其它项完全无关的独立同分布高斯随机变量,那么压缩表示将会非常难以学习。但如果输入的数据中某些项是彼此相关的,那么Autoencoder就可以发现这一相关性,也就可以学习到压缩表示。事实上,Autoencoder通常可以学习出一个跟主成分分析(PCA)结果非常相似的输入数据的低维表示。
举例来说,
设现在利用4bit来表示4个数字,希望可以进行压缩至2bit来表示,可通过训练得到如下压缩表示:
(0,0,0,1) ->(0.99,0.09) -> (0.06,0.00,0.01,0.91)
(0,0,1,0) ->(0.85,0.99) -> (0.00,0.07,0.90,0.07)
(0,1,0,0) ->(0.01,0.67) -> (0.06,0.87,0.11,0.00)
(1,0,0,0) ->(0.12,0.00) -> (0.89,0.10,0.00,0.02)
input_layer hidden_layer output_layer
观察hidden层的编码可以发现下面对应关系:
(0.99,0.09) 1,0
(0.85,0.99) 1,1
(0.01,0.67) 0,1
(0.12,0.00) 0,0
用于数据压缩表示的Autoencoder的代价函数如下:
这里Autoencoder中激励函数选择的是Sigmoid函数,而Sigmoid函数的输出在0-1之间,因此为了满足Autoencoder的学习目标,数据在输入网络之前,需要对各项进行归一化操作,例如白化操作。
Autoencoder用于压缩表示时与PCA类似,都是要找到可以代表原始信息的主要成分(捕捉可以代表输入数据的最重要的因素),事实上Autoencoder通常可以学习出一个跟PCA结果非常相似的数据低维表示。只是PCA是线性的,而Autoencoder因为有Sigmoid函数,所以是非线性的降维。
前面压缩表示例子是基于隐藏神经元数量小于输入数据的维度,如果隐藏神经元的数量大于输入数据的维度,我们可以通过给Auto encoder施加稀疏性限制来学习输入数据的稀疏表示。
补充:什么是稀疏性?
这里用稀疏特征的特点来解释稀疏性,如果说一个特征是稀疏的,那么这个特征向量里面有很多项都是0,而非零的项远小于向量的维度。说白了,稀疏特征就是0比较多而已。
接触机器学习的同学应该都听过稀疏表示,高维数据的稀疏表示是近年来机器学习和计算机视觉领域的研究热点之一。那么稀疏表示的优越性在哪里呢?其实需要说明的是,讨论稀疏表示的优越性之前需要明确应用场景(没有一种理论是万能的),稀疏表示对于大多数的inverse problem一般都具有良好的表现,例如图像,音频,视频等等自然信号,因为这些信号具有很好的可稀疏性。
在Machine Learning,Signal/Image Processing等众多领域,很多inverse problem都是不适定/病态的(under-determined, ill-posed)。为了能获得比较好的解,人们需要x的先验知识。而稀疏性便是众多先验知识中,最为主要的一种。这种性质使得不适定的问题变得适定(well-posed),进而获得“好的解”成为可能。
如果当神经元的输出接近于1的时候认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里假设神经元的激活函数是sigmoid函数,如果使用tanh作为激活函数,则当神经元输出为-1的时候认为神经元是被抑制的。
那么如何在Autoencoder中加入稀疏性限制呢?
首先我们定义隐藏神经元 j 的平均激活度:
稀疏惩罚项的具体形式有很多种合理的选择,在这里选择基于相对熵(KL divergence)的形式:
Sparse Autoencoder的代价函数如下:
在概率论或信息论中,KL散度( Kullback–Leibler divergence),又称相对熵(relative entropy),信息散度(information divergence),信息增益(information gain),是描述两个概率分布P和Q差异的一种方法(P和Q差别的非对称性的度量)。它是非对称的,这意味着D(P||Q) ≠ D(Q||P)。特别的,在信息论中,D(P||Q)表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布。
有人将KL散度称为KL距离,但事实上,KL散度并不满足距离的概念,原因在于:
1)KL散度不是对称的;
2)KL散度不满足三角不等式。
训练出的Autoencoder其实就是第一个权重矩阵,我们可视化的是函数:
很多人会困惑为什么可视化以后是这样的结果,因此这里有几点需要明确:
第一,训练Autoencoder时候的训练数据是什么?
我们拿到的数据集是数字灰度图像,
UFLDL-Autoencoders and Sparsity
http://ufldl.stanford.edu/wiki/index.php/Autoencoders_and_Sparsity
Visualizing a Trained Autoencoder
http://ufldl.stanford.edu/wiki/index.php/Visualizing_a_Trained_Autoencoder
CS231n-Linear Classification
http://cs231n.github.io/linear-classify/
什么是稀疏特征(Sparse Features)?
https://www.zhihu.com/question/31951092?sort=created
稀疏表达的意义在于?为什么稀疏表达得到广泛的应用?
https://www.zhihu.com/question/26602796/answer/33457780
KL Divergence KL散度
http://blog.csdn.net/gao1440156051/article/details/44162269