NLP(七):前馈神经网络基础回顾(NN模型及其正则化,dropout,各种梯度求解算法等模型优化策略)

目录

1.前馈神经网络及其相关概念

2.前馈神经网络的Tensorflow实现

2.1tensorflow的图模式下的NN实现

2.2tf.keras实现

3.1Sigmoid

3.2Tanh

3.3ReLU

3.4LReLU、PReLU与RReLU

4.深度学习中的正则化

4.1参数范数惩罚

4.2 L1和L2正则化

4.3数据集增强

4.4噪声添加

4.5提前终止(early stop)

4.6dropout

5.深度模型的优化

5.1参数初始化策略

5.2自适应学习率算法

​5.3优化算法的选择

5.4深度学习中的Batch Normalization

5.5深度学习中的layer Normalization


在学习深度学习模型在NLP中的应用之前,先回顾总结一下DL模型中最简单的前馈神经网络及相关的一些优化策略。


1.前馈神经网络及其相关概念

线来看神经网络的结构吧。这就是一个比较简单的神经网络结构了。在一个神经网络中通常会分这样几层:输入层( input layer )、隐藏层( hidden layer,也叫隐含层)、输出层( output layer ) 。

输入层在整个网络的最前端部分,直接接受输入的向量,它是不对数据做任何处理的,所以通常这一层是不计人层数的 。

隐藏层可以有一层或多层,现在比较深的网络据我所知有超过 50 层的,甚至在一些“特殊”的网络一一例如深度残差网络中有超过 150 层的。

输出层是最后一层,用来输出整个网络处理的值,这个值可能是一个分类向量值,也可能是一个类似线性回归那样产生的连续的值,也可能是别的复杂类型的值或者向量,根据不同的需求输出层的构造也不尽相同,后面我们会逐步接触到 。

激励函数( activation function) -一也有翻译成激活函数的,也是神经元中重要的组成部分。 激励函数在一个神经元当中跟随在y=wx+b函数之后,用来加入一些非线性的因素。

神经元模型见下图,有n个输入x,一个输出f(x),f(x)=wx+b。这种方式也是神经元最核心部分对 x 所做的线性处理,其中 x 是一个 l x n 的矩阵,而
w 是一个 n x l 的权重矩阵, b 是偏置项 。



2.前馈神经网络的Tensorflow实现

2.1tensorflow的图模式下的NN实现

(以手写数字识别数据集mnist为例)

from __future__ import print_function
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

# number 1 to 10 data
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# 添加层
def add_layer(inputs,in_size,out_size,activation_funtion=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))
    biases = tf.Variable(tf.zeros([1,out_size]) + 0.1) # biases推荐值不为零
    Wx_plus_b = tf.matmul(inputs,Weights) + biases
    if activation_funtion is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_funtion(Wx_plus_b)
    return outputs

def compute_accuracy(v_xs, v_ys): # 定义误差函数
    global prediction # 声明prediction为全局变量
    y_pre = sess.run(prediction, feed_dict={xs: v_xs})
    # op。验证yre中是为数据为1的位置,是否等于v—ye中数据为1的位置
    correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))
    # op。计算一个多少个不相等的结果
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys})
    return result

#define placeholder for inputs to network
xs = tf.placeholder(tf.float32,[None,784]) # 28*28
ys = tf.placeholder(tf.float32,[None,10])

# add output layer
prediction = add_layer(xs, 784, 10, activation_funtion=tf.nn.softmax) # 多分类器softmax

# the error between prediction and real data
# softmax作为输出函数时,loss选用交叉熵cross_entropy
cross_entorpy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entorpy)

sess = tf.Session()
#important step
sess.run(tf.global_variables_initializer())

for i in range(1000):
    batch_xs,batch_ys = mnist.train.next_batch(100) #从mnist中提取100个数据
    sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys})
    if i%50 == 0:
        print(compute_accuracy(mnist.test.images, mnist.test.labels))

2.2tf.keras实现

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
a, b = model.evaluate(x_test, y_test)
print(b)

参考出处:https://blog.csdn.net/huangfei711/article/details/79613024

3.1Sigmoid

Sigmoid 是使用范围最广的一类激活函数,具有指数函数形状 。正式定义为:

这里写图片描述

可见,sigmoid 在定义域内处处可导,根据上述对饱和的定义,其可被定义为软饱和激活函数。

Sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。

这里给出一个关于梯度消失的通俗解释:

Sigmoid 函数能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是 f ′ (x)=f(x)(1−f(x)) f′(x)=f(x)(1−f(x))f'(x)=f(x)(1-f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新。

最后总结一下 Sigmoid 函数的优缺点

优点:
1.Sigmoid 函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。它在物理意义上最为接近生物神经元。
2.求导容易。
缺点:
1.由于其软饱和性,容易产生梯度消失,导致训练出现问题。
2.其输出并不是以0为中心的。

3.2Tanh

表达式如下:

函数位于[-1, 1]区间上,对应的图像是:

这里写图片描述

同样的,Tanh 激活函数也具有软饱和性。Tanh 网络的收敛速度要比 Sigmoid 快。因为 Tanh 的输出均值比 Sigmoid 更接近 0,SGD 会更接近 natural gradient(一种二次优化技术),从而降低所需的迭代次数。

总结一下 Tanh 激活函数的优缺点

优点:
1.比Sigmoid函数收敛速度更快。
2.相比Sigmoid函数,其输出以0为中心。

缺点:还是没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。

3.3ReLU

ReLU 是近几年非常受欢迎的激活函数。表达式为:

这里写图片描述

其对应的函数图像为:

这里写图片描述

可见,ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。

最后总结一下 ReLU 函数的优缺点

优点:
1.相比起Sigmoid和tanh,ReLU在SGD中能够快速收敛。据称,这是因为它线性、非饱和的形式。
2.Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
3.有效缓解了梯度消失的问题。
4.在没有无监督预训练的时候也能有较好的表现。
5.提供了神经网络的稀疏表达能力。

缺点:

随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。

3.4LReLU、PReLU与RReLU

参考出处:https://www.cnblogs.com/rgvb178/p/6055213.html

通常在LReLU和PReLU中,我们定义一个激活函数为:

f(y_i)=\begin{cases} y_i& if(y_i>0)\\ a_iy_i& if(y_i\le0) \end{cases}

-LReLU
a_i比较小而且固定的时候,我们称之为LReLU。LReLU最初的目的是为了避免梯度消失。但在一些实验中,我们发现LReLU对准确率并没有太大的影响。很多时候,当我们想要应用LReLU时,我们必须要非常小心谨慎地重复训练,选取出合适的a,LReLU的表现出的结果才比ReLU好。因此有人提出了一种自适应地从数据中学习参数的PReLU。

-PReLU
PReLU是LReLU的改进,可以自适应地从数据中学习参数。PReLU具有收敛速度快、错误率低的特点。PReLU可以用于反向传播的训练,可以与其他层同时优化。

-RReLU
在RReLU中,我们有:

y_{ji}=\begin{cases} x_{ji}& if(x_{ji}>0)\\ a_{ji}x_{ji}& if(x_{ji}\le0) \end{cases}

a_{ji} \sim U(l,u),l<u\;\;and\;\;l,u\in [0,1)

其中,a_{ji}是一个保持在给定范围内取样的随机变量,在测试中是固定的。RReLU在一定程度上能起到正则效果。

在论文Empirical Evaluation of Rectified Activations in Convolution Network中,作者对比了RReLU、LReLU、PReLU、ReLU 在CIFAR-10、CIFAR-100、NDSB网络中的效果。


4.深度学习中的正则化

我们将正则化定义为 ‘‘对学习算法的修改——旨在减少泛化误差而不是训练误差’’。目前有许多正则化策略。有些策略向机器学习模型添加限制参数值的额外约束。有些策略向目标函数增加额外项来对参数值进行软约束。如果我们细心选择,这些额外的约束和惩罚可以改善模型在测试集上的表现。有时侯,这些约束和惩罚被设计为编码特定类型的先验知识;其他时候,这些约束和惩罚被设计为偏好简单模型,以便提高泛化能力。有时,惩罚和约束对于确定欠定的问题是必要的。其他形式的正则化,如被称为集成的方法,则结合多个假说来解释训练数据。在深度学习的背景下,大多数正则化策略都会对估计进行正则化。 估计的正则化以偏差的增加换取方差的减少。一个有效的正则化是有利的 ‘‘交易’’,也就是能显著减少方差而不过度增加偏差。我们在第五章中讨论泛化和过拟合时,主要侧重模型族训练的 3 个情形:(1)不包括真实的数据生成过程 对应欠拟合和含有偏 差的情况,(2)匹配真实数据生成过程,(3)除了包括真实的数据生成过程,还包 括许多其他可能的生成过程方差(而不是偏差)主导的过拟合 正则化的目标是使模型从第三种情况转化为第二种情况。在实践中,过于复杂的模型族不一定包括目标函数或真实数据生成过程,甚至 也不包括近似过程 我们几乎从未知晓真实数据的生成过程,所以我们永远不知道 被估计的模型族是否包括生成过程 然而, 深度学习算法的大多数应用都是针对这 样的情况,其中真实数据的生成过程几乎肯定在模型族之外 深度学习算法通常应 用于极为复杂的领域,如图像音频序列和文本,本质上这些领域的真实生成过程涉及模拟整个宇宙 从某种程度上说,我们总是持方枘(数据生成过程)而欲内圆 凿(我们的模型族) 这意味着控制模型的复杂度不是找到合适规模的模型(带有正确的参数个数) 这样一个简单的事情 相反,我们可能会发现,或者说在实际的深度学习场景中我们几乎总是会发现,最好的拟合模型(从最小化泛化误差的意义上)是一个适当正则化的大型模型。

