梯度下降法

#第三天打卡。

-------------------Yc

1.定义解释:梯度下降是机器学习算法中的一个基本概念,用于迭代寻找函数最优解。

        设x,y为自变量,z为因变量,求解目标为因变量的最小值。求解步骤如下:

        1.任取一点作为起始点;

        2.查看在当前点像哪个方向移动能得到最小的z值;

        3.重复步骤,直到无法找到更小的z值,此时认为达到最低点。

        由于受到起始点和函数特性的影响,梯度下降法有时无法找到全局最优解(最小值),但此方法比OLS(最小二乘算法)的求解速度快,因此在大样本学习(训练样本数量多、特征维度大)中广泛应用。

相关概念:

        (1) 步长(learning rate):每一次梯度下降时向目标方向前进的长度。步长越大,在陡峭区域下降越快,但在平缓区域容易出现反复抖动找不到最优点;步长越短越不易产生抖动,但是容易陷入局部最优解。

        (2) 假设函数(hypothesis function):由特征产生目标变量的函数,即知道x,y求z的函数。

        (3) 损失函数(loss function):寻找最优解用到的函数,即给参数组合打分的函数。通过损失函数,才能得到哪个点更接近真实值。常用的损失函数为\sum (\hat{y}-y)^2,即样本估值和标准值的方差和,此函数中方差和越小越好。(损失函数向哪个方向移动的原理是计算损失函数的偏导数向量,正方向是增长最快的方向,反方向是减小最快的方向。)

        虽然普通梯度下降已经是一种不保证求得非全局最优解的权衡方法,但在大样本中计算仍然不够快。因为每次根据损失函数求参数时,都需要遍历一次样本数据,为了加快速度,形成了随机梯度下降法。

2.随机梯度下降法

        在损失函数计算时不遍历所有样本,只采用单一或小批量样本的方差和作为损失值。

        随机梯度下降法和普通梯度下降的效果主要在于:

        1.迭代次数增加,但时间缩短;

        2.由于数据样本存在噪声,每次迭代的方向不一定是‘正确的’,但由于迭代次数的增加,总体的移动仍为正确方向;

        3.有更大的可能性通过‘非正确移动’不困于非最优值,从而找到全局最优解。

优点:无论运行速度还是结果正确性均优于普通梯度下降。

---------------------------------------------------------------------------------------------------------------------------------

3.增量学习(Incremental Learning)

        增量学习是一种机器学习方法,其主要特点是在训练过程中逐步增加新的数据或样本,而不是一次性使用全部的原始数据。这种方法允许模型在新数据到来时进行适应和更新,而不需要重新开始整个训练过程。

        增量学习在实际应用中非常有用,因为它可以处理大规模的数据集,并且能够快速适应新的数据。例如,当你想要对一个在线购物网站的商品推荐系统进行优化时,如果每次都重新训练整个模型,那么当有大量的新商品加入到系统中时,就需要花费大量的时间和计算资源来进行重新训练。但是,如果你采用了增量学习的方法,就可以在每次有新商品加入时,只对相关的部分进行更新和优化,从而大大提高了效率。

        此外,通过观察模型在不同时间点的表现,我们可以发现模型是否过拟合或者欠拟合,从而进行相应的调整。当模型在新数据上表现良好但在旧数据上表现较差时,可能是由于过拟合造成的。这意味着模型过于复杂,捕捉到了训练数据中的噪声和异常值。相反,如果模型在训练集和测试集上都表现不佳,可能是由于欠拟合导致的。这表示模型无法很好地泛化到新数据。

4.随机梯度下降的应用(Python)

        应用第三方库scikit-learn中的线性模型分类器SGDClassifier或回归器SGDRegressor。它们的区别在于:SGDClassifier预测值是数据目标值之一(即成已有的别);而SGDRegressor的预测值是依据假设函数直接得到的计算结果(回归计算数据)。

(一) 回归模型实例:

        回归模型实例:

from sklearn.linear_model import SGDRegressor
x=[[0,0],[2,1],[5,4]]
y=[0,2,2]
reg=SGDRegressor(penalty='l2',max_iter=10000)    #使用部分初始化参数
reg.fit(x,y)
print('预测值:%f:'%reg.predict([[4,3]]))
print('截距:%f'%reg.intercept_)  
print('参数:%s'%reg.coef_)   

        初始化参数介绍:

       1.loss:损失函数类型,取值为‘squared_loss(均方差损失,普通最小二乘)’,‘huber’(平均绝对误差和均方差的综合,详见深入了解 Huber 损失函数_huber损失函数-CSDN博客),‘epsilion_insensitive’(线性支持向量回归)。

        2.penalty:损失函数惩罚项,取值‘none’,‘l1’,‘l2’,‘elasticnet’。L1,L2为岭回归和Lasso回归的惩罚项,见上一篇文章,‘elasticnet’为两者的综合。

        3.tol:容忍度或误差范围。迭代后损失函数的变化小于tol则认为已找到最优解。

       4.max_iter:最大迭代次数。有时模型在迭代中陷入反复抖动,无法找到满足tol而停止的点,则以max_iter作为停止迭代的条件。

        5.shuffle:完成一轮迭代后是否随即调整样本顺序进行下一次迭代。

        6.n_jobs:进行计算时,并行运行的工作进程的数量。n_jobs的默认值为1,只使用一个进程。如果将n_jobs设置为-1,则使用所有可用的处理器核心并行计算。这意味着会尽可能地利用计算机的多核处理器资源,加快计算速度。

        7.learning_rate:学习率,包括constant(固定学习率)、optimal(最优学习率)、invscaling(根据当前的梯度大小和参数数量来调整学习率,从而使模型更快地收敛),在步长类型为‘constant’或‘invscaling’设置时需设置初始步长。

(二) 分类模型实例

from sklearn.linear_model import SGDClassifier
x=[[0,0],[2,1],[5,4]]
y=[0,2,2]
clf=SGDClassifier(penalty='l2',max_iter=10000)    #使用部分初始化参数
clf.fit(x,y)
print('预测值:%f:'%clf.predict([[4,3]]))          #结果不同,结果为原有结果

---------------------------------------------------------------------------------------------------------------------------------日常求赞~

  • 30
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值