Numpy理解各种梯度下降等优化算法
一 本节课程介绍
1.1 知识点
1、优化算法的基本介绍;
2、梯度下降算法的实现;
3、随机梯度下降的实现;
4、其他优化算法的对比;
二 课程内容
2.1 优化算法基本介绍
优化算法常用在最优化模型上,使得模型的损失值为最小。经典的优化算法分为直接法和迭代法。直接法是指能够直接获取到优化问题的最优解。其要求目标函数需要满足两个条件:(1)目标函数需要是凸函数,若目标函数是凸函数,其最优解处的梯度为0;(2)对于求解目标函数梯度为0,需要有其闭式解。常见的直接优化算法有岭回归,有想要更深了解的同学可以自行加深学习。
迭代法是指通过迭代的方式对最优解的估计,其可以分为一阶法和二阶法。本文所讲解的梯度下降法就属于是一阶法。二阶法也叫作牛顿法,Hessian矩阵就是目标函数的二阶信息。
人工智能中常见的优化算法有梯度下降法(BGD)、随机梯度下降法(SGD)、小批次梯度下降法(MBGD)、Adagrad和Adam等。
2.1.1 梯度下降法
梯度下降法需要求解每一步函数的梯度,按照梯度*固定步长的方式对上一步的数值进行加和,为了使得梯度最快拟合,使用梯度负数可以最快拟合。
特点:每次都会对全局数据进行更新,易造成训练缓慢。
2.1.2 随机梯度下降法
如上所述,当训练数据量特别大时,经典的梯度下降法每次对模型参数进行更新时,需要遍历所有的训练数据,会造成很长的训练时间,在这种情况下显然不可取。
为了解决这个问题,随机梯度下降法每次使用单个训练样本进行计算损失,即可以实现用单个训练数据对模型参数进行更新,极大的加快了收敛速度,但是由于使用单个样本近似全局,易造成准确率降低,模型震荡严重。
特点:模型更新较快,精度下降。
2.1.3 动量梯度下降法
为了缓解随机梯度下降模型精确率较差的问题,其一陷入函数鞍点处。使用惯性保持的方式进行缓解这个问题。
修改梯度下降法的公式为,添加一个修正项,为一个系数乘以上一步的步伐。这里的系数为带衰减的系数。即其由两部分组成:一是由学习率乘以当前的梯度;二是带衰减的前一个步伐。这样惯性就可以使得当前的步伐考虑到上一步伐有一定的惯性保持。
三 实验测试
3.1 numpy实现批量梯度下降
首先要导入库:
import numpy as np
import matplotlib.pyplot as plt
(1)设置X参数值随机生成的200行一列的均匀分布数据乘以5。
X = 5 * np.random.rand(200, 1)
(2)设置y与x之间的关系式如下,其中np.random.randn(200, 1)作为噪声项,3和8是我们需要求解的值,即最终求解的矩阵为[[3],[8]]为最完整的答案:
y = 3 + 8 * X + np.random.randn(200, 1)
(3)设置x参数要加上一个偏置项,即y=w*x+b,其中b是乘以1的,故需要生成200行一列的1用来求解b。:
x=np.c_[np.ones((200, 1)), X]#作为求解偏置项,即偏置项需要乘以1,而不是x
(4)设置梯度下降的基本参数,learning_rate为学习率,iterations为迭代次数,并初始化θ的值:
learning_rate=0.05
iterations=2000
theta=np.random.randn(2,1)
(5)根据梯度下降法的公式,迭代计算并打印输出:
for i in range(iterations):
gradients=1.0/200*x.T.dot(x.dot(theta)-y)
theta=theta-learning_rate*gradients
print(theta)
最终模型运行后值为:
(5)构建需要预测的x值,按照上面的方式一样:
X_test = np.array([[0],[5]])
X_pred=np.c_[np.ones((2, 1)), X_test]#作为求解偏置项,即偏置项需要乘以1,而不是x
(6)预测值为其点乘参数y=WT*X:
y_predict = X_pred.dot(theta)
(7)绘制图可视化,为折线图和散点图
plt.plot(X_test, y_predict, 'r-')
plt.plot(X, y, 'b.')
最终可查看拟合效果:
3.2 numpy实现随机梯度下降法
首先要导入库:
import numpy as np
import matplotlib.pyplot as plt
(1)设置X参数值随机生成的200行一列的均匀分布数据乘以5。
X = 5 * np.random.rand(200, 1)
(2)设置y与x之间的关系式如下,其中np.random.randn(200, 1)作为噪声项,3和8是我们需要求解的值,即最终求解的矩阵为[[3],[8]]为最完整的答案:
y = 3 + 8 * X + np.random.randn(200, 1)
(3)设置x参数要加上一个偏置项,即y=w*x+b,其中b是乘以1的,故需要生成200行一列的1用来求解b。:
x=np.c_[np.ones((200, 1)), X]#作为求解偏置项,即偏置项需要乘以1,而不是x
(4)设置梯度下降的基本参数,learning_rate为学习率,iterations为迭代次数(这里要考虑每次对一个样本更新,样本有200个,为了保持2000次迭代,这里选取2000/200=10),并初始化θ的值:
learning_rate=0.05
iterations=10
theta=np.random.randn(2,1)
(5)根据梯度下降法的公式,迭代计算并打印输出:
for epoch in range(iterations):
for i in range(200):
random_idx=random.randint(0,200)#随机生成抽取样本的位置
xi=x[random_idx:random_idx+1]#根据随机生成的位置选取样本
yi=y[random_idx:random_idx+1]
gradients=xi.T.dot(xi.dot(theta)-yi) #只用了一个数据不需要求平均值
theta= theta - learning_rate * gradients
最终模型运行后值为:
(5)构建需要预测的x值,按照上面的方式一样:
X_test = np.array([[0],[5]])
X_pred=np.c_[np.ones((2, 1)), X_test]#作为求解偏置项,即偏置项需要乘以1,而不是x
(6)预测值为其点乘参数y=WT*X:
y_predict = X_pred.dot(theta)
1
(7)绘制图可视化,为折线图和散点图
plt.plot(X_test, y_predict, 'r-')
plt.plot(X, y, 'b.')
最终可查看拟合效果:
四 思考与作业
尝试使用sklearn实现不同的梯度下降算法