(二十四) 手推BP神经网络的前向传播和反向传播

手推BP神经网络的前向传播和反向传播

一、基本术语

1、监督学习与非监督学习

Supervised Learning有监督式学习: 输入的数据被称为训练数据,一个模型需要通过一个训练过程,在这个过程中进行预期判断,如果错误了再进行修正,训练过程一直持续到基于训练数据达到预期的精确性。其关键方法是分类和回归,比如逻辑回归(Logistic Regression)和BP神经网络(Back Propagation Neural Network)。

Unsupervised Learning无监督学习: 没有任何训练数据,基于没有标记的输入数据采取推导结构的模型,其关键方式是关联规则学习和聚合,比如k-means.

2、深度学习的推理和训练

训练(Training): 一个初始神经网络通过不断的优化自身参数,来让自己变得准确。这整个过程就称之为训练(Traning)。

推理(Inference): 你训练好了一个模型,在训练数据集中表现良好,但是我们的期望是它可以对以前没看过的图片进行识别。你重新拍一张图片扔进网络让网络做判断,这种图片就叫做现场数据(live data),如果现场数据的区分准确率非常高,那么证明你的网络训练的是非常好的。这个过程,称为推理(Inference)。

3、优化和泛化

深度学习的根本问题是优化和泛化之间的对立。
优化(optimization) 是指调节模型以在训练数据上得到最佳性能(即机器学习中的学习)。
泛化(generalization) 是指训练好的模型在前所未见的数据上的性能好坏

4、数据集的分类

数据集可以分为:
1.训练集: 实际训练算法的数据集;用来计算梯度,并确定每次迭代中网络权值的更新;
2.验证集: 用于跟踪其学习效果的数据集;是一个指示器,用来表明训练数据点之间所形成的网络函数发生了什么,并且验证集上的误差值在整个训练过程中都将被监测;
3.测试集: 用于产生最终结果的数据集。

为了让测试集能有效反映网络的泛化能力:
1. 测试集绝不能以任何形式用于训练网络,即使是用于同一组备选网络中挑选网络。测试集只能在所有的训练和模型选择完成后使用;

2. 测试集必须代表网络使用中涉及的所有情形。

5、交叉验证

这里有一堆数据,我们把他切成3个部分(当然还可以分的更多)
第一部分做测试集,二三部分做训练集,算出准确度;
第二部分做测试集,一三部分做训练集,算出准确度;
第三部分做测试集,一二部分做训练集,算出准确度;
之后算出三个准确度的平局值,作为最后的准确度。
在这里插入图片描述

为什么要交叉验证:目的有两个:
1.选择合适的模型
2.选择合适的参数
1.对于一个问题,可以用模型m1,m2,不知道哪个的准确率高,可以交叉验证一下,从而选择用哪个
2.对于一个模型,参数的选择会影响结果,所以用交叉验证选择最合适的参数
然后,常用的交叉验证的方式是k折交叉验证(k-fold cross validation)
把数据集分为训练集和测试集:
先把所有数据分成k组,其中k-1组作为训练集,剩下的一组作为测试集,这样有k种选法,把k种选法得到的训练集和测试集进行模型训练和测试,得到的结果平均,就是交叉验证的结果。还有一种方法,就是留n法,每次把n个数据作为测试集,留1法就是k折的一个特例

6、神经网络的训练

代(Epoch): 使用训练集的全部数据对模型进行一次完整训练,被称为“一代训练”。
批大小(Batch size): 使用训练集的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”
迭代(Iteration): 使用一个Batch数据对模型进行一次参数更新的过程,被称为“一次训练”(一次迭代)。每一次迭代得到的结果都会被作为下一次迭代的初始值。
一个迭代 = 一个正向通过 + 一个反向通过。
在这里插入图片描述
比如 训练集有500个样本,batchsize= 10 ,那么训练完整个样本集:iteration=50,epoch=1.

二、bp神经网络

BP网络(Back-Propagation Network) 是1986年被提出的,是一种按误差逆向传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一,用于函数逼近、模型识别分类、数据压缩和时间序列预测等。

• BP网络又称为反向传播神经网络,它是一种有监督的学习算法,具有很强的自适应、自学习、非线性映射能力,能较好地解决数据少、信息贫、不确定性问题,且不受非线性模型的限制。

• 一个典型的BP网络应该包括三层: 输入层、隐藏层和输出层。各层之间全连接,同层之间无连接。隐藏层可以有很多层。
在这里插入图片描述

1、学习过程:

正向传播输入信号从输入层经过各个隐藏层向输出层传播。在输出层得到实际的响应值,若实际值与期望值误差较大,就会转入误差反向传播阶段。反向传播按照梯度下降的方法从输出层经过各个隐含层并逐层不断地调整各神经元的连接权值和阈值,反复迭代,直到网络输出的误差减少到可以接受的程度,或者进行到预先设定的学习次数。

2、神经网络的训练过程

1、粗略过程

