【吴恩达】神经网络&深度学习-学习笔记【二】
神经网络-深度学习 - 吴恩达 - 第二课
一、改善神经网络
1.1 数据集划分
早期 70/30 或者 60/20/20
大数据时代:尽量缩小验证集数量
要保证数据集和验证集合来自同一分布
也可以没有独立的测试集(不需要无偏性能估计)
1.2 方差/偏差
以上三图分别对应高偏差,低偏差和低方差,高方差
过拟合会出现验证集效果不好,训练集效果很好
1.3 设计思路
对于一个系统,要选用的神经网络架构测试步骤:
主要是要搞明白当前是高偏差的问题还是高方差的问题
当下的大数据时代,有办法实现改变偏差的时候对方差没有太大影响,反之亦然。
1.4 L2正则化
$\min _{w, b} J(w, b)$
- 线性回归中的正则化:
现在用的比较多的是L2正则化
- 神经网络中的正则化
从最后化简出来的式子不难看出,lambla范数可以控制权重矩阵的大小
为了使损失函数接近0,当lambla越大,相应的权重矩阵约接近0
- 为什么正则化可以减少方差(减小过拟合)?
lambla变大,实际上发生了:
缺点:有可能需要尝试很多的正则化参数
1.5 Dropout正则化
用代码实现:
在测试阶段不应该用dropout。
为什么dropout能发挥作用?
可以设定单层的dropout参数防止特定的层过拟合,一般用在机器视觉领域,如果没有发生过拟合不推荐使用。
使用dropout后 J的代价函数 会不再被明确定义,出现错误时候会很难调试
1.6 其他正则化方法
-
扩增数据集:翻转/裁剪/扭曲/强变形图片,可以增大数据集,降低过拟合
-
early stop:同时绘制训练集和验证集,在验证集的代价函数开始上升时停止学习
缺点:无法保证这个时候学习得到的 J 最小
1.7 归一化
为什么要使输入数据归一化?
当输入的特征x数据不是归一化的时候,所需要的权重w都是不一行的,会影响迭代速度
(实际上就是保证数据的输入范围基本要一样)
1.8 梯度消失&梯度爆炸
使用线性激活函数:
当权重矩阵比1大一点->梯度爆炸
当权重矩阵比1小一点->梯度消失
权重的初始化(将权重设置成标准的正态分布)
其实就是通过这个公式,设定权重矩阵的初值(和输入数据的维数挂钩)
目的:设定权重矩阵,使输出既不会增长过快,也不会太快下降到0.
梯度检验时候,使用双边偏差:
梯度检验步骤:
- 第一步,将所有量转化为向量
- 第二步,通过双边偏差求导(通过循环对J中的每个参数进行双边偏差):
- 第三步,计算用双边偏差得到的结果和直接求偏导得到的数值的差别(使用范数判断,分母是防止数值太大或者太小,实际上就是三角验证,分子表示第三条边长度,分母表示剩余两边长,这样子比值总是落在[0,1]之间):
前向传播:foreprop 反向传播 :backprop
通过梯度检验,进行debug,发现系统中的错误。
注意事项:
(1. 不要在训练中使用梯度校验,只应该在debug中用梯度校验)
(2. 当在计算过程中发现某层数值差距很大时候,有可能这层存在bug)
(3. 如果使用了正则化,梯度检验时候代价函数需要包含正则化项)
(4. dropout中不应该使用梯度检验,或者把keep.prop设置为1)
二、不同的梯度下降法
2.1 Mini-batch
现有训练方式的问题:必须全部处理完一批训练集才能进行下一层训练。
解决方法,使用Mini-batch(子集)之前的整体训练方式成为 Batch
mini-batch 的一代(1 epoch 遍历一遍训练集集)可以完成1000次梯度下降(下面例子中)
batch的一代(1 epoch 遍历一遍训练集集)只能完成1次梯度下降
使用batch和mini-batch时,成本函数的下降趋势:
mini-batch的size选择:
两个极端情况-size=m和size=1:

