BP神经网络的详细推导

2023-11-11



概述

神经网络的定义:神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应”。

神经网络中最基本的成分是神经元(neuron)模型,即上述定义中的“简单单元”。

一、神经元模型

神经元是神经网络中最基本的结构,也可以说是神经网络的基本单元,它的设计灵感完全来源于生物学上神经元的信息传播机制。神经元有两种状态:兴奋和抑制。一般情况下,大多数的神经元是处于抑制状态,但是一旦某个神经元收到刺激,导致它的电位超过一个阈值,那么这个神经元就会被激活,处于“兴奋”状态,进而向其他的神经元传播化学物质(其实就是信息)。
在这里插入图片描述
1943年,McCulloch和Pitts将上图的神经元结构用一种简单的模型进行了表示,构成了一种人工神经元模型,也就是我们现在经常用到的“M-P神经元模型”,如下图所示:
在这里插入图片描述
图中: θ θ θ是神经元的激活阈值,函数 f ( ⋅ ) f(⋅) f()被称为激活函数。
函数 f ( ⋅ ) f(⋅) f()可以用一个阶跃方程表示,大于阈值激活,否则则抑制。理想中的激活函数阶跃函数,然而阶跃函数具有不连续、不光滑等不好的性质,因此我们更常用的方法是用sigmoid函数来表示函数函数 f ( ⋅ ) f(⋅) f()
在这里插入图片描述
把许多个这样的神经元按-定的层次结构连接起来,就得到了神经网络。
在这里插入图片描述

二、感知机与多层网络

感知机(Perceptron)由两层神经元组成,如图所示,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称“阈值逻辑单元”(threshold logic unit)。
在这里插入图片描述
感知机能容易地实现逻辑与、或、非运算。更一般地,给定训练数据集,权重 w i ( i = 1 , 2 , … , n ) w_i (i=1, 2, …,n) wi(i=1,2,,n)以及阈值 θ θ θ可通过学习得到。

感知机学习规则非常简单,对训练样例 ( x , y ) (x,y) (x,y),若当前感知机的输出为y,则感知机权重将这样调整:

在这里插入图片描述
其中 η ∈ ( 0 , 1 ) η∈(0,1) η(0,1) 称为学习率(learning rate)。从式可看出,若感知机对训练样例 ( x , y ) (x,y) (x,y)预测正确,即 y ^ = y \hat{y}=y y^=y,则感知机不发生变化,否则将根据错误的程度进行权重调整。

需注意的是,感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元(functional neuron),其学习能力非常有限.

事实上,上述与、或、非问题都是线性可分(linearly separable)的问题.可以证明,若两类模式是线性可分的,即存在一个线性超平面能将它们分开,如图5.4(a)-©所示,则感知机的学习过程一定会收敛(converge)而求得适当的权向量 w = ( w 1 ; w 2 ; … ; w n + 1 ) w= (w_1;w_2;…;w_{n+1}) w=(w1;w2;;wn+1),否则感知机学习过程将会发生振荡(fuctuation), w难以稳定下来,不能求得合适解,例如感知机甚至不能解决如图5.4(d)所示的异或这样简单的非线性可分问题.
在这里插入图片描述
要解决非线性可分问题,需考虑使用多层功能神经元.例如下图中这个简单的两层感知机就能解决异或问题.
在这里插入图片描述
在图中,输出层与输入层之间的一层神经元,被称为隐层或隐含层(hidden layer),隐含层和输出层神经元都是拥有激活函数的功能神经元.

更一般的,常见的神经网络是形如图5.6所示的层级结构,每层神经元与下-层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接.这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural networks),
在这里插入图片描述
其中输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出;

换言之,输入层神经元仅是接受输入,不进行函数处理,隐层与输出层包含功能神经元.因此,图5.6(a)通常被称为“两层网络”。
在这里插入图片描述
为避免歧义,这里称其为“单隐层网络”。只需包含隐层,即可称为多层网络。
在这里插入图片描述
神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”(connection weight)以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴涵在连接权与阈值中。

