Lecture3 梯度下降(Gradient Descent)
创始人
2024-05-26 01:16:13
0

目录

1 问题背景

2 批量梯度下降 (Batch Gradient Descent)

3 鞍点(Saddle Point)

3 随机梯度下降 (Stochastic Gradient Descent)

4 小批量梯度下降 (Mini-batch Gradient Descent)


1 问题背景

图1 上节课讲述的穷举法求最优权重值

  在Lecture2中,介绍了使用穷举法来确定最优\omega值,然而当遇到\omega范围较大,或者数量过多等情况时,穷举法的时间复杂度过大。因此,我们需要优化该算法。

2 批量梯度下降 (Batch Gradient Descent)

  在这次课中,介绍了一种寻找\omega最优值的算法——批量梯度下降 (Batch Gradient Descent, BGD)

简单介绍下该算法。首先对于下图:

图2 训练过程中权重初始值与最优值的位置

  假设我们目前的起始\omega位于上图红色点,为了找到最优\omega点(位于绿点),那么我们需要向左边移动,这样才能到达最优\omega点。

图3 我们需要计算梯度以向左移动权值点

 

   如何让权值点向左还是向右移动呢?此时我们需要计算当前点的梯度(Gradient),也就是用成本函数对权重进行求导,如果梯度<0,则向函数值递减方向移动;梯度>0,则向函数值递增方向移动。

  因为要移动起来,所以我们每移动一步,就要更新一下\omega值。更新函数如下图Update处:

图4 更新权重值的函数公式

  在这个更新函数中, α代表学习率(Learning Rate),学习率是机器学习中常用的一个超参数,它定义了每次更新参数时步长的大小,即每次更新参数时参数值变化的幅度。如果学习率设置得过大,所求结果可能会在最优解的附近来回震荡,而无法找到全局最优解。如果学习率设置得过小,那么模型的训练将会非常缓慢,甚至找不到最优解。

  这个式子中,梯度前面用了减号,是为了朝函数值递减方向,也就是往最优\omega所在的点移动,所以在梯度前面加负号。 就这样持续一步步地更新\omega,直到找到最优\omega

下面我们来具体讲讲如何去计算更新函数中的\frac{\partial cost}{\partial \omega} :

图5 更新函数

计算过程中,需要用到上节课总结的两个公式:

图6 均方误差MSE

图7 预测值y_hat

  接着把上述两个公式代入原式:

图8 求导过程

   蓝色处,因为cost=MSE,所以直接代入上一节课的MSE公式,然后对\omega求导。

  绿色处,由有理运算法则,和的导数等于导数的和,所以这里可以把\frac{\partial}{\partial \omega}移入求和式子中,对里面先进行求导后,再求和相加。

  黄色处,根据复合导数的链式求导法进行求导。

代码实现

from matplotlib import pyplot as pltx_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.0  # 初始权重,由这个权重开始迭代'''线性模型,算出预测值y_hat'''
def forward(x):return x * w'''均方误差MSE'''
def cost(xs, ys):cost = 0for x, y in zip(xs, ys):y_pred = forward(x)  # 算出y_hatcost += (y_pred - y) ** 2  # (y_hat - y)²return cost / len(xs)  # 除以样本总数求均值'''梯度下降公式'''
def gradient(xs, ys):grad = 0for x, y in zip(xs, ys):grad += 2 * x * (x * w - y)return grad / len(xs)print('Predict (before training)', 4, forward(4))  # 训练前,模型对输入的4的最终预测结果cost_list = [] # 保存每轮迭代后的cost值
epoch_list = [] # 保存每轮的迭代后的epoch值
for epoch in range(100):  # 进行100轮训练cost_val = cost(x_data, y_data)grad_val = gradient(x_data, y_data)w -= 0.01 * grad_val # 使用梯度下降法更新权重,0.01表示学习率print('Epoch:', epoch, 'w=%.2f' % w, 'loss=%.2f' % cost_val)cost_list.append(cost_val)epoch_list.append(epoch)
print('Predict (after training)', 4, forward(4))  # 训练后,模型对输入的4的最终预测结果'''绘图'''
plt.plot(epoch_list, cost_list)
plt.ylabel('Cost')
plt.xlabel('Epoch')
plt.grid()
plt.show()
图9 输出结果图像

  将MSE公式和Linear Model公式代入整合,的最终更新函数:

图10 最终的更新函数

补充

训练后的结果一般来说,cost会趋于收敛情况

