自然语言处理(六)

1. 前馈神经网络、网络层数、输入层、隐藏层、输出层、隐藏单元、激活函数的概念。

1.1 神经网络

所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。例如,下图就是一个简单的神经网络
  在这里插入图片描述
最左边一层是输入层,中间是隐藏层,右侧是输出层。输入层以及隐藏层均有3个节点,每个节点代表一个神经元。输入层有3个输入节点,x1, x2, x3, 以及一个偏置节点(标有+ 1的圆圈)。每一层和下一层之间对应的也有一个权重矩阵w。

对于这样一个简单的神经网络来说,我们的整个过程就是,将输入x与权重矩阵w结合,以wx + b的形式输入隐藏层(Layer L2),经过激活函数f(x)的处理,得到输出结果a1, a2, a3, 然后与对应的权重,偏置结合,作为输出层(Layer L3)的输入,经过激活函数,得到最终输出结果。

1.2激活函数

学习神经网络的时候我们总是听到激活函数这个词,而且很多资料都会提到常用的激活函数,比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分:

1.2.1什么是激活函数?

首先要了解神经网络的基本模型,参考https://blog.csdn.net/tyhj_sf/article/details/54134210
在这里插入图片描述
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

1.2.2 激活函数的用途(为什么需要激活函数)?

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

1.2.3有哪些激活函数,都有什么性质和特点?

早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。
近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。下面我们来总结下这些激活函数:
Sigmoid 是常用的非线性的激活函数,它的数学形式如下:
在这里插入图片描述
Sigmoid的几何图像如下:
在这里插入图片描述
特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.
缺点:
sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:
在这里插入图片描述
缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0, f=wTx+b 那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间

tanh函数

在这里插入图片描述
tanh函数及其导数的几何图像如下图:
在这里插入图片描述
tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
Relu函数
在这里插入图片描述
Relu函数及其导数的图像如下图所示:
在这里插入图片描述
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了gradient vanishing问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh

ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!

2. 感知机相关;利用tensorflow等工具定义简单的几层网络(激活函数sigmoid),递归使用链式法则来实现反向传播。

2.1感知机模型

f(X)=sign(w*X+b),其中sign是符号函数。

感知机模型,对应着一个超平面w*X+b=0,这个超平面的参数是(w,b),w是超平面的法向量,b是超平面的截距。

我们的目标是,找到一个(w,b),能够将线性可分的数据集T中的所有的样本点正确地分成两类。
参考:https://www.cnblogs.com/hapjin/p/6714526.html

2.2 反向传播

反向传播的本质只是对链式法则的巧妙运用。
链式法则它指出,假设有三个函数f、g和h,其中f是g的函数,g是h的函数,那么f相对于h的导数等于f相对于g的导数和g相对于h的导数的乘积,用公式表示如下:
在这里插入图片描述
下面,我们使用最简单的神经网络来说明。这个网络只有3层,分别是蓝色的输入层、绿色的隐藏层和红色的输出层。上一层中的每个单元都连接到下一层中的每个单元,而且每个连接都具有一个权重,当某个单元向另一个单元传递信息时,会乘以该连接的权重得到更新信息。某个单元会把连接到它的上一层所有单元的输入值相加,并对这个总和执行Logistic函数并向下一层网络传递该值。
在这里插入图片描述
三层神经网络,单元数分别为3、4和3
假设给了m个训练样本,第i个输入输出对表示为:
在这里插入图片描述
其中,x和y是3维向量。对于输入x,我们把g称作神经网络的预测(输出)值,它也是一个3维向量,每个向量元素对应一个输出单元。所以,对于每个训练样本来说,有:
在这里插入图片描述
△ 网络中输入值、输出值和预测值的向量形式
给定输入x,我们要找到使得预测值g与输出值y相等或比较相近的一组网络权重。因此,我们加入了误差函数,定义如下:
在这里插入图片描述
神经网络的误差函数
为了计算总误差,我们使用了训练集中的所有样本,并对红色输出层中的每个单元计算该单元预测值与真实输出间的平方误差。对每个样本分别计算并求和,得到总误差。