对于mini-batch来说,局部样本有可能导致优化方向不一定向着收敛,所以会产生很多噪声。
在现实中采用的大小介于1~m之间。
-
当大小为m时候,每次迭代需要大量的训练样本,耗时长
-
当大小为1时(随机梯度下降法),每次处理一个样本,可以减少噪声,但是舍去了所有向量化的优势,时间也很长
现实中选择一个不大不小的mini-batch的size ,达到快速处理并且效果最好
如何选择?
- 样本集少的时候:直接使用batch(一般小于2000个)
- 一般mini-batch的size(64,128,256,512)选二次方,方便计算机处理
- 使mini-batch适合CPU/GPU内存(防止爆内存)
2.2 指数加权移动平均
什么是指数加权移动平均(例子)
通过前一天的90%+今天的10%作为平均值,画出红线
如果改变权重时:
为什么名称中含有指数?
权重的n次方后会下降到接近1/e,1/e在自然数中和(1-a)^(1/a)相等,所以等效于平均了1/1-a天的天气。
如何实现?
优点:占用内存极小(计算中只需要占用单行数字存储)
缺点:不一定精准
加权平均的偏差修正:
(偏差修正是防止刚开始的时候,数据量少导致的平均值不准确,实际上就是把开始处变小一点)
2.3 (Momentum)动量梯度下降优化算法
将上面的指数加权移动平均应用在梯度下降法中,主要是代替原来梯度下降中的微分项,用平均代替原值,可以降低微分项的震荡,加快收敛。(一般在迭代10次后初值影响就不大了,因此在实际应用中一般不加偏差修正)
原来的梯度下降法就变成了:
betla一般取0.9,效果不错
2.4 RMSprop优化算法
这种算法从动量梯度法改进而来:
可以降低震荡的幅度,并且可以在调整学习率的同时,避免增大b的震荡,加快收敛
2.5 Adam优化算法
结合了Momentum和RMSprop:
该算法广泛运用于许多的神经网络结构中。
经验取值:

2.6 学习率衰减
用同一种学习率,到最后会出现没办法完全收敛的情况。
再设定一个超参数,控制alpha学习率
- 学习率衰减法1:
- 学习率衰减法2:
指数衰减:
- 学习率衰减法3:
- 学习率衰减法4:
离散衰减:
也可以手动控制衰减(模型数量小时有用)
2.7 局部最优问题
有可能遇到鞍点
在高维空间中,鞍点需要有左右的扰动离开局部最优点
三、超参数调试、Batch正则化和程序框架
3.1 如何调试
神经网络中的所有参数(中括号代表重要性):
$$
\alpha&学习率【1】\
\beta&Momentum动量梯度优化参数【2】\
\beta_1,\beta_2,\epsilon&Adam优化算法中的参数【4】\
layers&网络层数【3】\
hidden-units&隐含层节点数【2】\
learning-rate-decay&学习率衰减函数【3】\
mini-batch--size&minibatch的大小【2】
$$
PS:
$$
\beta_1,\beta_2,\epsilon一般直接取值0.9,0.999,10^{-8}
$$
-
方形法(不要用左图网格):
二维量
-
立方体法:
三维量

选出较好的区域,继续取点:

3.2 选取超参数范围
用对数坐标尺可以快速确定超参数范围
给alpha取值:
给belta取值:
转换为取(1-belta)
离1近标尺取小,离1远标尺取大
3.3 超参数实际调整方式
Panda法:只训练一组,根据时间不断调整参数(算力不够或者数据过多)。
Caviar法:同时训练多组,取出最好的一组(需要有强大的并行算力)。
3.4 归一化网络的激活函数
两个参数y,b不是超参数,实际上就是控制归一化后结果的缩放平移
比如激活函数为sigmod,可以控制z(i)使之脱离线性区域:

在激活函数前进行归一化(BatchNum)
在batch中,b参数可以先省略,因为归一化后除平均值,该参数也就没有了
在现实中,经常也和mini-batch一起用
归一化的作用:加快学习速率
3.5 归一化加快学习速度的原因
归一化可以降低各层间的影响(都回到均值0方差1的情况)
batch归一化有类似于轻微正则化的效果,通过均值和方差限制了参数的变化。
3.6 实践中的batch归一化
均值和方差在mini-batch中的计算:
是在整个mini-batch上计算出来的,包含了一定数量的样本。
在测试集中需要逐个处理数据。
3.7 Softmax回归
softmax激活函数:
决策边界:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!