图11 通常训练后cost图像会趋于收敛

 如果发生如下情况,说明训练失败,原因有很多,其中之一可能是学习率取得太大:

图12 训练失败

 

  这就是批量梯度下降算法,本质上是一个贪心算法(Greedy Algorithm)。不过该算法有局限性,比如当前的预测值\omega正好位于下图绿线处,因为再往右移动会梯度会发生变化,使得程序直接终止,于是误将红的点作为最优\omega值,而忽略了处于蓝色点的最优\omega值:

图13 局部最优和全局最优示意图

   我们把上图中的红点称为局部最优点(Local Optimum),蓝色点称为全局最优点(Global Optimum)。因此对于该梯度下降算法,很可能会找到局部最优点,而忽略了全局最优点。不过这种现象不必担心,因为在实际训练中,往往很难陷入局部最优点。

3 鞍点(Saddle Point)

  在实际训练中,往往很难陷入局部最优点,而最需要解决的问题是鞍点(Saddle Point),鞍点是机器学习和数学中的一个概念,它指的是一个特殊的局部极小值,在某些方向上是极小值,但在其他方向上是极大值。在一元函数中,梯度=0的点就是鞍点。比如下图中,红色小球所处的位置就在鞍点,此时梯度为零,会导致更新函数无法更新(因为梯度=0,\omega=\omega-α*0相当于没有发生更新):

图14 鞍点示意图

 

 从多维角度来分析,比如下图红球处于马鞍面(Saddle Surface),从一个切面看可以处于最小值,从另一个切面看又处于最大值:

图15 位于马鞍面的鞍点

 

  在优化问题中,鞍点是一种特殊的局部最优解,是一个难以优化的点,因为优化算法可能很难从鞍点附近找到全局最优解。这是因为,如果优化算法在鞍点附近搜索,它可能会被误导到其他附近的局部最优解,而不是真正的全局最优解。所以在深度学习中,需要克服的最大问题就是鞍点而非局部最优问题。

3 随机梯度下降 (Stochastic Gradient Descent)

  随机梯度下降 (Stochastic Gradient Descent, SGD)在深度学习中很常用,和BGD算法的区别是,BGD使用所有的样本的均值的平均损失来作为\omega的更新依据,而SGD是从所有样本中随机选择单个样本的损失值来对\omega进行更新。

  随机梯度下降的优点是,每次仅使用一个数据点的梯度,因此在每次迭代时都有可能沿着非0梯度的方向更新参数,这样就避免陷入到鞍点导致无法更新参数。

图16 BGD到SGD公式上的改变

代码实现

import randomx_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
w = 1.0def forward(x):return x * wdef loss(x, y):y_pred = forward(x)return (y_pred - y) ** 2def gradient(x, y):return 2 * x * (x * w - y)print('Predict (before training)', 4, forward(4))
for epoch in range(100):t = random.randrange(0, 3) # 随机得到一个样本x = x_data[t]y = y_data[t]grad = gradient(x, y)w = w - 0.01 * gradprint("\tgrad: ", x, y, '%.2f' % grad)l = loss(x, y)print("progress:", epoch, "w=%.2f" % w, "loss=%.2f" % l)
print('Predict (after training)', 4, forward(4))

部分输出结果

Predict (before training) 4 4.0
    grad:  3.0 6.0 -18.00
progress: 0 w=1.18 loss=6.05
    grad:  2.0 4.0 -6.56
progress: 1 w=1.25 loss=2.28
    grad:  3.0 6.0 -13.58
progress: 2 w=1.38 loss=3.44
    grad:  1.0 2.0 -1.24
progress: 3 w=1.39 loss=0.37
    grad:  2.0 4.0 -4.85
progress: 4 w=1.44 loss=1.24

···

    grad:  1.0 2.0 -0.00
progress: 97 w=2.00 loss=0.00
    grad:  1.0 2.0 -0.00
progress: 98 w=2.00 loss=0.00
    grad:  2.0 4.0 -0.00
progress: 99 w=2.00 loss=0.00
Predict (after training) 4 7.999910864525451

