week2-part3 梯度下降法 Gradient Descent
1.直观解释
在上一节我们指出,
预
测
值
y
^
=
σ
(
w
t
x
+
b
)
,
σ
(
z
)
=
1
1
+
e
−
z
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
^
(
i
)
,
y
(
i
)
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
log
y
^
(
i
)
+
(
1
−
y
(
i
)
)
log
(
1
−
y
^
(
i
)
)
预测值\ \hat{y} = \sigma(w^t x + b), \sigma(z) = \frac{1}{1 + e^{-z}} \\ J(w, b) = \frac{1}{m}\sum_{i = 1}^{m}L(\hat{y}^{(i)}, y^{(i)}) = -\frac{1}{m}\sum_{i = 1}^{m}y^{(i)}\log\hat{y}^{(i)}+(1 - y^{(i)})\log(1 - \hat{y}^{(i)})
预测值 y^=σ(wtx+b),σ(z)=1+e−z1J(w,b)=m1i=1∑mL(y^(i),y(i))=−m1i=1∑my(i)logy^(i)+(1−y(i))log(1−y^(i))
梯度下降算法,通过你的测试集,通过最小化代价函数
J
(
w
,
b
)
J(w, b)
J(w,b)来训练学习参数w和b。
我们通过图示来更好地解释梯度下降算法。
纵轴为代价函数 J ( w , b ) J(w, b) J(w,b)形成的曲面,曲面上某一点个高度就是在对应w和b下 J ( w , b ) J(w, b) J(w,b)的函数值。我们所做的就是找到使代价函数 J ( w , b ) J(w, b) J(w,b)函数值最小的参数w和b,也就是图中曲面最低点对应的w和b。
在这个图中,横轴表示你的参数w和b,在实际情况中,w可以是更高的维度,但为了更好地绘图,我们定义w和b都是一维实数。
首先我们需要在图中选定一个点作为我们训练的起点,也就是初始化参数w和b。我们完全可以采用随机初始化的方法,对于逻辑回归几乎所有的初始话方法都有效。(因为函数是凸函数,无论在哪里初始化,几乎最终都会达到同一点)
我们随机选取一点来初始化参数w和b,然后不断朝着最陡的下坡方向走一步,不断迭代,直到走到全局最优解或者接近最优解的地方。演示如下(注意球于黄色中心相对位置的变化,黑色线为最陡方向,蓝色虚线球为更新后位置)
2.数学解释
接下来,我们用仅有一个参数的情况来细节化说明梯度下降算法。
假定代价函数 J ( w ) J(w) J(w)只有一个参数w,即用一维曲线代替多维曲线,便于更好画图。
我们选取一个起点
w
0
w_0
w0,利用公式
w
:
=
w
−
α
d
J
(
w
)
d
w
w := w - \alpha\frac{d J(w)}{d w}
w:=w−αdwdJ(w)不断更新w的取值,直至最终达到最低点位置(或近似)。如下图所示
公式中, α \alpha α表示学习率,用来控制步长,即向下走一步的长度。 d J ( w ) d w \frac{d J(w)}{d w} dwdJ(w)是函数 J ( w ) J(w) J(w)对w求导,在代码中我们会用 d w d w dw表示这个结果。
对于导数更加形象化的理解就是斜率,如上图右边的红色三角形所示,某点的导数就i是这个点相切于 J ( w ) J(w) J(w)曲线的小三角形的高除宽。假设我们从图中靠右的 w 0 w_0 w0作为起点,该点斜率为正,即 d J ( w ) d w > 0 \frac{d J(w)}{d w} > 0 dwdJ(w)>0,所以 w : = w − α d J ( w ) d w w := w - \alpha\frac{d J(w)}{d w} w:=w−αdwdJ(w)更新后会减小,所以接下来向左走一步到达 w 1 w_1 w1处,不断如此。同理,如果我们到达最低点左边,那么斜率就为负数,w更新后增大,向右走,接近最低点。
故整个梯度下降算法的迭代过程就是朝着最小值点的方向走。
我们现在回归之前有两个参数w和b的情况,同理,我们只需要同时对两个参数进行更新即可。
w
:
=
w
−
α
∂
J
(
w
,
b
)
∂
w
,
b
:
=
b
−
α
∂
J
(
w
,
b
)
∂
b
w := w - \alpha \frac{\partial J(w, b)}{\partial w},\ b := b - \alpha \frac{\partial J(w, b)}{\partial b}
w:=w−α∂w∂J(w,b), b:=b−α∂b∂J(w,b)
-
其中 ∂ \partial ∂表示求偏导符合,可以读作round
-
∂ J ( w , b ) ∂ w \frac{\partial J(w, b)}{\partial w} ∂w∂J(w,b)就是函数 J ( w , b ) J(w,b) J(w,b)对w求偏导, ∂ J ( w , b ) ∂ b \frac{\partial J(w, b)}{\partial b} ∂b∂J(w,b)就是函数 J ( w , b ) J(w,b) J(w,b)对b求偏导,在代码中我们分别用 d w dw dw, d b db db来表示这两个结果
-
小写字母 d d d在对一个参数的函数求导时使用,偏导数符号 ∂ \partial ∂在对多参数函数求导时使用
你将训练集中的 x x x输入,随机选取参数 w w w和 b b b,求出此时的 J ( w , b ) J(w,b) J(w,b),然后通过求导不断更新参数 w w w和 b b b,再求出对应状态下的 J ( w , b ) J(w, b) J(w,b),不断迭代,直至 J ( w , b ) J(w, b) J(w,b)达到一个令人满意的值,此时对应的w和b就是你训练出来的模型参数。利用此参数,只要你给出输入 x x x,它便可以计算出预测的 y y y值,一个简单的模型便构建完成。