最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

三种梯度下降方式

互联网 admin 2浏览 0评论

三种梯度下降方式

  • 梯度
    梯度是一个向量,表示函数在该点处沿着该方向变化最快、变化率最大;
    在微积分中对多元函数的各个参数求偏导所形成的向量,即梯度向量;

    沿着梯度向量的方向增长,能寻找其最大值;沿着负梯度方向可以寻找其最小值;

  • 梯度下降、梯度上升
    最小化损失函数,我们可以通过梯度下降算法来进行迭代;
    反之可以利用梯度上升来计算f(θ) - loss_func 来求解最优参数

  • 梯度下降算法
    可以参考下山过程,考虑下山最快的、最陡的路径
    note:可能在一段山路中走到了较低点,但并非是全局最低点,这时候可以考虑多初始化几个起点;当损失函数为凸函数条件下,其一定得到全局最优解;

    什么是凸函数?f((x1+x2)/2) < (f(x1)+f(x2))/2 成立

  • 梯度下降算法的一些概念
    步长:即下山的步子大小,称之为学习率
    特征:样本中变量的类别数
    预测函数:即打算用线性方程还是二次还是指数函数来拟合数据,例如
    y=theta0+theta1*X
    损失函数:用来求解最优的参数,查看拟合效果

    整体的简洁表示:y= sum(theta * xi) i=0,1,2,3,……,n
    其中theta为参数矩阵,xi为第i个样本的特征矩阵

    针对线性回归来说,其损失函数为MSE,即误差平方和的期望;

    梯度下降时参数的选择:
    步长、学习率的选择:过小,迭代次数太多;过大,可能会错过最优解或不收敛
    初始值的选择:凸函数情况下不需要考虑,非凸时,可以考虑多个初始值;
    特征归一化:各个特征取值范围的差异会影响迭代速度

  • 三种梯度下降
    批梯度下降:在更新参数的时候采用所有样本数据来更新(训练速度慢)
    随机梯度下降:每次选取一个样本来进行参数的更新(收敛速度慢)
    小批量梯度下降:上述两种方式的折中

    批梯度下降:
    1)数据加载、预处理
    2)设置梯度下降参数,学习率、迭代次数、初始化值
    3)进行梯度值的计算,gradient=1/m * X_b.T.dot(X_b.dot(theta) -y)
    4) 迭代停止,返回结果

          import numpy as npimport pandas as pd# 生成数据X = np.random.randn(100, 1)# 添加的误差项一定要服从正态分布,运用回归分析的前提y = 2 * X + np.random.randn(100, 1)# print(y)# 要为X添加一列常数列1X_b = np.c_[np.ones((100, 1)), X]# print(X_b)# 梯度下降的参数设置# 学习率、theta初始值、最大迭代次数learning_rate = 0.1theta = np.zeros((2, 1))n_iter = 1000m = X_b.shape[0]for i in range(n_iter):# 计算梯度值# 这里要注意dot函数 和 * 的区别 dot是正常的矩阵相乘,而*是元素级别的乘法,只有shape相同的时候才能运算gradient = 1 / m * X_b.T.dot((X_b.dot(theta) - y))theta = theta - learning_rate * gradientprint(theta)
    

    随机梯度下降:
    1)数据加载、预处理
    2)设置参数,学习率、迭代轮次epoches、样本量m(总计算次数=epoches*m)
    3)进行梯度值计算,每次只采用一条数据来更新theta值,所以gradient=xi.T.dot(x1.dot(theta)-yi)
    4) 迭代停止,返回结果

          import numpy as npimport pandas as pdimport randomX = np.random.rand(100, 1)y = 2 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# 使用SGD算法learning_rate = 0.1epoches = 100m = X.shape[0]theta = np.zeros((2, 1))# 设置学习率衰减# 学习衰减率decay_rate = 3.1def learning_schedule(epoch):return (1 / (decay_rate + epoch))# 进行随机梯度下降for epoch in range(epoches):# 把原始的数据全部打乱,即把数据的索引打乱即可indexes = [i for i in range(m)]rand_indexes = random.sample(indexes, m)# print(rand_indexes)# 进行一轮次的计算for i in range(m):xi = X_b[rand_indexes[i]:rand_indexes[i] + 1]yi = y[rand_indexes[i]:rand_indexes[i] + 1]gradient = xi.T.dot(xi.dot(theta) - yi)theta = theta - learning_rate * gradient# 进行学习率衰减learning_rate = learning_schedule(epoch)print(theta)
    

    小批量梯度下降:
    算法思想和上述一致,只是在更新theta是采用的是小批量的样本数据,是对梯度下降训练速度慢、SGD收敛速度慢的改进

          import randomimport numpy as npimport pandas as pdX = np.random.randn(100, 1)y = 2 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# mini_batch梯度下降参数learning_rate = 0.1batch_size = 5epoches = 100# m 为数据的样本量m = X.shape[0]# 初始化参数矩阵theta = np.zeros((2, 1))# 进行小批量梯度下降for epoch in range(epoches):# 进行数据的打乱,即数据的索引打乱indexes = [i for i in range(m)]rand_indexes = random.sample(indexes, m)# 一个轮次中需进行循环的次数nn = int(m / batch_size)for i in range(n):X_batch = X_b[rand_indexes[i * batch_size:(i + 1) * batch_size]]# print(X_batch)y_batch = y[rand_indexes[i * batch_size:(i + 1) * batch_size]]gradient = 1 / batch_size * X_batch.T.dot(X_batch.dot(theta) - y_batch)theta = theta - gradient * learning_rateprint(theta)
    