-------以上引自花书。

4.1参数范数惩罚

许多正则化方法通过对目标函数 J 添加一个参数范数惩罚 Ω(θ),限制模型(如神经网络、 线性回归或逻辑回归)的学习能力。我们将正则化后的目标函数记为J:

是权衡范数惩罚项Ω和标准目标函数相对贡献的超参数。将 α 设为 0 表示没有正则化。 α 越大,对应正则化惩罚越大。

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

在神经网络中,参数包括每一层仿射变换的权重和偏置,我们通常只对权重做惩罚而不对偏置做正则惩罚。每个权重会指定两个变量如何相互作用。我们需要在各种条件下观察这两个变量才能良好地拟合权重。而每个偏置仅控制一个单变量。这意味着,我们不对其进行正则化也不会导致太大的方差。另外,正则化偏置参数可能会导致明显的欠拟合。

4.2 L1和L2正则化

直接贴上之前的学习备忘记录:https://blog.csdn.net/weixin_42483560/article/details/84893424

4.3数据集增强

实践中,我们拥有的数据量是很有限的。解决这个问题的一种方法是创建假数据并添加到训练集中。

数据集增强对一个具体的分类问题来说是特别有效的方法:对象识别 图像是 高维的并包括各种巨大的变化因素,其中有许多可以轻易地模拟 即使模型已使用 卷积和池化技术(第九章)对部分平移保持不变,沿训练图像每个方向平移几个像素的操作通常可以大大改善泛化许多其他操作如旋转图像或缩放图像也已被证明非常有效我们必须要小心,不能使用会改变类别的转换。例如,光学字符识别任务需要认识到 b 和 d 以及 6 和 9 的区别,所以对这些任务来说,水平翻转和旋转 180 并不是合适的数据集增强方式 能保持我们希望的分类不变,但不容易执行的转换也是存在的 例如,平面外绕轴转动难以通过简单的几何运算在输入像素上实现。数据集增强对语音识别任务也是有效的 (Jaitly and Hinton, 2013)。

在比较机器学习基准测试的结果时,考虑其采取的数据集增强是很重要的 通 常情况下,人工设计的数据集增强方案可以大大减少机器学习技术的泛化误差 将 一个机器学习算法的性能与另一个进行对比时,对照实验是必要的 在比较机器学 习算法 A 和机器学习算法 B 时,应该确保这两个算法使用同一人工设计的数据集增 强方案 假设算法 A 在没有数据集增强时表现不佳,而 B 结合大量人工转换的数 据后表现良好 在这样的情况下,很可能是合成转化引起了性能改进,而不是机器 学习算法 B 比算法 A 更好

4.4噪声添加

在神经网络的输入层注入噪声 (Sietsma and Dow, 1991) 也可以被看作是数据增 强的一种方式 对于许多分类甚至一些回归任务而言,即使小的随机噪声被加到输入,任务仍应该是能够被解决的 然而, 神经网络被证明对噪声不是非常健壮 (Tang and Eliasmith, 2010) 改善神经网络健壮性的方法之一是简单地将随机噪声添加到输入再进行训练。输入噪声注入是一些无监督学习算法的一部分,如去噪自编码 器(Vincent et al., 2008a) 向隐藏单元施加噪声也是可行的,这可以被看作在多个抽 象层上进行的数据集增强 Poole et al. (2014) 最近表明,噪声的幅度被细心调整后,该方法是非常高效的。