1.提取特征向量作为输入。
2.定义神经网络结构。包括隐藏层数,激活函数等等。
3.通过训练利用反向传播算法不断优化权重的值,使之达到最合理水平。
4.使用训练好的神经网络来预测未知数据(推理),这里训练好的网络就是指权重达到最优的情况。

2、进一步具体过程

1、选择样本集合的一个样本(Ai,Bi),Ai为数据、Bi为标签(所属类别)
2、送入网络,计算网络的实际输出Y,(此时网络中的权重应该都是随机量)
3、计算D=Bi−Y(即预测值与实际值相差多少)
4、根据误差D调整权重矩阵W
5、对每个样本重复上述过程,直到对整个样本集来说,误差不超过规定范围神经网络的训练过程

3、更具体的

1 参数的随机初始化
2 前向传播计算每个样本对应的输出节点激活函数值
3 计算损失函数
4 反向传播计算偏导数5使用梯度下降或者先进的优化方法更新权值

三、前向传播准备

1、参数的随机初始化

对于BP神经网络的所有的参数我们必须初始化它们的值,而且它们的初始值不能设置成一样,比如都设置成0或1。如果设置成一样那么更新后所有参数都会相等。即所有神经元的功能都相等,造成了高度冗余。所以我们必须随机化初始参数。
•特别的,如果神经网络没有隐藏层,则可以把所有参数初始化为0。(但这也不叫深度神经网络了)

参数初始化方式选择

权重初始化并不是简单的随机初始化,而是一项会影响训练性能的关键一步,而且有时候会依赖于选择的激活函数。 如果仅仅是将权重随机初始化为一些很小的随机数,它会打破梯度更新对称性。

1. 权重参数初始化从区间均匀随机取值。
2. XAvier初始化(sigmoid、tanh)
在这里插入图片描述

3. 初始化为小的随机数(小型网络):比如,可以初始化为均值为0,方差为0.01的高斯分布
4. 权重初始化为正态分布(relu)
5. MSRA Filler(relu):用均方差为0,方差为
在这里插入图片描述
的高斯分布。
6. 偏置bias的初始化:一般初始化为0

2、输入数据标准化

原因:由于进行分类器或模型的建立与训练时,输入的数据范围可能比较大,同时样本中各数据可能量纲不一致,这样的数据容易对模型训练或分类器的构建结果产生影响,因此需要对其进行标准化处理,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

1、归一化

其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上。
在这里插入图片描述

2、零均值归一化

z-score标准化(零均值归一化zero-mean normalization):
•经过处理后的数据均值为0,标准差为1(正态分布)
•其中μ是样本的均值,σ是样本的标准差
在这里插入图片描述

3 、损失函数

损失函数用于描述模型预测值与真实值的差距大小。一般有有两种常见的算法——均值平方差(MSE)和交叉熵。

1、均值平方差(Mean Squared Error,MSE),也称“均方误差”:
在这里插入图片描述

2、交叉熵(cross entropy) 也是loss算法的一种,一般用在分类问题上,表达意思为预测输入样本属于哪一类的概率。值越小,代表预测结果越准。(y代表真实值分类(0或1),a代表预测值):

在这里插入图片描述
3、损失函数的选取

损失函数的选取取决于输入标签数据的类型:
1.如果输入的实数、无界的值,损失函数使用MSE。
2.如果输入标签是位矢量(分类标志),使用交叉熵会更适合。

四、反向传播准备

1、梯度下降法

梯度∇f=(∂x1​∂f;∂x2​∂f;…;∂xn​∂f)指函数关于变量x的导数,梯度的方向表示函数值增大的方向,梯度的模表示函数值增大的速率。

•那么只要不断将参数的值向着梯度的反方向更新一定大小,就能得到函数的最小值(全局最小值或者局部最小值)。

•一般利用梯度更新参数时会将梯度乘以一个小于1的学习速率(learning rate),这是因为往往梯度的模还是比较大的,直接用其更新参数会使得函数值不断波动,很难收敛到一个平衡点(这也是学习率不宜过大的原因)。
在这里插入图片描述

2、学习率

学习率是一个重要的超参数,它控制着我们基于损失梯度调整神经网络权值的速度。学习率越小,我们沿着损失梯度下降的速度越慢。从长远来看,这种谨慎慢行的选择可能还不错,因为可以避免错过任何局部最优解,但它也意味着我们要花更多时间来收敛,尤其是如果我们处于曲线的至高点。
新权值= 当前权值-学习率×梯度学习率

3、泛化能力分类

欠拟合: 模型没有能够很好的表现数据的结构,而出现的拟合度不高的情况。模型不能在训练集上获得足够低的误差;
拟合: 测试误差与训练误差差距较小;
过拟合: 模型过分的拟合训练样本,但对测试样本预测准确率不高的情况,也就是说模型泛化能力很差。训练误差和测试误差之间的差距太大;
不收敛: 模型不是根据训练集训练得到的。
下图依次树欠拟合、拟合、过拟合。
在这里插入图片描述

1、过拟合

