一、K近邻分类器(K - Nearest Neighbors)
对于计算机而言,图像是矩阵,彩色图像就是有RGB三通道,三层矩阵;不同色素块就是矩阵元素里不同数值大小(0~255)。
1.工作流程简说:目标图像减去训练图像可以得到一系列距离误差;误差越小,距离越近;然后选取k个最近的图像,投票来确定目标图像最有可能的标签。
名称 | 公式 | 优点 |
L1(曼哈顿距离) | | 计算量更小 |
L2(欧几里得距离) | | 更平滑 |
这种方法在图像识别上的缺点显而易见,例如下图,目标函数是青蛙,但是却很有可能被认为是猫、飞机、甚至航母。
这是因为某种意义上来说,knn在图像识别里是基于色素块矩阵对应元素相减的。
此外还有其它缺点:(1)训练快(把图像直接输入计算机了)但是预测很慢(目前图像与训练好的记住的图像算距离)。这是我们不想要的,我们更需要预测速度快的算法/模型。(2)像素距离not informative,两个图像操作得到的距离没任何意义。
http://vision.stanford.edu/teaching/cs231n-demos/knn/
2.K折交叉验证:数据集划分为k+1个均匀子集,一个作为测试集;进行k次实验;k个子集每次选取一个作为验证集,通过验证集来选取最合适的距离计算方式和k值(太小敏感、太大过拟合);最后在测试集进行验证。 是一种强大的模型评估技术
优点 | 使用场景 |
1.评估更可靠,减少因数据划分导致的偏差,全面利用数据。 2.有效估计模型泛化能力,结果稳定性强。 3。可用于超参数调优,选出最佳参数组合。 | 1.小数据集:样本少,传统划分评估不稳定,K 折交叉验证能全面评估模型。 2.超参数选择:对比不同超参数组合下模型性能,确定最优设置。 3.模型比较:评估多种模型,挑选最合适的用于特定任务。 |
二、线性分类器 (Linear Classifier)
Flatten tensors into a vector 张量展平为向量
图像是矩阵,但x是列向量
1.工作流程简述:图像矩阵拉成列向量,左乘权重矩阵w加偏移量b结果为得分。
2.对得分的后续操作
理论上有目标在各种标签上的得分后,去对比实际得分进行操作,这样一对比就会有个损失,有损失就可以更好的进行参数更新了。这样的损失叫做数据损失
损失函数 | 应用场景 | 作用 |
softmax loss | 多分类 | 输出转化为概率 |
svm loss | 线性分类 | 最大化类别间隔的超平面 试图在不同分类间找到一个超平面,使其间隔最大 |
2.1softmax loss:
经过softmax函数后,得分转化为概率(总和为1),可以更明显看到预测效果。而实际标签是one-hot encoding(即只有一个1,其余全为0)。预测概率与实际概率进行操作(均分误差or交叉熵损失)可以得到一个损失。
交叉熵损失可以更好的区分成模型的差异,因此更常用。
2.2svm loss:
SVM 的核心目标找到具有最大间隔的分类超平面
三、正则化(Regularization)
数据损失降的太小,说明模型对当前训练集学习太好。抽象来说就是得到的函数与训练集上的数据高度重合。这样会导致模泛化能力不够。所以我们引出了正则化损失。
正则化的作用是防止模型在训练集上过拟合,直观来说就是更喜欢简单的函数,只在训练过程中使用,目的是找到合适参数。
总损失=数据损失+正则化损失 ;损失是关于w的函数
Occam’s Razor: Among multiple competing hypotheses, the simplest is the best.
正则化的作用:(1)表达对权重的偏好(2)简化模型以确保其在测试数据上有效(3)通过增加曲率来优化改进(正则化损失是一个w的函数,加入一个新函数后的总函数的曲率通常变高,在高曲率区域,模型参数不能轻易地为了拟合个别噪声数据点而大幅变动。)
1.常见正则化如下
接下来让我们更深入了解这些正则化计数:
1.BN(batch normalization)
为什么引入批正则化?:层与层之间的输入分布会随着参数更新不断发生变化,这种现象被称为内部协变量偏移,进而导致梯度传播不稳定、收敛慢、对超参数敏感。
上一层的输出数据(特征图),经过BN在进入到本层作为输入后,好处:可以使数据更规整,不会有很多“刺头“数据,相当于模型在训练时候不会关注细小噪声,从而不会过拟合。(之前说过拟合,就是因为模型把数据学习的太好,一些噪音也考虑到了)
理想情况希望,把每层的数据全都一起进行bn,但实际由于算力不足,无法一窝端,因此需要小批次minibatch的进行bn。
流程:先在 mini-batch 的数据上计算其均值和方差。然后进行归一化操作。
归一化后的输出被严格限制在均值为 0 和方差为 1 的分布中,使得模型的学习能力受到一定限制。为了恢复模型的表达能力,BN 引入了两个可学习的参数:缩放参数 γ 和偏移参数 β,将归一化后的数据进行线性变换以此来恢复模型表达能力。缩放参数 γ 和偏移参数 β会根据每一层的输入输出通过反向传播进行更新,训练完之后,这两个参数也就定下来了,推理时直接使用。
在训练时,是每个小批次进行bn。但在推理时,会使用训练过程中每一层都使用累积的全局均值和方差来进行归一化,缩放参数 γ 和偏移参数 β会使用已经训练好的。
局限性:
(1)当 batch size 较小时,均值和方差的估计会变得不稳定,导致 BN 效果变差。通常使用大于 16 的 batch size 或改用LN、IN和 GN等替代方法。(李沐说过小是好的,太大不行,有点反直觉。理由是数据少的话噪音会大,在目前神经网络太深的情况下,数据噪音大可以提升模型鲁棒性,泛化能力增强
(2)BN 在循环神经网络中效果不如在卷积神经网络中显著。这是因为 RNN 的数据序列特性较强,batch 内的不同样本在时间上的依赖性(根据时间变化)会影响均值和方差的稳定性。
(3)在推理时,BN 需要使用训练阶段积累的均值和方差进行归一化操作,这增加了额外的计算成本。
2.LN(Layer Normalization)
BN又叫纵向规范化:对同一通道选取的数据来进行操作;CNN用。
LN又叫横向规范化(层正则化):根据所指定的单个数据,考虑全部通道,来对这一个样本进行操作;RNN用。
BN并不适用于RNN等动态网络和batchsize较小的时候效果不好。Layer Normalization(LN)的提出有效的解决BN的这两个问题。
LN与BN的公式是相同的,但是所选取数据不同。
LN在单个样本的层级上进行操作,即考虑该样本的所有通道;对每个样本独立计算规范化参数(均值和标准差),而BN是在整个批量的基础上。
对于给定的样本,在其所有特征(或通道)上计算均值和标准差。然后,使用这些统计数据来规范化该样本的每个特征。
3. IN(Instance Normalization)
实例归一化主要用于风格迁移任务中。IN 仅在每个样本的每个通道上进行归一化,忽略了 batch 维度上的信息,适合图像生成任务,尤其是图像风格迁移中的应用。
BN、LN、IN公式是相同的,仅在选取数据不同
4.Droupout
在神经网络的训练过程中,Dropout 随机失活以一定的概率p随机 “丢弃”(即暂时将其输出设为 0)隐藏层中的神经元。这就像在训练时随机生成不同结构的 “子网络”,每次前向传播,都会有不同的神经元被随机选中参与计算,这些被保留的神经元共同协作来进行预测。例如,一个具有 100 个神经元的隐藏层,若 Dropout 概率设为 0.5,那么每次训练时大约会随机关闭 50 个神经元 。
但是在测试时,所有神经元都参与计算,但它们的输出会乘以训练时的保留概率(1 - p) 。这是为了保证测试时神经元输出的期望与训练时保持一致。
一般在全连接层使用,
四、优化器(Optimizer)
我们知道了损失之后,下一步就是根据这个损失去更新参数,而其中具体用到的方法就是优化器。
优化器的作用是通过调整模型参数,使目标函数(通常是损失函数)达到最小化(或在某些情况下最大化),从而提升模型的性能。
引1.梯度下降法基本思想
梯度定义:矢量(向量),方向是函数在该点处变化最快的方向,也就是函数值上升最快的方向;大小表示函数在这个方向上的变化率。简言之,梯度指引上升最快的方向,梯度的反方向函数下降最快。
所以,想找损失函数最小的点,就往梯度反方向走,即更新w。
负号代表梯度反方向;学习率*梯度;
若损失函数是w的函数,那么损失最小点一定是损失函数梯度为零的点。
因此才有了基于梯度的一系列优化器。
BGD | 批量梯度下降 | 参数更新使用全部样本 |
SGD | 随机梯度下降 | 参数更新使用1个样本 |
MBGD | 小批量梯度下降 | 参数更新使用小部分样本 |
这三种传统梯度下降法训练时使用数据量不同,但进行参数更新时采用方法相同:
1求梯度;2求梯度平均值;3更新权重(公式)
缺点:由于学习率不变导致找不到极小值点or收敛至局部极小。
因此有了在梯度方面或在学习率方面改进的优化器
引2.动量(Momentum)
动量(Momentum)方法是一种在深度学习中广泛使用的优化策略,它通过引入动量项来加速梯度下降算法的收敛并提高其稳定性。----即基于梯度方面改进
把原始公式里梯度替换成动量项,这个动量项是历史梯度和当前梯度的关系式。
动量(累计梯度)更新:
是衰减系数;对指数加权平均的影响很大。如果 接近 1,那么历史数据的影响会持续很长时间,平滑效果更强;如果 0,则新数据的影响更大,对变化的反应更快。
左边是当前动量,右边是历史动量(累计梯度);
动量方法的核心思想是模拟物理学中的动量概念,通过累积过去梯度的信息来调整参数更新的方向和幅度。动量通过指数加权平均的方式来计算。
指数加权平均:指数,是一个理解方面,因为距离今天越远的参数会被指数级衰减。加权平均是另一个理解,是因为在历史梯度和当前梯度前有个系数,这就相当于加权后进行平均。
衰减系数控制历史梯度平方和的衰减速度:
较大时(如 0.99),历史目标值的变化较慢(忘得慢,会受较远目标值的充分影响)。
较小时(如 0.9),历史目标值的变化较快(忘得快,很受最近目标值的影响)。
1.SGD+Momentum
SGD 加动量算法在随机梯度下降基础上,引入动量概念,通过指数加权平均的方式累积梯度形成速度,利用速度帮助参数更新,使更新方向更稳定且能加速收敛,避免在局部最小值或鞍点处停滞。----即在梯度方面改进
动量(累计梯度)更新:
梯度更新:
优点:
(1)加快收敛;帮助跳出局部最小
(2)在每一步的更新中加入一部分上一步的速度,帮助算法在相关方向上加速,并减少在目标函数的平坦区域中的震荡。
2.RMSProp
Root Mean Square Propagation是一种自适应学习率的优化算法,旨在解决 AdaGrad 学习率单调递减的问题。RMSProp 通过引入衰减系数(decay rate),使得历史梯度平方和不会无限增长,从而更好地适应非凸优化问题。
AdaGrad 的问题是:(1)由于是梯度累计,所以会不断增大,所以学习率会逐渐减小,可能导致训练后期学习率过小,收敛缓慢。(2)内存开销较大:需要存储每个参数的历史梯度平方和。
而Rmsprop通过指数加权平均的思想,来计算梯度平方和。
是累计梯度平方,去替换AdaGrad的
项,这样就不会导致学习率衰减过快了。右下角的公式,可知Rmsprop算法在学习率方面进行改进。
这用到了上文中的指数加权平均的思想,我们也对此有了更深的了解:指数加权平均可以使历史目标值不会无限增大,时间较早的目标值会被指数级衰减。
3.Adam
Adaptive Moment Estimation结合了Momentum和 RMSProp 的思想,旨在通过计算梯度的一阶矩估计和二阶矩估计来调整每个参数的学习率,从而实现更高效的网络训练。
在算法的初期,由于和
(分别是梯度的一阶矩和二阶矩的估计)是从 0 开始初始化的,会导致它们在初始阶段被低估。特别是当
和
接近 1 时,这个偏差会更加显著。为了补偿这种估计的偏差,Adam 算法引入了偏差校正步骤。
通过除以 ,可以将
和
的值放大,使其更快地接近实际的梯度均值。随着迭代次数 k的增加,
会趋向于 0,偏差校正因子
就会趋向于 1,偏差校正的影响会逐渐减小。
偏差校正对于 Adam 算法在训练的初期至关重要。没有偏差校正,算法可能会因为初始的低估而导致学习步长太小,进而影响训练的速度和效果。通过偏差校正,Adam 算法可以更快地调整其参数更新的大小,加速初期的学习过程,并提高整体的优化效率。
由图右下角公式可知,Adam是在梯度方面和学习率方面都进行改进的优化器。使用了动量里的历史梯度+RMSProp的学习率并且加上了偏差矫正
Rprop(Resilient 弹性 Backpropagation)算法
通仅使用梯度的符号来计算更新,而不是梯度的大小,从而动态地为每个权重独立地调整步长。
这种方法克服了传统梯度下降算法的一些固有缺点,并且由于其对误差函数行为的局部适应性,使得学习过程更加高效和透明。
代码实现
随机梯度下降(SGD)、
带动量的随机梯度下降(SGD+Momentum)、
均方根传播(RMSProp)
自适应矩估计(Adam)
和权重衰减自适应矩估计(AdamW)
公式总结
五、全连接神经网络fully-connected networks有时多层感知机mlp
指数计算是一件很贵的事,所以现在很多激活函数使用relu
反向传播算法(Backpropagation)