为什么要使用梯度下降
∙
\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=0∑ni!f(i)(x0)(x−x0)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)(x−x0)+2!f′′(x0)(x−x0)2+3!f′′′(x0)(x−x0)3+...+n!fn(x0)(x−x0)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=1∑N(yi−wTXi)2=∣∣y−Xw∣∣22=(y−Xw)T(y−Xw)
∙
\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(y−Xw)
解析求解中,对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(y−Xwt)
通过上式可知,参数的更新量和“输入与预测残差的相关性”有关。老师还说道输入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)=∣∣y−Xw∣∣22+λ∣∣w∣∣22
∙
\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)=∣∣y−Xw∣∣22+λ∣∣w∣∣1
∙
\bullet
∙ 其中的绝对值函数
∣
∣
w
∣
∣
1
||w||_{1}
∣∣w∣∣1在原点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)