4.5提前终止(early stop)

当训练有足够的表示能力甚至会过拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。这种现象几乎一定会出现。这意味着我们只要返回使验证集误差最低的参数设置,就可以获得验证集误差更低的模型(并且因此有希望获得更好的测试误差)。在每次验证集误差有所改善后,我们存储模型参数的副本。当训练算法终止时,我们返回这些参数而不是最新的参数。当验证集上的误差在事先指定的循环次数内没有进一步改善时,算法就会终止。这种策略被称为 提前终止(early stopping)。这可能是深度学习中最常用的正则化形式。它的流行主要是因为有效性和简单性。

4.6dropout

Dropout可以作为训练深度神经网络的一种trick供选择。在每个训练批次中,通过忽略一些特征检测器(让一些的隐层节点值为0),可以明显地减少过拟合现象。这种方式可以减少特征检测器(隐层节点)间的相互作用,检测器相互作用是指某些检测器依赖其他检测器才能发挥作用。

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


5.深度模型的优化

5.1参数初始化策略

动机:

1.初始点的选取,有时候能够决定算法是否收敛

2.当收敛时,初始点可以决定学习收敛的多快,是否收敛到一个代价高或低的点

3.初始化也可以影响泛化

4.初始参数需要破坏不同神经元间的“**对称性**”,因为如果初始化成全0或者一样的值,那么整个神经网络就会变成确定性的算法,具有相同输入的神经元前向传播和梯度更新就都变得一模一样的。(尤其是在cnn中,对于不同channel,具有相同输入的情况下)

初始化的参数主要有:w权重,bias偏置,

关于W权重的:

①.在实践中,我们经常将权重初始化为高斯分布,或者均匀分布。高斯分布或者均匀分布的选择并没有太大的区别。但是初始化分布的**大小(scale)**对优化结果和泛化能力有极大的影响。

②对于relu的激活函数推荐使用**【2】或者【3】**的方式

关于b偏置的:

1)如果偏置作为输出单元,初始化偏置以获取正确的输出边缘的统计通常是有利的。

2)有时,我们可能想要选择偏置以避免初始化引起的太大饱和

3)一个单元会控制其他单元能否参与到等式中,比如常见的门操作,在LSTM中将forget_bias=1.0.

5.2自适应学习率算法

(本小节引自花书)

神经网络研究员早就意识到学习率肯定是难以设置的超参数之一,因为它对模型的性能有显著的影响,损失通常高度敏感于参数空间中的某些方向,而不敏感于其他。动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数,在这种情况下,自然会问有没有其他方法,如果我们相信方向敏感度在某种程度是轴对齐的,那么每个参数设置不同的学习率,在整个学习过程中自动适应这些学习率是有道理的。Delta-bar-delta 算法 (Jacobs, 1988) 是一个早期的在训练时适应模型参数各 自学习率的启发式方法 该方法基于一个很简单的想法,如果损失对于某个给定模 型参数的偏导保持相同的符号,那么学习率应该增加 如果对于该参数的偏导变化 了符号,那么学习率应减小。当然,这种方法只能应用于全批量优化中 最近,提出了一些增量(或者基于小批量)的算法来自适应模型参数的学习率。

5.2.1AdaGrad

AdaGrad 算法独立地适应所有模型参数的学习率,缩放每 个参数反比于其所有梯度历史平方值总和的平方根 (Duchi et al., 2011) 具有损失 最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上 有相对较小的下降 净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步 在凸优化背景中, AdaGrad 算法具有一些令人满意的理论性质 然而,经验上 已经发现,对于训练深度神经网络模型而言, 从训练开始时积累梯度平方会导致有 效学习率过早和过量的减小 AdaGrad 在某些深度学习模型上效果不错,但不是全部。

5.2.2RMSProp

RMSProp 算法 (Hinton, 2012) 修改 AdaGrad 以在非凸设定下效果更好,改 变梯度积累为指数加权的移动平均 AdaGrad 旨在应用于凸问题时快速收敛 当应 用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一 个局部是凸碗的区域 AdaGrad 根据平方梯度的整个历史收缩学习率,可能使得学 习率在达到这样的凸结构前就变得太小了 RMSProp 使用指数衰减平均以丢弃遥远 过去的历史,使其能够在找到凸碗状结构后快速收敛,它就像一个初始化于该碗状 结构的 AdaGrad 算法实例 RMSProp 的标准形式如算法 8.5 所示,结合 Nesterov 动量的形式如算法 8.6 所  示 相比于 AdaGrad,使用移动平均引入了一个新的超参数ρ,用来控制移动平均的 长度范围 经验上, RMSProp 已被证明是一种有效且实用的深度神经网络优化算法 目前 它是深度学习从业者经常采用的优化方法之一。