•过拟合指的是给定一堆数据,这堆数据带有噪声,利用模型去拟合这堆数据,可能会把噪声数据也给拟合了。
•一方面会造成模型比较复杂;
•另一方面,模型的泛化性能太差了,遇到了新的数据,用所得到的过拟合的模型,正确率是很差的。

2、过拟合出现原因

1、 建模样本选取了错误的选样方法、样本标签等,或样本数量太少,所选取的样本数据不足以代表预定的分类规则
2、 样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则
3、 假设的模型无法合理存在,或者说是无法达到假设成立的条件
4、 参数太多导致模型复杂度过高
5、 对于神经网络模型:
a) 对样本数据可能存在分类决策面不唯一,随着学习的进行,,BP算法使权值可能收敛过于复杂的决策面;
b) 权值学习迭代次数足够多,拟合了训练数据中的噪声和训练样例中没有代表性的特征。

3、过拟合的解决方法

1.减少特征:删除与目标不相关特征,如一些特征选择方法----2
2.Early stopping ---- 对应5-b和4
3.更多的训练样本。----1
4.重新清洗数据。---- 2
5.Dropout+正则化 ---- 4

4、Early Stopping

•在每一个Epoch结束时,计算validation data的accuracy,当accuracy不再提高时,就停止训练。

•那么该做法的一个重点便是怎样才认为validation accurary不再提高了呢?并不是说validation accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让accuracy又上去了,所以不能根据一两次的连续降低就判断不再提高。

•一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。

•这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30

5、Dropout

在神经网络中,dropout方法是通过修改神经网络本身结构来实现的:
1.在训练开始时,随机删除一些(可以设定为1/2,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变。
2.然后按照BP学习算法对ANN中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。这样一直进行,直至训练结束。Dropout方法是通过修改ANN中隐藏层的神经元个数来防止ANN的过拟合。

一次迭代更新包括正向传播和反向传播
在这里插入图片描述

6、为什么Dropout能够减少过拟合:

1.Dropout是随机选择忽略隐层节点,在每个批次的训练过程,由于每次随机忽略的隐层节点都不同,这样就使每次训练的网络都是不一样的,每次训练都可以当做一个“新”模型;

2.隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现。这样权值的更新不再依赖有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其他特定特征下才有效果的情况。

总结:Dropout是一个非常有效的神经网络模型平均方法,通过训练大量的不同的网络,来平均预测概率。不同的模型在不同的训练集上训练(每个epoch的训练数据都是随机选择),最后在每个模型用相同的权重来“融合”。

Dropout经过交叉验证,隐藏节点dropout率等于0.5的时候效果最好。
•dropout也可以被用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数。使得输入变化不会太大(0.8)
•dropout的缺点就在于训练时间是没有dropout网络的2-3倍

五、神经网络训练过程实例

1、BP神经网络算法

BP算法是一个迭代算法,它的基本思想如下:
1. 将训练集数据输入到神经网络的输入层,经过隐藏层,最后达到输出层并输出结果,这就是前向传播过程。
2. 由于神经网络的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
3. 在反向传播的过程中,根据误差调整各种参数的值(相连神经元的权重),使得总损失函数减小。
4. 迭代上述三个步骤(即对数据进行反复训练),直到满足停止准则。

在这里插入图片描述在这里插入图片描述这样,反向传播算法就完成了,最后我们再把更新的权值重新计算,不停地迭代。在这个例子中第一次迭代之后,总误差0.298371109下降至0.291027924。迭代10000次后,总误差为0.000035085。输出为:[0.015912196, 0.984065734]

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
反向传播(Back Propagation)是一种常用的神经网络训练算法。其基本思想是通过计算误差梯度,并将其逆向传播到网络的每一层,从而根据梯度进行权重的更新,以最小化误差函数。 反向传播算法涉及两个主要步骤:前向传播反向传播。 在前向传播中,输入数据通过网络的每一层,并经过激活函数计算得到输出。这些输出与实际输出进行比较,并计算出网络误差。接下来,误差被分配给各个连接权重,以确定每个权重对误差的贡献。 在反向传播中,误差从输出层开始向逐层反向传播。对于每个神经元,根据其贡献计算误差梯度,并将其传播一层。这个过程通过链式法则实现,将当层的误差梯度乘以一层的输出结果。 最后,根据误差梯度对权重进行更新,以使网络的输出更接近目标输出。可以使用优化算法(如梯度下降)来选择合适的学习速率,并最小化网络的总误差。 反向传播算法的主要优势在于它能够通过迭代优化来逐渐提高网络性能,同时还可以处理多层隐藏层的网络结构。然而,反向传播算法也存在一些问题,如梯度消失和梯度爆炸,以及需要大量的计算资源。 总而言之,反向传播算法是一种用于神经网络训练的重要方法,它通过计算误差梯度和逆向传播来更新权重,以实现网络的优化。这种算法在深度学习和人工智能领域得到了广泛的应用,并且不断被改进和扩展。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值