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

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

1 原理

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

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

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

                                                                                 寻找最小点过程

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

对于一元函数来说,  是会存在两个方向:要么是正方向(  ),要么是负方向(  ),如何选择每一步的方向,就需要用到大名鼎鼎的泰勒公式,先看一下下面这个泰勒展式:

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

可选择令:

其中步长  α是一个较小的正数,从而:  .

由于任何不为0的数的平方均大于0因此保证了  .

从而,设定:

,则可保证:

那么更新  的计算方式就很简单了,可按如下公式更新 

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

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

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

梯度下降法的设计过程

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逐步逼近最小点  .

梯度下降法 —— 经典的优化方法相关推荐

  1. python实现次梯度(subgradient)和近端梯度下降法 (proximal gradient descent)方法求解L1正则化

    l1范数最小化 考虑函数,显然其在零点不可微,其对应的的次微分为: 注意,的取值为一个区间. 两个重要定理: 1)一个凸函数,当且仅当,为全局最小值,即 为最小值点  : 2)为函数(不一定是凸函数) ...

  2. 随机梯度下降(SGD)与经典的梯度下降法的区别

    随机梯度下降(SGD)与经典的梯度下降法的区别 经典的优化方法,例如梯度下降法,在每次迭代过程中需要使用所有的训练数据,这就给求解大规模数据优化问题带来挑战. 知识点:随机梯度下降法(SGD).小批量 ...

  3. 神经翻译笔记2扩展b. 优化方法

    文章目录 NMT Tutorial 2扩展b. 优化方法 基本优化方法:梯度下降 基于动量的梯度下降及其扩展 动量法 Nesterov动量法 自适应学习率算法 AdaGrad AdaDelta RMS ...

  4. 了解神经网络结构和优化方法

    了解神经网络结构和优化方法 了解基础算子 conv2D conv2D是卷积神经网络的操作函数,即二维卷积,在pytorch中查得如下: torch.nn.Conv2d(in_channels, out ...

  5. 线性回归之随机梯度下降法(Stochastic Gradient Descent,SGD)

    通俗易懂 一个经典的例子就是假设你现在在山上,为了以最快的速度下山,且视线良好,你可以看清自己的位置以及所处位置的坡度,那么沿着坡向下走,最终你会走到山底.但是如果你被蒙上双眼,那么你则只能凭借脚踩石 ...

  6. 机器学习中的梯度下降法

    1. 机器学习中为什么需要梯度下降 梯度下降是机器学习中常见优化算法之一,梯度下降法有以下几个作用: (1)梯度下降是迭代法的一种,可以用于求解最小二乘问题. (2)在求解机器学习算法的模型参数,即无 ...

  7. 【机器学习】总结:线性回归求解中梯度下降法与最小二乘法的比较

    在线性回归算法求解中,常用的是最小二乘法与梯度下降法,其中梯度下降法是最小二乘法求解方法的优化,但这并不说明梯度下降法好于最小二乘法,实际应用过程中,二者各有特点,需结合实际案例具体分析. 最后有两份 ...

  8. 随机梯度下降法_动量梯度下降法(gradient descent with momentum)

    简介 动量梯度下降法是对梯度下降法的改良版本,通常来说优化效果好于梯度下降法.对梯度下降法不熟悉的可以参考梯度下降法,理解梯度下降法是理解动量梯度下降法的前提,除此之外要搞懂动量梯度下降法需要知道原始 ...

  9. 多层神经网络 ——小批量梯度下降法

    在前面的课程中,我们知道为了实现非线性分类的任务,需要使用多层神经网络,多层神经网络的损失函数不再是凸函数,而是一种比较复杂的不规则函数,这类函数求导数非常困难,在求解极值问题时很难通过计算得到解析解 ...

最新文章

  1. form表单提交编码的问题
  2. android vlc 参数,【VLC-Android】LibVLC API简介(至关于VLC的MediaPlayer)
  3. Jvm 系列(十):Java 即时编译器JIT机制以及编译优化
  4. 请问一个跨进程调用的问题?
  5. 电源适配器变压器计算与元器件选型、细,全!【上篇-适配器设计计算23步骤】...
  6. 开发日记-20190829 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 5
  7. iis php5.3 mysql_Win2008 R2配置IIS7.5+PHP Manager+PHP5.3+Mysql5.5+Wincache
  8. View controller-based status bar
  9. 【详细教程】教你如何使用Node + Express + Typescript开发一个应用
  10. ICSharpCode.SharpZipLib 开源压缩库使用示例
  11. java登录功能多线程_java之多线程
  12. 87. 带着班图精神编程
  13. Unity 3D中的内存管理
  14. envi自定义坐标系
  15. 有什么好用的windows PDF阅读器?答案在这里面
  16. 解决:vue组件顶部留有空白问题
  17. win10远程桌面连接服务器接示内部错误
  18. Photoshop设计精讲笔记
  19. Linux系统修复网络,Linux系统无法上网解决方案教程
  20. 一、Oracle数据库

热门文章

  1. C#文字转语音,实时播放以及mp3,wav文件保存
  2. CVPR 2021 | 记录SCRFD人脸检测C++工程化(含docker镜像)
  3. 项目需求|3D结构光扫面(项目经费50万)
  4. OOM?教你如何在PyTorch更高效地利用显存
  5. 一文详解AI模型部署及工业落地方式
  6. linux 在终端修改文件,linux命令行学习(42):修改.bashrc文件
  7. antd Form.Item 中如何获取到Select的label值
  8. 数字化如何影响药物开发
  9. 科学计算工具NumPy(3):ndarray的元素处理
  10. vue从后台获取新数据后刷新_vue项目中实现定时刷新页面(重新渲染数据实时更新)...