机器学习线性回归之梯度下降

为什么要使用梯度下降
   ∙ \bullet 解析求解法中对N*D的输入矩阵X进行SVD分解的复杂度是 O ( N 2 D ) O(N^2D) O(N2D)
   ∙ \bullet 样本数目N很大或者特征维数D很大时,SVD计算的复杂度很高,或者机器的内存根本就不够。为了解决这个问题,可采用以下方式进行优化求解:梯度下降、随即梯度下降、次梯度下降、坐标轴下降等。梯度下降(Gradient Descent)是求解无约束优化问题最常用的方法之一。算法复杂度的准确定义是什么样的?该段开始的 O ( N 2 D ) O(N^2D) O(N2D)应如何准确地理解呢?突然想到一个问题,什么是NP问题呢?
  
什么是梯度
   ∙ \bullet 在微积分中,一元函数f(x)在x处的梯度为函数在该点的导数 d f / d x df/dx df/dx
   ∙ \bullet 对多元函数 f ( x 1 , . . . , x D ) f(x_{1},...,x_{D}) f(x1,...,xD),在点 x = ( x 1 , . . . , x D ) \mathbf{x} =(x_{1},...,x_{D}) x=(x1,...,xD)处,共有D个偏导数 ∂ f / ∂ x 1 , . . . , ∂ f / ∂ x D \partial f/ \partial x_{1},...,\partial f/\partial x_{D} f/x1,...,f/xD,将这D个偏导数组合成一个D维矢量 ( ∂ f / ∂ x 1 , . . . , ∂ f / ∂ x D ) T (\partial f/ \partial x_{1},...,\partial f/\partial x_{D})^T (f/x1,...,f/xD)T(应该是向量吧),称为函数 f ( x 1 , . . . , x D ) f(x_{1},...,x_{D}) f(x1,...,xD)在x处的梯度。
   ∙ \bullet 梯度一般记作∇或grad,即 ∇ f ( x 1 , . . . , x D ) = g r a d f ( x 1 , . . . , x D ) = ( ∂ f / ∂ x 1 , . . . , ∂ f / ∂ x D ) T \nabla f(x_{1},...,x_{D}) = gradf(x_{1},...,x_{D}) = (\partial f/ \partial x_{1},...,\partial f/\partial x_{D})^T f(x1,...,xD)=gradf(x1,...,xD)=(f/x1,...,f/xD)T   ∙ \bullet 从几何意义上讲,某点的梯度是函数在该点变化最快的方向(PPT里,写的是变化最快的地方,应是笔误)。视频里,老师也画过图,明确表示变化最快的方向是切线的方向,所以之前是不是只有正负两个方向的怀疑是错误的。那么如何理解这个变化最快呢?是说相对于其他方向,沿着变化最快的方向移动相同的长度,自变量x的变化导致的y变化量最大么?如果是这样的话,后边会讲到的更新过程是 w t + 1 = w t − η ∇ J ( w t ) w_{t+1} = w_{t} - \eta \nabla J(w_{t}) wt+1=wtηJ(wt),虽然这个公式用到了梯度,但却没有用到变化最快的逻辑,例如求出的梯度是0.5,但如果用0.6代替0.5,岂不是变化得更快?但公式中也用到了步长 η \eta η这个值,这会使得减去的这一项的值并不等同于梯度,这是不是也就说明了梯度的值(即梯度方向)并不那么重要,重要的是梯度的正负号?
   ∙ \bullet 沿着梯度向量的方向,函数增加最快,更容易找到函数的最大值。同上最后一个问
   ∙ \bullet 沿着负梯度方向,函数减少最快,更容易找到函数的最小值。同上上最后一个问
   ∙ \bullet ∇ \nabla 发音为nabla,表示微分,不属于希腊字母,只是一个记号。但老师读的好像是nabda
   ∙ \bullet PPT里,有一个链接,标题是如何直观形象的理解方向导数与梯度以及它们之间的关系。也许能回答之前提出的问题。
  
何时采用梯度下降法
   ∙ \bullet 如果函数形式比较简单且数据量较小,可以采用解析计算: f ′ ( x ) = 0 f'(x)=0 f(x)=0,否则就需要采用梯度下降法。
  
梯度下降算法基本思想
   ∙ \bullet 1.从t=0开始,初始化 x 0 为随机值 x^0为随机值 x0为随机值;
   ∙ \bullet 2.找到下一个点 x t + 1 x^{t+1} xt+1,使得函数值越来越小,即 f ( x t + 1 ) < f ( x t ) f(x^{t+1}) < f(x^t) f(xt+1)<f(xt);
   ∙ \bullet 3.重复,直到函数值不再减小,则就找到了函数得最小值。
   使用这种方法找到得是局部最小值点,而不是全局极小值点。解决方法是,多尝试几个初始值。那也不能保证找到全局最小值点啊?如果目标函数是凸函数,是不是就没有这个问题了?那么通常使用得Ridge、LASSO等目标函数是凸函数吗?
  
