首页 > 代码库 > deep leaning学习笔记(一)

deep leaning学习笔记(一)

更确切的是读http://www.cnblogs.com/tornadomeet/archive/2013/03/14/2959138.html 写得博客的读后感加自己的理解。蓝色字体是自己的理解。

模型表达就是给出输入和输出之间的函数关系式,当然这个函数是有前提假设的,里面可以含有参数。此时如果有许多训练样本的话,同样可以给出训练样本的平均相关的误差函数,一般该函数也称作是损失函数(Loss function)。我们的目标是求出模型表达中的参数,这是通过最小化损失函数来求得的。一般最小化损失函数是通过梯度下降法(即先随机给出参数的一组值,然后更新参数,使每次更新后的结构都能够让损失函数变小,最终达到最小即可)。在梯度下降法中,目标函数其实可以看做是参数的函数,因为给出了样本输入和输出值后,目标函数就只剩下参数部分了,这时可以把参数看做是自变量,则目标函数变成参数的函数了。梯度下降每次都是更新每个参数,且每个参数更新的形式是一样的,即用前一次该参数的值减掉学习率和目标函数对该参数的偏导数(如果只有1个参数的话,就是导数),为什么要这样做呢?通过取不同点处的参数可以看出,这样做恰好可以使原来的目标函数值变低,因此符合我们的要求(即求函数的最小值)。即使当学习速率固定(但不能太大),梯度下降法也是可以收敛到一个局部最小点的,因为梯度值会越来越小,它和固定的学习率相乘后的积也会越来越小。在线性回归问题中我们就可以用梯度下降法来求回归方程中的参数。有时候该方法也称为批量梯度下降法,这里的批量指的是每一时候参数的更新使用到了所有的训练样本。

      Vectorized implementation指的是矢量实现,由于实际问题中很多变量都是向量的,所有如果要把每个分量都写出来的话会很不方便,应该尽量写成矢量的形式(就是把原来的一个变量一个公式写成了一个向量一个公式,把变量换成了向量)。比如上面的梯度下降法的参数更新公式其实也是可以用矢量形式实现的。矢量形式的公式简单,且易用matlab编程。由于梯度下降法是按照梯度方向来收敛到极值的,如果输入样本各个维数的尺寸不同(即范围不同),则这些参数的构成的等高线不同的方向胖瘦不同,这样会导致参数的极值收敛速度极慢。(我不知道为什么会导致参数的极值收敛粗度慢的原因,但是你想这时候把变量换成了向量,所以向量中所有的变量都对应同一个学习速率,那么如果你输入样本的尺度不一样,有的平均值几百多,有的只有零点几,同一个学习参数对于不同的变量学习速度的快慢是大大不一样的,所以才要把他们的每个维度都进行尺度变化)因此在进行梯度下降法求参数前,需要先进行feature scaling这一项,一般都是把样本中的各维变成0均值,即先减掉该维的均值,然后除以该变量的range(就个就应该是每个维度下样本的标准差)。

     接下来就是学习率对梯度下降法的影响。如果学习速率过大,这每次迭代就有可能出现超调的现象,会在极值点两侧不断发散(为什么会不断发散哪,学习以后,参数应该会向cost function函数的局部凹的地方移动啊,如果我们学习的速率比较大,那么肯定会越过局部的最低点,但是越过以后不还会回落到最低点吗,为什么会越来越大,这个不是很明白),最终损失函数的值是越变越大,而不是越来越小。在损失函数值——迭代次数的曲线图(就是每迭代一次以后得到的cost function值形成的图)中,可以看到,该曲线是向上递增的。当然了,当学习速率过大时,还可能出现该曲线不断震荡的情形。(这个容易理解,你的学习速率太大啦,你这次迭代可能出现在凸出,下次又出现在凹处,就是因为学习速率太大,不能一点点的平滑的滑落到凹处造成的)如果这该学习速率太小,曲线下降得很慢,甚至在很多次迭代处曲线值保持不变。那到底该选什么值呢?这个一般是根据经验来选取的,比如从…0.0001,0.001,.0.01,0.1,1.0…这些参数中选,看哪个参数使得损失值和迭代次数之间的函数曲线下降速度最快。

     同一个问题可以选用不同的特征和不同的模型,特征方面,比如单个面积特征其实是可以写成长和宽2个特征的。不同模型方面,比如在使用多项式拟合模型时,可以指定x的指数项最多到多少。当用训练样本来进行数据的测试时,一般都会将所有的训练数据整理成一个矩阵,矩阵的每一行就是一个训练样本(如果想用下面那个公式,x矩阵每一行就是一个训练样本,而不能是列),这样的矩阵有时候也会叫做是“design matrix”。当用矩阵的形式来解多项式模型的参数时,参数w=inv(X’*X)*X’*y(这个是在matlab的形式),这个方程也称为normal equations. (这个就是最小化误差平方也可以说最小二乘法得到的回归方程的参数的公式)虽然X’*X是方阵,但是它的逆不一定存在(当一个方阵的逆矩阵不存在时,该方阵也称为sigular)。比如说当X是单个元素0时,它的倒数不存在,这就是个Sigular矩阵,当然了这个例子太特殊了。另一个比较常见的例子就是参数的个数比训练样本的个数还要多时也是非可逆矩阵。这时候要求解的话就需要引入regularization项,或者去掉一些特征项(典型的就是降维,去掉那些相关性强的特征)。另外,对线性回归中的normal equations方程求解前,不需要对输入样本的特征进行feature scale(这个是有理论依据的)(不知道为什么)

  上面讲的函数一般都是回归方面的,也就是说预测值是连续的,如果我们需要预测的值只有2种,要么是要么不是,即预测值要么是0要么是1,那么就是分类问题了。这样我们需要有一个函数将原本的预测值映射到0到1之间,通常这个函数就是logistic function,或者叫做sigmoid function。因为这种函数值还是个连续的值,所以对logistic函数的解释就是在给定x的值下输出y值为1的概率。(在这里我想说说线性回归和逻辑斯蒂回归的区别,线性回归目的是拟合回归方程的值和原来每个样本的Yi尽可能接近,而这个回归方程就是样本X的各个一维度的线性叠加,因为是 线性的所以叫线性回归,刚才的最小二乘法,最小化误差平方就是线性回归模型。然后我们得到这个回归方程的参数以后,我们有了一个新的样本X,我们根据这个回归方程,就可以预测X对应的Y值是多少了。这时候就有人提出了不同的想法啦,因为有时候咱们要的不仅仅是对X的预测值Y是多少,我们更想要的是你根据这个X预测的Y到底概率是多大,你不能只是非黑即白的说,预测值就是多少多少,我们还得看你的把握有多大。假如我们的预测值Y只是从两个值中间预测,那么根据前面这些要求建立的模型就是逻辑斯蒂回归模型。那到底怎么建立这个模型呢,这个模型肯定有参数,那这些参数模型又是怎么得到的呢?首先说这个模型,我们之前的那种线性的回归方程肯定不行了,因为你是样本X各个维度的线性叠加,怎么加吧加吧也会超过[0,1]区间,这肯定就不是概率了,那么有人就想到了这种方式,假设Y的两个值分别是0和1,那么在已知x的情况下,Y=1和0的概率分别是 p(Y=1|x)=exp(w*x+b)/(1+exp(w*x+b)) 和p(Y=0|x)=1/(1+exp(w*x+b))这两种形式,你看这样的话,模型的值肯定就跑不出[0,1]之外了,并且预测为1和0的概率相加为1.正好符合概率。并且通过模型我们可以看出,我们样本X各个维度的线性叠加的值越接近于正无穷,那么我们预测这个样本X所对应的Y=1的概率越接近1,Y=0的概率越接近0,负无穷亦然。然后说下模型参数的估计,因为这里不再像之前的线性回归模型中,我们模型得到的是预测的Y的值,我们只需要把最小化真实值与预测值的误差就可以训练出来模型参数了,这里我们模型的值是概率,这时候我们的cost  function就是 概率论学的似然函数 。这时候要最小化这个cost function,那么我们肯定希望这个cost function是一个凸函数,因为只有是凸函数,才只有一个最小值,这时候我们迭代算法才会很容易的就得到了那个最值点对应的参数了。下面就是说为啥刚才在逻辑斯蒂模型中,我们为啥用到exp()那种公式形式。

    Convex函数其实指的是只有一个极值点的函数,而non-convex可能有多个极值点。一般情况下我们都希望损失函数的形式是convex的。在分类问题情况下,先考虑训练样本中值为1的那些样本集,这时候我的损失函数要求我们当预测值为1时,损失函数值最小(为0),当预测值为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为界来计算。(牛顿法这个不是很了解,以后再说

 

  如果当系统的输入特征有多个,而系统的训练样本比较少时,这样就很容易造成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)再减掉其它的,(α是学习速录,lamuda是正则项参数)当然了这个数在很多情况下和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和前面的一样。(也就是说不管是线性回归还是逻辑斯蒂回归,cost function都是凸函数,还得有现成的模型参数计算公式)

 

  logistic回归与多充线性回归实际上有很多相同之处,最大的区别就在于他们的因变量不同,其他的基本都差不多,正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalized linear model)。这一家族中的模型形式基本上都差不多,不同的就是因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是logistic回归,如果是poisson分布,就是poisson回归,如果是负二项分布,就是负二项回归,等等。只要注意区分它们的因变量就可以了。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。所以实际中最为常用的就是二分类的logistic回归。

 

deep leaning学习笔记(一)