由于g为网络的预测值,取决于网络的权重,可以看到总误差会随权重变化而变化,网络的训练目标就是找到一组误差最小的权重。

我们可以使用梯度下降来做到这一点,但梯度下降方法要求算出总误差E对每个权重的导数,这也是结合反向传播要实现的目标。

现在,我们推广到一般情况,而不是之前的3个输出单元。假设输出层有任意数量的输出单元,设为n,对于这种情况此时的总误差为:
在这里插入图片描述
计算误差
这里为了简洁,删去了上标i,因为它是不变的。

大家可能有个疑问,这个误差值是怎么随着某个输出单元的预测值变化而变化的?导数在这里起了作用:
在这里插入图片描述
总误差相对每个输出单元的导数,这里使用链式法则得到平方项的导数
我们还可以发现,随着输出单元预测值的变化,该误差会根据预测值与真值间的差值,以同样速率在变化。

这里你可能还有疑问,当某个输出单元的总输入变化时,误差会如何变化。这里只使用了导数。用z来代表某个输出单元的总输入,求出下面公式的值:
在这里插入图片描述
误差E相对于第j个输出单元总输入的导数
但是,g是关于z的函数,应用链式法则,把它重写为:
在这里插入图片描述
△ 应用链式法则后的公式
要记住,在每个单元中,先使用Logistic函数处理输入后再把它向前传递。这意味着,g作为Logistic函数,z是它的输入,所以可以表示为
在这里插入图片描述
Logistic函数及其导数
进而得到:
在这里插入图片描述
总误差相对于第j个输出单元总输入的导数
这里已经计算出,总误差与某个输出单元总输入的变化规律。

现在,我们已经得到误差相对于某个权重的导数,这就是所求的梯度下降法。

设绿色单元的预测值为g’,绿色层中的单元k与红色层(输出层)中的单元j之间的连接权重设为:
在这里插入图片描述
绿色层中的单元k与红色层中的单元j之间的连接权重
考虑下图中,黄色输出单元对应的总输入z。为了计算这个总输入,先获得每个绿色单元的输出值,在把其与连接绿色单元和黄色单元的红色箭头权重相乘,并将它们全部相加。
在这里插入图片描述
红色箭头表示为获得黄色单元的总输入在节点间添加的连接
进行推广,假如有任意数量的绿色单元,设为n,这个n与上面定义的不同,可以表示为:
在这里插入图片描述
从总输入到输出j
所以,我们不仅可以把z看作是自变量为连接权重的函数,也可以看作是自变量为连接单元输出值的函数。

下面轮到链式法则发挥了。

当与输出单元的连接权重变化时,误差该如何变化,这表示为:

在这里插入图片描述
总误差相对于输出单元连接权重的导数
上面已经计算出误差相对于输出单元连接权重的导数,这正是梯度下降所需的公式。

但是推导还没有完成,我们仍需要计算误差相对于第一层和第二层连接权重的导数,这里还需要用到链式法则。

接下来,计算误差与第k个绿色单元输出值的变化关系:
在这里插入图片描述
总误差相对于绿色层中第k个单元输出值的导数
由于第k个单元有j个连接权重,我们也考虑在内:
在这里插入图片描述
总误差相对于绿色层中第k个单元输出值的导数
推导到这里结束,我们得到了总误差相对于某个单元输出值的导数。现在,我们可以忽略红色输出层,把绿色层作为网络的最后一层,并重复上述所有步骤来计算总误差E相对于输入权重的导数。

你会注意到,我们计算出的第一个导数与预测值和真实值之间的“误差”相等。同样地,最终的导数中也是这个误差项与其他项的乘积。

这种算法叫做反向传播,因为我们把这种形式的误差进行反向传播,从最后一层反馈到第一层,并被用来计算误差E相对于网络中每个单元权重的导数。
只要计算出这些导数后,可在梯度下降过程中使用它们来最小化误差E并训练神经网络。

3. 深度学习中的正则化(参数范数惩罚:L1正则化、L2正则化;数据集增强;噪声添加;early stop;Dropout层)、正则化的介绍。

3.1 正则化简介

