【小组汇报】20201013 — 神经网络基础知识

    科技2025-07-26  8

    声明:本文只是用于自己总结回顾使用,如有侵权,请留言,会尽快删除对应内容。

    提纲

    图像分类、目标检测、语义分割、实例分割噪声、方差、偏差欠拟合、拟合、过拟合梯度下降反向传播激活函数混淆矩阵,准确率 (accuracy),精准率 (Precision),召回率 (Recall)卷积(y=2*x 体验卷积)、池化、全连接参数量如何计算

    图像分类、目标检测、语义分割、实例分割

    图1:图像分类、目标检测、语义分割、实例分割

    ( a ) Image Classification: 图像分类,用于识别图像中物体的类别(如:bottle 瓶子、cup 杯子、cube 立方体)。 ( b ) Object Localization: 目标检测,用于检测图像中每个物体的类别,并准确标出它们的位置。 ( c ) Semantic Segmentation: 图像语义分割,用于标出图像中每个像素点所属的类别,属于同一类别的像素点用一个颜色标识。 ( d ) Instance Segmentation: 实例分割,值得注意的是,(b)中的目标检测任务只需要标注出物体位置,而(d)中的实例分割任务不仅要标注出物体位置,还需要标注出物体的外形轮廓;(c) 中的目标是将不同类别的像素点使用不同颜色表示,而(d)中的实例分割不仅要求不同类别的物体使用不同颜色,还要求不同个体(实例)之间使用不同颜色。

    注:实例分割与语义分割的区别 参考链接 目前的分割任务主要有两种: (1)像素级别的语义分割 (2)实例分割 这个有意思,什么叫实例分割呢?它与语义分割有什么区别与联系呢? 语义分割,对图像中的每个像素都划分出对应的类别,即实现像素级别的分类; 而类的具体对象,即为实例,那么实例分割不但要进行像素级别的分类,还需在具体的类别基础上区别开不同的实例。比如说图像有多个人甲、乙、丙,那边他们的语义分割结果都是人,而实例分割结果却是不同的对象,具体如下图所示:

    图2:左侧对应语义分割,右侧对应实例分割

    噪声、方差、偏差

    参考链接 学习算法的预测误差, 或者说泛化误差(generalization error)可以分解为三个部分: 偏差(bias), 方差(variance) 和噪声(noise).

    噪声:真实标记 与数据集中的 实际标记 间的偏差(标记失误,无法通过程序进行约减,需要重新标注)。

    偏差(bias) (一定程度上可以理解为是准确率):偏差衡量了模型的预测值与实际值 (ground truth)(分类任务中指的是标签)之间的偏离关系。通常在深度学习中,我们每一次训练迭代出来的新模型,都会拿训练数据进行预测,偏差就反应在预测值与实际值匹配度(准确率)上,比如通常在运行中看到的准确率为96%,则说明是低偏差;反之,如果准确度只有70%,则说明是高偏差。

    方差(variance): 方差描述的是训练数据在不同迭代阶段的训练模型中,预测值的变化波动情况(或称之为离散情况)。从数学角度看,可以理解为每个预测值与预测均值(下图中的靶心位置)差的平方和的再求平均数。通常在深度学习训练中,初始阶段模型复杂度不高,为低方差;随着训练量加大,模型逐步拟合训练数据,复杂度开始变高,此时方差会逐渐变高。

    注:理解下图时有一个前提,是对不同迭代阶段的同一物体的预测。

    图3:偏差(bias)与方差(variance)

    这是一张常见的靶心图。(注意:这是不同迭代次数中对同一目标的预测) 可以想象红色靶心表示为实际值,蓝色点集为预测值。在模型不断地训练迭代过程中,我们能碰到四种情况:

    低偏差,低方差:这是训练的理想模型,此时蓝色点集基本落在靶心范围内,且数据离散程度小,基本在靶心范围内;低偏差,高方差:这是深度学习面临的最大问题,过拟合了。也就是模型太贴合训练数据了,导致其泛化(或通用)能力差,若遇到测试集,则准确度下降的厉害;高偏差,低方差:这往往是训练的初始阶段;高偏差,高方差:这是训练最糟糕的情况,准确度差,数据的离散程度也差。

    目标(理想情况): 是既要方差小也要偏差小,这样总的误差才会小( PS:噪声属于不可约减的误差 (irreducible error) )。 误差 = 方差 + 偏差 2 + 噪音

    图4:理想情况是 低偏差、低方差

    欠拟合、拟合、过拟合

    以下两图来自链接 (PS:原文中非正经解释很有意思)

    参考链接

    欠拟合

      下图为训练初始阶段,我们的模型(蓝线)对训练数据(红点)拟合度很差,是高偏差,但蓝线近似线性组合,其波动变化小,套用数学公式也可知数值较小,故为低方差,这个阶段也称之为欠拟合(underfitting),需要加大训练迭代数。

    图5:欠拟合
    过拟合

      下图为训练的后期阶段,可明显看出模型的拟合度很好,是低偏差,但蓝线的波动性非常大,为高方差,这个阶段称之为过拟合(overfitting),问题很明显,蓝线模型很适合这套训练数据,但如果用测试数据来检验模型,就会发现泛化能力差,准确度下降。

    图6:过拟合
    拟合

      下图这个蓝色模型可认为是“恰好”的一个模型,既能跟训练数据拟合,又离完美拟合保持一定距离,模型更具通用性,用测试数据验证会发现准确度也不错。

    图7:理想的拟合情况

    这个模型怎么来呢?我们可以采取很多手段,比如:

    欠拟合时: 加大数据量,数据越多,自然其泛化能力也越强。但现实情况我们不能像大公司那样拥有很多资源,那怎么办?一种可行的办法就是根据已有的数据做数据增强,比如旋转、反转、改变图像亮暗等操作造出很多数据; 过拟合时: 正则化,通常来说有dropout、L2、L1等正则化手段;提早结束训练,防止训练过拟合化。
    dropout 方法,缓解过拟合的情况

      Dropout 说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率 P 停止工作(减少了模型参数),这样可以使模型泛化性更强,因为它不会太依赖某些局部特征。

    图8:Dropout 方法

    梯度下降

    从微分角度解释梯度请看另一篇文章

    梯度与斜率

    梯度 :的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

    梯度向量的方向即为函数值增长最快的方向。

    二维空间: 下面是一个简单的一次函数,在点(b,a)的梯度等于直线斜率(这是关于y的最快增长方向) 下面是一个二次函数图形,在(a,b)和(c,d)两点的梯度等于切线的斜率 因为斜率以x轴的正方向为参考,所以在点(a,b)处的斜率为负,但这并不影响梯度,这是梯度的负方向,取该点斜率的负方向就是梯度的正方向。 三维图形:三维图形中描述变化情况的常用工具为等高线图,我们在x,y平面上绘制等高线图如下: 我们以其中一个极值点作为增长方向,则梯度为等高线上某点切线的法向量方向 。

    既然梯度向量的方向即为函数值增长最快的方向,那么梯度下降,就是延着梯度向量的反方向进行变化。

    站在山谷的起始位置,每次走一小步,走向谷底。每次步长一定,则最快走向谷底的方向为当前位置的梯度方向的反方向。

    梯度下降的公式: α是什么含义? α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,α 太小则走的太慢(如下左图),α 太大则可能会导致错过最低点(如下右图)。所以α的选择在梯度下降法中往往是很重要的,是一个需要调整的超参数!为什么要梯度要乘以一个负号? 梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号。

    举例:单变量函数的梯度下降 假设有一个单变量的函数: f (x) = x 2 函数的微分为: f ′ ( x ) = d f ( x ) x = 2 x f ' (x) = \frac {df(x)} {x} = 2x f(x)=xdf(x)=2x 初始化起点为:x0 = 1 学习率(即步长)为: α = 0.4 梯度下降公式: x 1 = x 0 − α ∗ d f ( x ) x x_1 = x_0 - α * \frac {df(x)} {x} x1=x0αxdf(x)

    开始进行梯度下降的迭代计算过程: x0 = 1 x1 = x0 - α * f '(x) = 1 - 0.4 * 2 * 1 = 1 - 0.8 = 0.2 x2 = x1 - α * f '(x) = 0.2 - 0.4 * 2 * 0.2 = 0.2 - 0.16 = 0.04 x3 = x2 - α * f '(x) = 0.04 - 0.4 * 2 * 0.04 = 0.04 - 0.032 = 0.008 x4 = x3 - α * f '(x) = 0.008 - 0.4 * 2 * 0.008 = 0.008 - 0.0064 = 0.0016 如图,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点(实际的最低点值为0),也就是山底

    单变量函数的梯度下降

    两种特殊情况:局部最小值 与 鞍点

    两种特殊情况:局部最小值 与 鞍点 第一种:局部最小值,并非全局最小值。解决思路:调大学习率,使步长变大,从而得以越过局部最小值最近处的山峰。第二种:鞍点,梯度为0的点,回想单变量的梯度下降公式,当梯度为零时数值无法再继续变化。解决思路:强制走一点,从而实现 离开 鞍点 的目的。

    反向传播 回头再补相关内容!!!!!!!

    反向传播的思想

    对于每一个训练实例,将它传入神经网络,计算它的输出;然后测量网络的输出误差(即期望输出和实际输出之间的差异),并计算出上一个隐藏层中各神经元为该输出结果贡献了多少的误差;反复一直从后一层计算到前一层,直到算法到达初始的输入层为止。此反向传递过程有效地测量网络中所有连接权重的误差梯度,最后通过在每一个隐藏层中应用梯度下降算法来优化该层的参数(反向传播算法的名称也因此而来)。

    为了帮助较好的理解反向传播概念,对它有一个直观的理解,接下来就拿猜数字游戏举个栗子。

    两人猜数字:这一过程类比没有隐层的神经网络,比如逻辑回归,其中小黄帽代表输出层节点,左侧接受输入信号,右侧产生输出结果,小蓝猫则代表了误差,指导参数往更优的方向调整。由于小蓝猫可以直接将误差反馈给小黄帽,同时只有一个参数矩阵和小黄帽直接相连,所以可以直接通过误差进行参数优化(实纵线),迭代几轮,误差会降低到最小。 两人猜数字 三人猜数字:这一过程类比带有一个隐层的三层神经网络,其中小女孩代表隐藏层节点,小黄帽依然代表输出层节点,小女孩左侧接受输入信号,经过隐层节点产生输出结果,小蓝猫代表了误差,指导参数往更优的方向调整。由于小蓝猫可以直接将误差反馈给小黄帽,所以与小黄帽直接相连的左侧参数矩阵可以直接通过误差进行参数优化(实纵线);而与小女孩直接相连的左侧参数矩阵由于不能得到小蓝猫的直接反馈而不能直接被优化(虚棕线)。但由于反向传播算法使得小蓝猫的反馈可以被传递到小女孩那进而产生间接误差,所以与小女孩直接相连的左侧权重矩阵可以通过间接误差得到权重更新,迭代几轮,误差会降低到最小。 三人猜数字

    链式法则

    sigmod 导数推导

    反向传播完整的推导流程(详细推导过程见原文!!!)

    激活函数(使用函数画出图像)

    单一神经元模型(简单的激活函数)

      神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

    图9:单一神经元模型
    激活函数的用途(为什么需要激活函数)?

      如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。在这种情况下,深层(多个隐藏层)神经网络与只有一个隐藏层的神经网络没有任何区别,不如去掉多个隐藏层。   正因为上面的原因,我们决定引入非线性函数作为激励函数,这样 深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数,从而可以去解决多分类问题)。

    几种常见的激活函数及其导数图像 : 链接

    几种常见激活函数,绘制图像代码 :链接

    几种常见的激活函数

    图10:几种常见的激活函数

    sigmod 函数 特点:它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示: 图11:sigmod 导数图像 图12:sigmod 导数推导 缺点2:函数输出不是以0为中心的,这样会使权重更新效率降低(收敛的速度会变慢)。激活函数不是以 0 为中心的影响,上一层神经元的输入值(经过了sigmod函数激活过),所以肯定是正值,那么可以得出结论:在某一次反向传播时,对于神经元A来说,w1、w2…改变的方向是统一的,或正或负。如果你的最优值是需要w1增加,w2减少,那么只能走 z 字形才能实现。 激活函数不是以 0 为中心的影响 缺点3:sigmod函数要进行指数运算,这个对于计算机来说是比较慢的。

    tanh 函数

    tanh是双曲正切函数,tanh函数和sigmod函数的曲线是比较相近的,咱们来比较一下看看。 首先相同的是,这两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新;- - 不同的是输出区间,tanh的输出区间是在(-1,1)之间,而且整个函数是以0为中心的,这个特点比sigmod的好。

    ReLU 函数

    相比于sigmod函数和tanh函数,它有以下几个优点:

    在输入为正数的时候,不存在梯度饱和问题。计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)

    当然,缺点也是有的:

    当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。这样在前向传播过程中,还不算什么问题,有的区域是敏感的,有的是不敏感的。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。我们发现ReLU函数的输出要么是0,要么是正数,这也就是说,ReLU函数也不是以0为中心的函数。

    PReLU 函数 PReLU也是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势吧。 我们看PReLU的公式,里面的参数α一般是取0~1之间的数,而且一般还是比较小的,如零点零几。当α=0.01时,我们叫 PReLU 为 Leaky ReLU,算是PReLU的一种特殊情况吧。

    Maxout 函数 参考链接,不在此细讲。

    ELU 函数 ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱和和指数运算的问题。

    softmax 激活函数

    混淆矩阵,准确率 (accuracy),精准率 (Precision),召回率 (Recall)

    参考链接 T(True) : 预测结果 “ 正确 ” F(False): 预测结果 “ 错误 ” P(Positive) : 预测的结果为 “ 正类 ” N(Negative): 预测的结果为 “ 负类 ”

    准确率 (accuracy) :

    准 确 率 = 预 测 正 确 的 样 本 数 总 样 本 数 准确率 = \frac {预测正确的样本数}{总样本数} = a c c u r a c y = ( T P + T N ) ( T P + T N + F P + F N ) accuracy= \frac {(TP+TN)} {(TP+TN+FP+FN)} accuracy=(TP+TN+FP+FN)(TP+TN)

    使用准确率进行预测的不足

    虽然准确率可以判断总的正确率,但是在样本不平衡 的情况下,并不能作为很好的指标来衡量结果。举个简单的例子,比如在一个总样本中,正样本占 90%,负样本占 10%,样本是严重不平衡的。对于这种情况,我们只需要将全部样本预测为正样本即可得到 90% 的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。 这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。

    正因为如此,也就衍生出了其它两种指标:精准率和召回率。

    精准率 (Precision)

      精准率(Precision)又叫查准率,它是针对预测结果 而言的,它的含义是在所有被预测为正的样本中实际为正的样本的概率,意思就是在预测为正样本的结果中,预测正确的样本所占的概率。。 精 准 率 = 预 测 为 正 类 样 本 且 预 测 结 果 正 确 的 样 本 数 预 测 为 正 类 样 本 的 样 本 数 精准率 = \frac {预测为正类样本且预测结果正确的样本数}{预测为正类样本的样本数} = p r e c i s i o n = T P ( T P + F P ) precision = \frac {TP} {(TP+FP)} precision=(TP+FP)TP

    准确率与精准率的区别:

    准确率,代表整体的预测准确程度,既包括正样本,也包括负样本(指在所有预测结果中,预测正确的程度)。精准率,代表对预测为正样本的结果中,预测的准确程度。

    召回率(Recall)

      召回率(Recall)又叫查全率,它是针对原样本而言的,它的含义是在实际为正类的样本中,被正确预测为正类样本的概率,其公式如下: 召 回 率 = 预 测 为 正 类 样 本 且 正 确 的 样 本 数 实 际 为 正 类 样 本 的 样 本 数 召回率= \frac {预测为正类样本且正确的样本数}{实际为正类样本的样本数} = R e c a l l = T P ( T P + F N ) Recall= \frac {TP} {(TP+FN)} Recall=(TP+FN)TP 召回率应用场景: 更注重   比如拿网贷违约率为例,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,造成严重偿失。召回率越高,代表实际坏用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。

    精准率和召回率的分子是相同,都是 TP,但分母是不同的,一个是(TP+FP),一个是(TP+FN)。两者的关系可以用一个 P-R 图来展示。详情参考链接

    y=2*x+1 体验卷积 项目链接

    训练网络:

    训练数据:二维数据 ,5 行 13 列

    [[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

    [2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

    [3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

    [4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],

    [5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

    标签值:

    y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype(‘float32’)

    测试数据:二维数据, 1 行 13 列

    [[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]

    执行结果:

    车牌识别项目中的字符分割

    项目链接

    字符分割详解

    车牌图片:(170, 722)

    处理字符分割的核心思想:

    读取车牌图片并处理成灰度图通过阈值处理,将背景的像素值处理为 0 ,字符的像素值处理成 255 。车牌中的每个字符是由连续的列的像素值组成的,并且每一列的像素值的和不为 0 。根据这一特点对车牌进行分割,分割出车牌中的每个字符(从左往右,两个相邻的列的像素值和不为 0 之间的区域构成一个车牌中的字符)。对分割出的字符进行填充,填充成(170 * 170)大小的图片。将分割出的字符送入网络进行预测,得出预测结果。

    卷积

    局部卷积 和 全局卷积(一般接触的卷积都是全局卷积)一个卷积核对应一个特征(同一个卷积核的 权重 / 参数 共享),不同卷积和对应不同特征。重要参数:卷积核尺寸、步长、填充大小。

    池化

    最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不用观察物体在图片中的具体位置,只关心其是否出现,则使用最大池化效果比较好。平均池化往往能保留整体数据的特征,能凸出背景的信息。随机池化中元素值大的被选中的概率也大,但不是像最大池化总是取最大值。随机池化一方面最大化地保证了Max值的取值,一方面又确保了不会完全是max值起作用,造成过度失真。除此之外,其可以在一定程度上避免过拟合。

    神经网络是黑盒 !!!

    损失函数: 链接

    交叉熵损失函数0-1损失函数、绝对值损失函数、log对数损失函数、平方损失函数、指数损失函数、Smooth L1损失

    优化方法: 链接

    SGD、Momentum、Adagrad、Adagrad

    边界检测

    批量归一化

    参数量如何计算

    经典网络:

    LeNet、AlexNet、VGG、GoogLeNet 、ResNet、Yolo、Fast-RCNN(R表示的是区域)、Faster-RCNN、SSD
    Processed: 0.011, SQL: 8