时间:2020年10月30日
normal参数及控制
直接进行归一化,利用两个参数进行分布的学习控制。初始的偏差为0,尺度控制为1。
affine=False
意味着参数不再更新,恒为初值。track_running_stats=True
一般选择打开,当打开时一般会关注统计所有batch的效果,如果关闭只关注当前batch的效果。测试阶段使用model.eval()
将可训练关闭,双模型训练时候,关注以训练好模型的情况。- 测试阶段
用训练阶段的整体样本统计量进行测试数据的归一化。
Normal推导及代码
反向传播 计算代码 推导参考,反向
def batchnorm_backward(dout, cache):
"""
Backward pass for batch normalization.
Inputs:
- dout: Upstream derivatives, of shape (N, D)
- cache: Variable of intermediates from batchnorm_forward.
Returns a tuple of:
- dx: Gradient with respect to inputs x, of shape (N, D)
- dgamma: Gradient with respect to scale parameter gamma, of shape (D,)
- dbeta: Gradient with respect to shift parameter beta, of shape (D,)
"""
dx, dgamma, dbeta = None, None, None
out_, x, sample_var, sample_mean, eps, gamma, beta = cache
N = x.shape[0]
dout_ = gamma * dout
dvar = np.sum(dout_ * (x - sample_mean) * -0.5 * (sample_var + eps) ** -1.5, axis=0)
dx_ = 1 / np.sqrt(sample_var + eps)
dvar_ = 2 * (x - sample_mean) / N
# intermediate for convenient calculation
di = dout_ * dx_ + dvar * dvar_
dmean = -1 * np.sum(di, axis=0)
dmean_ = np.ones_like(x) / N
dx = di + dmean * dmean_
dgamma = np.sum(dout * out_, axis=0)
dbeta = np.sum(dout, axis=0)
return dx, dgamma, dbeta
优缺点
- 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低。将输入映射到同一种分布
- 计算式引入噪声—>正则
batch Normal 与 layer Normal
- batch_normalization
- 针对所有的样本,对某一个特征图计算均值和方差,然后然后对这个特征图神经元做归一化。
- “横着来”,一批数据考虑。
- layer_normalization
- 某一个样本,计算该样本所有特征图的均值和方差,然后对这个样本做归一化。
- “竖着来”,一批神经元考虑。
- 不受mini-batch的分布影响
- 反向传播时候,计算每一个神经元的双参数,并根据优化器和学习率(单独设定)进行参数的改变。
- 推理的时候结合所有的双参数进行判断。