机器学习中的一个核心问题是设计不仅在训练数据上表现好,并且能在新输入上泛化好的算法。在机器学习中,许多策略显式地被设计为减少测试误差(可能会以增大训练误差为代价)。这些策略被统称为正则化。深度学习工作者可以使用许多不同形式的正则化策略。在深度学习的背景下,大多数正则化策略都会对估计进行正则化。估计的正则化以偏差的增加换取方差的减少。一个有效的正则化是有利的”交易”,也就是能显著减少方差而不过度增加偏差。

3.1.1 参数范数惩罚

许多正则化方法通过对目标函数J添加一个参数范数惩罚Ω(θ),限制模型(如神经网络、线性回归或逻辑回归)的学习能力。我们将正则化后的目标函数记为J’:J’(θ;X,y)=J(θ;X,y)+αΩ(θ),其中α∈[0,∞)是权衡范数惩罚项Ω和标准目标函数J(X;θ)相对贡献的超参数。将α设为0表示没有正则化。α越大,对应正则化惩罚越大。

当我们的训练算法最小化正则化后的目标函数J’时,它会降低原始目标J关于训练数据的误差并同时减少参数θ的规模(或在某些衡量下参数子集的规模)。选择不同的参数范数Ω会偏好不同的解法。

3.1.2 L2参数正则化:

权重衰减(weight decay)的L2参数范数惩罚。这个正则化策略通过向目标函数添加一个正则项Ω(θ)=1/2‖w‖22,使权重更加接近原点。
为了简单起见,我们假定其中没有偏置参数,因此θ就是w。这样一个模型具有以下总的目标函数:
在这里插入图片描述
与之对应的梯度为:
在这里插入图片描述
使用单步梯度下降更新权重,即执行以下更新:
在这里插入图片描述
可以看到,加入权重衰减后会引起学习规则的修改,即在每步执行通常的梯度更新之前先收缩权重向量(将权重向量乘以一个常数因子)。这是单个步骤发生的变化。

L2正则化能让学习算法”感知”到具有较高方差的输入x,因此与输出目标的协方差较小(相对增加方差)的特征的权重将会收缩。
L1参数正则化:对模型参数w的L1正则化被定义为:即各个参数的绝对值之和。
在这里插入图片描述
与L2权重衰减类似,我们也可以通过缩放惩罚项Ω的正超参数α来控制L1权重衰减的强度。因此,正则化的目标函数J’(w;X,y)如下所示:J’(w;X,y)=α‖w‖1+J(w;X,y)。

相比L2正则化,L1正则化会产生更稀疏(sparse)的解。此处稀疏性指的是最优值中的一些参数为0。和L2正则化相比,L1正则化的稀疏性具有本质的不同。由L1正则化导出的稀疏性质以及被广泛地用于特征选择(feature selsection)机制。特征选择从可用的特征子集选择出有意义的特征,化简机器学习问题。
2. 作为约束的范数惩罚:约束神经网络层的权重矩阵每列的范数,而不是限制整个权重矩阵的Frobenius范数。分别限制每一列的范数可以防止某一隐藏单元有非常大的权重。如果我们将此约束转换成Lagrange函数中的一个惩罚,这将与L2权重衰减类似但每个隐藏单元的权重都具有单独的KKT乘子。每个KKT乘子分别会被动态更新,以使每个隐藏单元服从约束。在实践中,列范数的限制总是通过重投影的显示约束来实现。

3.1.3数据集增强

让机器学习模型泛化得更好的最好办法是使用更多的数据进行训练。当然,在实践中,我们拥有的数据量是很有限的。解决这个问题的一种方法是创建假数据并添加到训练集中。对于一些机器学习任务,创建新的假数据相当简单。对分类来说这种方法是最简单的。分类器需要一个复杂的高维输入x,并用单个类别标识y概括x。这意味着分类面临的一个主要任务是要对各种各样的变化保持不变。我们可以轻易通过转换训练集中的x来生成新的(x,y)对。这种方法对于其它许多任务来说并不那么容易。例如,除非我们已经解决了密度估计问题,否则在密度估计任务中生成新的假数据是很困难的。