三、误差逆传播算法

多层网络的学习能力比单层感知机强得多.需要更强大的学习算法.

误差逆传播(error BackPropagation,简称BP)算法就是其中最杰出的代表,它是迄今最成功的神经网络学习算法.

现实任务中使用神经网络时,大多是在使用BP算法进行训练.值得指出的是,BP算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络,例如训练递归神经网络[Pineda, 1987].

但通常说“BP网络”时,一般是指用BP算法训练的多层前馈神经网络.

给定训练集 D = { ( x 1 , y 1 ) , ( x 1 , y 1 ) , … … , ( x m , y m ) } , y i ∈ R d D=\{(x_{1},y_{1}),(x_{1},y_{1}),……,(x_{m},y_{m})\},y_{i}\in R^{d} D={(x1,y1),(x1,y1),(xm,ym)},yiRd,即输入示例由d个属性描述,输出l维实值向量.
在这里插入图片描述
对训练例 ( x k , y k ) (x_k, y_k) (xk,yk),假定神经网络的输出为 y ^ k = ( y ^ 1 k , y ^ 2 k , … … , y ^ l k ) \hat{y}_{k}=(\hat{y}_{1}^k,\hat{y}_{2}^k,……,\hat{y}_{l}^k) y^k=(y^1k,y^2k,y^lk),即
在这里插入图片描述
则网络在 ( x k , y k ) (x_k, y_k ) (xk,yk)上的均方误差为:
在这里插入图片描述
图5.7的网络中有 ( d + l + 1 ) q + l (d+l+1)q+l (d+l+1)q+l个参数需确定:输入层到隐层的 d × q d×q d×q个权值、隐层到输出层的 q × l q×l q×l个权值、 q q q个隐层神经元的阈值、 l l l个输出层神经元的阈值.

BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,即与式类似,任意参数v的更新估计式为:
在这里插入图片描述
在这里插入图片描述
如何求每一个节点的梯度?
链式法则->反向传播

BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整.对式的误差E_k,给定学习率η,有:
在这里插入图片描述
注意到 W h j W_{hj} Whj先影响到第 j j j个输出层神经元的输入值 B j B_j Bj,再影响到其输出值 y ^ j k \hat{y}_j^k y^jk,然后影响到 E k E_k Ek,有:
在这里插入图片描述
根据 B j B_j Bj的定义,显然有:
在这里插入图片描述
Sigmoid函数有一个很好的性质:
在这里插入图片描述
于是有:
在这里插入图片描述
于是,得到了BP算法中关于 W h j W_{hj} Whj的更新公式:
在这里插入图片描述
类似可得:
在这里插入图片描述
在这里插入图片描述
学习率 η ∈ ( 0 , 1 ) η∈(0,1) η(0,1)控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。

BP算法的工作流程.对每个训练样例:
在这里插入图片描述
需注意的是,BP算法的目标是要最小化训练集D上的累积误差,
在这里插入图片描述
但我们上面介绍的“标准BP算法”每次仅针对一个训练样例更新连接权和阈值,也就是说,算法的更新规则是基于单个的E_k推导而得.

如果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法.

损失函数中,求和并不影响单个求导,所以,是多个样例的求和

两种方法的比较:

  • 标准BP算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象.为了达到同样的累积误差极小点,标准BP算法往往需进行更多次数的迭代.
  • 累积BP算法直接针对累积误差最小化,它在读取整个训练集D 一遍后才对参数进行更新,其参数更新的频率低得多.
  • 但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准BP往往会更快获得较好的解,尤其是在训练集D非常大时更明显.

两种方法的缺点?
标准BP:震荡,
累积BP:大样本时速度慢

Hornik 在1989年已经证明,只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。然而,如何设置隐层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”(trial-by-error)调整.

试错法:为了追求达到理想目标而通过不断试验和消除误差,探索具有黑箱性质的系统的方法。统称为试错法