三种梯度下降方式

  • 梯度
    梯度是一个向量,表示函数在该点处沿着该方向变化最快、变化率最大;
    在微积分中对多元函数的各个参数求偏导所形成的向量,即梯度向量;

    沿着梯度向量的方向增长,能寻找其最大值;沿着负梯度方向可以寻找其最小值;

  • 梯度下降、梯度上升
    最小化损失函数,我们可以通过梯度下降算法来进行迭代;
    反之可以利用梯度上升来计算f(θ) - loss_func 来求解最优参数

  • 梯度下降算法
    可以参考下山过程,考虑下山最快的、最陡的路径
    note:可能在一段山路中走到了较低点,但并非是全局最低点,这时候可以考虑多初始化几个起点;当损失函数为凸函数条件下,其一定得到全局最优解;

    什么是凸函数?f((x1+x2)/2) < (f(x1)+f(x2))/2 成立

  • 梯度下降算法的一些概念
    步长:即下山的步子大小,称之为学习率
    特征:样本中变量的类别数
    预测函数:即打算用线性方程还是二次还是指数函数来拟合数据,例如
    y=theta0+theta1*X
    损失函数:用来求解最优的参数,查看拟合效果

    整体的简洁表示:y= sum(theta * xi) i=0,1,2,3,……,n
    其中theta为参数矩阵,xi为第i个样本的特征矩阵

    针对线性回归来说,其损失函数为MSE,即误差平方和的期望;

    梯度下降时参数的选择:
    步长、学习率的选择:过小,迭代次数太多;过大,可能会错过最优解或不收敛
    初始值的选择:凸函数情况下不需要考虑,非凸时,可以考虑多个初始值;
    特征归一化:各个特征取值范围的差异会影响迭代速度

  • 三种梯度下降
    批梯度下降:在更新参数的时候采用所有样本数据来更新(训练速度慢)
    随机梯度下降:每次选取一个样本来进行参数的更新(收敛速度慢)
    小批量梯度下降:上述两种方式的折中

    批梯度下降:
    1)数据加载、预处理
    2)设置梯度下降参数,学习率、迭代次数、初始化值
    3)进行梯度值的计算,gradient=1/m * X_b.T.dot(X_b.dot(theta) -y)
    4) 迭代停止,返回结果

          import numpy as npimport pandas as pd# 生成数据X = np.random.randn(100, 1)# 添加的误差项一定要服从正态分布,运用回归分析的前提y = 2 * X + np.random.randn(100, 1)# print(y)# 要为X添加一列常数列1X_b = np.c_[np.ones((100, 1)), X]# print(X_b)# 梯度下降的参数设置# 学习率、theta初始值、最大迭代次数learning_rate = 0.1theta = np.zeros((2, 1))n_iter = 1000m = X_b.shape[0]for i in range(n_iter):# 计算梯度值# 这里要注意dot函数 和 * 的区别 dot是正常的矩阵相乘,而*是元素级别的乘法,只有shape相同的时候才能运算gradient = 1 / m * X_b.T.dot((X_b.dot(theta) - y))theta = theta - learning_rate * gradientprint(theta)
    

    随机梯度下降:
    1)数据加载、预处理
    2)设置参数,学习率、迭代轮次epoches、样本量m(总计算次数=epoches*m)
    3)进行梯度值计算,每次只采用一条数据来更新theta值,所以gradient=xi.T.dot(x1.dot(theta)-yi)
    4) 迭代停止,返回结果

          import numpy as npimport pandas as pdimport randomX = np.random.rand(100, 1)y = 2 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# 使用SGD算法learning_rate = 0.1epoches = 100m = X.shape[0]theta = np.zeros((2, 1))# 设置学习率衰减# 学习衰减率decay_rate = 3.1def learning_schedule(epoch):return (1 / (decay_rate + epoch))# 进行随机梯度下降for epoch in range(epoches):# 把原始的数据全部打乱,即把数据的索引打乱即可indexes = [i for i in range(m)]rand_indexes = random.sample(indexes, m)# print(rand_indexes)# 进行一轮次的计算for i in range(m):xi = X_b[rand_indexes[i]:rand_indexes[i] + 1]yi = y[rand_indexes[i]:rand_indexes[i] + 1]gradient = xi.T.dot(xi.dot(theta) - yi)theta = theta - learning_rate * gradient# 进行学习率衰减learning_rate = learning_schedule(epoch)print(theta)
    

    小批量梯度下降:
    算法思想和上述一致,只是在更新theta是采用的是小批量的样本数据,是对梯度下降训练速度慢、SGD收敛速度慢的改进

          import randomimport numpy as npimport pandas as pdX = np.random.randn(100, 1)y = 2 * X + np.random.randn(100, 1)X_b = np.c_[np.ones((100, 1)), X]# mini_batch梯度下降参数learning_rate = 0.1batch_size = 5epoches = 100# m 为数据的样本量m = X.shape[0]# 初始化参数矩阵theta = np.zeros((2, 1))# 进行小批量梯度下降for epoch in range(epoches):# 进行数据的打乱,即数据的索引打乱indexes = [i for i in range(m)]rand_indexes = random.sample(indexes, m)# 一个轮次中需进行循环的次数nn = int(m / batch_size)for i in range(n):X_batch = X_b[rand_indexes[i * batch_size:(i + 1) * batch_size]]# print(X_batch)y_batch = y[rand_indexes[i * batch_size:(i + 1) * batch_size]]gradient = 1 / batch_size * X_batch.T.dot(X_batch.dot(theta) - y_batch)theta = theta - gradient * learning_rateprint(theta)
    

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论