数据集增强对一个具体的分类问题来说是特别有效的方法:对象识别。图像是高维的并包括各种巨大的变化因素,其中有许多可以轻易地模拟。即使模型已使用卷积和池化技术对部分平移保持不变,沿训练图像每个方向平移几个像素的操作通常可以大大改善泛化。许多其它操作如旋转图像或缩放图像也已被证明非常有效。我们必须要小心,不能使用会改变类别的转换。
数据集增强对语音识别任务也是有效的。
在神经网络的输入层注入噪声,也可以被看作是数据增强的一种方式。对于许多分类甚至一些回归任务而言,即使小的随机噪声被加到输入,任务仍应该是能够被解决的。然而,神经网络被证明对噪声不是非常健壮。改善神经网络健壮性的方法之一是简单地将随机噪声添加到输入再进行训练。输入噪声注入是一些无监督学习算法的一部分,如去噪自编码器。向隐藏单元施加噪声也是可行的,这可以被看作在多个抽象层上进行的数据集增强。最近表明,噪声的幅度被细心调整后,该方法是非常高效的。正则化策略Dropout可以被看作是通过与噪声相乘构建新输入的过程。

在比较机器学习基准测试的结果时,考虑其采取的数据集增强是很重要的。通常情况下,人工设计的数据集增强方案可以大大减少机器学习技术的泛化误差。将一个机器学习算法的性能与另一个进行对比时,对照实验是必要的。在比较机器学习算法A和机器学习算法B 时,应该确保这两个算法使用同一人工设计的数据集增强方案进行评估。假设算法A在没有数据集增强时表现不佳,而B结合大量人工转换的数据后表现良好。在这样的情况下,很可能是合成转化引起了性能改进,而不是机器学习算法B比算法A更好。有时候,确定实验是否已经适当控制需要主观判断。例如,向输入注入噪声的机器学习算法是执行数据集增强的一种形式。通常,普适操作(例如,向输入添加高斯噪声)被认为是机器学习算法的一部分,而特定于一个应用领域(如随机地裁剪图像)的操作被认为是独立的预处理步骤。

4. 深度模型中的优化:参数初始化策略;自适应学习率算法(梯度下降、AdaGrad、RMSProp、Adam;优化算法的选择);batch norm层(提出背景、解决什么问题、层在训练和测试阶段的计算公式);layer norm层。

4.1为什么需要参数初始化策略

目的
为了让神经网络在训练过程中学习到有用的信息,需要参数更新时的梯度不为0。在一般的全连接网络中,参数更新的梯度和反向传播得到的状态梯度以及输入激活值有关。那么参数初始化应该满足以下两个条件:

  1. 初始化必要条件一:各层激活值不会出现饱和现象(对于sigmoid,tanh);
  2. 初始化必要条件二:各层激活值不为0。

全零初始化存在的问题
全零初始化方法在前向传播过程中会使得隐层神经元的激活值均未0,在反向过程中根据BP公式,不同维度的参数会得到相同的更新。
需要破坏这种“对称性”。
在这里插入图片描述

4.2 自适应学习率算法

4.2.1 梯度下降算法

梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷
在这里插入图片描述
我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!
参考:https://www.jianshu.com/p/c7e642877b0e

4.2.2 AdaGrad算法介绍

在这里插入图片描述
表示第i个参数的梯度,对于经典的SGD优化方法,参数θth的更新为:
在这里插入图片描述
再来看AdaGrad算法表示为:
在这里插入图片描述
其中,r为梯度累积变量,r的初始值为0。ε为全局学习率,需要自己设置。δ为小常数,为了数值稳定大约设置为10 -7
AdaGrad算法分析
(1)从AdaGrad算法中可以看出,随着算法不断迭代,r会越来越大,整体的学习率会越来越小。所以,一般来说AdaGrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢。

