第八节,改善深层神经网络:超参数调试、正则化及梯度下降算法(中)
目录
一 mini batch
1.1 小批量梯度下降
$$w \to w' = w - η\frac{∂C}{∂w}\approx w - \frac{η}{m}\sum_{j}\frac{∂C_{X_j}}{∂w}$$$$b \to b' = b - η\frac{∂C}{∂b}\approx b - \frac{η}{m}\sum_{j}\frac{∂C_{X_j}}{∂b}$$
在使用梯度下降法训练神经网络时,如上式,$C$是在整个训练样本的代价函数,当样本数量很大时,$∂C/∂ω$计算代价很大,因为我们需要在整个数据集上的每个样本上计算。
在实践中,我们可以从数据集中随机采取少量样本,然后计算这些样本上的平均值,用来估计整体样本的值。
假设训练集样本个数为n,随机采样个数为m:
- 使用整个训练集的优化算法成为批量(batch)或者确定性(deterministic)梯度算法。(m=n)
- 每次使用单个样本的优化算法被成为随机(stochastic)或者在线(online)算法。(m=1)
- 大多数用于深度学习的方法介于以上两者之间,使用一个以上而且又不是全部的训练样本,传统上,这些会被称为小批量(minibatch)或小批量随机(minibatch stochastic)方法,现在通常简单将他们成为随机(stochastic)算法。(1<m<n)
我们在选取m值得时候,一般选取为2的幂数,16,32,64,128,256等。并且小批量数据是从训练样本随机抽取的。
#将训练集数据打乱,然后将它分成多个适当大小的小批量数据 random.shuffle(training_data)
mini_batches = [training_data[k:k+mini_batch_size] for k in range(0,n,mini_batch_size)]
补充知识:小批量随机梯度下降的一个有趣动机是,只要没有重复使用样本,他将遵循着真实泛化误差的梯度。
很多小批量随机梯度下降方法的实现都会打乱数据顺序一次,然后多次遍历数据来更新参数。
第一次遍历时,每个小批量样本都用来计算真实泛化误差的无偏估计。
第二次遍历时,估计将是有偏的,因为他重新抽取了已经用过的样本,而不是从和原先样本相同的数据生成分布中获取新的无偏的样本。
使用在线学习的方法,可以最小化泛化误差,随着数据集的规模的迅速增长,超越了计算能力的增速,机器学习应用每个样本只使用一次的情况变得原来 越常见,在使用一个非常大的训练集时,过拟合不在是问题,而欠拟合和计算效率变成了主要的问题。 因此在训练集数据较大的情况下,我们可以选取适当的抽样个数m,然后只遍历一次训练集。这样可以最小化泛化误差。
二 指数加权平均
2.1 指数加权概念
指数加权平均它同样是用来给梯度下降增速的。 在我们的正常的梯度下降中,不论是mini batch还是 full batch,梯度下降的效果大概是下面这个样子的。
梯度下降算法就像是上面这个图一样,像一个碗一样。这是我们优化成本函数$J$的方式,不停的更新$w$和$b$的值。让函数移动到最下面的那个红色的点,也就是全局最优解。
在这个过程中在纵轴上我们是上下波动的,横轴上我们不停的向最优解移动。 在这中间我们发现纵轴上下波动的太大导致我们在横轴上的移动速度不是很快, 这就需要我们增加迭代次数或者调大学习率来达到最后到达最优解的目的。
但是调大学习率会导致每一次迭代的步长过大,也就是摆动过大,误差较大。 而增加迭代次数则明显的增加了训练时间。 这时候指数加权就出现了。
什么是指数加权?
通过这样一个公式,比如我们现在有100天的温度值,要求这100天的平均温度值。24,25,24,26,34,28,33,33,34,35..........32。
我们现在直接给出输出公式:
$$v_t=\beta v_{t-1}+(1-\beta)\theta_t$$
其中$v_t$代表到第$t$天的平均温度值,$\theta_t$代表第$t$天的温度值,$\beta$代表可调节的超参数值;
假如$\beta=0.9$,我们可以得到指数平均公式下的平均值求法如下:
$$v_t=\beta v_{t-1}+(1-\beta)\theta_t$$
$$v_{100}=0.9v_{99}+0.1\theta_{100}$$
$$v_{99}=0.9v_{98}+0.1\theta_{99}$$
$$v_{98}=0.9v_{97}+0.1\theta_{98}$$
化简开得到如下表达式:
通过上面表达式,我们可以看到,$v_{100}$等于每一天温度值再乘以一个权值。本质就是以指数式递减加权的移动平均。
各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。而在我们上面提到的普通平均数求法,它的每一项的权值都是一样的,如果有$n$项,权值都为$1/n$。
通过计算,我们发现:
$$0.9^{10}≈\frac{1}{e}≈0.35$$
也就是说对于$β=0.9$而言,10天之后权重就下降到1/3。
对于$β=0.98$而言,50天之后权重就下降到1/3.
即有:$$(1-ε)^{\frac{1}{ε}}≈\frac{1}{e}$$
对于$v$的理解,你可以将其认为该数值表示的是$1/(1-β)$天的平均值。
例如这里取0.9,那么这个$v$值表示的是十天以来的温度的加权平均值.如果我们设置$v$是0.98,那么我们就是在计算50天内的指数加权平均,这时我们用,图中的绿线表示指数加权平均值。
13
我们看到这个高值的$β=0.98$得到的曲线要平坦一些,是因为你多平均了几天的温度,所以波动更小,更加平坦,缺点是曲线向右移动,这时因为现在平均的温度值更多,所以会出现一定的延迟。
对于这个$β=0.98$值的理解在于有0.98的权重给了原先的值,只有0.02的权重给了当日的值。
我们现在将$β=0.5$作图运行后得到黄线,由于仅平均了两天的温度,平均的数据太少,所以得到的曲线有更多的噪声,更有可能出现异常值,但是这个曲线能更快的适应温度变化,所以指数加权平均数经常被使用。
为什么我们要使用指数加权平均?
实际处理数据时,我们会使用以下公式:
$$v_0=0$$
$$v_1=\beta v_0 + (1-\beta)\theta_1$$
$$v_2=\beta v_1 + (1-\beta)\theta_2$$
$$v_3=\beta v_2 + (1-\beta)\theta_3$$
$$...$$
内存代码仅仅占用一行数字而已,不断覆盖掉原有的$v$值即可,只占单行数字的存储和内存。
虽然不是最精确的计算平均值的方法,但是相比于原有的计算平均值需要保存所有数据求和后取平均的方法效率更高和资源占用率大大减小,所以在机器学习中大部分采用指数加权平均的方法计算平均值。
2.2 指数加权平均的偏差修正
当我们取β=0.98,实际上我们得到的不是绿色曲线,而是紫色曲线,因为使用指数加权平均的方法在前期会有很大的偏差,为此我们引入了偏差修正的概念。
当 $t$ 很大时, $β$ 的$t$ 次方接近于 0, 偏差修正几乎没有作用,紫线基本和绿线重合了,不过在开始阶段,偏差修正可以帮助你更好预测温度,偏差修正可以帮助你从紫线变成绿线。
指数加权平均公式:
$$v_t=\beta v_{t-1}+(1-\beta)\theta_t$$
带修正偏差的指数加权平均公式:
$$\widehat{v} _t= \frac{v_t}{1-\beta^t}=\frac{\beta v_{t-1}+(1-\beta)\theta_t}{1-\beta^t}$$
随着$t$的增大, $β$ 的 $t$ 次方接近于 0,修正后的公式就会还原到原始公式。
在机器学习中,在计算指数加权平均数的大部分时候,大家不太在乎偏差修正,大部分宁愿熬过初始阶段,拿到具有偏差的估测,然后继续计算下去,我们观看上面的图,我们会发现,随着t的增加,紫线基本和绿线重合了。
三 梯度下降算法优化
3.1动量 momentum
假设图中是你的成本函数,你需要优化你的成本函数函数形象如图所示,其中红点所示就是你的最低点。
使用常规的梯度下降方法会有摆动这种波动减缓了你训练模型的速度,不利于使用较大的学习率,如果学习率使用过大则可能会偏离函数的范围。为了避免摆动过大,你需要选择较小的学习。.
我们在之前的学习中知道梯度下降是一个优化成本函数$J$的过程,不停的更新$w$和$b$的参数来使成本函数J最小。
公式是这样的: 每一次迭代都更新$w$和$b$的值:
$$w = w - α*∂J/∂w$$
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了