在上一节(线性回归)中介绍,在线性回归中参数值 θ \theta θ是不一定可以求出的,但是可以通过梯度下降的方式可求。
在微积分里面,对多元函数的参数求偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数 f ( x , y ) f(x,y) f(x,y), 分别对x,y求偏导数,求得的梯度向量就是 ( ∂ f ∂ x , ∂ f ∂ y ) T (\frac {\partial f}{\partial x},\frac {\partial f}{\partial y})^T (∂x∂f,∂y∂f)T,简称grad f(x,y)或者 ∇ f ( x , y ) \nabla f(x,y) ∇f(x,y)。对于在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)的具体梯度向量就是 ( ∂ f ∂ x 0 , ∂ f ∂ y 0 ) T (\frac {\partial f}{\partial x_0},\frac {\partial f}{\partial y_0})^T (∂x0∂f,∂y0∂f)T.或者 ∇ f ( x 0 , y 0 ) \nabla f(x_0,y_0) ∇f(x0,y0),如果是3个参数的向量梯度,就是 ( ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z ) T (\frac {\partial f}{\partial x}, \frac {\partial f}{\partial y},\frac{\partial f}{\partial z})^T (∂x∂f,∂y∂f,∂z∂f)T,以此类推。
那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数 f ( x , y ) f(x,y) f(x,y),在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),沿着梯度向量的方向就是 ( ∂ f ∂ x 0 , ∂ f ∂ y 0 ) T (\frac {\partial f}{\partial x_0},\frac {\partial f}{\partial y_0})^T (∂x0∂f,∂y0∂f)T的方向是 f ( x , y ) f(x,y) f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 − ( ∂ f ∂ x 0 , ∂ f ∂ y 0 ) T -(\frac {\partial f}{\partial x_0},\frac {\partial f}{\partial y_0})^T −(∂x0∂f,∂y0∂f)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。
假设目标函数 J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) − y ( i ) ) 2 ) J(\theta_0,\theta_1)=\frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)} - y^{(i)})^2) J(θ0,θ1)=2m1∑i=1m(hθ(x(i)−y(i))2)。
为什么要除以样本个数
m
m
m?
假如有1万个样本,那么会得到一个目标函数
J
(
θ
)
1
J(\theta)_1
J(θ)1,10万个样本,得到一个目标函数
J
(
θ
)
2
J(\theta)_2
J(θ)2,那么10万个样本的损失值一定比1万个样本的损失值大,但不能说10万个样本的模型不好,因此需要算一个平均值
1
m
\frac{1}{m}
m1。
我们的目标就是要寻找最低点,什么样的参数能使得目标函数达到最低点?
当开始的时候,是一个随机点:
- 找到当前最合适的方向
- 走一小步,如果走快了就“跌倒”了
- 按照方向与步伐去更新参数
批量梯度下降GD
在上面的说法中,要综合考虑所有的样本,每个样本都需要参与计算,这个计算量是非常大的,很难进行迭代,虽然很容易得到最优解。
∂
f
∂
θ
i
=
−
1
m
∑
i
=
1
m
(
y
i
−
h
θ
(
x
i
)
)
x
j
i
\frac {\partial f}{\partial \theta_i}=-\frac{1}{m}\sum_{i=1}^m(y^i-h_\theta(x^i))x_j^i
∂θi∂f=−m1i=1∑m(yi−hθ(xi))xji
θ j ′ = θ j + 1 m ∑ i = 1 m ( y i − h θ ( x i ) x j i ) \theta_j^\prime=\theta_j+\frac{1}{m}\sum_{i=1}^m(y^i-h_\theta(x^i)x^i_j) θj′=θj+m1i=1∑m(yi−hθ(xi)xji)
随机梯度下降SGD
每次找一个样本,迭代速度快,但不一定每次都朝着收敛的方向,无法判断好坏。
θ
j
′
=
θ
j
+
(
y
i
−
h
θ
(
x
i
)
)
x
j
i
\theta_j^\prime=\theta_j+(y^i-h_\theta(x^i))x_j^i
θj′=θj+(yi−hθ(xi))xji
小批量梯度下降
每次更新选择一小部分数据来算,比较实用。首先打乱顺序,然后每次拿10个数据
θ
j
:
=
θ
j
−
α
1
10
∑
k
=
i
i
+
9
(
h
θ
(
x
(
k
)
−
y
(
k
)
)
)
x
j
(
k
)
\theta_j :=\theta_j-\alpha\frac{1}{10}\sum_{k=i}^{i+9}(h_\theta(x^{(k)}-y^{(k)}))x_j^{(k)}
θj:=θj−α101k=i∑i+9(hθ(x(k)−y(k)))xj(k)