(2)在SGD中,随着梯度的增大,我们的学习步长应该是增大的。但是在AdaGrad中,随着梯度g的增大,我们的r也在逐渐的增大,且在梯度更新时r在分母上,也就是整个学习率是减少的,这是为什么呢?
这是因为随着更新次数的增大,我们希望学习率越来越慢。因为我们认为在学习率的最初阶段,我们距离损失函数最优解还很远,随着更新次数的增加,越来越接近最优解,所以学习率也随之变慢。
(3)经验上已经发现,对于训练深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。AdaGrade在某些深度学习模型上效果不错,但不是全部。

4.2.3RMSProp

RMSProp算法的全称叫 Root Mean Square Prop,是Geoffrey E. Hinton在Coursera课程中提出的一种优化算法,在上面的Momentum优化算法中,虽然初步解决了优化中摆动幅度大的问题。所谓的摆动幅度就是在优化中经过更新之后参数的变化范围,如下图所示,蓝色的为Momentum优化算法所走的路线,绿色的为RMSProp优化算法所走的路线。
在这里插入图片描述
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法对权重 W 和偏置 b 的梯度使用了微分平方加权平均数。
其中,假设在第 t 轮迭代过程中,各个公式如下所示:
在这里插入图片描述
算法的主要思想就用上面的公式表达完毕了。在上面的公式中sdw和sdb分别是损失函数在前t−1t−1轮迭代过程中累积的梯度梯度动量,β 是梯度累积的一个指数。所不同的是,RMSProp算法对梯度计算了微分平方加权平均数。这种做法有利于消除了摆动幅度大的方向,用来修正摆动幅度,使得各个维度的摆动幅度都较小。另一方面也使得网络函数收敛更快。(比如当 dW 或者 db 中有一个值比较大的时候,那么我们在更新权重或者偏置的时候除以它之前累积的梯度的平方根,这样就可以使得更新幅度变小)。为了防止分母为零,使用了一个很小的数值 ϵϵ 来进行平滑,一般取值为 10−8。

4.2.4Adam

有了上面两种优化算法,一种可以使用类似于物理中的动量来累积梯度,另一种可以使得收敛速度更快同时使得波动的幅度更小。那么讲两种算法结合起来所取得的表现一定会更好。Adam(Adaptive Moment Estimation)算法是将Momentum算法和RMSProp算法结合起来使用的一种算法,我们所使用的参数基本和上面讲的一致,在训练的最开始我们需要初始化梯度的累积量和平方累积量。
在这里插入图片描述

假设在训练的第 t 轮训练中,我们首先可以计算得到Momentum和RMSProp的参数更新:

在这里插入图片描述
由于移动指数平均在迭代开始的初期会导致和开始的值有较大的差异,所以我们需要对上面求得的几个值做偏差修正。
在这里插入图片描述
通过上面的公式,我们就可以求得在第 t 轮迭代过程中,参数梯度累积量的修正值,从而接下来就可以根据Momentum和RMSProp算法的结合来对权重和偏置进行更新。

在这里插入图片描述
上面的所有步骤就是Momentum算法和RMSProp算法结合起来从而形成Adam算法。在Adam算法中,参数 β1 所对应的就是Momentum算法中的 ββ 值,一般取0.9,参数 β2 所对应的就是RMSProp算法中的 β 值,一般我们取0.999,而 ϵ 是一个平滑项,我们一般取值为 10−8,而学习率 α 则需要我们在训练的时候进行微调。

4.3batchnorm原理

BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

THAT’S IT。其实一句话就是:对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。因为梯度一直都能保持比较大的状态,所以很明显对神经网络的参数调整效率比较高,就是变动大,就是说向损失函数最优值迈动的步子大,也就是说收敛地快。BN说到底就是这么个机制,方法很简单,道理很深刻。
在这里插入图片描述
具体参考7


参考
1.https://blog.csdn.net/yinjiakang/article/details/77622372
2.https://www.cnblogs.com/codehome/p/9897358.html
3.https://blog.csdn.net/fengbingchun/article/details/79910284
4.https://blog.csdn.net/willduan1/article/details/78070086
5.https://blog.csdn.net/qq_25737169/article/details/79048516
7.http://www.cnblogs.com/guoyaohua/p/8724433.html

猜你喜欢

转载自blog.csdn.net/weixin_41781408/article/details/88414922