梯度下降 作者:马育民 • 2019-09-15 18:34 • 阅读:10170 # 概述 梯度下降,Gradient Descent,找到一个函数的局部极小值 在机器学习、深度学习中,梯度下降的作用就是找到 **损失函数** 的最小值,使得 **预测值** 和 **真实值** 的 **误差最小** ### 代码实现 https://www.malaoshi.top/show_1EF4G05NJ24L.html # 案例 ### 损失函数 这里使用均方误差作为损失函数,该函数有唯一最小值,那么假设该损失函数图像如下: [![](https://www.malaoshi.top/upload/0/0/1EF4FcXCP14T.png)](https://www.malaoshi.top/upload/0/0/1EF4FcXCP14T.png) y轴代表损失值 ### 目的 在上图中,人眼很容易找到最小值,即当x为0时,但要让计算机找到最小值,就要计算 假设 **出发点(a点)** 在下图位置 ,我们要做的就是判断该点 **是否** 此函数的极值,如果不是就 **求出极值** [![](https://www.malaoshi.top/upload/0/0/1EF4FjAxO92m.png)](https://www.malaoshi.top/upload/0/0/1EF4FjAxO92m.png) ### 判断是否极值 [![](https://www.malaoshi.top/upload/0/0/1EF4FjBVR6lp.png)](https://www.malaoshi.top/upload/0/0/1EF4FjBVR6lp.png) 对这一点进行求导,其 **导数值** 等于该点的 **切线斜率**,如果切线 **斜率不为0**,那么该点 **不在极值点** 上。 注意:上图的切线 **斜率为 负数** ### 移动的方向 [![](https://www.malaoshi.top/upload/0/0/1EF4FiytLMnc.png)](https://www.malaoshi.top/upload/0/0/1EF4FiyoDynZ.png) 当判断出a点不是极值后,接下来就要 **移动** 到下一个位置,首先要确定 **往哪个方向** 移动 上图中红线的 **斜率** 为 **负数**,a点的x值 与 斜率(负数)做 **加法** 运算时,**y值反而越大** 而我们的目的是找到 **y的最小值**,所以下一个点(b点)的x值 计算如下: ``` a点的x值 - 斜率 ``` ### 移动的步长 [![](https://www.malaoshi.top/upload/0/0/1EF4FiytLMnc.png)](https://www.malaoshi.top/upload/0/0/1EF4FiyoDynZ.png) 上面的计算,a点的x值 减去 斜率,可能达不到我们的要求,我们要控制 **下降速度**,就需要设置 **步长** 步长是需要手动设置的,也就是 **超参数** 步长 在机器学习、深度学习中 称为 **学习率(learning rate)** 所以下一个点的x值 计算如下: ``` a点的x值 - 步长*斜率 ``` 有经验所得,一般步长设置为 **0.01** ### 步长太小,移动的速度就太慢 如下图,需要运算的次数过多 [![](https://www.malaoshi.top/upload/0/0/1EF4FyoinrVY.png)](https://www.malaoshi.top/upload/0/0/1EF4FyoinrVY.png) ### 步长太大,可能得不到最优解 如下图: [![](https://www.malaoshi.top/upload/0/0/1EF4Fk4yvmwX.png)](https://www.malaoshi.top/upload/0/0/1EF4Fk4yvmwX.png) 步长太大时,会导致跳跃,甚至跳跃后,损失值会增大 ### 求出极值 [![](https://www.malaoshi.top/upload/0/0/1EF4FzBuJnQy.png)](https://www.malaoshi.top/upload/0/0/1EF4FzBuJnQy.png) 按照步长在负方向上移动,求导数,如果导数不为极值,那么重复执行,一直到导数为极值停止 ### 复杂函数(多个极值点) 对于 **均方误差**,**有唯一极值点** 但在很多 **复杂函数** 中,可能有 **多个极值点** [![](https://www.malaoshi.top/upload/0/0/1EF4FkPO1Jjp.png)](https://www.malaoshi.top/upload/0/0/1EF4FkPO1Jjp.png) 如上图,此函数有多个极值点 如果出发点在 **b点和c点之间**,有可能最终找到b点或c点,这只是 **局部最小值** 如果出发点在 **a点的两侧**,才能找到真正的 **全局最小值** 出发点的位置也是 **超参数** **解决方法:** - 多次运行,**随机** 初始点 - **手动** 设置出发点的位置 # 总结 ### 梯度法思想的三要素 从案例中,我们发现,有三个要素 1. 出发点(超参数) 2. 下降方向 3. 下降步长(学习速率,超参数) 原文出处:http://malaoshi.top/show_1EF44cFgc3QB.html