zl程序教程

您现在的位置是:首页 >  其他

当前栏目

复盘:Batch Normalization 和 Dropout在训练和测试的不同

训练测试 不同 Batch 复盘 Normalization dropout
2023-09-11 14:15:38 时间

复盘:Batch Normalization 的均值和方差数量, Dropout在训练和测试的不同

提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性

关于互联网大厂的笔试面试,都是需要细心准备的
(1)自己的科研经历,科研内容,学习的相关领域知识,要熟悉熟透了
(2)自己的实习经历,做了什么内容,学习的领域知识,要熟悉熟透了
(3)除了科研,实习之外,平时自己关注的前沿知识,也不要落下,仔细了解,面试官很在乎你是否喜欢追进新科技,跟进创新概念和技术
(4)准备数据结构与算法,有笔试的大厂,第一关就是手撕代码做算法题
面试中,实际上,你准备数据结构与算法时以备不时之需,有足够的信心面对面试官可能问的算法题,很多情况下你的科研经历和实习经历足够跟面试官聊了,就不需要考你算法了。但很多大厂就会面试问你算法题,因此不论为了笔试面试,数据结构与算法必须熟悉熟透了
秋招提前批好多大厂不考笔试,直接面试,能否免笔试去面试,那就看你简历实力有多强了。


面试问:Batch Normalization 和 Dropout在训练和测试的不同

batch normalization

训练和测试的参数是否一致?

不一致!

对于BN,训练的时候是对每一批数据操作,所以用到的均值方差都是一批的。
而测试的时候,没有一批的概念,这时候的均值和方差用到的是全量训练数据的,这些都是在训练时保存下来的

BN中均值 方差 训练不用全局的原因?
在训练的第一个完整epoch过程中是无法得到输入层之外其他层全量训练集的均值和方差,只能在前向传播过程中获取已训练batch的均值和方差。

每一批数据的均值、方差都会有差别,会增加模型的鲁棒性

Batch Normalization 的均值和方差数量

将输入的图像shape记为[N, C, W, H]
batchNorm是在batch上,对CHW做归一化,对小batchsize效果不好;
相当于有多少batch就有多少组待计算均值和方差数据
因为是在Batch上进行的,均值的维度应该为CWH

def Batchnorm(x, gamma, beta, bn_param):
    # x_shape:[B, C, H, W]
    running_mean = bn_param['running_mean']
    running_var = bn_param['running_var']
    results = 0.
    eps = 1e-5

    x_mean = np.mean(x, axis=0, keepdims=True)
    x_var = np.var(x, axis=0, keepdims=True0)
    x_normalized = (x - x_mean) / np.sqrt(x_var + eps)
    results = gamma * x_normalized + beta

    # 因为在测试时是单个图片测试,这里保留训练时的均值和方差,用在后面测试时用
    running_mean = momentum * running_mean + (1 - momentum) * x_mean
    running_var = momentum * running_var + (1 - momentum) * x_var

    bn_param['running_mean'] = running_mean
    bn_param['running_var'] = running_var

    return results, bn_param

在batchsize上

对比:
layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
相当于有多少个channel,就有多少组待计算均值和方差数据
均值的维度应该为NWH

instanceNorm在图像像素上,对HW做归一化,用在风格化迁移;
相当于有N*C组待计算均值和方差数据,均值的维度应该为W*H

GroupNorm将channel分组,然后再做归一化;
相当于有N*G组待计算均值和方差数据
其中G为group数,均值的维度应该为(N*C//G)WH

dropout

Dropout就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征。
训练阶段
在这里插入图片描述
没有Dropout的网络计算公式:全部输出
在这里插入图片描述
加一个概率则:

在这里插入图片描述
上面公式中Bernoulli函数是为了生成概率r向量,也就是随机生成一个0、1的向量

代码层面实现让某个神经元以概率p停止工作,
其实就是让它的激活函数值以概率p变为0

比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、…、y1000,我们dropout比率选择0.4
那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0

注意: 经过上面屏蔽掉某些神经元,使其激活值为0以后,
我们还需要对向量y1……y1000进行缩放,也就是乘以1/(1-p)

如果你在训练的时候,经过置0后,没有对y1……y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放,操作如下。
在这里插入图片描述

(2)在测试模型阶段
只有在训练阶段没有除(1-p)的,在测试的时候会乘P 否则不用

预测模型的时候,每一个神经单元的权重参数要乘以概率p。

测试阶段Dropout公式:
在这里插入图片描述


总结

提示:重要经验:

1)batchNorm是在batch上,对CHW做归一化,对小batchsize效果不好;相当于有多少batch,就有多少组待计算均值和方差数据
2)dropout是训练时没有被缩1/(1-p)的,测试扩p,BN训练时用一个批次的均值,而测试用整体均值
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。