二、BN(放在激活项前面)
1、一句话介绍BN
- BN是神经网络为了防止梯度消失或梯度爆炸采取的一种策略,一般放在激活项前。
2、BN的过程可以描述吗?
- 输入一个数据集合B,对该数据集合B求其均值和方差,然后对B进行归一化操作,同时BN还有两个可学习的参数r和β,通过这两个参数对归一化后的结果进行一定程度的还原。
3、BN中归一化的目的是什么?
- 将数据统一到一个区间内,减少数据的发散,从而加速模型的收敛。
4、归一化与标准化
- 常见的归一化公式为:
- 标准化公式如问题2所示。
5、BN中均值、方差通过哪些维度计算得到?
均值与方差的计算类似,这里以均值计算为例:
假设输入数据的维度是[batchsize channel w h]
那么这里就要考虑channel的数量,假设channel有3个,分别为1、2、3标号;batchsize为10。
那么channel 1中的10个数据全部相加然后除以batchsize * w * h
channel 2中的10个数据全部相加然后除以batchsize* w * h
channel 3中的10个数据全部相加然后除以batchsize * w * h。
所以r和β参数的维度其实和channel是一样的,此时为3。
6、训练与推理时BN中的均值、方差分别是什么
- 训练时是该batchsize求得的,
- 推理时是全部批次求得的。
7、BN训练时为什么不用全量训练集的均值和方差呢?
- 在当前batch训练时,是无法得知该batch以外的数据信息的,所以得选择该batch下的样本求得均值与方差。
三、LN(Layer Normalization)
1、Transformer中的LN是什么样子的?
首先也是在激活项前进行,先求出一个样本的均值和方差(比如单层隐藏层各个神经元的均值与方差),然后执行归一化操作,但这里存在一个gain参数和bias偏置参数,也是学习得到的,用来增强模型表达能力。
2、Transformer中为什么要舍弃 BN 改用 LN 呢
原始BN是为CNN而设计的,对整个batchsize范围内的数据进行考虑,而对于RNN以及transformer等等处理文本序列信息的模型来说,BN会变得非常复杂,而LN是对单个样本就可以进行处理,更加方便简单,自然选择用LN了。
3、Transformer中LN的作用?
当我们使用梯度下降法做优化时,随着网络深度的增加,数据的分布会不断发生变化,为了保证数据特征分布的稳定性,我们加入Layer Normalization,这样可以加速模型的收敛速度
Normalization 有很多种,但是它们都有一个共同的目的,那就是把输入转化成均值为 0 方差为1的数据。我们在把数据送入激活函数之前进行normalization(归一化),因为我们不希望输入数据落在激活函数的饱和区,发生梯度消失的问题,使得我们的模型训练变得困难。
4、BN和LN的区别
BN是对batchsize范围内数据进行处理
LN是对单个样本数据进行处理。
四、dropout
1、Dropout运行细节?
对于一个普通的DNN来说,
使用Dropout之后,过程变成如下:
随机临时删除一定比例的隐藏层神经元,其他不变。
前向传播,并且反向传播。
没有被临时删除的神经元进行梯度更新。
重复这个过程。
2、Dropout 在训练和测试时都需要嘛?
Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。
而在测试时,应该用整个训练好的模型,因此不需要dropout。
3、Dropout 如何平衡训练和测试时的差异呢?
Dropout ,在训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0
假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,
如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入,而实际测试时是不会有dropout的,输出层每个神经元都有6个输入,这样在训练和测试时,输出层每个神经元的输入和期望的会有量级上的差异。
因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。
4、BN和Dropout共同使用时会出现的问题
(一般可能都是先dropout再BN的,但是这样会出现问题的。所以如果真的想同时使用,那么就先BN再dropout)
BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。
当dropout在BN之前的时候,我们知道dropout在训练的时候会有随机失活,但是在预测时没有随机失活,为了弥补这个之间的一个gap,在训练的时候会把当前随机失火的这个神经元的一个输出数据进行一定程度的放缩,具体来说是除以一减p,然后当做下一层的一个输入数据,那么因为dropout在BN之前,训练时,BN会基于这些放缩的结果进行参数的学习。而预测时,dropout不进行放缩了,必然会对数据分布等产生一定影响,而此时的BN参数是基于之前放缩结果进行学习的,所以必然对BN会产生一定的影响。(学术界称为’方差偏移’)
五、神经元
总结
- 神经元的存在形式是一系列参数,并且是可学习的参数。
- 神经元可以接受不同尺寸的输入,也可以将输入与内部参数进行任意运算/操作(但操作方式应予输入尺寸相匹配)。
- 神经元的输出大小取决于输入数据的大小和神经元操作方式
- 神经元在输出前需要apply非线性函数
- 一个神经元配备一个bias
另一个思考的角度是:经过神经元的处理,输出通常都会比输入数据的尺寸要小,这其实是一种信息整合的体现