**梯度:**在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。沿着梯度向量的方向,函数增长最快,反向减少最快。
**梯度下降与梯度上升:**在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。
梯度下降法算:
起点(山顶)找最陡峭的位置向下走一步(梯度的负方向),继续求解当前位置梯度,走最陡峭的下山,走一步看一步。梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。
概念:
步长(Learning rate):延梯度每一步长度
特征(feature):指的是样本中输入部分
假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为
h
θ
(
x
)
h_{\theta}(x)
hθ(x)。
损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。
J
(
θ
0
,
θ
1
)
=
∑
i
=
1
m
(
h
θ
(
x
i
)
−
y
i
)
2
J(\theta_0, \theta_1) = \sum\limits_{i=1}^{m}(h_\theta(x_i) - y_i)^2
J(θ0,θ1)=i=1∑m(hθ(xi)−yi)2 计算结果和实际结果的方差。其中
x
i
x_i
xi表示第i个样本特征,
y
i
y_i
yi表示第i个样本对应的输出,
h
θ
(
x
i
)
h_\theta(x_i)
hθ(xi)为假设函数。
梯度下降的详细算法
先决条件: 确认优化模型的假设函数和损失函数。
比如对于线性回归,假设函数表示为
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn, 其中$ \theta_{j}$ (j = 0,1,2… n)为模型参数,
x
j
x_j
xj (j = 0,1,2… n)为每个样本的n个特征值。这个表示可以简化,我们增加一个特征
x
0
=
1
x_0=1
x0=1 ,这样
h
θ
(
x
0
,
x
1
,
.
.
.
x
n
)
=
∑
j
=
0
n
θ
j
x
j
h_\theta(x_0, x_1, ...x_n) =\sum\limits_{j=0}^{n}\theta_{j}x_{j}
hθ(x0,x1,...xn)=j=0∑nθjxj。同样是线性回归,对应于上面的假设函数,损失函数为:
J
(
θ
0
,
θ
1
.
.
.
,
θ
n
)
=
∑
i
=
0
m
(
h
θ
(
x
0
(
i
)
,
x
1
(
i
)
,
.
.
.
x
n
(
i
)
)
−
y
i
)
2
J(\theta_0, \theta_1..., \theta_n) = \sum\limits_{i=0}^{m}(h_\theta(x_0^{(i)}, x_1^{(i)}, ...x_n^{(i)}) - y_i)^2
J(θ0,θ1...,θn)=i=0∑m(hθ(x0(i),x1(i),...xn(i))−yi)2, 如果前面有系数参考线性回归损失函数为什么要用平方形式。
算法相关参数初始化:主要是初始化
θ
0
,
θ
1
.
.
.
,
θ
n
\theta_0, \theta_1..., \theta_n
θ0,θ1...,θn,算法终止距离
ε
\varepsilon
ε以及步长
α
\alpha
α。在没有任何先验知识的时候,我喜欢将所有的
θ
\theta
θ初始化为0, 将步长初始化为1。在调优的时候再优化。
算法过程:
1.确定损失函数,对
θ
i
\theta_i
θi:
∂
∂
θ
i
J
(
θ
0
,
θ
1
.
.
.
,
θ
n
)
\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)
∂θi∂J(θ0,θ1...,θn).
2.确定步长:
α
∂
∂
θ
i
J
(
θ
0
,
θ
1
.
.
.
,
θ
n
)
\alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)
α∂θi∂J(θ0,θ1...,θn).
3.确定是否所有的
t
h
e
t
a
i
theta_i
thetai,梯度下降的距离都小于
ε
\varepsilon
ε,如果小于
ε
\varepsilon
ε则算法终止,当前所有的
t
h
e
t
a
i
theta_i
thetai(i=0,1,…n)即为最终结果。否则进入步骤4.
4.更新所有的
t
h
e
t
a
theta
theta,对于
t
h
e
t
a
i
theta_i
thetai,其更新表达式如下。更新完毕后继续转入步骤1.
θ
i
=
θ
i
−
α
∂
∂
θ
i
J
(
θ
0
,
θ
1
.
.
.
,
θ
n
)
\theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)
θi=θi−α∂θi∂J(θ0,θ1...,θn).
梯度下降的算法调优:
- 算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。
- 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望 x ‾ \overline{x} x和标准差std(x),然后转化为:
x
−
x
‾
s
t
d
(
x
)
\frac{x - \overline{x}}{std(x)}
std(x)x−x
这样特征的新期望为0,新方差为1,迭代次数可以大大加快。
转载梯度下降(Gradient Descent)小结