通过泰勒展开证明,要使目标函数减小,就需要向负梯度方向移动
   ∙ \bullet 泰勒展开: f ( x ) ≈ ∑ i = 0 n f ( i ) ( x 0 ) i ! ( x − x 0 ) i f(x) \approx \sum_{i=0}^{n} \frac{f^{(i)}(x_{0})}{i!}(x-x_{0})^i f(x)i=0ni!f(i)(x0)(xx0)i ≈ f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + f ′ ′ ′ ( x 0 ) 3 ! ( x − x 0 ) 3 + . . . + f n ( x 0 ) n ! ( x − x 0 ) n \approx f(x_{0}) + f'(x_{0})(x-x_{0}) + \frac{f''(x_{0})}{2!}(x-x_{0})^2 + \frac{f'''(x_{0})}{3!}(x-x_{0})^3 + ... + \frac{f^n(x_{0})}{n!}(x-x_{0})^n f(x0)+f(x0)(xx0)+2!f′′(x0)(xx0)2+3!f′′′(x0)(xx0)3+...+n!fn(x0)(xx0)n
   ∙ \bullet 根据泰勒公式有 f ( x + △ x ) ≈ f ( x ) + △ x f ′ ( x ) f(x + \triangle x ) \approx f(x) + \triangle xf'(x) f(x+x)f(x)+xf(x)
   ∙ \bullet 要找到函数的最小值,需要 f ( x + △ x ) < f ( x ) f(x + \triangle x) < f(x) f(x+x)<f(x),因此需要求 △ x f ′ ( x ) < 0 \triangle xf'(x) < 0 xf(x)<0
   ∙ \bullet 要使 △ x f ′ ( x ) < 0 \triangle xf'(x) < 0 xf(x)<0,可选择 △ x = − η f ′ ( x ) \triangle x = -\eta f'(x) x=ηf(x),其中 η \eta η为较小的正数,被称作步长,从而使 △ x f ′ ( x ) = − η ( f ′ ( x ) ) 2 < 0 \triangle xf'(x) = -\eta(f'(x))^2 <0 xf(x)=η(f(x))2<0
   ∙ \bullet 因此x的更新: x ( t + 1 ) = x t + △ x = x t − η f ′ ( x ) x^{(t+1)} = x^t + \triangle x = x^{t}-\eta f'(x) x(t+1)=xt+x=xtηf(x)
   ∙ \bullet 即沿负梯度的方向走一小步,会使得 f ( x t + 1 ) < f ( x t ) f(x^{t+1}) < f(x^t) f(xt+1)<f(xt)
   ∙ \bullet 如上所述,梯度下降会使用到一阶导数,因此梯度下降是一中一阶优化算法
  以上是课程上的证明过程,但也存在另一种方法:得出需要 △ x f ′ ( x ) < 0 \triangle xf'(x) < 0 xf(x)<0后,进一步说明 △ x \triangle x x的符号需与f’(x)的符号相反,即 △ x \triangle x x与f’(x)的方向正好相反。

OLS梯度下降的公式推导
   ∙ \bullet OLS的目标函数为: J ( w ) = ∑ i = 1 N ( y i − w T X i ) 2 = ∣ ∣ y − X w ∣ ∣ 2 2 = ( y − X w ) T ( y − X w ) J(\mathbf w) = \sum_{i=1}^{N}(y_{i} - \mathbf w^TX_{i})^2 = ||\mathbf y - \mathbf X \mathbf w||_{2}^2 = (\mathbf y - \mathbf X \mathbf w) ^T (\mathbf y - \mathbf X \mathbf w) J(w)=i=1N(yiwTXi)2=∣∣yXw22=(yXw)T(yXw)
   ∙ \bullet 梯度: ∇ J ( w ) = − 2 X T y + − 2 X T X w = − 2 X T ( y − X w ) \nabla J(\mathbf w) = -2\mathbf X^T \mathbf y + -2\mathbf X^T\mathbf X\mathbf w =-2\mathbf X^T(\mathbf y-\mathbf X\mathbf w) J(w)=2XTy+2XTXw=2XT(yXw)
  解析求解中,对OLS目标函数求导得到的结果,与上式完全相同,只是接下来的步骤就不一样了,解析求解会令导数为0,而梯度下降会初始化参数,然后进行梯度下降。
   ∙ \bullet 梯度下降: w t + 1 = w t − η ∇ J ( w t ) = w t + 2 η X T ( y − X w t ) \mathbf w^{t+1} = \mathbf w^{t} - \eta \nabla J(\mathbf w^t) = \mathbf w^t + 2\eta X^T(\mathbf y-X\mathbf w^t) wt+1=wtηJ(wt)=wt+2ηXT(yXwt)
  通过上式可知,参数的更新量和“输入与预测残差的相关性”有关。老师还说道输入X和残差这各方向上很相关性的话,走的步子可以长一点。应如何理解这句话呢?还应再复习协方差、相关性等概念并沉淀成笔记。两个变量相乘就是算相关性吗?这个与协方差、皮尔森相关性又有什么异同呢?

