[UFLDL] Basic Concept
博客内容取材于:http://www.cnblogs.com/tornadomeet/archive/2012/06/24/2560261.html
参考资料:
补充材料:
- 大数据分析的4个核心概念【最重要且常用的四个因素】
- 关于线性模型你可能还不知道的二三事(一、样本)
- 关于线性模型你可能还不知道的二三事(二、也谈民主)
- 关于线性模型你可能还不知道的二三事(三、特征值与奇异值的魔力)
tornadomeet博客整理得很好,欣赏这样的学习态度。
该博客基本取材于UFLDL,在两者取舍间还是选择按照tornadomeet博客的剧本走一遍。
因为大部分概念都已熟知,在此过一遍的意义在于查缺补漏,巩固基础。
该博客年初发现,如今我也有了这样的“博客导航”,这便是正能量的传播效应。
Deep Learning学习笔记: Deep learning:五十一(CNN的反向求导及练习) Deep learning:五十(Deconvolution Network简单理解) Deep learning:四十九(RNN-RBM简单理解) Deep learning:四十八(Contractive AutoEncoder简单理解) Deep learning:四十七(Stochastic Pooling简单理解) Deep learning:四十六(DropConnect简单理解) Deep learning:四十五(maxout简单理解) Deep learning:四十四(Pylearn2中的Quick-start例子) Deep learning:四十三(用Hessian Free方法训练Deep Network) Deep learning:四十二(Denoise Autoencoder简单理解) Deep learning:四十一(Dropout简单理解) Deep learning:四十(龙星计划2013深度学习课程小总结) Deep learning:三十九(ICA模型练习) Deep learning:三十八(Stacked CNN简单介绍) Deep learning:三十七(Deep learning中的优化方法) Deep learning:三十六(关于构建深度卷积SAE网络的一点困惑) 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:二十五(Kmeans单层网络识别性能) Deep learning:二十四(stacked autoencoder练习) Deep learning:二十三(Convolution和Pooling练习) Deep learning:二十二(linear decoder练习) Deep learning:二十一(随机初始化在无监督特征学习中的作用) Deep learning:二十(无监督特征学习中关于单层网络的分析) Deep learning:十九(RBM简单理解) Deep learning:十八(关于随机采样) Deep learning:十七(Linear Decoders,Convolution和Pooling) Deep learning:十六(deep networks) Deep learning:十五(Self-Taught Learning练习) Deep learning:十四(Softmax Regression练习) Deep learning:十三(Softmax Regression) Deep learning:十二(PCA和whitening在二自然图像中的练习) Deep learning:十一(PCA和whitening在二维数据中的练习) Deep learning:十(PCA和whitening) Deep learning:九(Sparse Autoencoder练习) Deep learning:八(Sparse Autoencoder) Deep learning:七(基础知识_2) Deep learning:六(regularized logistic回归练习) Deep learning:五(regularized线性回归练习) Deep learning:四(logistic regression练习) Deep learning:三(Multivariance Linear Regression练习) Deep learning:二(linear regression练习) Deep learning:一(基础知识_1)
From: Deep learning:一(基础知识_1)
教程中的一些术语:
【剪裁版】
Model representation:
学习所得函数表达形式,可用矩阵表示。
Vectorized implementation:
指定函数表达式的矢量实现。
Feature scaling:
将特征的每一维都进行一个尺度变化,例如,让其均值为0等。
必要性:由于梯度下降法是按照梯度方向来收敛到极值的,如果输入样本各个维数的尺寸不同(即范围不同),则这些参数的构成的等高线不同的方向胖瘦不同,这样会导致参数的极值收敛速度极慢。
因此,在进行梯度下降法求参数前,需要先进行feature scaling这一项,一般都是把样本中的各维变成0均值,即先减掉该维的均值,然后除以该变量的range。
Normal equations:
多元线性回归中参数解的矩阵形式,这个解方程称为normal equations.
同一个问题可以选用不同的特征和不同的模型,
-
-
- 不同特征方面,比如单个面积特征其实是可以写成长和宽2个特征的。
- 不同模型方面,比如在使用多项式拟合模型时,可以指定x的指数项最大值。
-
当用训练样本来进行数据的测试时,一般都会将所有的训练数据整理成一个矩阵,矩阵的每一行就是一个训练样本,这样的矩阵有时候也会叫做是“design matrix”。
当用矩阵的形式来解多项式模型的参数时,参数 w=inv(X’*X)*X’*y,这个方程也称为 normal equations.
虽然X’*X是方阵,但是它的逆不一定存在(当一个方阵的逆矩阵不存在时,该方阵也称为sigular)。
-
-
-
- 比如说当X是单个元素0时,它的倒数不存在,这就是个Sigular矩阵,当然了这个例子太特殊了。
- 另一个比较常见的例子就是参数的个数比训练样本的个数还要多时也是非可逆矩阵。这时候要求解的话就需要引入regularization项,或者去掉一些特征项(典型的就是降维,去掉那些相关性强的特征)。
- 另外,对线性回归中的normal equations方程求解前,不需要对输入样本的特征进行feature scale(这个是有理论依据的)。
-
-
Optimization objective:
指的是需要优化的目标函数,比如 logistic中loss function表达式的公式推导,或者 多元线性回归中带有规则性的目标函数。
Gradient Descent、Newton’s Method:
求目标函数最小值的方法。
Convex函数其实指的是只有一个极值点的函数,而non-convex可能有多个极值点。一般情况下我们都希望损失函数的形式是convex的。在分类问题情况下,先考虑训练样本中值为1的那些样本集,这时候我的损失函数要求我们
-
-
- 当预测值为1时,损失函数值最小(为0),
- 当预测值为0时,此时损失函数的值最大,为无穷大,
-
所以这种情况下一般采用的是-log(h(x)),刚好满足要求。
同理,当训练样本值为0时,一般采用的损失函数是 -log(1-h(x))。
因此将这两种整合在一起时就为-y*log(h(x))-(1-y)*log(1-h(x)),结果是和上面的一样,不过表达式更紧凑了,选这样形式的loss函数是通过最大释然估计(MLE)求得的。
这种情况下依旧可以使用梯度下降法来求解参数的最优值。在求参数的迭代公式时,同样需要求损失函数的偏导,很奇怪的是,这时候的偏导函数和多元线性回归时的偏导函数结构类似,只是其中的预测函数一个是普通的线性函数,一个是线性函数和sigmoid的复合的函数。
梯度下降法是用来求函数值最小处的参数值,而牛顿法是用来求函数值为0处的参数值,这两者的目的初看是感觉有所不同,但是再仔细观察下牛顿法是求函数值为0时的情况,如果此时的函数是某个函数A的导数,则牛顿法也算是求函数A的最小值(当然也有可能是最大值)了,因此这两者方法目的还是具有相同性的。牛顿法的参数求解也可以用矢量的形式表示,表达式中有hession矩阵和一元导函数向量。
下面来比较梯度法和牛顿法:
- 梯度法中需要选择学习速率,而牛顿法不需要选择任何参数。
- 梯度法需要大量的迭代次数才能找到最小值,而牛顿法只需要少量的次数便可完成。
- 但是梯度法中的每一次迭代的代价要小,其复杂度为O(n) --> 而牛顿法的每一次迭代的代价要大,为O(n^3)。
- 因此当特征的数量n比较小时适合选择牛顿法 --> 当特征数n比较大时,最好选梯度法。这里的大小以n等于1000为界来计算。
Common variations:
规则项表达形式的多样性。
如果当系统的输入特征有多个,而系统的训练样本比较少时,这样就很容易造成over-fitting的问题。这种情况下
-
-
- 降维方法,来减小特征的个数(也可以通过模型选择的方法),
- regularization的方法,(通常情况下通过regularization方法在特征数很多的情况下是最有效,但是要求这些特征都只对最终的结果预测起少部分作用)
-
因为规则项可以作用在参数上,让最终的参数很小,当所有参数都很小的情况下,这些假设就是简单假设,从而能够很好的解决over-fitting的问题。
一般对参数进行regularization时,前面都有一个惩罚系数,这个系数称为regularization parameter,
如果这个规则项系数太大的话,有可能导致系统所有的参数最终都很接近0,所以会出现欠拟合的现象。
在多元线性回归中,规则项一般惩罚的是参数1到n(当然有的也可以将参数0加入惩罚项,但不常见)。随着训练样本的增加,这些规则项的作用在慢慢减小,因此学习到的系统的参数倾向而慢慢增加。
规则项还有很多种形式,有的规则项不会包含特征的个数,如L2-norm regularization(或者叫做2-norm regularization).当然了,还有L1-norm regularization。
由于规则项的形式有很多种,所以这种情形也称为规则项的common variations.【常见变种】
在有规则项的线性回归问题求解中,如果采用梯度下降法,则参数的更新公式类似(其中参数0的公式是一样的,因为规则项中没有惩罚参数0),
不同之处在于其它参数的更新公式中的更新不是用本身的参数去减掉后面一串,而是用本身参数乘以(1-alpha*lamda/m)再减掉其它的,当然了这个数在很多情况下和1是相等的,也就很前面的无规则项的梯度下降法类似了。
它的normal equation也很前面的类似,大致为 inv(X’*X+lamda*A)*X’*y,多了一项,其中A是一个对角矩阵,除了第一个元素为0外,其它元素都为1(在通用规则项下的情形)。这种情况下前面的矩阵一般就是可逆的了,即在样本数量小于特征数量的情况下是可解的。
当为logistic回归的情况中(此时的loss函数中含有对数项),如果使用梯度下降法,则参数的更新方程中也和线性回归中的类似,也是要乘以(1-alpha*lamda/m),nomal equation中也是多了一个矩阵,这样同理就解决了不可逆问题。
在牛顿法的求解过程中,加了规则项后的一元导向量都随着改变,hession矩阵也要在最后加入lamda/m*A矩阵,其中A和前面的一样。
logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于他们的 因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalized linear model)。
这一家族中的模型形式基本上都差不多,不同的就是因变量不同,
-
-
- 如果是连续的,就是多重线性回归,
- 如果是二项分布,就是logistic回归,
- 如果是poisson分布,就是poisson回归,
- 如果是负二项分布,就是负二项回归,等等。
-
只要注意区分它们的因变量就可以了。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。
所以实际中最为常用的就是二分类的logistic回归。
附录:相关知识点
dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
CNN中防止过拟合提高效果的一个大杀器,但对于其为何有效,却众说纷纭。在下读到两篇代表性的论文,代表两种不同的观点。
<组合论>
大规模的神经网络有两个缺点,死锁:
-
- 费时
- 容易过拟合
Sol:Dropout的出现很好的可以解决这个问题,每次做完dropout,相当于从原始的网络中找到一个更瘦
的网络,如下图所示:
因而,对于一个有n个节点的神经网络,有了dropout后,就可以看做是2n个模型的集合了,但此时要训练的参数数目却是不变的,这就解脱了费时的问题。
<动机论>
dropout也能达到同样的效果(有性繁殖比无性繁殖更具有适应性),它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。
- 训练时,训练网络的每个单元要添加一道概率流程。(就是一会儿valid,一会儿invalid)。
- 预测时,每一个单元的参数要预乘以p。
论文中的其他技术点
-
-
防止过拟合的方法:
- 提前终止(当验证集上的效果变差的时候)
- L1和L2正则化加权
- soft weight sharing
- dropout
-
dropout率的选择
- 经过交叉验证,hidden节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。
- dropout也可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)
-
训练过程
- 对参数w的训练进行球形限制(max-normalization),对dropout的训练非常有用。
- 球形半径c是一个需要调整的参数。可以使用验证集进行参数调优
- dropout自己虽然也很牛,但是dropout、max-normalization、large decaying learning rates and high momentum组合起来效果更好,比如max-norm regularization就可以防止大的learning rate导致的参数blow up。
- 使用pretraining方法也可以帮助dropout训练参数,在使用dropout时,要将所有参数都乘以1/p。
-
部分实验结论
该论文的实验部分很丰富,有大量的评测数据。
-
maxout 神经网络中的另一种方法,Cifar-10上超越dropout
-
文本分类上,dropout效果提升有限,分析原因可能是Reuters-RCV1数据量足够大,过拟合并不是模型的主要问题
- dropout与其他standerd regularizers的对比
- L2 weight decay
- lasso
- KL-sparsity
- max-norm regularization
- dropout
- 特征学习
- 标准神经网络,节点之间的相关性使得他们可以合作去fix其他节点中得噪声,但这些合作并不能在unseen data上泛化,于是,过拟合,dropout破坏了这种相关性。在autoencoder上,有dropout的算法更能学习有意义的特征(不过只能从直观上,不能量化)。
- 产生的向量具有稀疏性。
- 保持隐含节点数目不变,dropout率变化;保持激活的隐节点数目不变,隐节点数目变化。
- 数据量小的时候,dropout效果不好,数据量大了,dropout效果好
-
模型均值预测
- 使用weight-scaling来做预测的均值化
- 使用mente-carlo方法来做预测。即对每个样本根据dropout率先sample出来k个net,然后做预测,k越大,效果越好。
-
Multiplicative Gaussian Noise
使用高斯分布的dropout而不是伯努利模型dropout - dropout的缺点就在于训练时间是没有dropout网络的2-3倍。
-
-
进一步需要了解的知识点
- dropout RBM
- Marginalizing Dropout
具体来说就是将随机化的dropout变为确定性的,比如对于Logistic回归,其dropout相当于加了一个正则化项。- Bayesian neural network对稀疏数据特别有用,比如medical diagnosis, genetics, drug discovery and other computational biology applications
观点十分明确,就是对于每一个dropout后的网络,进行训练时,相当于做了Data Augmentation。
因为,总可以找到一个样本,使得在原始的网络上也能达到dropout单元后的效果。
比如,对于某一层,dropout一些单元后,形成的结果是(1.5,0,2.5,0,1,2,0),其中0是被drop的单元,那么总能找到一个样本,使得结果也是如此。
这样,每一次dropout其实都相当于增加了样本。
其他,暂略。
[1]. Srivastava N, Hinton G, Krizhevsky A, et al. Dropout: A simple way to prevent neural networks from overfitting[J]. The Journal of Machine Learning Research, 2014, 15(1): 1929-1958. [2]. Dropout as data augmentation. http://arxiv.org/abs/1506.08700
有必要细读的文章。
<L2, weight decay>
随着训练过程,网络在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不work。
让w“变小”的效果。为什么w“变小”可以防止overfitting?一个所谓“显而易见”的解释就是:
“更小的权值w,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。”
当然,对于很多人(包括我)来说,这个解释似乎不那么显而易见,所以这里添加一个稍微数学一点的解释(引自知乎):
过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
<L1>
在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n。
让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
另外,上面没有提到一个问题,当w为0时怎么办?当w等于0时,|W|是不可导的,所以我们只能按照原始的未经正则化的方法去更新w,这就相当于去掉η*λ*sgn(w)/n这一项,所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。(在编程的时候,令sgn(0)=0,sgn(w>0)=1,sgn(w<0)=-1)