博客内容取材于:http://www.cnblogs.com/tornadomeet/archive/2012/06/24/2560261.htmlphp
Deep learning:三十五(用NN实现数据降维练习) Deep learning:三十四(用NN实现数据的降维) Deep learning:三十三(ICA模型) Deep learning:三十二(基础知识_3) Deep learning:三十一(数据预处理练习) Deep learning:三十(关于数据预处理的相关技巧) Deep learning:二十九(Sparse coding练习) Deep learning:二十八(使用BP算法思想求解Sparse coding中矩阵范数导数) Deep learning:二十七(Sparse coding中关于矩阵的范数求导) Deep learning:二十六(Sparse coding简单理解) Deep learning:十二(PCA和whitening在二天然图像中的练习) Deep learning:十一(PCA和whitening在二维数据中的练习) Deep learning:十(PCA和whitening) Deep learning:九(Sparse Autoencoder练习) Deep learning:八(Sparse Autoencoder)
参考资料:html
在此将降维相关的内容所有集中在本篇。ios
NB: 稀疏表达(sparse representation)和降维(dimensionality reduction)算法
Here, we should note that these two concepts are different! Remeber to distinguish! api
十二(PCA和whitening在二天然图像中的练习)dom
三十(关于数据预处理的相关技巧)机器学习
归一化 Data Normalizationide
数据的归一化通常包括函数
数据尺度归一化的缘由是:数据中每一个维度表示的意义不一样,因此有可能致使该维度的变化范围不一样,所以有必要将他们都归一化到一个固定的范围,通常状况下是归一化到[0 1]或者[-1 1]。
这种数据归一化还有一个好处是对后续的一些默认参数(好比白化操做)不须要从新过大的更改。
逐样本的均值相减主要应用在那些具备稳定性的数据集中,也就是那些数据的每一个维度间的统计性质是同样的。好比说,在天然图片中,这样就能够减少图片中亮度对数据的影响,由于咱们通常不多用到亮度这个信息。不过逐样本的均值相减这只适用于通常的灰度图,在rgb等色彩图中,因为不一样通道不具有统计性质相同性因此基本不会经常使用。
特征标准化是指对数据的每一维进行均值化和方差相等化。这在不少机器学习的算法中都很是重要,好比SVM等。
在使用PCA前须要对数据进行预处理,[This is 特征标准化]
可是比较奇怪的是,在对天然图像进行均值处理时并非减去该维的平均值,而是减去这张图片自己的平均值。由于PCA的预处理是按照不一样应用场合来定的。
Whitening
*Purpose
Whitening的目的是去掉数据之间的相关联度,是不少算法进行预处理的步骤。
好比说当训练图片数据时,因为图片中相邻像素值有必定的关联,因此不少信息是冗余的。这时候去相关的操做就能够采用白化操做。
*Before whitening
数据的whitening必须知足两个条件:
在对数据进行白化前要求先对数据进行特征零均值化,不过通常只要 咱们作了(数据归一化)'s 特征标准化,那么这个条件必须就知足了。
*How to do whitening
在数据白化过程当中,最主要的仍是参数epsilon的选择,由于这个参数的选择对deep learning的结果起着相当重要的做用。
常见的白化操做有PCA whitening和ZCA whitening。
ZCA whitening公式为:
Ref: 实现主成分分析和白化
-- 参数epsilon的选择 --
为计算PCA白化后的数据 ,能够用
xPCAwhite = diag(1./sqrt(diag(S) + epsilon)) * U' * x;
由于 S 的对角线包括了特征值 ,这其实就是同时为全部样本
计算
的简洁表达。
最后,你也能够这样计算ZCA白化后的数据:
xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x;
在基于重构的模型中(好比说常见的RBM,Sparse coding, autoencoder都属于这一类,由于他们基本上都是重构输入数据),一般是选择一个适当的epsilon值使得可以对输入数据进行低通滤波。
可是何谓适当的epsilon呢?这仍是很难掌握的,
所以通常的方法是画出变化后数据的特征值分布图,若是那些小的特征值基本都接近0,则此时的epsilon是比较合理的。
以下图所示,让那个长长的尾巴接近于x轴。
该图的横坐标表示的是第几个特征值,已经将数据集的特征值从大到小排序过。
文章中给出了个小小的实用技巧:
若是数据已被缩放到合理范围(如[0,1]),能够从epsilon = 0.01或epsilon = 0.1开始调节epsilon。
基于正交化的ICA模型中,应该保持参数epsilon尽可能小,由于这类模型须要对学习到的特征作正交化,以解除不一样维度之间的相关性。
*Result:
Origianl photo --> left figure --> pca with 99% --> PCA Whitening --> 协方差矩阵 right figure
Thus, only main features remain after Whitening.
Ref: http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
from sklearn.decomposition import PCA pca = PCA(whiten=True) pca.fit(X)
Replace with scikit api here.
Goto: [Bayesian] “我是bayesian我怕谁”系列 - Continuous Latent Variables
8、九主要仍是稀疏约束部分,在稀疏表达中再详解。
十五就是效果等价于pca,降维并且识别率还高。
Self-taught learning or Semi-supervised learning 半监督学习
Self-taught learning是彻底无监督的。
好比说咱们须要设计一个系统来分类出轿车和摩托车。
该ML方法在特征提取方面是彻底用的无监督方法,在上面的基础上再用有监督的方法继续对网络的参数进行微调,这样就能够获得更好的效果了。
由于有了刚刚的初始化参数【等效pca的输入层的权重们】,此时的优化结果通常都能收敛到比较好的局部最优解
梯度扩散问题
先训练网络的第一个隐含层,而后接着训练第二个,第三个…最后用这些训练好的网络参数值做为总体网络参数的初始值。
前面的网络层次基本都用无监督的方法得到,只有最后一个输出层须要有监督的数据。
另外因为无监督学习其实隐形之中已经提供了一些输入数据的先验知识,因此此时的参数初始化值通常都能获得最终比较好的局部最优解。
最终还在于理解下面这个权重初始化的式子,从而防止梯度消失和爆炸。
补充:stacked autoencoders - 比较常见的一种层次贪婪训练方法 【见下文详情】
单自动编码器,充其量也就是个强化补丁版PCA,只用一次好不过瘾。
因而Bengio等人在2007年的 Greedy Layer-Wise Training of Deep Networks 中,
仿照stacked RBM构成的DBN,提出Stacked AutoEncoder,为非监督学习在深度网络的应用又添了猛将。
十七(Linear Decoders,Convolution和Pooling)
convolution是为了解决前面无监督特征提取学习计算复杂度的问题;
pooling方法是为了后面有监督特征分类器学习的,也是为了减少须要训练的系统参数;
[ 固然这是在广泛例子中的理解,也就是说咱们采用无监督的方法提取目标的特征,而采用有监督的方法来训练分类器 ]
假如对一张大图片Xlarge的数据集,r*c大小,则首先须要对这个数据集随机采样大小为a*b的小图片,而后用这些小图片patch进行学习(好比说sparse autoencoder),此时的隐含节点为k个。所以最终学习到的特征数为:
此时的convolution移动是有重叠的。
PCA Whitening是保证数据各维度的方差为1,而ZCA Whitening是保证数据各维度的方差相等便可,不必定要惟一。
而且这两种whitening的通常用途也不同,PCA Whitening主要用于降维且去相关性,而ZCA Whitening主要用于去相关性,且尽可能保持原数据。
由于目前tensorflow的出现,使用MATLAB的练习题貌似用处不大了。
stacked autoencoder貌似也没说什么,至于文中提到的反卷积显示问题,当下已经有了解决方案。
还有就是DBM多是有必须学习stacked autoencoder的惟一理由了吧,毕竟随机初始化能够替代这些个繁琐的预处理过程。
一个隐含层的网络结构
本文是读Ng团队的论文” An Analysis of Single-Layer Networks in Unsupervised Feature Learning”后的分析,主要是针对一个隐含层的网络结构进行分析的。
分别对比了4种网络结构,k-means, sparse autoencoder, sparse rbm, gmm。
最后做者得出了下面几个结论:
1. 网络中隐含层神经元节点的个数,采集的密度(也就是convolution时的移动步伐)和感知区域大小对最终特征提取效果的影响很大,甚至比网络的层次数,deep learning学习算法自己还要重要。
2. Whitening在预处理过程当中颇有必要!
3. 在以上4种实验算法中,k-means效果居然最好。所以在最后做者给出结论时的建议是,尽可能使用whitening对数据进行预处理,每一层训练更多的特征数,采用更密集的方法对数据进行采样。
【感知区域大小当前可经过””小卷积核+多层“来实现,这样参数少】
即根本就无需经过那些复杂且消耗大量时间去训练网络的参数的deep learning算法,咱们只需随机给网络赋一组参数值,其最终取得的特征好坏不比那些预训练和仔细调整后获得的效果些,并且这样还能够减小大量的训练时间。
当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,能够在网络的可视层(即数据的输入层)引入随机噪声,
这种方法称为Denoise Autoencoder(简称dAE),由Bengio在08年提出,见其文章Extracting and composing robust features with denoising autoencoders.
denoise后右图学习到的特征更具备表明性,给人印象深入。右图同时也给人一种overfitting的感受。
可见,特征这个东西,是越简单越好,表现出的样子就是右图所示。
四十八(Contractive AutoEncoder简单理解)
Contractive autoencoder是autoencoder的一个变种,其实就是在autoencoder上加入了一个规则项,它简称CAE。
是隐含层输出值关于权重的雅克比矩阵,
表示的是该雅克比矩阵的F范数的平方,即雅克比矩阵中每一个元素求平方
而后求和,更具体的数学表达式为:
关于雅克比矩阵的介绍可参考雅克比矩阵&行列式——单纯的矩阵和算子,
关于F范数可参考前面的博文Sparse coding中关于矩阵的范数求导中的内容。
有了loss函数的表达式,采用常见的mini-batch随机梯度降低法训练便可。
关于为何contrative autoencoder效果这么好?
好的特征表示大体有2个衡量标准:
1. 能够很好的重构出输入数据;
2.对输入数据必定程度下的扰动具备不变形。
普通的autoencoder和sparse autoencoder主要是符合第一个标准。
deniose autoencoder和contractive autoencoder则主要体如今第二个,尤为是对于分类任务。
总之,Contractive autoencoder主要是抑制训练样本(处在低维流形曲面上)在全部方向上的扰动。
Goto: [UFLDL] Generative Model 【--> 重点反而不是降维,而是能量传播与全局最优】