4 小批量梯度下降 (Mini-batch Gradient Descent)

  SGD算法虽然可以在一定程度上避免陷入局部最优以及鞍点问题,但是运算所需时间复杂度过高,每次仅使用一个数据点的梯度,因此它的收敛速度通常比较慢。

  因此有一个折中的办法,就是使用小批量梯度下降 (Mini-batch Gradient Descent) 算法。简单来说,小批量梯度下降是一种介于批量梯度下降和随机梯度下降之间的优化算法。结合了这两种方法,通过使用小的随机选择的训练数据子集(称为mini-batch)计算损失函数关于参数的梯度的平均值来更新模型参数。

  总之,小批量梯度下降算法实现了BGD的高计算效率和SGD的良好收敛性之间的平衡。

相关内容

热门资讯

“路道粗”的新同事原来是“阿诈... 转自:上观新闻表面上,他对同事有求必应,实际上,他只是巧舌如簧趁机骗钱……近日,经奉贤区检察院提起公...
【甘快看】当金黄遇见湛蓝 巴丹... 近日,户外爱好者和摄影师在甘肃民勤境内的巴丹吉林沙漠腹地,拍摄到了沙漠“海子”画面。据介绍,这些“海...
印度德里一建筑倒塌 已致11人... 当地时间19日凌晨,印度德里一栋建筑倒塌,目前已造成至少11人死亡。(总台记者 石玥)
【甘快看】甘肃静宁:大棚杏子抢...   央广网兰州4月18日消息(记者李红军 通讯员李芳艳 李倩)近日,甘肃省静宁县城川镇靳寺村的温室大...
内蒙古天气反复无常新一轮冷空气... 转自:草原云记者从内蒙古自治区气象局了解到,4月20至22日,新一轮冷空气来袭,内蒙古再迎降温、大风...
高速抛锚未做警示,后车追尾导致... 转自:上观新闻老司机们都知道,高速公路上车速快、车流量大,随意停车易引发追尾、多车相撞等严重的交通事...
短时强降水+雷暴大风!洛阳最新... 转自:洛阳发布4月的洛阳天气阴晴不定明日洛阳再迎“短时强降水+雷暴大风”强对流天气↓↓↓根据最新气象...
【甘快看】当汉字邂逅春日,双倍... 时值春日,甘肃兰州黄河岸边春意盎然。一起在花蕊中、河面上、山林间、古刹里寻找汉字的印迹,感受汉字和春...
全国卫健系统先进表彰 我市1集...   4月17日,全国卫生健康系统先进集体、先进工作者及“白求恩奖章”获得者代表会见会在京召开。由人力...
来自乌鲁木齐地铁服务公告 因乌鲁木齐天山国际机场T1、T2、T3航站楼改造维护升级,自2025年4月18日零时起关闭乌鲁木齐地...
爆火!平谷这场公益市集“卷”出... (记者 武奕)4月19日,平谷万达广场举办新时代文明实践服务联盟市集。不同于以售卖商品为主的传统市集...
两江新区2000余名职工开启欢... 中新网重庆新闻4月19日电(记者 刘贤)春日的明月湖,微风徐徐,碧波荡漾,满眼皆绿。4月19日上午,...
“五一”假期江苏铁路计划增开临... 转自:微讯江苏长三角铁路五一运输方案近日出台,今年五一运输期限为4月29日至5月6日(较节假日提前2...
辽宁省第十四届全民读书节活动启... 4月19日上午,辽宁省第十四届全民读书节(沈阳读书季)暨读书市集启动仪式在辽宁省图书馆举行。启动仪式...
侵吞货款,假扮合伙人诈骗客户,... 转自:上观新闻“开始我工作挺认真的,直到2023年1月在手机上赌博,把积蓄都搭进去了,因此就动了歪脑...
鸡蛋太贵?特朗普不服:价格太低... 格隆汇4月19日|特朗普周五在白宫就全国鸡蛋价格问题表态,断言价格“下降了87%,但没人谈论这个问题...
56岁女子谎称谈恋爱,诈骗3名... 转自:上观新闻近年来,针对独居老年人的婚恋诈骗案件屡见不鲜。部分不法分子利用老年人渴望陪伴与关爱的心...
孤胆枪手2传奇如何使用能量电池... 孤胆枪手2传奇如何使用能量电池?我不知道按那个键用电池打开背包,然后点击能量电池,然后点击使用就可以...
用我要给什么当写句子 用我要给什么当写句子我要给兰花浇水我要给幼儿园的小朋友当小老师。1、我要给妈妈当个小棉袄,这样妈妈冬...
当恒瑞医药BD国内权益 转自:氨基观察©氨基观察-创新药组原创出品作者 | 蔡九“恒瑞医药怎么了”?其与默克的交易,除了获得...