1. 介绍BN。
BN动机:神经网络训练过程的本质是学习数据分布
,如果训练数据与测试数据的分布不同将大大降低网络的泛化性能,因此我们需要在训练开始前对所有输入数据进行归一化处理。(参数变化后使得后一层的输入发生变化,每一批次训练数据的分布不一致,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。)
- 为了解决网络中数据分布变化大,学习过程慢的问题。
- 采用标准化,并引入两个可学习的参数来重建浅层网络学到的分布。
(变换重构)
2. 了解BN吗?
- 为了解决网络中数据分布变化大,学习过程慢的问题。
- 采用标准化,并引入两个可学习的参数来重建浅层网络学到的分布
(变换重构)
。
3. BN的原理、作用以及训练测试时的不同。
# BN计算步骤:
1.计算样本均值。
2.计算样本方差。
3.样本数据标准化处理。
4.进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。
作用:
- 加快训练速度,这样我们就可以使用较大的学习率来训练网络。
- 提高网络的泛化能力。
训练测试的不同:
就是BN在训练阶段每一个batch按照如上图的算法流程计算每个batch的均值和方差,然后通过一个滑动平均值方法保存,在pytorch中是通过一个参数momentum
保存每个连续计算的batch的均值和方差的。
# 其中x'表示新的保存下来的值,x是之前旧的保存的值,x''是表示新的batch计算的当前均值方差等。
x' = (1-momentum)*x + momentum*x''
其中的均值是每个batch的均值的均值,方差是每个batch的无偏估计量。但是在pytorch具体实现是采用以上所说的滑动平均值
方法计算的,所以最后一旦整个训练阶段完成,BN层中的所有参数也就固定下来,然后直接用于test。
4. 手写softmax、手写BN公式。
5. BN的缺点。
-
受
batch_size
大小的限制
BN是以batch为单位计算归一化统计量的,当一个batch样本数很少时,少量样本的均值和方差无法反映全局
的统计分布,所以基于少量样本的BN的效果会变得很差。在一些场景中,比如说硬件资源受限,在线学习等场景,BN是非常不适用的。(在Transformer中使用的是Layer Normalization,受硬件的限制,Bert一般训练的批次都不大)
-
无法很好的应用于RNN中
在一个batch中,通常各个样本的长度都是不同的
,当统计到比较靠后的时间片时,这时可能只有很少的样本数据为非零值,基于这些仍有数据的少量样本的统计信息不能反映全局分布,所以这时BN的效果并不好。
另外如果在测试时我们遇到了长度大于任何
一个训练样本的测试样本,我们无法找到保存的归一化统计量
,所以BN无法运行。
6. LN的计算方法。
LN是一个独立于batch size的算法,所以无论一个batch样本数多少都不会影响参与LN计算的数据量,从而解决BN的两个问题。LN的做法是根据样本的特征数做归一化。
7. BN和LN的不同。
- Batch Normalization 的处理对象是对一批样本, Layer Normalization 的处理对象是单个样本。
- Batch Normalization 是对这批样本的同一维度特征(每个神经元)做归一化,Layer Normalization 是对这单个样本的所有维度特征做归一化。
LN不依赖于batch的大小和输入sequence的深度,因此可以用于batch-size为1
和RNN
中对边长的输入sequence的normalize操作。但在大批量的样本训练时,效果没BN好。
实践证明,LN用于RNN进行Normalization时,取得了比BN更好的效果。但用于CNN时,效果并不如BN明显。
1. dropout的原理、作用以及训练测试时的不同。
原理:训练时,每个神经元节点激活值以一定的概率被“丢弃”;测试时,每个神经元参数要预先乘以概率系数,以恢复在训练中该神经元只有的概率被应用到整个神经网络的前向传播计算(以使得在训练时和测试时每一层输入有大致相同的期望。)
。
两种方法处理:(通常采用第一种方案)
- 只在训练时对第二层的输出数据除以之后再传给输出层神经元。
- 只在测试时对每一个神经单元的权重参数要乘以概率。
# coding:utf-8
import numpy as np
# dropout函数的实现
def dropout(x, level):
if level < 0. or level >= 1: #level是概率值,必须在0~1之间
raise ValueError('Dropout level must be in interval [0, 1[.')
retain_prob = 1. - level
# 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
# 硬币 正面的概率为p,n表示每个神经元试验的次数
# 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
print(random_tensor)
x *= random_tensor
print(x)
x /= retain_prob
return x
#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)
dropout(x,0.4)
作用:
- Dropout 是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。
- 类似于Bagging。
2. dropout为什么可以防止过拟合?
Dropout作用于每份小批量训练数据,随机丢弃部分神经元,相当于每次迭代都在训练不同的神经网络(对于包括N个神经元节点的网络,在Dropout的作用下可看作为2^N个模型的集成。这2^N个模型可认为是原始网络的子网络,它们共享权值,并且具有相同的网络层数,而模型整体的参数数目不变,这就大大简化了运算。)
。类比于Bagging方法,Dropout可被认为是一种实用的大规模深度神经网络的模型集成算法。对于任意神经元,每次训练中都与一组随机挑选的不同的神经元集合共同进行优化,这个过程会减弱全体神经元之间的联合适应性,减少过拟合的风险,增强泛化能力。
3. Dropout了解吗,说下作用,白板实现以下。
Dropout 是在训练过程中以一定的概率的使神经元失活,即输出为0,以提高模型的泛化能力,减少过拟合。
-
没有Dropout的网络计算公式:
-
采用Dropout的网络计算公式:
标准网络和带Dropout的网络
4. 在Transformer模型中dropout主要用在哪里?看过源码吗?
droput在每个子层(BertEmbeddings、BertAttention、BertOutput)
之间,设置为0.1
。
1. 正则化L1和L2正则化,区别是什么?
L1(L1-Norm)
和L2(L2-Norm的平方)
都是正则化项,又叫做惩罚项
,是为了限制模型的参数
,防止模型过拟合
而加在损失函数后面的一项。
- L1是模型各参数的绝对值之和;L2是模型各参数的平方和。
- L1会趋向于产生
少量的特征
,而其它的特征都是0(稀疏的)
。因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0,产生稀疏权重矩阵。 - L2会选择
更多的特征
,这些特征都会接近于0。最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。当最小化||w||时,就会使得每一项趋近于0。
2. L2正则化作用?
- 约束模型参数,防止过拟合。
3. 为什么参数越小代表模型越简单?
- 越是复杂的模型,越是会尝试所有样本进行拟合,包括
异常点
。这就会造成在较小的区间中产生较大的波动,这个较大的波动也会反应在这个区间的导数
比较大。 - 只有
越大的参数
才可能产生较大的导数
。因此参数越小,模型就越简单。
4. 实现参数的稀疏有什么好处?
因为参数的稀疏,在一定程度上实现了特征的选择
。一般而言,大部分特征对模型是没有贡献的。这些没有用的特征虽然可以减少训练集上的误差
,但是对测试集的样本,反而会产生干扰
。稀疏参数的引入,可以将那些无用的特征的权重置为0.
5. 正则化有什么用,为什么有用,L1正则为什么能使参数稀疏,为什么能防止过拟合
- 约束模型参数,防止过拟合。
加入了正则化项就是在原来目标函数的基础上加入约束。当目标函数的等高线
和L1、L2范数函数的等高线
第一次相交时,得到最优解。
- L1范数符合
拉普拉斯分布
,是不完全可微
的。表现在图像上会有很多角
出现。这些角和目标函数的接触机会远大于其他部分。就会造成最优值出现在坐标轴上
,因此就会导致某一维的权重为0,产生稀疏权重矩阵,进而防止过拟合。 - L2范数
符合高斯分布
,是完全可微
的。和L1相比,图像上的棱角被圆滑
了很多。一般最优值不会在坐标轴上
出现。在最小化正则项时,参数不断趋向于0,最后获得很小的参数。
网友评论