参加过深度学习面试的同学,大部分可能都会刷过一些面试经验贴,其中也会有不少关于 BN 的面试贴。
对于这个算法,一个经典的问法并不是让你手写算法,而是会问你在训练过程中和推理过程中,批归一化算法相同吗?如果你回答相同,那基本就没戏了。
既然这么问,那肯定就是不同的,具体怎么个不同法呢?
均值和方差的处理不一样
一个完整的训练过程是需要经过很多轮次的迭代。对于 BN 算法,在训练过程大概是要经过以下这么几步的:
-
对每一样本计算均值和方差
-
使用计算的均值和方差对输入数据进行标准化
-
对标准化后的数据进行缩放和平移,通过可学习的参数进行调整
-
在下一轮反向传播中计算梯度并再一次更新参数
其他的我们暂时先不管,先看第 1 条和第 2 条。
每个小批次都会计算一次均值和方差,也就是说如果我分了 10 个批次来训练模型,那岂不是要计算出 10 批均值和方差吗?计算出来的这 10 个均值和方差都是局部均值和局部方差。
而在推理过程,我们需要的是所有训练数据训练出来的一个全局均值和全局方差,那怎么办呢?
这就需要对训练的局部均值和方差做一个处理,下面看一些在推理过程中 BN 要经过哪些过程。
针对 BN 算法,在推理过程大概要经过以下几步:
-
使用训练过程中累积的均值和标准差对输入数据进行标准化。
-
对标准化后的数据进行缩放和平移,使用训练过程中学到的参数。
-
不再更新参数,因为推理阶段不进行反向传播。
<