ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

第三讲 Numpy理解各种梯度下降等优化算法

2022-02-09 13:31:42  阅读:193  来源: 互联网

标签:200 偏置 梯度 random 算法 np theta Numpy


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实现不同的梯度下降算法

标签:200,偏置,梯度,random,算法,np,theta,Numpy
来源: https://blog.csdn.net/dwf1354046363/article/details/122693692

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有