https://www.toutiao.com/a6646958932096975373/

2019-01-16 13:15:26

今天我们尝试用最简单的方式来理解梯度下降,在之后我们会尝试理解更复杂的内容,也会在各种各样的案例中使用梯度下降来求解(事实上之前线性回归模型中我们已经使用了它),感兴趣的同学欢迎关注后续的更新(以及之前的内容)。

梯度下降的原理

在数据科学中,我们经常要寻找某个模型的最优解。梯度下降就是数值优化问题的一种方案,它能帮助我们一步步接近目标值。在机器学习过程中,这个目标值往往对应着“最小的残差平方和”(比如最小二乘法求解线性回归)、“最大的似然”(比如极大似然估计求解逻辑回归)等。

在实际应用的过程中,梯度给出了我们数值调整的方向,一般来说,它对应着微积分中的偏导数,在这个方向上,我们的数值优化速度最快。我们用下图来理解一下梯度下降的过程:

假如我们的目标是寻找全局最小值,最上边的红三角是我们的起始点。那么梯度下降的过程就是先寻找起始点的导数方向,然后在这个方向上迈出一步,到达第二个点;然后计算第二个点的导数,接着迈出第二步,到达第三点……直到我们的目标值不再变化或者变动值小于某个阈值,那我们就认为我们找到了最小值或近似的最小值(只要设定好阈值,两者的差异几乎可以忽略不计)。

在上图中,每个小三角都对应着梯度下降过程中的一个循环(计算导数方向->迈步->满足停止条件则终止循环,否则进入下一个循环)。

梯度的计算

在实际的应用过程中,我们常常是无法直接得到导数的,但是我们可以用两个间隔非常小的点之间连线的斜率来作为替代,根据微分的知识我们可以知道,当间隔趋近于0时,斜率趋近于导数,当间隔小到一定程度时,两者的差异已经可以忽略不计。

我们用最简单的平方函数来演示一下,很容易知道,平方函数、平方函数的导数函数以及估计导数分别为:

那么我们用Python来对比一下两种方法得到的导数之间的差异(为了看起来格式规整,同时大家又能复制代码直接使用,所以这里同时提供源码和截图):

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
from functools import partial
# 定义一个函数,根据数组返回其平方和
sns.set()
mpl.rcParams['font.sans-serif'] = 'WenQuanYi Micro Hei'
# 定义一个函数,根据数组返回其平方和
def square(x):return x ** 2
# 导数
def derivative(x):return 2 * x
# 用微分来估计
def diff_quotient(f, x, h):return (f(x + h) - f(x)) / h
# 偏函数
der_esti = partial(diff_quotient, square, h=0.00001)
# 生成测试数据
x = list(range(-10, 10))
# 绘图
plt.figure(figsize=(8, 6))
# 计算并绘制实际导数数据
plt.plot(x, list(map(derivative, x)), 'r+', markersize=12, label='实际导数值')
# 计算并绘制估计导数数据
plt.plot(x, list(map(der_esti, x)), 'gx', markersize=12, label='估计导数值')
plt.legend()
plt.title('实际导数值与估计导数值对比', fontsize=24);

两者差异微乎其微,不是吗?当然,这里我们的例子是最简单的一元函数,事实上,在数据科学过程中,我们往往会遇到包含大量特征的情况,这时就需要针对每个特征的系数计算其偏导数。这一部分我们留作之后为大家讲解,心急的同学也可以自己尝试一下。

通过梯度下降求解最小值

还是以平方函数求解最小值为例,前边我们已经完成了梯度的计算公式,那么接下来我们就该输入一个起始点,然后让计算机开始循环求解了。

# 尝试一系列步长,选择目标函数值最小的步长作为最终选择
for alpha in [0.1, 0.01, 0.001, 0.0001, 0.00001]:# 设置起始点x = 10# 设置阈值,当两次计算得到的y值差异在阈值范围内时,终止循环threshold = 0.000001#设置初始y值y_last = y_current = 0# 设置初始循环次数为0loop_cnt = 0# 开始计算while True:# 计算当前y值和循环次数loop_cnt += 1y_last = y_currenty_current = square(x)# 如果满足条件,则终止循环,输出数据if abs(y_current - y_last) < threshold:print(x, y_current, loop_cnt)break# 不满足条件,则计算梯度,# 更新x,进入下一个循环gradient = der_esti(x)x -= gradient * alpha

输出为:

0.0013242286604497634 1.753581545156575e-06 41
0.004918010399948077 2.4186826293997443e-05 378
0.015761481529165663 0.0002484242999942304 3224
0.04998440091982569 0.0024984403353138715 26491
0.15810632941470976 0.024997611400992714 207351

可以看到,在步长为0.1时,我们得到了最小值。这样我们就完成了一个简单的梯度下降求解最小值的案例,有问题的同学可以在下方留言,我会及时回答。

