梯度下降算法及优化
1-梯度下降算法原理
梯度下降算法(Gradient Descent):是一种用来求使函数最小值时参数的值的算法。
Loss损失函数用来衡量机器学习模型的精确度。一般来说,损失函数的值越小,模型的精确度就越高。降低损失函数的值,我们一般采用梯度下降这个方法。所以,梯度下降的目的,就是为了最小化损失函数,此时的参数w,b便是最优的解。
梯度:梯度实际上函数的偏导数。
梯度下降的基本过程就和下山的场景很类似。
参考1下山的例子:
一个人被困在山的某处,他也不知道自己在那,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢?
首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法
算法原理:在算法中,首先,随机选取一个自变量的值,作为初始值,代表着在山的某一初始位置处。然后,在函数中自变量的初始位置计算函数对于自变量的梯度(偏导),求这个地方最陡峭的地方。接下来,根据计算的梯度值对自变量进行更新。然后从改变过的自变量的位置处,对函数求梯度,再对进行调整更新。
每一次的调整被称为迭代(iteration)
流程:
- 定义自变量初始值x1(人在山的随机某处)
- 函数在x1处求梯度,参数更新(人找最陡峭的下一点x2)
- 函数在x2处求梯度,参数更新(找最陡峭的下一点x3)
- 不断迭代,直到约等最小值(到达谷底)
2-算法的实现
下面通过实例来应用梯度下降算法找到
y
=
x
2
+
1
y=x^2+1
y=x2+1的最小值。
根据上述算法流程:
- 首先定义初始值 x 0 = − 18 x_0=-18 x0=−18
- 接下来求该点的梯度值,求导得 d y / d x = 2 x dy/dx=2x dy/dx=2x,该点梯度值为-36,接下来参数更新,调整方式为 x 1 = x 0 − l r ∗ x 0 x1=x0-lr*x0 x1=x0−lr∗x0,lr为学习率。学习率过大容易出现如下图所示现象,过小时间开销大
- 然后不断按照这种方式迭代,直到接近0.
python代码流程如下:
1,首先做准备,加载依赖库,定义函数,
#加载依赖库
import numpy as np
import matplotlib.pyplot as plt
# 定义 y=x^2+1 函数
def function(x):
x = np.array(x)
y = x ** 2 + 1
return y
2,定义参数的初始值
#指定自变量更新的次数(迭代的次数)
epochs = 50
# 指定学习率的值
lr = 0.1
# 对自变量的值进行初始化
xi = -18
3,求解梯度,更新参数,不断训练。
# 求取函数的梯度值
def get_gradient(x):
gradient = 2 * x
return gradient
# 用于存储每次自变量更新后的值
trajectory = []
# 利用梯度下降算法找到使得函数取最小值的自变量的值x_star
def get_x_star(xi):
for i in range(epochs):
trajectory.append(xi)
xi = xi - lr * get_gradient(xi)
x_star = xi
return x_star
# 运行get_x_star函数
get_x_star(xi)
4,进行显示。
x1 = np.arange(-20, 20, 0.1)
y = function(x1)
# 画出函数图像
plt.plot(x1, y)
x_trajectory = np.array(trajectory)
y_trajectory = function(trajectory)
# 画图更新过程中的自变量与其对应的函数的值
plt.scatter(x_trajectory, y_trajectory)
plt.show()
5,结果如下图所示:
3-梯度下降优化算法
在计算损失函数关于模型参数的梯度时,根据使用的训练集的数据量,梯度算法大致分为三类:
- 批量梯度下降batch gradient descent:计算梯度时使用训练集的全部数据,准确率高,效率低。
- 随机梯度下降stochastic gradient descent:每次只用训练集一个样本计算梯度,随时更新。效率高,学习率选择困难。
- 小批量梯度下降mini-batch gradient descnet:每次使用训练集中小部分数据,批尺寸。
梯度下降算法主要关注:学习率,效率,基于次,在实际的应用中,常采用以下5种优化算法。
- SGD:随机梯度下降算法。
- Adagrad:适用于数据集的数据集特征较稀疏且样本参数较多。
- Adadelta
- RMSprop:默认学习率为0.001。
- Adam
4-参考
1,梯度下降算法原理讲解——机器学习
2,史上最详细的梯度下降优化算法介绍(从SGD到Adam至Lookahead)