批次标准化Batch Normalization
目录
批次标准化Batch Normalization
第五节 2021 - 类神经网络训练不起来怎么办 (五) 批次标准化 (Batch Normalization)
📌Batch Normalization可以直接改变error surface的崎岖
为什么需要批次标准化
因为在训练的过程中,会存在着损失函数对多个weight权重模型参数的偏导变化趋势不匹配(即有smooth光滑的也有steep陡峭的),如下图:
产生上述变化趋势不匹配的原因
以下面简单的模型来解释上述变化趋势的不匹配 该模型只有两个特征值输入,也就只对应两个权重参数;
当w1产生变化时,若输入的特征值的变化阶层很小比如1到2这种,那么w1的变化就不会对loss产生较大的影响,从而对应上图中smooth的曲线
当w2产生变化时,若输入的特征值的变化阶层很大比如1到100到200这种,那么w2的变化就会对loss产生较大的影响,从而对应上图的steep的曲线
📌为了消除这种模型参数偏导变化趋势不同的error surface造成的training的困难,需要对输入的每个样本的特征值进行处理,使得它们的变化阶层相近,这种技巧就叫做Feature Normalization
处理方法
对每个样本的特征向量进行标准化,其公式如下:
x i ′ = x i − μ σ x^{i'}= \frac {x^i-\mu} {\sigma} xi′=σxi−μ
这里的μ即是所有样本的特征向量作算术和(向量相应位置上的数值相加)再取平均;∑即是进行均方差的求解,即:
μ = 1 n ∑ x i , σ = 1 n ( x i − μ ) 2 \mu=\frac {1} {n} \sum x^i,\sigma=\sqrt{\frac {1} {n}(x^i-\mu)^2} μ=n1∑xi,σ=n1(xi−μ)2
📌经过标准化的处理,所有样本的特征向量的平均值即为0,方差即为1
📌不仅刚开始的输入值需要做Normalization,每个之前神经元的输出,均需要在下一个神经元的激活函数之前进行Normalization处理(一般是激活函数前后进行标准化差异不大,但由于sigmoid的曲线在0附近偏导最大,若在sigmoid之后再normalization会导致gradient值偏大),如下图:
上图即是一个大的分类网络,网络在原来的基础上多了均值和均方差的计算即对输入值的标准化。
且本来特征值的输入改变并不会影响其他z的改变,但是因为均值和均方差的改变使得其他z也发生了改变
处理方法的优化
最后求的所有样本的均值为0,方差为1。但有时我们并不想要这样分布的特征向量,所以将特征向量标准化的式子更改为下图:其中γ与β均为模型参数,一般开始训练时γ为1向量,β为0向量
这样做的目的是在训练刚开始时将特征向量的分布近似相同,从而减轻训练难度,更快的进行参数的更新,之后再在训练的过程中逐渐由机器改变γ与β的值
Batch Normalization的引出
因为一次性对所有样本计算均值和均方差对GPU或CPU的要求较高,所以为了减少硬件需求,我们引入了Batch的概念。
故只需要对Batch内的样本进行求均值和均方差然后对Batch内样本的特征向量进行标准化,从而进行参数的更新(此时Batch不能太小也不能太大
Batch太大太小对训练的影响见上述标题批次Batch)
Testing时的相应处理
因为Batch
Normalization是对一定量的样本进行一次训练。而在测试时我们一般是有了一个样本就对模型输入特征值进行预测,此时如果再求μ和σ即会导致标准化后为0
因此Testing时的μ和σ有专门的计算方法Moving Average,如下:μ t = p × μ t ′ + ( 1 − p ) × μ i , μ i 为每一次 b a t c h 的均值 , μ t ′ 即为上次的 μ t . 按照该式递归求解 μ t \mu_{t}=p \times \mu_{t'}+(1-p) \times \mu ^i,\mu^i为每一次batch的均值,\mu_{t'}即为上次的\mu_t.按照该式递归求解\mu_t μt=p×μt′+(1−p)×μi,μi为每一次batch的均值,μt′即为上次的μt.按照该式递归求解μt
σ t = p × σ t ′ + ( 1 − p ) × σ i , σ i 为每一次 b a t c h 的均方差 , σ t ′ 即为上次的 σ t . 按照该式递归求解 σ t \sigma_{t}=p \times \sigma_{t'}+(1-p) \times \sigma ^i,\sigma^i为每一次batch的均方差,\sigma_{t'}即为上次的\sigma_t.按照该式递归求解\sigma_t σt=p×σt′+(1−p)×σi,σi为每一次batch的均方差,σt′即为上次的σt.按照该式递归求解σt