源码传送门
\quad\quad
搜索算法是最优化理论中的内容,搜索算法的目的是寻找最优解。在绝大多数的机器学习算法没有精确的数学表达式不容易直接求出最优解,而搜索算法是寻找最优解更具有一般性的优化算法。
4.1 梯度下降算法与次梯度下降算法
4.1.1 梯度下降算法
\quad\quad
梯度下降算法的思路可以描述为:假定目标函数可微,算法从任一给定的初始点开始进行指定轮数的搜索,每一轮搜索都计算目标函数在当前点的梯度,并沿着负梯度方向按照一定的步长移动到下一个可行点。
\quad\quad
下图是梯度下降算法的运行过程:
算法任务是如下无约束优化问题:
m
i
n
w
∈
R
n
F
(
w
)
\underset{w\in \mathbb{R^n}}{min}F(w)
w∈RnminF(w)
其中目标函数
F
F
F是可微的
n
n
n元实函数。算法包含两个参数,搜索轮数
N
N
N,搜索步长
η
>
0
\eta>0
η>0,
η
\eta
η称为学习率。初始时
w
w
w为全
0
0
0向量。随后
N
N
N轮循环,每轮循环都沿
∇
F
(
w
)
\nabla F(w)
∇F(w)反方向前进一小步,步长为
η
\eta
η。
w
←
w
−
η
∇
F
(
w
)
(4.1)
w\leftarrow w-\eta \nabla F(w) \tag{4.1}
w←w−η∇F(w)(4.1)
这里学习率是一个固定值也可以将学习率随迭代次数增大而变小
η
t
=
η
0
η
1
+
t
\eta_t=\frac{\eta_0}{\eta_1+t}
ηt=η1+tη0
η
t
\eta_t
ηt表示第
t
t
t轮迭代的学习率,
t
t
t表示迭代轮数,
η
0
\eta_0
η0
η
1
\eta_1
η1是两个常参数
梯度下降算法
w = 0 w=0 w=0
for t=1,2,…,N:
w ← w − η ∇ F ( w ) \quad\quad w\leftarrow w-\eta \nabla F(w) w←w−η∇F(w)
return w w w
下面分析梯度下降算法的收敛原理,在任意一点
w
w
w,根据多元函数泰勒展开公式对任意
u
u
u有
F
(
u
)
=
F
(
w
)
+
<
∇
F
(
w
)
,
u
−
w
>
+
1
2
(
u
−
w
)
T
∇
2
F
(
w
)
(
u
−
w
)
+
.
.
.
F(u)=F(w)+<\nabla F(w),u-w>+\frac12(u-w)^T\nabla^2F(w)(u-w)+...
F(u)=F(w)+<∇F(w),u−w>+21(u−w)T∇2F(w)(u−w)+...
取
u
=
w
−
η
∇
F
(
w
)
u=w-\eta\nabla F(w)
u=w−η∇F(w)并带入上式得到
F
(
u
)
=
F
(
w
)
−
η
∥
∇
F
(
w
)
∥
2
+
o
(
η
)
F(u)=F(w)-\eta \begin{Vmatrix} \nabla F(w)\end{Vmatrix}^2+o(\eta)
F(u)=F(w)−η∥
∥∇F(w)∥
∥2+o(η)
梯度下降算法的收敛原理从几何上看就是梯度方向是函数值增大最快的方向,负梯度方向就是函数值下降最快的方向。函数值不断下降,不断接近最优解。
\quad\quad
正规方程是求解线性回归问题的重要算法,但是需要计算矩阵的逆,而求矩阵逆的时间复杂度是
o
(
n
3
)
o(n^3)
o(n3)当特征数非常多时,求解正规方程的计算量较大。
eg:用梯度下降求解线性回归问题,设目标函数为均方误差
F
(
w
)
=
∥
X
w
−
y
∥
2
/
m
F(w)=\begin{Vmatrix} Xw-y \end{Vmatrix}^2/m
F(w)=∥
∥Xw−y∥
∥2/m,梯度为
∇
F
(
w
)
=
2
m
X
T
(
X
w
−
y
)
(4.2)
\nabla F(w)=\frac{2}{m}X^T(Xw-y) \tag{4.2}
∇F(w)=m2XT(Xw−y)(4.2)
4.1.2 次梯度下降算法
前面的梯度下降算法要求目标函数可微,而次梯度下降算法就是为了解决目标函数不可微的情况。
次梯度:设
F
:
R
n
→
R
F:\mathbb{R^n\rightarrow R}
F:Rn→R为一个
n
n
n元函数。如果
w
,
v
∈
R
n
w,v\in\mathbb{R^n}
w,v∈Rn满足如下性质:
F
(
u
)
≥
F
(
w
)
+
<
v
,
u
−
w
>
,
∀
u
∈
R
n
(4.3)
F(u)\geq F(w)+<v,u-w>,\forall u\in\mathbb{R^n} \tag{4.3}
F(u)≥F(w)+<v,u−w>,∀u∈Rn(4.3)
则称
v
v
v是
F
F
F在
w
w
w处的一个次梯度,称集合
∂
F
(
w
)
=
{
v
∈
R
n
:
v
为
F
在
w
处的次梯度
}
\partial F(w)=\{v\in\mathbb{R^n}:v为F在w处的次梯度\}
∂F(w)={v∈Rn:v为F在w处的次梯度}为
F
F
F在
w
w
w处的次梯度集。
下图是对次梯度的几何解释
定理:如果
F
F
F是凸函数,且在
w
w
w处可微,则
∂
F
(
w
)
=
{
∇
F
(
w
)
}
\partial F(w)=\{ \nabla F(w)\}
∂F(w)={∇F(w)}
次梯度下降和梯度下降的区别仅仅体现在梯度集合的一个扩充。
那么前面线性回归算法中
L
1
L_1
L1正则化(Lasso回归)的次梯度就可以表示为:
∂
F
(
w
)
=
2
m
X
T
(
X
w
−
y
)
+
λ
u
(4.4)
\partial F(w)=\frac{2}{m}X^T(Xw-y)+\lambda u \tag{4.4}
∂F(w)=m2XT(Xw−y)+λu(4.4)
其中
u
i
=
{
1
,
如果
w
i
>
0
0
,
如果
w
i
=
0
1
,
如果
w
i
<
0
(4.5)
u_i=\begin{cases} 1,如果w_i>0 \\ 0,如果w_i=0 \\ 1,如果w_i<0 \end{cases} \tag{4.5}
ui=⎩
⎨
⎧1,如果wi>00,如果wi=01,如果wi<0(4.5)
当然也可以直接用
S
i
g
n
Sign
Sign函数表示
源码去开头传送门
4.2 随机梯度下降算法
在经验损失最小化算法中,目标函数:
m
i
n
w
∈
R
n
F
(
w
)
=
1
m
l
(
h
w
(
x
(
i
)
)
,
y
(
i
)
)
\underset{w\in\mathbb{R^n}}{min}F(w)=\frac{1}{m}l(h_w(x^{(i)}),y^{(i)})
w∈RnminF(w)=m1l(hw(x(i)),y(i))
在计算时需要先计算梯度
∇
F
(
w
)
=
1
m
∑
i
=
1
m
∇
l
(
h
w
(
x
(
i
)
)
,
y
(
i
)
)
\nabla F(w)=\frac {1}{m}\sum_{i=1}^m \nabla l(h_w(x^{(i)}),y^{(i)})
∇F(w)=m1i=1∑m∇l(hw(x(i)),y(i))
但是也可以发现,为了计算梯度
∇
F
(
w
)
\nabla F(w)
∇F(w),需要对每条数据进行计算,这是一个非常耗时的计算。所以就有了随机梯度下降。
∇
F
(
w
)
=
E
[
∇
l
(
h
w
(
x
(
i
)
)
,
y
(
i
)
)
]
(4.6)
\nabla F(w)=E[ \nabla l(h_w(x^{(i)}),y^{(i)})] \tag{4.6}
∇F(w)=E[∇l(hw(x(i)),y(i))](4.6)
上式的意思是任取一条数据
(
x
(
i
)
,
y
(
i
)
)
(x^{(i)},y^{(i)})
(x(i),y(i))计算出梯度的期望都等于所有数据计算出的梯度。
那么随机梯度下降算法就是选出一条数据计算梯度
∇
F
(
w
)
=
∇
l
(
h
w
(
x
(
i
)
)
,
y
(
i
)
)
\nabla F(w)=\nabla l(h_w(x^{(i)}),y^{(i)})
∇F(w)=∇l(hw(x(i)),y(i))
随机梯度下降在刚接触的时候会感觉很奇怪,但确实是一个很有效的算法。
下图是梯度下降和随机梯度下降算法收敛过程的对比,虽然随机梯度下降算法过程很崎岖但是总体上都在朝着目标前进。
下面再来介绍小批量梯度下降算法,因为梯度下降算法的计算量大,随机梯度下降算法需要样本在较多的时候才会有较好的效果,所以就有了小批量梯度下降算法。
4.3 牛顿迭代算法
牛顿迭代算法的证明:
f
(
w
)
=
f
(
u
)
+
f
′
(
u
)
(
w
−
u
)
+
o
(
w
−
u
)
f(w)=f(u)+f'(u)(w-u)+o(w-u)
f(w)=f(u)+f′(u)(w−u)+o(w−u)
假定
w
∗
w^*
w∗为函数
f
f
f的
0
0
0点,即
f
(
w
∗
)
=
0
f(w^*)=0
f(w∗)=0,带入上式就得到
w
∗
=
u
−
f
(
u
)
f
′
(
u
)
−
o
(
w
∗
−
u
)
w^*=u-\frac{f(u)}{f'(u)}-o(w^*-u)
w∗=u−f′(u)f(u)−o(w∗−u)
(书上的证明我也看不太懂)
结论就是
w
←
w
−
f
(
w
)
f
′
(
w
)
w\leftarrow w-\frac{f(w)}{f'(w)}
w←w−f′(w)f(w)
不断迭代就可以找到
w
w
w 使
f
(
w
)
=
0
f(w)=0
f(w)=0。(当然是无限接近,也可能是完全等于0)
但我们需要的并不是函数值等于零的点,而是最小值点,即在凸优化中梯度等于零的点。只需要将迭代过程变为如下形式
w
←
w
−
F
′
(
w
)
F
′
′
(
w
)
(4.7)
w\leftarrow w-\frac{F'(w)}{F''(w)}\tag{4.7}
w←w−F′′(w)F′(w)(4.7)
就可以找到
F
′
(
w
)
=
0
F'(w)=0
F′(w)=0的点即最小值点
具体表示出来就是:
w
←
w
−
∇
2
F
(
w
)
−
1
∇
F
(
w
)
w\leftarrow w-\nabla^2F(w)^{-1}\nabla F(w)
w←w−∇2F(w)−1∇F(w)
在最优化理论中牛顿迭代算法我记着好像有两种形式,在迭代过程还有调整这里只给出了一种,不是特别清楚。
没记错的话在最优化理论中还有共轭梯度下降算法可以通过n次迭代找到n元2次多项式的最小值点
在线性回归中设定初始点为0,则只需要一步就可以就可以找到线性回归中的最优值:
w
=
−
∇
2
F
(
0
)
−
1
∇
F
(
0
)
=
(
X
T
X
)
−
1
X
T
y
w=-\nabla^2F(0)^{-1}\nabla F(0)=(X^TX)^{-1}X^Ty
w=−∇2F(0)−1∇F(0)=(XTX)−1XTy
(这里的原因就是两个的计算结果相同)也从另一方面作证了牛顿迭代算法的正确性
4.4 坐标下降算法
梯度下降算法主要针对无约束优化问题,坐标下降算法可以用来求解带约束优化问题。
坐标下降算法过程是,分别沿着每个坐标轴进行优化
eg:
m
i
n
f
=
x
1
2
+
x
2
2
minf=x_1^2+x_2^2
minf=x12+x22,初始点
(
2
,
1
)
(2,1)
(2,1)
step1:对
x
1
x_1
x1优化,
m
i
n
f
=
x
1
2
+
1
minf=x_1^2+1
minf=x12+1,结果是
(
0
,
1
)
(0,1)
(0,1)
step2:对
x
2
x_2
x2优化,
m
i
n
f
=
x
2
2
minf=x_2^2
minf=x22,结果是
(
0
,
0
)
(0,0)
(0,0)
下面通过一个例子提出柔和阈值函数
Lasso回归的坐标下降算法
F
(
w
)
=
∑
i
=
1
m
(
<
w
,
x
(
i
)
>
−
y
(
i
)
)
2
/
m
+
λ
∣
w
∣
F(w)=\sum_{i=1}^m(<w,x^{(i)}>-y^{(i)})^2/m+\lambda|w|
F(w)=i=1∑m(<w,x(i)>−y(i))2/m+λ∣w∣
可行域
W
=
R
n
W=\mathbb{R^n}
W=Rn,在实现坐标下降算法时,需要对任意坐标方向
j
(
1
<
=
j
<
=
n
)
j(1<=j<=n)
j(1<=j<=n)计算相应的单变量优化问题
w
∗
=
a
r
g
m
i
n
w
∈
R
F
(
u
,
w
−
j
)
w^*=\underset{w\in\mathbb{R}}{argmin}F(u,w_{-j})
w∗=w∈RargminF(u,w−j)
将上式
F
(
u
,
w
−
j
)
F(u,w_{-j})
F(u,w−j)用
f
(
u
)
f(u)
f(u)表示出来为如下形式:
f
(
u
)
=
1
m
∑
i
=
1
m
(
u
x
j
(
i
)
+
<
w
−
j
,
x
−
j
(
i
)
>
−
y
(
i
)
)
2
+
λ
∣
u
∣
+
λ
∣
w
−
j
∣
f(u)=\frac1m\sum_{i=1}^m(ux_j^{(i)}+<w_{-j},x_{-j}^{(i)}>-y^{(i)})^2+\lambda|u|+\lambda|w_{-j}|
f(u)=m1i=1∑m(uxj(i)+<w−j,x−j(i)>−y(i))2+λ∣u∣+λ∣w−j∣
对上式解释
w
−
j
w_{-j}
w−j的意思是原来的
w
w
w去掉第
j
j
j个分量,
u
u
u表示的就是
w
w
w中的第
j
j
j个分量,
x
x
x同样道理。
例如
w
=
[
1
,
2
,
3
]
w=[1,2,3]
w=[1,2,3],
w
−
1
=
[
2
,
3
]
w_{-1}=[2,3]
w−1=[2,3]这时的
u
=
1
u=1
u=1
为简化记号
e
j
(
i
)
=
<
w
−
j
,
x
−
j
(
i
)
>
−
y
(
i
)
e_j^{(i)}=<w_{-j},x_{-j}^{(i)}>-y^{(i)}
ej(i)=<w−j,x−j(i)>−y(i)则
f
(
u
)
=
1
m
∑
i
=
1
m
(
u
x
j
(
i
)
+
e
j
(
i
)
)
2
+
λ
∣
u
∣
+
λ
∣
w
−
j
∣
(4.8 )
f(u)=\frac1m\sum_{i=1}^m(ux_j^{(i)}+e_j^{(i)})^2+\lambda|u|+\lambda|w_{-j}|\tag{4.8 }
f(u)=m1i=1∑m(uxj(i)+ej(i))2+λ∣u∣+λ∣w−j∣(4.8 )
(4.8)式时凸函数,并且有重要的推论
f
(
u
∗
)
=
m
i
n
u
∈
R
f(u^*)=\underset{u\in\mathbb{R}}{min}
f(u∗)=u∈Rmin的充分必要条件为
0
∈
∂
f
(
u
∗
)
0\in\partial f(u^*)
0∈∂f(u∗),
∂
f
(
u
∗
)
\partial f(u^*)
∂f(u∗)为次梯度集合。
下面就来求解上面的最优解
定义
α
j
=
2
m
∑
i
=
1
m
(
x
j
(
i
)
)
2
,
β
j
=
2
m
∑
i
=
1
m
x
j
(
i
)
e
j
(
i
)
(4.9)
\alpha_j=\frac2m\sum_{i=1}^m(x_j^{(i)})^2,\beta_j=\frac2m\sum_{i=1}^mx_j^{(i)}e_j^{(i)}\tag{4.9}
αj=m2i=1∑m(xj(i))2,βj=m2i=1∑mxj(i)ej(i)(4.9)
次梯度集合
∂
f
(
u
)
=
{
{
α
j
u
+
β
j
+
λ
}
,
如果
u
>
0
[
β
j
−
λ
,
β
j
+
λ
]
,
如果
u
=
0
{
α
j
u
+
β
j
−
λ
}
,
如果
u
<
0
(4.10)
\partial f(u)= \begin{cases} \{\alpha_ju+\beta_j+\lambda\}, & 如果u>0 \\ [\beta_j-\lambda,\beta_j+\lambda], & 如果u = 0 \\ \{\alpha_ju+\beta_j-\lambda\}, & 如果u < 0 \\ \end{cases} \tag{4.10}
∂f(u)=⎩
⎨
⎧{αju+βj+λ},[βj−λ,βj+λ],{αju+βj−λ},如果u>0如果u=0如果u<0(4.10)
刚刚的推论在这里就要用上,充分必要条件需要0在次梯度集中
下面分类讨论来解:
当
β
j
<
−
λ
\beta_j<-\lambda
βj<−λ时,如果
u
∗
<
0
u^*<0
u∗<0,则
α
j
u
+
β
j
−
λ
<
0
\alpha_ju+\beta_j-\lambda<0
αju+βj−λ<0;
如果
u
∗
=
0
u^*=0
u∗=0则区间
[
β
j
−
λ
,
β
j
+
λ
]
[\beta_j-\lambda,\beta_j+\lambda]
[βj−λ,βj+λ]均小于0
所以仅当
u
∗
>
0
u^*>0
u∗>0时,
f
f
f有唯一梯度
α
j
u
+
β
j
+
λ
\alpha_ju+\beta_j+\lambda
αju+βj+λ,并且
0
∈
∂
f
(
u
∗
)
0\in\partial f(u^*)
0∈∂f(u∗)
所以
{
α
j
u
+
β
j
+
λ
=
0
u
∗
>
0
\begin{cases} \alpha_ju+\beta_j+\lambda=0 \\ u^*>0 \end{cases}
{αju+βj+λ=0u∗>0
唯一解:
u
∗
=
−
β
j
+
λ
α
j
u^*=-\frac{\beta_j+\lambda}{\alpha_j}
u∗=−αjβj+λ
用同样方法解:
当
β
>
λ
\beta>\lambda
β>λ时,
u
∗
=
−
β
j
−
λ
α
j
u^*=-\frac{\beta_j-\lambda}{\alpha_j}
u∗=−αjβj−λ
当
−
λ
≤
β
j
≤
λ
-\lambda\leq\beta_j\leq\lambda
−λ≤βj≤λ时,
u
∗
=
0
u^*=0
u∗=0
综上所述:
u
∗
=
{
−
β
j
+
λ
α
j
如果
β
j
<
−
λ
0
如果
−
λ
≤
β
j
≤
λ
−
β
j
−
λ
α
j
如果
β
>
λ
(4.11)
u^*= \begin{cases} -\frac{\beta_j+\lambda}{\alpha_j} & 如果\beta_j<-\lambda \\ 0 & 如果-\lambda\leq\beta_j\leq\lambda \\ -\frac{\beta_j-\lambda}{\alpha_j} &如果 \beta>\lambda \\ \end{cases} \tag{4.11}
u∗=⎩
⎨
⎧−αjβj+λ0−αjβj−λ如果βj<−λ如果−λ≤βj≤λ如果β>λ(4.11)
这就使最后的解。
那么接下来就来说明柔和函数:
S
t
(
x
)
=
{
x
−
t
如果
x
>
t
0
如果
−
t
≤
x
≤
t
x
+
t
如果
x
<
−
t
(4.12)
S_t(x)= \begin{cases} x-t & 如果x>t \\ 0 & 如果-t\leq x \leq t \\ x+t &如果 x<-t \\ \end{cases} \tag{4.12}
St(x)=⎩
⎨
⎧x−t0x+t如果x>t如果−t≤x≤t如果x<−t(4.12)
(4.11)和(4.12)其实是一样的只需
x
=
−
β
j
α
j
,
t
=
λ
α
j
x=-\frac{\beta_j}{\alpha_j},t=\frac{\lambda}{\alpha_j}
x=−αjβj,t=αjλ就可以
坐标下降中每一步中第j个坐标的的求解都是结果(4.12)
最后去学习代码是怎么写的,因为在操作的时候很容易出现维度不匹配。