吴恩达深度学习课程笔记-神经网络编程基础-梯度下降法

吴恩达深度学习课程笔记-神经网络编程基础-梯度下降法

吴恩达深度学习课程笔记

第二周:神经网络编程基础(Basics of Neural Network programming)

2.4 梯度下降法(Gradient Descent)

首先回顾一下逻辑回归算法的代价函数 J(w,b)

    \[\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)}))\]

代价函数衡量了参数 wb 在训练集上的效果,要学习合适的参数 wb,很自然我们要找到使得代价函数 J(w,b) 尽可能小的 wb,而这个过程可以通过梯度下降法来解决。

首先看一下梯度下降法的形象化说明:

enter image description here

在上图中,横轴表示空间参数 wb,在实践中,w 可以是更高的维度,但是为了方便绘图,我们定义 wb 都是单一实数,代价函数 J(w,b) 是在水平轴 wb 上的曲面,因此曲面的高度就是 J(w,b) 在某一点的函数值。我们所做的就是找到参数 wb,使得代价函数 J(w,b) 的值是最小值。

如图,J(w,b) 这个代价函数是一个凸函数,像一个大碗一样。而像下图这样的正好相反,它是非凸函数,有很多不同的局部最小值。

enter image description here

寻找参数 wb的过程如下:

首先我们要给 wb 赋上初始值,对于逻辑回归而言,几乎任意的初始化方法都有效,我们通常会初始化为0,随机初始化也可以,因为函数是凸函数,所以无论初始值是什么,最终都应该到达同一点或大致相同的点。接下来,我们要从初始点开始,朝最陡的下坡方向走一步,然后不断的迭代,直到走到全局最低点,也就是代价函数 J(w,b) 的最小值点。

梯度下降的细节化说明:

enter image description here

如上图所示,假设代价函数 J(w) 只有一个参数 w,即用一维曲线代替多维曲线,这样看着更简单明了。

梯度下降的迭代过程就是不断重复如下的公式:

    \[w := w - a\frac {dJ(w)}{dw}\]

公式中的 a 表示学习率,用来控制步长,即每次向下走一步的长度;\frac {dJ(w)}{dw} 是函数 J(w)w 求导,在代码中我们会用 dw 表示这个求导的结果,即上面的公式用代码实现会写成 w = w - adw

函数的导数就是函数在某个点的斜率,而斜率就是这个点相切于 J(w) 的小三角形的高除以宽,如下图所示。假设我们以下图中的点为初始点,该点的斜率是正的,即 \frac {dJ(w)}{dw} > 0,所以接下来会向左走一步。整个梯度下降法的迭代过程就是不断地向左走,直到逼近最小值点。

enter image description here

如果一开始初始点在函数最低点的左侧,则斜率是负的,接下来会向右走,同样会逼近最小值点。

逻辑回归的代价函数 J(w,b) 是含有两个参数的,wb 的更新公式如下:

    \[w := w - a\frac {dJ(w,b)}{dw}\]

    \[b := b - a\frac {dJ(w,b)}{db}\]

\frac {dJ(w,b)}{dw} 指的是 J(w,b)w 求偏导,在代码中我们会用 dw 表示,\frac {dJ(w,b)}{db} 指的是 J(w,b)b 求偏导,在代码中我们会用 db 表示。

导数和偏导在定义上有一些区别,导数针对的是函数中只有一个参数的情况,偏导针对的是函数中包含多个参数的情况。

上一篇:吴恩达深度学习课程笔记-神经网络编程基础-逻辑回归损失函数

下一篇:吴恩达深度学习课程笔记-神经网络编程基础-导数

发表评论

电子邮件地址不会被公开。 必填项已用*标注