Weekly 20241026

这周学了什么

何为反向传播?

维基百科
这是维基百科上的解释:

反向传播(英语:Backpropagation,意为误差反向传播,缩写为BP)是对多层 人工神经网络 进行 梯度下降 的算法,也就是用 链式法则 以网络每层的权重为变量计算 损失函数 的梯度,以更新权重来最小化损失函数。

我对反向传播的算法的理解就是:

也就是说,反向传播算法是用来让我们的模型不断去接近理想输出的一种方法?我这样说对不对?

ChatGPT也给出了自己的回答:

对的!反向传播算法确实是让模型不断接近理想输出的一种方法。通过计算损失(预测输出和真实标签之间的差异)对模型参数的导数(梯度),反向传播指导模型参数的调整方向和步伐,让模型的预测更贴近真实结果。
总结来说,反向传播就是通过“计算误差并调整权重”这一循环,使模型在每一轮迭代中变得“更聪明”,更符合理想输出。

有用链接

[Deep Learning] 神经网络基础 - Poll的笔记 - 博客园
一文弄懂神经网络中的反向传播法——BackPropagation - Charlotte77 - 博客园
A Step by Step Backpropagation Example
3-3 反向传播的深入理解 — 梗直哥随笔 v0.1 文档
反向传播算法
和ChatGPT的对话也记录如下:
反向传播算法(Backpropagation)是一种计算梯度的算法,主要用于训练神经网络。它是一种梯度下降法,核心思想是通过计算输出误差对网络各层权重的偏导数,逐层更新权重,以最小化损失函数。反向传播在深度学习中的重要性在于它可以高效地计算复杂网络结构的梯度,从而在训练过程中引导模型逐步找到最优解。

1. 反向传播的工作流程

反向传播通常分为前向传播反向传播两个阶段:

  1. 前向传播:输入数据通过网络传递,计算出预测值。具体来说,数据依次通过网络中的每一层,应用相应的激活函数,得到最终输出。
  2. 反向传播:根据预测输出和真实标签的差异,计算损失函数的梯度。通过链式法则,将误差从输出层逐层向输入层传播,计算各层权重的梯度,然后更新权重。

2. 反向传播的数学推导

假设网络中的第 ( L ) 层的激活值记为 ( a^L ),该层的权重为 ( W^L ),偏置为 ( b^L ),则该层的输出可以表示为: [ z^L = W^L a^{L-1} + b^L ] 其中,激活函数 ( f ) 被应用在 ( z^L ) 上得到: [ a^L = f(z^L) ]
损失函数:假设损失函数为 ( \mathcal{L} ),它是网络输出和真实值的差异度量。为了最小化损失,反向传播的任务就是计算损失 ( \mathcal{L} ) 对网络中每个权重 ( W ) 的梯度 ( \frac{\partial \mathcal{L}}{\partial W} ),然后更新权重。

3. 链式法则在反向传播中的作用

由于损失是网络层次结构的函数,我们无法直接计算每个权重的梯度,但可以利用链式法则。反向传播的核心步骤是对网络中的每一层进行梯度计算。具体来说,对某一层 ( L ) 的损失 ( \mathcal{L} ) 求导的公式如下:
[ \frac{\partial \mathcal{L}}{\partial W^L} = \delta^L \cdot (a^{L-1})^T ]
其中:

  • ( \delta^L ) 表示第 ( L ) 层的误差项,可以通过链式法则表达为: [ \delta^L = \frac{\partial \mathcal{L}}{\partial z^L} = (W^{L+1})^T \delta^{L+1} \cdot f’(z^L) ]
  • ( f’(z^L) ) 是激活函数 ( f ) 在 ( z^L ) 处的导数。

这样从输出层开始,逐层往前计算每一层的误差,直到输入层。这个过程称为误差的反向传播

4. 权重更新

在得到各层的梯度之后,可以使用梯度下降法更新权重: [ W^L = W^L - \eta \frac{\partial \mathcal{L}}{\partial W^L} ] 其中,( \eta ) 是学习率,控制权重更新的步伐。