机器学习基础:理解梯度下降本质「附Python代码」相关推荐

  1. 下列计算机应用中属于计算机辅助教学的事,2017年计算机基础考试题库完整版「附答案解析」...

    2017年计算机基础考试题库完整版「附答案解析」 [解析]计算机编程语言有:机器语言.汇编语言.高级语言.其中机器语言(由二进制码组成)是计算机能直接识别或执行的,而另两种语言则需要先翻译(又称为编译 ...

  2. 梯度下降及一元线性回归[python代码](二)

    第一章.AI人工智能入门之梯度下降及一元线性回归(2) 目录 第一章.AI人工智能入门之梯度下降及一元线性回归(2) 一.线性回归是什么? 二.线性回归的应用 三.线性回归的一般形式 四.一元线性回归 ...

  3. 机器学习随机森林实战:声纳信号分类(附python代码保姆级解析)

    随机森林是一种很常用的机器学习算法,"随机"表示每棵树的训练样本随机以及训练时的特征随机.         训练形成的多棵决策树形成了"森林",计算时我们把每棵 ...

  4. Java外卖点餐系统「附全部代码」

    前言 傻瓜式外卖点餐系统(无数据库) tips: 菜品类(菜品id,菜品名,菜品类型,上架时间,单价,月销售,总数量) 管理员类(管理员id,账号,密码) 客户类(客户id,客户名,性别,密码,送餐地 ...

  5. 机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)

    机器学习系列(12)_XGBoost参数调优完全指南(附Python代码) 原文链接:http://blog.csdn.net/han_xiaoyang/article/details/5266539 ...

  6. 机器学习(1)之梯度下降(gradient descent)

    机器学习(1)之梯度下降(gradient descent) 题记:最近零碎的时间都在学习Andrew Ng的machine learning,因此就有了这些笔记. 梯度下降是线性回归的一种(Line ...

  7. 没有任何基础的可以学python吗-没有任何基础的人,该如何学习Python?「附具体步骤」...

    原标题:没有任何基础的人,该如何学习Python?「附具体步骤」 Python是一门简单易学的语言,可是对于完全没有任何基础的小白来说,入门也是不容易的. 今天,我们来看一下,对于这部分同学来说,具体 ...

  8. 怎么学python-没有任何基础的人,该如何学习Python?「附具体步骤」

    原标题:没有任何基础的人,该如何学习Python?「附具体步骤」 Python是一门简单易学的语言,可是对于完全没有任何基础的小白来说,入门也是不容易的. 今天,我们来看一下,对于这部分同学来说,具体 ...

  9. 没有基础的人可以学python吗-没有任何基础的人,该如何学习Python?「附具体步骤」...

    原标题:没有任何基础的人,该如何学习Python?「附具体步骤」 Python是一门简单易学的语言,可是对于完全没有任何基础的小白来说,入门也是不容易的. 今天,我们来看一下,对于这部分同学来说,具体 ...

最新文章

  1. Android类库打包方法探究
  2. 4月书讯 | 从引爆技术圈的 K8s 到图灵奖得主作品升级,从独角兽项目到人人都要学习的写作逻辑...
  3. We7 从这里开始---安装we7
  4. 是时候重新定义安全了,阿里云肖力解读安全责任共担模型
  5. 用MathType编辑带点星号的流程
  6. 天天写业务代码?写业务代码中的成长机会!
  7. java创建变量的过程_java 对象的创建过程
  8. BZOJ 2720 [Violet 5]列队春游 ——期望DP
  9. Markdown基本语法总结
  10. springmvc+activiti 完美整合- 流程在线设计+代码生成器+UI快速开发库,提高一半的开发效率
  11. html+input+hidden,input type=hidden
  12. 「竞品分析报告」不会写?套用这个报告模板,让你不再毫无头绪
  13. 【codevs3119】高精度开根号(二分答案)
  14. 光伏组件为何出现白色线条?
  15. 创建型模式——原型模式(Prototype Pattern)
  16. HDU5510 Bazinga(KMP)
  17. Git No newline at end of file
  18. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(10月31日~11月6日)...
  19. Java基本功一之JDK配置Java基本语法
  20. 比较Perl、PHP、Python、Java和Ruby

热门文章

  1. 保存Java程序状态及设置Properties文件
  2. 专访朱雷:昔日的游戏少年,如今的Python工匠
  3. 一本Python数据分析入门宝藏书,快藏不住了!
  4. Spring Boot并不重复“造轮子”
  5. 独家 | Bamboolib:你所见过的最有用的Python库之一(附链接)
  6. 从演进式角度看消息队列
  7. 疫情过后人工智能是否能迎来春天?
  8. 你有一张世界互联网大会的门票待领取!数字经济人才专场报名开启
  9. 独家 | 从全方位为你比较3种数据科学工具的比较:Python、R和SAS(附链接)
  10. 自然语言处理数据集免费资源开放(附学习资料)