OLS梯度下降算法
   ∙ \bullet 1.从t = 0开始,初始化 w t w^t wt为较小的随机值(或0)注意:是较小的随机值或0
   ∙ \bullet 2.计算目标函数J(w)在当前值的梯度: ∇ J ( w t ) \nabla J(w^t) J(wt)
   ∙ \bullet 3.根据学习率 η \eta η,更新参数 w t + 1 = w t − η ∇ J ( w t ) w^{t+1} = w^t - \eta \nabla J(w^t) wt+1=wtηJ(wt)
   ∙ \bullet 4.判断是否满足终止条件,如果满足,则循环结束,返回最佳参数 w t + 1 w^{t+1} wt+1和目标函数极小值 J ( w t + 1 ) J(w^{t+1}) J(wt+1),否则转到第二步。
  迭代终止条件:1.迭代次数达到设定的最大次数;2.目标函数值的变化很小: J ( w t ) − J ( w t + 1 ) J ( w t ) < ϵ \frac{J(w^t) - J(w^{t+1})}{J(w^t)}<\epsilon J(wt)J(wt)J(wt+1)<ϵ.
  该OLS梯度下降算法的标题来源于PPT,尽管是OLS的下降算法,但也适用于其他目标函数,比如Ridge。

岭回归的梯度下降
   ∙ \bullet 岭回归的目标函数: J ( w ) = ∣ ∣ y − X w ∣ ∣ 2 2 + λ ∣ ∣ w ∣ ∣ 2 2 J(\mathbf w) = ||\mathbf y - \mathbf X \mathbf w||_{2}^2 + \lambda||\mathbf w||_{2}^2 J(w)=∣∣yXw22+λ∣∣w22   ∙ \bullet 梯度为: ∇ J ( w ) = − 2 X T y + − 2 X T X w \nabla J(\mathbf w) = -2\mathbf X^T \mathbf y + -2\mathbf X^T\mathbf X\mathbf w J(w)=2XTy+2XTXw
   ∙ \bullet 梯度下降过程同OLS

LASSO不能使用梯度下降
   ∙ \bullet LASSO的目标函数为: J ( w ) = ∣ ∣ y − X w ∣ ∣ 2 2 + λ ∣ ∣ w ∣ ∣ 1 J(\mathbf w) = ||\mathbf y - \mathbf X \mathbf w||_{2}^2 + \lambda||\mathbf w||_{1} J(w)=∣∣yXw22+λ∣∣w1
   ∙ \bullet 其中的绝对值函数 ∣ ∣ w ∣ ∣ 1 ||w||_{1} ∣∣w1在原点w=0处不可导,无法用梯度下降法求解。解决方法有两种,分别是:1.用次梯度概念替换梯度概念,得到次梯度法;2.使用坐标轴下降法。这两种方法,后边都会讲到。

梯度下降实用tips
   ∙ \bullet 1. 学习率 η \eta η设置需小心,太大可能引起目标函数数值震荡不收敛,太小收敛速度慢。可采用自适应学习率(深度学习部分会学习更多的自适应学习率算法)。
   ∙ \bullet 2. 梯度下降对特征的取值范围敏感。建议对输入特征X最好作去量纲处理(可用sklearn.preprocessing.StandardScaler实现,MinMaxScale也可以)。那么去量纲的准确含义是什么呢?
   ∙ \bullet 3.上边OLS梯度下降公式推导那一部分,还提到如果特征与残差在这个方向的相关性很强的话,步子可以走得更大一些。
   ∙ \bullet 4. PPT上有一个链接需要看

随机梯度下降(SGD)
   ∙ \bullet 当样本中存在冗余信息时(梯度正负抵消或相似),梯度下降的效率不高,所以要用随即梯度下降。为什么这就效率不高了,是因为重复计算吗?那为什么随即梯度下降得到的结果一定正确呢?
   ∙ \bullet 每次梯度下降更新时,只计算一个样本上的梯度。
   ∙ \bullet 推荐阅读:为什么我们更宠爱“随机”梯度下降?(SGD)
https://zhuanlan.zhihu.com/p/28060786
   ∙ \bullet 为了确保收敛,相比于同等条件下的梯度下降,随即梯度下降需要采用更小的步长和更多的迭代轮数。因为一个样本的梯度存在较大的随即性,如果向负梯度方向走得太多,再去做调整,会花费较大得精力。
   ∙ \bullet 相比于非随即算法,随即梯度下降的前期迭代效果比较显著。
   ∙ \bullet 小批量梯度下降法(MBGD):介于一次使用所有样本(批处理梯度下降BGD)和一次使用一个样本(随即梯度下降SGD)之间,实践中常采用小批量样本(mini-batch)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值