Gradient Descent
Last updated
Was this helpful?
Last updated
Was this helpful?
我们已经讲了逻辑回归模型。 我们已经讲了如何通过损失函数来界定你的模型 对单一样本的训练效果。 我们还讲了代价函数,代价函数 可以用来衡量参数w与b在你设计的整个模型中的作用效果 现在,我们继续来看看如何使用梯度下降模型去训练, 或者去学习,来调整你的训练集中的参数w和b。 总的来说,这里有一个我们已经熟悉的逻辑回归算法。
在第二行我们看到了代价函数 J 代价函数J有参数w和b, 并且定义为平均值。 计算从1到m的损失函数之和 损失函数可以衡量你的算法的效果 对每一个训练样例都输出y^(i) 对每一个训练样例上的真实结果y(i)进行比较 完整的公式在等号右边展开 所以代价函数可以衡量你的参数w和 b在训练集上的效果 要使得参数w和b的设置变得合理 自然地想到要去找到使得代价函数 J(w, b) 尽可能小所对应的w和b 接下来给出梯度下降法(gradient descent)的说明 在这个图中横轴表示 你的空间参数w和b 在实践中w可以是更高的维度,但是为了更好地绘图 我们定义w和b都是单一实数 代价函数J(w,b)是在 水平轴w和b上的曲面 因此曲面的高度就是 J(w,b)在某一点的值 我们所想要做的就是找到这样的w和b 使得对应的代价函数J值是最小值
我们可以看到代价函数J是一个凸函数(convex function) 像这样的一个大碗,因此这是一个凸函数 并且这与看起来像这样的函数相反 它是非凸的,并且有很多不同的局部最优 因此我们的成本函数J(w,b),之所以定义为凸函数 一个重要原因是我们使用对于逻辑回归 这个特殊代价函数J造成的 为了去找到优的参数值 我们将会用一些初始值来初始化w和b 可能是用那个小红点表示的 对于逻辑回归几乎所有的初始化方法都有效 通常用0来进行初始化 随机初始化也有效 但是对于逻辑回归我们通常不这么做 但是因为函数是凸函数,无论在哪里初始化 你应该达到同一点或大致相同的点 梯度下降法以初始点开始 然后朝最陡的下坡方向走一步 因此在梯度下降法一步后,你或许会停在那里 因为它正试图沿着最陡下降的方向走下坡路 或者尽可能快地下坡 这是梯度下降的一次迭代 两次迭代或许会到达那里 三次或更多 我猜想这是隐藏在曲线后面 希望你收敛到这个全局最优值或接近全局最优值 所以这张图片说明了梯度下降模型 让我们多说一些细节 为了更好地说明,让我们来看一些函数 你想要找到J(w)的最小值,可能函数会看起来像这样 为了画起来容易些,我现在忽略b 仅仅是用一维曲线代替多维曲线 梯度下降是这样做的 我们将重复执行以下更新的操作 我们更新w的值 使用“:=”表示w进行迭代 设置w为w-α dJ(w)/dw(公式如图) (dJ(w)/dw表示函数J(w)对w求导) 在算法收敛之前我会重复这样做。 公式中有两点是我要提一下的,首先在这里的α表示学习率(learning rate) 学习率可以控制我们在每一次迭代或者梯度下降法中步长大小 我们之后讨论如何选择学习率α 其次在这里的这个数是导数 这就是对参数w的基本更新或者改变 当我们开始编写代码来实现梯度下降 我们将使用代码中变量名的约定
dw表示导数 因此你会像这样编写代码 w:=w-α*dw(公式如图) 我们用dw作为导数的变量名 现在我们确保梯度下降法更新是有意义的 w在这 对应的代价函数J(w)在曲线上的这一点 记住导数的定义 是函数在这个点上的斜率 而函数的斜率是高除宽 在这个点相切于 J(w)的一个小三角形 在这里导数是正的 w通过w自身减去学习率乘导数来更新 导数是正的所以你每一次从w中减去这个乘积 接着每一次都向左边走一步 如果在一开始你参数w的值就非常的大的话 像这样梯度下降法会使你的算法渐渐地减小这个参数w。 另一个例子,如果w的位置是在这里 这个点处的斜率 dJ/dw将会是负的 并且梯度下降法在更新参数时 w将会减去α乘上一个负数 并慢慢地使得参数w增加 所以这样的迭代和梯度下降法会使得参数w逐步变大 无论你初始化的位置是在左边还是右边 梯度下降法会朝着全局最小值方向移动 如果你不熟悉导数或者微积分 你也不熟悉dJ(w)/dw的含义,别急 在下一节课我们会讨论更多关于导数的知识 如果你深入了解过微积分 你应该可以对神经网络如何工作有更深刻更直观的认识 但是即使你并不熟悉微积分 通过下面的几节课,我们也会对导数 和微积分有足够直接的认识 使你能够有效的使用神经网络 但是现在所有的直观认识 便是这个术语,表示的是函数的斜率 并且我们希望知道 在当前的参数条件下,斜率是怎样的 所以我们可以采用下降速度最快的步长 我们也可以知道下一步更新的方向 让代价函数J逐渐减小
因此目前对于(w)J的梯度下降法 我们写出来的参数中假设了只有w 在逻辑回归中你的代价函数是一个含有w和b的函数 在这种情况下,梯度下降的内部循环 就是这里的 这个公式,你需要不断重复迭代 我们可以把w的迭代公式写成这样 w:=w-αdJ(w,b)/dw 以及把b的迭代公式写成这样 b:=b-αdJ(w,b)/db 这两个等式是你实际迭代更新参数时进行的操作 另外我想提到的是,在微积分的符号约定中 某些符号可能会让人疑惑。 我不认为目前理解微积分(符号约定)是非常重要的 如果你看到这些,希望你不要想太多 在微积分中在这的术语 作为这一有趣的花体标志我们实际上这么写
(如图所写的是偏微分符号,读作round) 所以这个符号这实际上只是一个小写d 当你看到这个表达式的时候 用一个花哨的、样式化的字体 所有的含义都是J(w,b)的导数或者函数J(w,b)的斜率 也即是函数在w这一点的斜率 在微积分中这个符号的规则 我认为并不是完全符合逻辑的 同时对于微积分中这个符号的规则 我认为会让理解变得 更为困难。也就是说 当函数J有两个以上的变量 (使用偏导数符号) 我们不使用小写字母d 而使用更加花哨的符号 这个就称作偏导数符号 但是别担心 如果J只有一个变量,就使用小写字母d 唯一的区别就是你是用偏导数符号 还是小写字母d 取决于你的函数J是否含有两个以上的变量 变量超过两个,就使用偏导数符号 如果你的函数只有一个变量你就使用小写字母d 这是在微积分上一个有趣的符号规则 我认为它使学习和理解变得更加复杂了 但是如果你看到了偏导数符号 其含义就是计算函数 关于其中一个变量在对应点处的斜率 类似在这里,这里的微积分符号正式地写的话 应该改用另一个数学符号 因为在这里J有两个输入参数而不是一个 屏幕底部的这个东西应该用这个偏导数来写 但是这其实表达了和小写字母d同样的含义 最后当你编写代码想要实现 我们屏幕写出的这个公式时 通常在迭代更新w的值的时候 我们会用dw这个变量来代替这个式子 同样的情况,还有下面这个公式 当你想去更新b的数值 我们将会用db这个变量来代表下面这个公式 所以,这就是梯度下降法的实现方法 如果现在你已经有很多年没接触微积分了 我明白你看到这个视频中一黑板的导数公式会有些焦虑 如果你有这种感觉,不要担心 我们会在下一个教程中,给你更多关于导数的解释 甚至不用通过深度数学知识来理解微积分 而是通过直观图示来理解微积分 这样学习完后,你将会更容易理解什么是神经网络 让我们进入下一个视频,我们会讨论导数的知识 GTC字幕组翻译 恩