5.2.3Adam

Adam (Kingma and Ba, 2014) 是另一种学习率自适应的优化算法,如算法 8.7 所示。 “Adam’’ 这个名字派生自短语 “adaptive moments’’。早期算法背景下,它也许最好被看作结合 RMSProp 和具有一些重要区别的动量的变种。首先,在 Adam 中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入 RMSProp 最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量使用没有明确的理论动机。其次, Adam 包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计(算法 8.7 )。 RMSProp 也采用了(非中心的)二阶矩估计,然而缺失了修正因子。因此,不像 Adam, RMSProp 二阶矩估计可能在训练初期有很高的偏置。Adam 通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。



5.3优化算法的选择

最流行并且使用很高的优化算法包括 SGD、具动量的 SGD、 RMSProp、具动量的 RMSProp、 AdaDelta 和 Adam。此时,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数)。

5.4深度学习中的Batch Normalization

批规范化(Batch normalization)是深度学习中经常见到的一种训练trick,指在采用梯度下降法训练DNN时,对网络层中每个mini-batch的数据进行归一化,使其均值变为0,方差变为1,其主要作用是缓解DNN训练中的梯度消失/爆炸现象,加快模型的训练速度。

传统的神经网络中,只是在输入层之前或在输出层之后对x或者y进行标准化处理(减均值,除标准差),让数据处于均值为0、方差为1的分布中,以降低样本间的差异性。

在训练开始之前,要对输入的数据做Normalization的原因:

原因在于神经网络学习过程本质上是为了学习数据的分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另一方面,一旦在mini-batch梯度下降训练的时候,每批训练数据的分布不相同,那么网络就要在每次迭代的时候去学习以适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对所有训练数据做一个Normalization预处理的原因。

带来的好处:

1.允许较大的学习率,加快模型收敛速度
BN通过固定网络层输入(也即前一层的响应)的分布(标准正态)使优化过程中的解空间更平滑,从而确保了梯度更具预测性和稳定性,因此可以使用更大范围的学习率并获得更快的收敛速度。(参考BatchNorm是如何在深度学习优化过程中发挥作用的)
2.避免深层网络的梯度消失或爆炸问题
BN通过固定网络层输入的均值和方差,即使网络较深层的响应或梯度过小或过大时,也可通过BN的规范化作用将其缩放到一个比较合理的取值范围,从而避免梯度消失或爆炸问题。参考“深度学习中 Batch Normalization为什么效果好? - 魏秀参的回答 - 知乎” https://www.zhihu.com/question/38102762/answer/85238569
3.减少对参数初始化方法的依赖
Xavier等参数初始化的目的是为了使网络各层的输入输出具有相同的统计分布,而BN直接对网络层构造标准正态分布的响应,能够达到同样的目的。

传统神经网络中使用Normalization的缺点:

对于深度网络的训练是一个复杂的过程,只要网络的前面几层参数发生微小的改变,那么后面几层网络就会被积累放大发生更大的变动。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练数据的分布发生变化,那么将会影响网络的训练速度。

算法如下:

è¿éåå¾çæè¿°


5.5深度学习中的layer Normalization

在前面谈到,标准化的作用就是改良数据分布。

BN的操作是,对同一批次的数据分布进行标准化,得出的均值方差,其可信度受batch size影响。很容易可以想到,如果我们对小batch size得出均值方差,那势必和总数据的均值方差有所偏差。这样就解释了BN的第一个缺点:BN特别依赖Batch Size;

LN的操作类似于将BN做了一个“转置”,对同一层网络的输出做一个标准化。注意,同一层的输出是单个图片的输出,比如对于一个batch为32的神经网络训练,会有32个均值和方差被得出,每个均值和方差都是由单个图片的所有channel之间做一个标准化。这么操作,就使得LN不受batch size的影响。同时,LN可以很好地用到序列型网络如RNN中。同时,LR在训练过程和inference过程都会有,这就是和BN很大的差别了。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值