当前位置:首页>编程日记>正文

梯度下降法 —— 经典的优化方法

梯度下降法 —— 经典的优化方法

机器学习基础算法python代码实现可参考:zlxy9892/ml_code

1 原理

在机器学习的核心内容就是把数据喂给一个人工设计的模型,然后让模型自动的“学习”,从而优化模型自身的各种参数,最终使得在某一组参数下该模型能够最佳的匹配该学习任务。那么这个“学习”的过程就是机器学习算法的关键。梯度下降法就是实现该“学习”过程的一种最常见的方式,尤其是在深度学习(神经网络)模型中,BP反向传播方法的核心就是对每层的权重参数不断使用梯度下降来进行优化。

梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单、最经典的方法之一。我们来考虑一个无约束优化问题梯度下降法 —— 经典的优化方法 配图01  , 其中  梯度下降法 —— 经典的优化方法 配图02为连续可微函数,如果我们能够构造一个序列 梯度下降法 —— 经典的优化方法 配图03 ,并能够满足:

梯度下降法 —— 经典的优化方法 配图04

那么我们就能够不断执行该过程即可收敛到局部极小点,可参考下图。

梯度下降法 —— 经典的优化方法 配图05

                                                                                 寻找最小点过程

那么问题就是如何找到下一个点 梯度下降法 —— 经典的优化方法 配图06,并保证 梯度下降法 —— 经典的优化方法 配图07 呢?假设我们当前的函数  梯度下降法 —— 经典的优化方法 配图08的形式是上图的形状,现在我们随机找了一个初始的点 梯度下降法 —— 经典的优化方法 配图09 ,对于一元函数来说,函数值只会随着 梯度下降法 —— 经典的优化方法 配图10的变化而变化,那么我们就设计下一个 梯度下降法 —— 经典的优化方法 配图11 是从上一个 梯度下降法 —— 经典的优化方法 配图12 沿着某一方向走一小步 梯度下降法 —— 经典的优化方法 配图13 得到的。此处的关键问题就是:这一小步的方向是朝向哪里?

 

对于一元函数来说,  梯度下降法 —— 经典的优化方法 配图14是会存在两个方向:要么是正方向(  梯度下降法 —— 经典的优化方法 配图15),要么是负方向(  梯度下降法 —— 经典的优化方法 配图16),如何选择每一步的方向,就需要用到大名鼎鼎的泰勒公式,先看一下下面这个泰勒展式:

 梯度下降法 —— 经典的优化方法 配图17

左边就是当前的梯度下降法 —— 经典的优化方法 配图18  移动一小步  梯度下降法 —— 经典的优化方法 配图19之后的下一个点位,它近似等于右边。前面我们说了关键问题是找到一个方向,使得 梯度下降法 —— 经典的优化方法 配图20 ,那么根据上面的泰勒展式,显然我们需要保证:

 梯度下降法 —— 经典的优化方法 配图21

 可选择令:梯度下降法 —— 经典的优化方法 配图22

其中步长  α是一个较小的正数,从而:  .梯度下降法 —— 经典的优化方法 配图23

由于任何不为0的数的平方均大于0因此保证了  .梯度下降法 —— 经典的优化方法 配图24

从而,设定:

 梯度下降法 —— 经典的优化方法 配图25

,则可保证:梯度下降法 —— 经典的优化方法 配图26

那么更新  的计算方式就很简单了,可按如下公式更新 梯度下降法 —— 经典的优化方法 配图27

 梯度下降法 —— 经典的优化方法 配图28

这就是所谓的沿负梯度方向走一小步

到此为止,这就是梯度下降的全部原理。

如果稍有不清楚的地方,再用下图重新回顾一下具体的设计过程:

梯度下降法 —— 经典的优化方法 配图29

梯度下降法的设计过程

2 代码实现

不妨用python来自己尝试一下上述的梯度下降法是否真的能够帮助我们找到函数的极小值点吧。

完整代码:https://github.com/zlxy9892/ml_code/blob/master/basic_algorithm/gradient_descent/simple_gradient_descent.py

# -*- coding: utf-8 -*-import numpy as np
import matplotlib.pyplot as pltdef f(x):return np.power(x, 2)def d_f_1(x):return 2.0 * xdef d_f_2(f, x, delta=1e-4):return (f(x+delta) - f(x-delta)) / (2 * delta)# plot the function
xs = np.arange(-10, 11)
plt.plot(xs, f(xs))
plt.show()learning_rate = 0.1
max_loop = 30x_init = 10.0
x = x_init
lr = 0.1
for i in range(max_loop):# d_f_x = d_f_1(x)d_f_x = d_f_2(f, x)x = x - learning_rate * d_f_xprint(x)print('initial x =', x_init)
print('arg min f(x) of x =', x)
print('f(x) =', f(x))

输出内容如下:

8.000000000004661
6.400000000004837
5.120000000003557
4.0960000000043095
3.276800000005622
2.6214400000032967
2.097152000001259
1.6777216000003392
1.3421772800004028
1.0737418240003205
0.8589934592002546
0.6871947673602241
0.5497558138881831
0.4398046511105336
0.35184372088844174
0.2814749767107627
0.22517998136861533
0.18014398509489674
0.14411518807592116
0.11529215046073862
0.09223372036859068
0.07378697629487216
0.05902958103589708
0.047223664828717364
0.03777893186297355
0.03022314549037856
0.024178516392302875
0.019342813113842325
0.015474250491073885
0.012379400392859128
initial x = 10.0
arg min f(x) of x = 0.012379400392859128
f(x) = 0.00015324955408672073

经过30次迭代  从初始点10.0逐步逼近最小点  梯度下降法 —— 经典的优化方法 配图30.


http://www.coolblog.cn/news/63e01d643df004db.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