时间:2020年10月30日 Normal系列 - 图1


normal参数及控制

  • Normal系列 - 图2 直接进行归一化,利用两个参数进行分布的学习控制。初始的偏差为0,尺度控制为1。
  • affine=False意味着参数不再更新,恒为初值。track_running_stats=True一般选择打开,当打开时一般会关注统计所有batch的效果,如果关闭只关注当前batch的效果。测试阶段使用model.eval()将可训练关闭,双模型训练时候,关注以训练好模型的情况。
  • 测试阶段Normal系列 - 图3 用训练阶段的整体样本统计量进行测试数据的归一化。

Normal推导及代码

反向传播 计算代码 推导参考,反向

  1. def batchnorm_backward(dout, cache):
  2. """
  3. Backward pass for batch normalization.
  4. Inputs:
  5. - dout: Upstream derivatives, of shape (N, D)
  6. - cache: Variable of intermediates from batchnorm_forward.
  7. Returns a tuple of:
  8. - dx: Gradient with respect to inputs x, of shape (N, D)
  9. - dgamma: Gradient with respect to scale parameter gamma, of shape (D,)
  10. - dbeta: Gradient with respect to shift parameter beta, of shape (D,)
  11. """
  12. dx, dgamma, dbeta = None, None, None
  13. out_, x, sample_var, sample_mean, eps, gamma, beta = cache
  14. N = x.shape[0]
  15. dout_ = gamma * dout
  16. dvar = np.sum(dout_ * (x - sample_mean) * -0.5 * (sample_var + eps) ** -1.5, axis=0)
  17. dx_ = 1 / np.sqrt(sample_var + eps)
  18. dvar_ = 2 * (x - sample_mean) / N
  19. # intermediate for convenient calculation
  20. di = dout_ * dx_ + dvar * dvar_
  21. dmean = -1 * np.sum(di, axis=0)
  22. dmean_ = np.ones_like(x) / N
  23. dx = di + dmean * dmean_
  24. dgamma = np.sum(dout * out_, axis=0)
  25. dbeta = np.sum(dout, axis=0)
  26. return dx, dgamma, dbeta

优缺点

  • 上层网络需要不停调整来适应输入数据分布的变化,导致网络学习速度的降低。将输入映射到同一种分布
  • 计算式引入噪声—>正则

batch Normal 与 layer Normal

  • batch_normalization
    • 针对所有的样本,对某一个特征图计算均值和方差,然后然后对这个特征图神经元做归一化。
    • “横着来”,一批数据考虑。
  • layer_normalization
    • 某一个样本,计算该样本所有特征图的均值和方差,然后对这个样本做归一化。
    • “竖着来”,一批神经元考虑。
    • 不受mini-batch的分布影响
  • 反向传播时候,计算每一个神经元的双参数,并根据优化器和学习率(单独设定)进行参数的改变。
  • 推理的时候结合所有的双参数进行判断。

参考