AI-梯度下降

梯度下降

1 梯度下降原理概述

梯度下降法(gradient descent)是一个最优化算法,也称为最速下降法(steepest descent)核心公式为: (其中α为步长,也叫学习率)

2 梯度下降的理论解释

2.2.1 问题导入

如下图所示,假设左侧曲线为一个山坡,某人在A点,他被困在山上,需要从山上下来(找到山的最低点,也就是山谷I)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。在这里插入图片描述

2.2.2 问题分析

这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷I。
我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!而这里所说的每走一段距离,就是前面公式中提到的参数α(也叫学习率),可以理解步长越长,α越大,测量的频率越小,越易偏离轨道。同理步长越短,α越小,虽然在保证下山方向正确的前提,但是非常耗时。而这座山每个点最陡峭的地方就是函数每个点的切线方向,其数值等于函数在该点的导数值。
由此,我们可以简单理解梯度下降的核心公式: (其中α为步长,也叫学习率)。当我们到达山谷时,此时山谷的导数值为零即θ不再变化。在这里插入图片描述

或许你会担心如果步长α较大,会不会越过山谷直接跑到对面的山坡上,如下图所示,此时仍可以到达山谷,但是可以想象当步长α非常大时,梯度下降的迭代在两曲线间剧烈震荡,可能会导致无法到达山谷。所以我们要合理的调整步长α。从而避免这类问题。在这里插入图片描述

					当步长α较大时的梯度下降过程

3 梯度下降的具体实现

3.1梯度下降法的一般步骤
假设函数只有一个极小点。
初始给定参数为 从这个点如何搜索才能找到原函数的极小值点?
①首先设定一个较小的正数α,ε;
②求当前位置出处的各个偏导数:在这里插入图片描述

③修改当前函数的参数值,公式如下:在这里插入图片描述

④如果参数变化量小于ε,退出;否则返回第2步。
3.2梯度下降的两个参数(步长、终止条件之变量)
梯度下降有个重要的参数α,ε(自己设置,α>0,ε>0),其中α为步长,ε为终止条件之变量,即当计算后的与已知的差值的绝对值 小于ε时终止计算,此时的即为要求的最小值点。(理论上可以达到0,这就要求我们设置的ε非常小)
3.3算法终止的条件
算法终止的条件有两个,一是迭代次数,二是终止条件的变化量ε。
(1)当程序运行次数达到迭代次数时,此时结束程序,获得结果。
(2) 小于ε时,结束程序,获得结果。

4 梯度下降存在问题

1 靠近极小值的时候梯度下降速度变慢在这里插入图片描述
2 步长过大时侯出现“之字形”
在这里插入图片描述
3 直线搜索也会出现问题

梯度下降的三种方法

在了解梯度下降之前首先要了解训练集,测试集,以及验证集。
训练集(train set) —— 用于模型拟合的数据样本。
验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
形象的比喻来说
训练集就是学习课本知识
验证集就是课后作业,了解不同学生的水平
测试集就是考试,考的题平常没有见过,考察举一反三的能力.
1,批量梯度下降法:它使用训练集的所有数据更新参数
优点:得到全局最优解。
缺点:由于使用全部数据,所以当自变量太多,训练速度向下降
2,随机梯度下降法:每次更新只随机使用一组数据,因此计算量减少,缺点是噪音较多,使得迭代方向不是朝着最优解的方向;最终得到的结果只是在全局最优解附近
优点:训练速度快
缺点:过程杂乱,准确度下降。
3,小批量梯度下降:包括对包含n个样本的数据集进行计算。综合了上述两种方法,既保证了训练速度快,又保证了准确度。

4 代码实现

对于函数f(x)=x^2

import numpy as np
import matplotlib.pyplot as plt
def f(x):
    return np.power(x, 2)
def d_f_1(x):
    return 2.0 * x
def d_f_2(f, x, delta=1e-4):
    return (f(x+delta) - f(x-delta)) / (2 * delta)
```python
xs = np.arange(-10, 11)
plt.plot(xs, f(xs))
plt.show()
learning_rate = 0.1
max_loop = 30
x_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_x
    print(x)
print('initial x =', x_init)
print('arg min f(x) of x =', x)
print('f(x) =', f(x))
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值