5. 实现中的注意点

  • 梯度爆炸与消失:在深层神经网络中,反向传播时梯度可能会逐渐放大或缩小,导致梯度爆炸或消失。这是深度学习的经典问题,可以通过使用更好的激活函数(如ReLU)、正则化或批归一化等方法缓解。
  • 高效实现:在实际实现中,通常使用矩阵运算(如利用深度学习框架)来批量计算反向传播的梯度,提高计算效率。

总结

反向传播的过程就是通过链式法则,从输出层逐层往前计算误差,并用这些误差更新权重,使得损失逐渐减小。这个算法非常高效,特别适合多层神经网络的训练,因此成为了深度学习的基础。

那么,反向传播算法究竟做了什么呢?

反向传播算法在神经网络中主要做了以下几件关键的事情:

1. 计算误差

在反向传播算法的开始,我们首先通过前向传播计算网络的输出,并与真实标签进行比较。这一步的目标是得到预测结果与真实值的差异(称为误差),通常用损失函数(如均方误差或交叉熵损失)来量化。

2. 计算梯度(误差对每个权重的导数)

为了调整网络中的权重,使其对误差的贡献变小,我们需要计算梯度。梯度表示了损失函数对于每一个权重的敏感程度,即权重变化对误差的影响有多大。
具体而言,梯度计算分层进行。反向传播从输出层开始,逐层往前(向输入层方向)计算每一层的梯度:

  • 对于每一层的权重和偏置,反向传播通过链式法则计算误差相对于它们的导数。
  • 通过将误差分层传播回去,每一层的误差被分解并传递到前一层,这样便能得到每一层的梯度。

3. 更新权重

在得到了每个权重和偏置的梯度之后,反向传播使用这些梯度来更新权重。更新的方式通常是通过梯度下降,每一层的权重更新公式为: [ W = W - \eta \cdot \frac{\partial \mathcal{L}}{\partial W} ] 其中,( \eta ) 是学习率,决定了每次更新的步伐大小。
梯度下降的思想是:如果权重对误差的贡献很大(梯度较大),则需要调整的力度也较大;相反,如果对误差的影响不大,则更新的幅度会较小。

4. 迭代优化,逐步逼近最优解

反向传播是一个迭代的过程,通过不断进行前向传播和反向传播更新权重。每次迭代都会使模型的输出逐渐逼近真实值,误差逐渐缩小,直到收敛到某个极小值(理想情况下为最小值),网络达到较好的状态。

总结来说,反向传播算法在神经网络中完成了以下任务:

  • 计算输出与真实值的误差
  • 逐层计算权重和偏置的梯度
  • 使用梯度下降法更新权重
  • 反复迭代,优化网络性能

通过这些步骤,反向传播让网络的参数不断调整,使得模型输出越来越接近理想的目标输出。

梯度是什么东西?
维基百科的链接

梯度下降法是什么?

维基百科
这里的解释也很好:
梯度下降 · Machine Learning

这里直接贴上ChatGPT的回答:
梯度下降算法(Gradient Descent)是优化机器学习和深度学习模型参数的重要算法。它通过不断调整参数,使模型的损失函数值逐步降低,从而实现模型的优化。

梯度下降的基本概念

在机器学习中,模型的性能通常通过损失函数(Loss Function)来衡量,梯度下降的目标就是最小化这个损失函数。算法从一个随机的参数起点出发,通过多次迭代找到使损失函数最小的参数值。每次迭代会计算损失函数对模型参数的梯度,并按照梯度的反方向调整参数值(因为在梯度的方向上,损失函数的值会增加,所以反方向会减少)。

什么是梯度

梯度实际上是损失函数相对于参数的偏导数。它表示了函数在当前点的增长最快的方向和速率。数学上,梯度就是一个向量,指向损失函数增大的方向,向量的大小反映了损失函数增大的快慢。

机器学习中的梯度 vs. 数学中的梯度

机器学习和数学中的梯度在定义上是相同的,即函数在某点处的偏导向量。然而,梯度在机器学习中不仅仅是描述函数变化的工具,更是优化过程中指导模型参数调整的重要依据。因此,梯度的具体含义取决于它在优化损失函数时的作用。

我继续追问:

所以,这里的梯度就是一个偏导数,代表了我们当前损失函数增长最大的方向。而损失函数应当越小越好,所以我们需要根据梯度来找到损失函数“最能影响我们当前模型的地方“,从而通过下降梯度来减少损失函数。我这样说对不对?

对,你理解得非常到位!
梯度确实是损失函数在当前位置增长最快的方向,而我们的目标是找到使损失函数最小的参数值。因此,我们会朝着梯度的反方向移动,从而“下降”损失函数。也就是说,梯度下降就是在每一步找出“最能影响当前模型的地方”,然后朝着降低损失的方向调整。
具体来说,梯度越大,表明当前位置的损失函数变化越大,我们也会适当地调整步长(学习率)以确保收敛效果。

看的文章

链接
在特征工程一节中,采用了The interquartile range (IQR) statistical 方法去除离群值.
在进行降维的时候:

对于二元数据集,我们根据对特征的先验知识对由 32 个特征组成的初始数据集进行了子采样;而对于三元数据集,我们使用了基于树、顺序和递归的特征消除技术,以及线性判别分析(LDA)将数据转换到低维空间。

来到结果和讨论章节:

我们首先建立了一个包含 32 个特征的数据集,然后进行了特征工程,包括离群点去除、统计显著性分析和成对相关性分析。经过这些步骤后,我们得到了由 23 个特征组成的二元分类器数据集(“缺陷 “和 “无缺陷”)和由 20 个特征组成的三元分类器数据集(“深度 1”、“深度 2 “和 “深度 3”)。

为了进一步减少维数,我们对二元数据集进行了子采样,创建了两个分别由 16 个和 7 个特征组成的额外数据集。因此,我们总共有 3 个二元分类数据集。对于三元数据集,我们采用了各种降维技术,如基于树的特征选择器、递归特征选择器、序列特征选择器和 LDA 特征选择器。这一过程产生了 5 个三元分类数据集。所有这些数据集都经过了独立的训练和评估。

为此,我们将每个数据集随机分成训练集和测试集,其中 65% 的数据用于训练,35% 用于测试。为了在不同的类别中保持相同的观测值数量,我们采用了分层拆分和 5 倍交叉验证的方法。在分类方面,我们使用了支持向量机(SVM)分类器,该分类器旨在找到最佳的超平面,以最好地区分不同类别,同时通过提供软边际来允许一些误分类。

选择支持向量机和其结果:

在这项研究中,我们有意选择使用 SVM 这种经典的机器学习方法,而不是更复杂的神经网络。我们之所以做出这样的决定,是因为分类结果简单、透明。虽然特征是人工挑选的,而不是由模型选择的,但它们的选择是基于我们之前的研究 [4 ,35],这些研究证明了它们在脱粘检测中的有效性。因此,本文在特征、特征的重要性以及分类的灵敏度和特异性之间建立了直接联系,提供了新的见解。此外,众所周知,具有明确特征的 SVM 可以有效地泛化未见数据,避免过拟合。通过对训练过程中未使用的数据(这些数据来自不同几何形状的样本)和独立实验中的数据进行演示,我们证实了该模型的泛化能力。

最后,文章也指出了使用SVM(基于传统机器学习)的优势:训练速度和易于实施方面都具有明显优势,这种简单易用使得在研究中的易用性提高了.相比之下,神经网络的学习通常会花费更多的时间,这样会导致成本的上升。
并且.随系数据集的大小和复杂度的增长,SVM的性能可能有限 .在应对大量复杂的且非线性的数据集的时候,神经网络可以自动提取特征并提供更大的泛化和鲁棒性潜力,尤其是在处理现实世界的变化和噪声时。

跑的模型

上周因为网不太好导致并没有成功验证焊接的缺陷检测模型。这周终于完成了模型的训练并且成功用来检测缺陷了。我分别采用30次迭代和80次迭代次数进行训练。在30次的次数下,效果不是很理想。但是在80次的训练之后,模型可以正确识别出焊接的工件,焊缝和缺陷了。但是现在仅仅是能识别出焊接的缺陷而已,还不能做到正确的分类。这点仍旧需要加强。