有两种策略常用来缓解BP网络的过拟合:

  • 第一种策略是“早停”(early stopping):将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
  • 第二种策略是“正则化”(regularization) [Barron, 1991; Girosi et al, 1995],其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。

仍令 E k E_k Ek表示第 k k k个训练样例上的误差, w i w_i wi表示连接权和阙值,则误差目标函数改变为:
在这里插入图片描述
其中 λ ∈ ( 0 , 1 ) λ∈(0,1) λ(0,1)用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。

四、全局最小与局部最小

若用 E E E表示神经网络在训练集上的误差,则它显然是关于连接权 w w w和阈值 θ θ θ的函数。此时,神经网络的训练过程可看作一个参数寻优过程,即在参数空间中,寻找一组最优参数使得 E E E最小。

两种“最优”:“ 局部极小”(local minimum)和“全局最小”(global minimum)。对 w ∗ w^* w和θ ∗ ^* ,若存在 ϵ > 0 ϵ>0 ϵ>0使得:
在这里插入图片描述
都有 E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) E(w;θ)≥E(w^*;θ^*) E(w;θ)E(w;θ) 成立,则 ( w ∗ ; θ ∗ ) (w^*;θ^*) (w;θ)为局部极小解;若对参数间中的任意 ( w ; θ ) (w;θ) (w;θ)都有 E ( w ; θ ) ≥ E ( w ∗ ; θ ∗ ) E(w;θ)≥E(w^*;θ^*) E(w;θ)E(w;θ),则 ( ( w ∗ ; θ ∗ ) ((w^*;θ^*) ((w;θ)为全局最小解。两者对应的 E ( w ∗ ; θ ∗ ) E(w^*;θ^*) E(w;θ) 分别称为误差函数的局部极小值和全局最小值。

基于梯度的搜索是使用最为广泛的参数寻优方法.在此类方法中,我们从某些初始解出发,迭代寻找最优参数值.每次迭代中,我们先计算误差函数在当前点的梯度,然后根据梯度确定搜索方向。
在这里插入图片描述
如果误差函数具有多个局部极小,则不能保证找到的解是全局最小.对后一种情形,我们称参数寻优陷入了局部极小,这显然不是我们所希望的.

在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小:

  • 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。
  • 使用模拟退火技术。模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
  • 使用随机梯度下降.与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素(选取训练数据中的特例).于是,即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。

此外,遗传算法也常用来训练神经网络以更好地逼近全局最小。

五、BP算法的改进

1.引入动量法

标准BP算法实质上是一种简单的最速下降静态寻优算法, 在修正权值w(k)时,只是按k时刻的负梯度方向进行修正, 没有考虑积累的经验,即以前的梯度方向,从而使学习过程振荡,收敛缓慢。

附加动量法使网络在修正权值时不仅考虑误差在梯度上的 作用,而且考虑在误差曲面上变化趋势的影响。
在这里插入图片描述
其中:

  • D ( k ) D(k) D(k) k k k时刻的负梯度, D ( k − 1 ) D(k-1) D(k1) k − 1 k-1 k1时刻的负梯度。
  • α α α为学习率, α > 0 α>0 α>0
  • η η η为动量项因子, $0≤η<1 $

所加入的动量项实质上相当于阻尼项,它减小了学习过程 的振荡趋势,改善了收敛性,是一种应用比较广泛的改进 算法。

2.尺度变换法

标准BP学习算法采用的是一阶梯度法,因而收敛较慢。若 采用二阶梯度法,则可以大大提高收敛性。
在这里插入图片描述
虽然二阶梯度法具有较好的收敛性,但是需要计算 E E E w w w的 二阶导数,这个计算量很大。所以一般不直接采用二阶梯度法,而常常采用变尺度法或共轭梯度法,它们具有如二阶梯度法收敛较快的优点,又无需直接计算二阶梯度。
在这里插入图片描述

3.自适应学习率调整法

在BP算法中,网络权值的调整取决于学习速率和梯度。

自适应学习率调整准则是:检查权值的修正是否真正降低了误差函数,如果确实如此,则说明所选的学习率小了,可对其增加一个量;若不是则说明产生了过调,那么就应减小学习速率的值。
在这里插入图片描述
当连续两次迭代其梯度方向相同时,表明下降太慢,这时可使步长加倍;当连续两次迭代其梯度方向相反时,表明下降过头,这时可使步长减半。

六、BP神经网络的训练

1.产生数据样本集

包括原始数据的收集、数据分析、变量选择和数据的预处理

  • 首先要在大量的原始测量数据中确定出最主要的输入模式。
  • 在确定了最重要的输入量后,需进行尺度变换和预处理。

尺度变换常常将它们变换到[-1,1]或[0,1]的范围。

在进行尺度变换前必须先检查是否存在异常点(或称野点),这些点必须删除。

通过对数据的预处理分析还可以检验其是否存在周期性、固定变换趋势或其它关系。

对数据的预处理就是要使得经变换后的数据对于神经网络更容易学习和训练。

对于一个问题应该选择多少数据,这也是一个很关键的问题。

系统的输入输出关系就包含在数据样本中。一般来说,取的 数据越多,学习和训练的结果便越能正确反映输入输出关系。

但选太多的数据将增加收集、分析数据以及网络训练付出的代价;选太少的数据则可能得不到正确的结果。

事实上数据的多数取决于许多因素,如网络的大小、网络 测试的需要以及输入输出的分布等。

其中网络的大小最关键。通常较大的网络需要较多的训练数据。

在神经网络训练完成后,需要有另外的测试数据来对网络加以检验,测试数据应是独立的数据集合。

最简单的方法是(交叉验证):将收集到的可用数据随机地分成两部分,比如其中三分之二用于网络的训练。另外三分之一 用于将来的测试。随机选取的目的是为了尽量减小这两部分数据的相关性。

影响数据大小的另一个因素是输入模式和输出结果的分布, 对数据预先加以分类可以减小所需的数据量。相反,数据 稀薄不匀甚至覆盖则势必要增加数据量。

2.确定网络的类型和结构

神经网络的类型很多,需根据问题的性质和任务的要求来 合适地选择网络类型。

一般从已有的网络类型中选用一种比较简单而又能满足要求的网络,新设计一个网络类型来满足问题的要求往往比 较困难。

若主要用于模式分类,尤其是线性可分的情况,则可采用 较为简单的感知器网络。

若主要用于函数估计,则可应用BP网络。

在网络的类型确定后,需要选择网络的结构和参数。

以BP网络为例,需选择网络的层数、每层的节点数、初始 权值、阈值、学习算法、学习率等参数。

有些项的选择有一些指导原则,但更多的是靠经验和试凑。

对于网络层数的选取:
增加层数主要可以更进一步降低误差,提高精度,但同时也使网络复杂化,从而增加了网络权值的训练时间。
而误差精度的提高实际上也可以通过增加隐含层中的神经元数目来获得,其训练效果也比增加层数更容易观察和调整。所以,一般情况下,应优先考虑增加隐含层中的神经元数

对于每层节点数的选取:
对于具体问题若确定了输入和输出变量后,网络输入层和输出层的节点个数也便随之确定了。
隐层节点数对网络的泛化能力有很大的影响。节点数太多,倾向于记住所有的训练数据,包括噪声的影响,反而降低了泛化能力;节点数太少,不能拟和样本数据,没有较好的泛化能力。
原则:选择尽量少的节点数以实现尽量好的 泛化能力
具体选择可采用如下方法:先设较少的节点,对网络进行训练,并测试网络的逼近误差,然后逐渐增加节点数,直到测试的误差不再有明显的减少为止。

初始权值的选取:
由于系统是非线性的,初始值对于学习是否达到局部最小、是否能够收敛以及训练时间的长短关系很大。
如果初始值太大,使得加权后的输入落到激活函数的饱和区,从而导致其导数非常小,而在计算权值的修正公式中,修正量正比与其导数,从而使调节过程几乎停顿下来。
一般总是希望经过初始加权后的每个神经元的输出值都接近于零,这样可以保证每个神经元的权值都能够在他们的S 型激活函数变化最大之处进行调节。所以,一般取初始权 值在(-1,1)之间的随机数

学习速率的选取:
学习速率决定每一次循环训练中所产生的权值变化量。大的学习速率可能导致系统的不稳定 ;小的学习速率会导致训练较长,收敛速度很慢。不过能保证网络的误差值不跳出表面的低谷而最终趋于最小误差值。
一般情况下,倾向于选取较小的学习速率以保证系统的稳 定性。学习速率一般的选取范围为 0.01 - 0.8 0.01-0.8 0.010.8 和初始权值的选取过程一样,在一个神经网络的设计中,网络要经过几个不同的学习速率的训练。通过观察每一次训练后的误差平方和的下降速率来判断选定的学习速率是否合适。 如果下降很快,说明学习速率合适。若出现振荡,则说明学习速率过大。
对于较复杂的网络,为了减小寻找学习速率的训练次数以及训练时间,比较合适的方法是采用自适应学习速率。

3.训练和测试

对所有样本数据正向运行一次并反向修改连接权一次称为一 次训练(或一次学习) 。 通常训练一个网络需要成百上千次。 并非训练的次数越多,越能得到正确的输入输出的映射关系。

训练网络的目的在于找出蕴含在样本数据中的输入和输出之间的本质联系,从而对于未经训练的输入也能给出合适的输出,即局部泛化能力。

网络的性能主要是用它的泛化能力来衡量,它不是用对训练数据的拟和程度来衡量,而是用一组独立的数据来加以测试和检验。

由于所收集的数据都是包含噪声的,训练的次数过多,网络将包含噪声的数据都记录了下来,在极端情况下,训练后的网络可以实现相当于查表的功能。但是对于新的输入数据却不能给出合适的输出,即并不具备很好的泛化能力。

实际操作时应该训练和测试交替进行,即每训练一次,同时用测试数据测试一遍,画出均方误差随训练次数的变换曲线 。
在这里插入图片描述
在用测试数据检验时,均方误差开始逐渐减小,当训练次数再增加时,测试检验误差反而增加,误差曲线上极小点所对应的即为恰当的训练次数,若再训练即为“过度训练”了。

七、项目实战

项目实战请转至:
[1] tensorflow学习笔记(三):利用BP线性回归
[2] tensorflow学习笔记(四):利用BP手写体(MNIST)识别

系列相关论文:
1.卷积神经网络CNN模块化剖析
2.用于图像分类的经典的卷积神经网络CNN
3.神经⽹络可以计算任何函数的可视化证明

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BP神经网络的详细推导 的相关文章

随机推荐

  • k8s集群部署之bind安装

    前提准备5台虚拟机 ip 分别为10 4 7 11 10 4 7 12 10 4 7 21 10 4 7 22 10 4 7 200 更改主机名 以10 4 7 11为例 hostnamectl set hostname hdss7 11
  • STM32F103基于spi实现OLED显示

    文章目录 一 原理 二 实现 1 显示中文 2 滚动显示 3 显示字符串 4 读取温湿度 5 显示温湿度 三 结果 1 开机显示欢迎信息 2 循环读取温湿度以及滚动显示我的id 四 总结 五 参考 六 源码 1 github 2 gitee
  • Qt入门-connect, SIGNAL, SLOT

    在QT中 事件处理信号叫做SIGNAL 事件处理函数叫做SLOT 两者关联函数是QOjbect connect 示例 connect sender SIGNAL signal receiver SLOT slot sender 指触发的控件
  • stable diffusion字体融合特效

    使用stable diffusion的图生图功能
  • 计算机学习顺序及其课程连接

    https www bilibili com video BV1Qt411J7mo p 1
  • MySQL数据存储原理一

    执行计划 id sql比较复杂的话 id列值会有好几个 它表示具体sql语句要执行的顺序 type 表示访问数据或进行查询的时候 所对应的类型是什么 效率优先级由低到高 all gt index gt range gt index ref
  • Python知识点讲解之Python冒号的使用

    本文要讲解Python的知识点是Python冒号 我们都知道 逗号 分隔各个维度 表示各个维度内的切片 只有 表示取这个维度的全部值 那么下面小编有一个例子来详细分析下Python冒号的使用 例子 a 1 2 3 4 2 3 4 5 5 6
  • 【HTML】多行文本框随字数增加,高度增加

    转载地址 https blog csdn net xj 9264 article details 85611526
  • .Net Core基础之读取配置文件

    在应用程序开发中 配置文件是主要存储系统的初始配置信息 配置文件的读取虽然属于基础内容却又经常用到 所以百丈高楼平地起 学习 Net Core 就从学习配置文件开始 在 net framework时代 配置文件主要是xml格式 web co
  • 创建型模式2——工厂模式(简单工厂、工厂方法、抽象工厂)

    简单工厂 模式动机 意图 定义一个创建对象的接口 让其子类自己决定实例化哪一个工厂类 工厂模式使其创建过程延迟到子类进行 主要解决 主要解决接口选择的问题 简单工厂模式的要点在于 当你需要什么 只需要传入一个正确的参数 就可以获取你所需要的
  • OpenGL ES加载纹理

    iOS OpenGL ES加载纹理 GLKit 1 准备工作 创建UIViewController文件并继承GLKViewController 遵守协议GLKViewDelegate 实现协议方法 void glkView GLKView
  • [Vue warn] Failed to resolve component:报错问题。

    在一个vue3项目中 引入一个自定义组件时出现了 Vue warn Failed to resolve component 组件名 这样的警告 引入的组件没有出现在页面中 网上查了半天没找到原因 后来将vue3中的defineCompone
  • cs231n_反向传播求导篇

    我们已经知道基本的标量除以矩阵 或向量 矩阵 或向量 除以标量 以及稍微复杂一点的向量除向量 1 1 1 行向量除以向量除以矩阵 矩阵除以向量的方法 那么矩阵除以矩阵呢 例如 XN DWD C fN C X N
  • 用python+pytest框架写UI自动化

    使用 Python 编写 UI 自动化测试通常需要使用 Pytest 测试框架 下面是编写 Python Pytest UI 自动化测试的一般步骤 安装 Python Pytest 和相关的库 例如 Selenium WebDriver 和
  • WM_CHAR 获取键盘按下的字符

    DEMO3 11 CPP WM CHAR demo INCLUDES define WIN32 LEAN AND MEAN just say no to MFC include
  • QT-固定全局文字大小

    问题描述 W10 将缩放与布局设置为 gt 100 时 QT的文字会放大超过原来的文字框 解决 使用这种方法是让Windows来控制缩放 而不是Qt 添加一个资源文件qt conf 内容为 Platforms WindowsArgument
  • linux 时钟漂移,Redis 实现分布式锁之Redlock 算法浅析

    保证分布式锁有效的三个属性 Safety Properties 安全性 此处也就是互斥性 任意时刻只能有一个客户端可以持有锁 Liveness Property A 无死锁 即使持有锁的客户端崩溃或被分区 也可以获得锁 Liveness P
  • pandas中groupby函数中参数ax_index和group_keys的区别

    前言 笔者在学习pandas中groupby函数时 发现ax index True False和group key True False这两个参数相近又有所不同 特写出此文供大家分享 一 首先创建一个DataFrame df pd Data
  • thymeleaf模板报红

    问题 解决 忽略所有警告或错误 1 或者忽略Thymeleaf有关警告或错误 2 2 取消这个勾 关闭IDEA对于thymeleaf的数据验证选项
  • BP神经网络的详细推导

    文章目录 概述 一 神经元模型 二 感知机与多层网络 三 误差逆传播算法 四 全局最小与局部最小 五 BP算法的改进 1 引入动量法 2 尺度变换法 3 自适应学习率调整法 六 BP神经网络的训练 1 产生数据样本集 2 确定网络的类型和结