zoukankan      html  css  js  c++  java
  • 线性模型、最优化方法(二)

    一、线性回归

    一般的,线性回归模型表示为

    [h_{ heta}(x)= heta_0+ heta_1x_1+...+ heta_nx_n=sum_{i=0}^{n} heta_ix_i= heta^Tx ]

    上式中令(x_0=1),这样(x)实际上是(n+1)维,(x=[1,x_1,x_2,…,x_n]^T).当我们知道训练数据集后怎样得到参数( heta)的值呢?一个比较合理的想法是尽可能的让(h_{ heta}(x))接近真实值(y),下面我们来定义一个函数来度量(h_{ heta})(y)的距离:

    [J( heta)=frac{1}{2}sum_{i=1}^m(h_{ heta}(x^{(i)})-y^{(i)})^2 ]

    其中(m)表示训练集中样本个数,(x^{(i)})(y^{(i)})分别表示第(i)个样例的特征值和真实结果。我们希望找到一个( heta)使的(J( heta))最小。下面分别采用梯度下降算法和最小二乘法来求解( heta)

    二、梯度下降算法

    我们希望能找到( heta)使得(J( heta))达到最小,于是我们可以使一个搜素算法,初始化( heta)为一个任意值,在迭代过程中不断的更新( heta)使得(J( heta))更小,直到收敛为止(可以认为(J( heta))不再改变)。下面我们来考虑下梯度下降算法,它先给( heta)一个初始化值,然后通过下面公式来更新( heta)

    [ heta_j:= heta_j-alphafrac{partial}{partial heta_{j}}J( heta)quad 其中 quad j = 0,1,...,n ]

    上式中(alpha)称为学习速率。为了理解上面的算法,我们需要推导一下偏微分部分,推导过程中我们只考虑一个样例(x,y),然后只需要把所有的加起来就可以了

    [frac{partial}{partial heta_{j}}J( heta)=frac{1}{2}frac{partial}{partial heta_{j}}(h_{ heta}(x)-y)^2 \ =(h_{ heta}(x)-y)frac{partial}{partial heta_{j}}(sum_{i=0}^n heta_i x_i-y) \ =(h_{ heta}(x)-y)x_j quad quad quad quad quad quad quad ]

    对于单独的第(i)个样本,更新规则为

    [ heta_j:= heta_j-alpha(h_{ heta}(x^{(i)})-y^{(i)})x_{j}^{(i)}quad 其中 quad j = 0,1,...,n ]

    当有(m)个样本时,更新规则为

    [ heta_j:= heta_j-alpha sum_{i=1}^m(h_{ heta}(x^{(i)})-y^{(i)})x_j^{(i)}quad 其中 quad j = 0,1,...,n ]

    上式每次迭代将所有样本考虑进来更新( heta),这种方法叫做批量梯度下降。梯度下降容易陷入一个局部的最优解,事实上(J( heta))是一个凸函数,没有所谓的局部最优解,它只有一个全局最优解。

    ​ 批量梯度下降一般工作的很好,考虑下面的算法:![屏幕快照 2018-03-08 18.01.18](屏幕快照 2018-03-08 18.01.18.png)

    该算法每一个样例都更新了( heta)一次,这个算法被称作随机梯度下降(或增量梯度下降)SGD,当(m)很大的时候,批量梯度下会很耗时,通常,随机梯度下降比批量梯度下降要快很多,然而它可能永远达不到最小值,并在最小值附近震荡,而实际上这种近似最小值已经够了。在样本量比较大的情况下,随机梯度下降比梯度下降更实用。

    三、最小二乘法

    梯度下降算法给出了一种最小化(J( heta))的方法。这里将介绍第二种方法:最小二乘法。我们先求(J( heta))的偏导数,然后令偏导数为0,用等式解出( heta),此时的( heta)使得(J( heta))最小((J( heta))是下凸函数)。

    ​ 先介绍下矩阵迹相关知识,对于一个(n imes n)的方阵(A),定义它的迹为

    [tr(A)=sum_{i=1}^nA_{ii} ]

    即矩阵对角线的和。实数的迹是它本身,有关迹的一些性质

    [tr(A)=tr(A^T) quad quad quadquadquadquadquadquad\ tr(A+B)=tr(A)+tr(B)quad quad quad \ tr(kA)=ktr(A)quad quad quadquadquadquadquad;;\ tr(AB)=tr(BA)quad quad quadquadquadquadquad;; \ tr(ABC)=tr(CAB)=tr(BCA) quad\ tr(ABCD)=tr(BCDA)=tr(CDBA)=tr(DABC) quad\ ]

    不加证明的给出有关矩阵微分结论

    [ abla_A tr(AB)=B^T quad quad quad quad quad quad quad quad \ abla_{A^T}f(A)=( abla_Af(A))^T quad quad quad quad quad\ abla_Atr(ABA^TC)=CAB+C^TAB^T \ abla_A |A|=|A|(A^{-1})^T quad quad quad quadquad quad;; ]

    其中(|A|)表示(A)的行列式,第四个式子中(A)可逆。定义(X)(m imes n)(实际上是(m imes (n+1)))的矩阵,用它表示训练的数据特征集

    [X=[x^{(1)},x^{(2)},...,x^{(m)}] ]

    定义真实值向量(y=[y^{(1)},y^{(2)},…,y^{(m)}]^T),于是

    [X^T heta - y =[h_{ heta}( x^{(1)})-y^{(1)},h_{ heta}( x^{(2)})-y^{(2)},...,h_{ heta}( x^{(m)})-y^{(m)}]^T ]

    我们知道对于一个(n)维向量(z)(z^Tz=sum_{i=1}^{n}z_{i}^2),于是

    [J( heta)=frac{1}{2}sum_{i=1}^m(h_{ heta}(x^{(i)})-y^{(i)})^2=frac{1}{2}(X^T heta-y)^T( X^T heta-y) ]

    下面来对(J( heta))求导

    [ abla_{ heta} J( heta)=frac{1}{2} abla_{ heta}(X^T heta-y)^T( X^T heta-y) quadquadquadquadquadquadquadquad\ =frac{1}{2} abla_{ heta}( heta^TXX^T heta-2 heta^T Xy+y^Ty) quadquad ;;\ =frac{1}{2} abla_{ heta}(tr; heta^TXX^T heta-2;tr; heta^T Xy+y^Ty) \ =frac{1}{2} abla_{ heta}tr; heta heta^TXX^T-( abla_{ heta^T} tr; heta^T Xy)^T quad \ =XX^T heta-Xy quadquadquadquadquadquadquadquadquadquad;; ]

    ( abla_{ heta} J( heta)=0)(XX^T heta=Xy),求解

    [ heta = (XX^T)^{-1}Xy ]

    这样我们直接求出来了( heta)的解析解,这就是最小二乘法。

    四、有关概率的解释

    当我们求解回归问题时,为什么选择线性回归?为什么代价函数(J)是合理的呢?这里我们将给出一个概率性的假设,然后很自然的推导出最小二乘法。

    我们结果的目标值和预测值满足以下等式
    

    [y^{(i)}= heta^Tx^{(i)}+epsilon^{(i)} ]

    其中(epsilon^{(i)})表示预测误差,我们再继续假设(epsilon^{(i)})满足独立同分布,它们服从均值为0,方差为(delta)的高斯分布(epsilon ^{(i)}sim N(0,delta^{2})),概率密度函数即为

    [p(epsilon ^{(i)})=frac{1}{sqrt{2 pi}delta}exp(-frac{(epsilon^{(i)})^2}{2delta}) ]

    于是有(y^{(i)}sim N( heta^Tx^{(i)},delta^2))分布,则

    [p(y^{(i)}|x^{(i)} ; heta)=frac{1}{sqrt{2 pi}delta}exp(-frac{(y^{(i)}- heta^Tx^{(i)})^2}{2delta}) ]

    需要注意(p(y^{(i)}|x^{(i)} ; heta))中德( heta)是一个确定的值,并不是随机变量,这个和(p(y^{(i)}|x^{(i)} , heta))是不同的,此处的( heta)是一个随机变量。我们希望观测概率最大,也就是关于观测值的似然函数

    [L( heta)=L( heta;x,y)=p(y|x; heta) ]

    注意前面我们假设了随机变量(epsilon^{(i)}) 是相互独立的,所以

    [L( heta)=prod_{i=1}^mp(y^{(i)}|x^{(i)})=prod_{i=1}^mfrac{1}{sqrt{2 pi}delta}exp(-frac{(y^{(i)}- heta^Tx^{(i)})^2}{2delta}) ]

    现在给出(y^{(i)},x^{(i)}),如何选择参数( heta)使得(L( heta))最大呢?这中方法被称极大似然估计。我们取对数似然函数

    [l( heta)=ln;L( heta)=frac{m}{ln;(sqrt{2pi}delta)}-sum_{i=1}^mfrac{(y^{(i)}- heta^Tx^{(i)})^2}{2delta} ]

    我们需要最大化(l( heta))也就是得极小化

    [sum_{i=1}^mfrac{(y^{(i)}- heta^Tx^{(i)})^2}{2}=J( heta) ]

    我们总结一下,在概率假设前提下,最小二乘回归就是找到( heta)的最大似然估计。

    五、局部加权线性回归

    在原来的线性回归中,为了预测在点(x)处的值,我们会

    • 拟合( heta)来最小化(sum_i(y^{(i)}- heta^Tx^{(i)})^2)
    • 输出( heta^Tx)

    而在局部线性回归中,我们会

    • 拟合( heta)来最小化(sum_iw^{(i)}(y^{(i)}- heta^Tx^{(i)})^2)
    • 输出( heta^Tx)

    这里的(w^{(i)})是非负数的权重,直观上看,如果(w^{(i)})很小,将会被忽略((y^{(i)}- heta^Tx^{(i)})^2),下面是(w^{(i)})一个常用的权重

    [w^{(i)}=exp(-frac{(x^{(i)}-x)^2}{2 au^2}) ]

    这个可以内比高斯分布的图形,但事实上它们没半毛钱关系。距离(x)越远的点权重越小,越近的点权重越大,当(|x^{(i)}-x|)越小,(w^{(i)} o 1),当(|x^{(i)}-x|)很大时,(w^{(i)} o 0).参数( au)通常称为波长参数,控制权重函数图像的形状。

    ​ 局部加权线性回归是我们看到的第一个非参数学习模型,我们之前看到的是未加权的参数学习算法,因为它具有固定个数的参数,这些参数只需要学习一遍。相反的,使用局部加权线性回归,我们需要保持整个训练集,每次预测都要用不同的参数。

    六、逻辑回归模型

    现在我们来考虑下分类问题。这和回归问题一样,唯一的区别是我们要预测的值是离散的。现在我们来讨论二元分类问题,其中(y)能只能取(0)或者(1).例如现实生活中,邮件是否是垃圾邮件,只有是和否两种答案。通常我们也可以称这样的样本为正或负样本。

    ​ 上述问题,我们忽视(y)是离散值的事实,也可以采用线性回归来分类,但是(y in {0,1}),线性回归得到的大于1或者小于0的值都是没有意义的。为了解决这个问题,我们修改假设函数(h_{ heta}(x))的形式

    [h_{ heta}(x)=g( heta^Tx)=frac{1}{1+exp(- heta^Tx)} ]

    其中

    [g(z)=frac{1}{1+e^{-z}} ]

    称为(sigmiod)函数着或logistic函数。sigmoid函数将( heta^Tx)映射为(0 o 1)的概率,sigmoid函数还有一个很好的性质

    [g(z)'=g(z)(1-g(z)) ]

    那么给出了逻辑回归模型,我们如何得到参数( heta),和前面最小二乘法概率解释做法一样,可以采用极大似然估计方法来求解参数( heta).我们假设

    [P(y=1|x; heta)=h_{ heta}(x) quadquad \ P(y=0|x; heta)=1-h_{ heta}(x) ]

    注意到上面两个式子可以写成

    [P(y|x; heta)=h_{ heta}(x)^y(1-h_{ heta}(x))^{1-y} ]

    我们假设有(m)个训练样本相互独立,似然函数为

    [L( heta)=prod_{i=1}^mp(y|x; heta)quadquadquadquad quadquadquadquadquadquad \ =prod^{m}_{i=1}h_{ heta}(x^{(i)})^{y^{(i)}}(1-h_{ heta}(x))^{1-y^{(i)}} ]

    然后再化简为对数似然函数

    [l( heta)=sum_{i=1}^m [y^{(i)}ln;h_ heta(x)+(1-y^{(i)})ln;(1-h_ heta(x))] ]

    要最大化(l( heta)),我们可以向前面那样,使用梯度上升算法根据下面迭代公式

    [ heta := heta +alpha abla_ heta l( heta) ]

    更新( heta).我们用一个样例来求导,然后用随机梯度上升算法求解。

    [frac{partial}{partial heta_j}l( heta)=[frac{y}{g( heta^Tx)}-frac{1-y}{1-g( heta^Tx)}]frac{partial}{ heta_j}g( heta^Tx) \ =frac{y-g( heta^Tx)}{g'( heta^Tx)}g'( heta^Tx)x_j=(y-h_ heta(x))x_j ]

    这个形式和最小二乘法得到的一样,区别是模型(h_ heta(x))不一样。我们得到的随机梯度上升迭代公式为

    [ heta_j := heta_j +alpha (y^{(i)}-h_ heta(x^{(i)}))x_j quad foreach ;j ;from ; 1 o n ]

    七、感知机模型

    我们现在来讨论一个具有历史意义的算法,考虑修改逻辑回归算法让结果强制映射为0和1,修改(sigmoid)函数为下面形式

    [g(z)=left { egin{matrix} 0 & z<0\ 1 & z ge 0 end{matrix} ight . ]

    于是

    [h_ heta(x)=g( heta^Tx)=left { egin{matrix} 0 & heta^Tx<0\ 1 & heta^Tx ge 0 end{matrix} ight . ]

    我们得到的( heta)学习规则与前面线性模型一样

    [ heta_j= heta_j+alpha(y^{(i)}-h_ heta(x^{(i)}))x_j^{(i)} ]

    这样,我们就得到了感知机学习算法。在过去,感知机被粗略的认为是大脑中的一个简单的神经元,需要注意尽管感知机算法在形式上和前面讨论的算法相似,但它与逻辑回归和最小二乘回归实际上是不同的模型。特别是将感知机赋予概率的意义,或者是利用极大似然估计来推导它。

    八 牛顿法

    以逻辑回归为例,来讨论另一个最优化算法:牛顿法。下面使用牛顿法来最大化(l( heta)).牛顿法的思想就是通过迭代来找到函数的零点。特别的,假设我们有一个函数(f: extbf{R} mapsto extbf{R}),我们想找到一个( heta)满足(f( heta)=0),这里( heta in R),牛顿法的迭代公式为

    [ heta := heta-frac{f( heta)}{f'( heta)} ]

    这种方法通常有一个直观的解释,我们可以通过一个线性函数来近似(f),该线性函数在当前猜测的( heta)点处与(f)相切,接下来求解线性函数零点,并让下一个猜测点在线性函数的零点位置,如下图![屏幕快照 2018-03-11 11.10.31](../屏幕快照 2018-03-11 11.10.31.png)

    牛顿迭代法给出了一个求解零点的方法,但是我们怎么来通过牛顿迭代法来优化(l( heta))呢?求解(l( heta))的最大值先要求解(l'( heta))的零点,所以上式中我们令(f( heta)=l'( heta)),于是

    [ heta := heta - frac{l'( heta)}{l''( heta)} ]

    在逻辑回归模型中,( heta)是一个向量而不是一个实数,所以我们需要将牛顿法推广到多维的情况,推广公式为

    [ heta := heta - H^{-1} abla_ heta l( heta) ]

    其中,( abla_ heta l( heta))(l( heta))的梯度,(H^{-1})(n)阶方阵(实际上是(n+1)阶),他被称为(Hessian)矩阵,它的元素其实就是(l( heta))二阶偏导数组成的

    [H^{-1}_{i,j}=frac{partial^2 heta}{partial heta_i partial heta_j} ]

    牛顿法是二阶收敛,梯度下降是一阶收敛,牛顿法通常比梯度下降算法收敛速度要快,只需要更少的迭代次数就能获得最小值。然而一次牛顿迭代要比一次梯度下降更昂贵,因为它需要计算(Hessan)矩阵并且求它的逆,这将花费不少时间。但是当参数个数(n)不是太大时,总体来说速度还是要快很多。

  • 相关阅读:
    L2-004. 这是二叉搜索树吗?
    CF934A A Compatible Pair
    CF937B Vile Grasshoppers
    CF940B Our Tanya is Crying Out Loud
    ZOJ 3182 Nine Interlinks
    ZOJ 3175 Number of Containers
    Codeforces Round #193 (Div. 2) B
    CodeForces 149D Coloring Brackets
    POJ 2653 Pick-up sticks(计算几何)
    UVA 12506 Shortest Names
  • 原文地址:https://www.cnblogs.com/tandier/p/8549848.html
Copyright © 2011-2022 走看看