Batch Normalization梯度反向传播推导

最近在看CS231N的课程,同时也顺带做配套的作业,在Assignment2 中关于Batch Normalization的具体数学过程则困惑了很久,通过参看一些博客自己推导了一遍,供大家参考。

Batch Normalization

首先,关于Batch Normalization的具体实现过程就不在此介绍了,想了解的可以参看论文或者博客
对于Batch Normalization的前向传播可以参看下图的过程,它主要思路就是将每个Batch的输入根据均值 μB 和方差 2B 进行归一化,然后再进行尺度缩放到 yi

对于前向传播网络,可以很直观的给出实现代码

def batchnorm_forward(x, gamma, beta, bn_param):
  """
  Input:
  - x: (N, D)维输入数据
  - gamma: (D,)维尺度变化参数 
  - beta: (D,)维尺度变化参数
  - bn_param: Dictionary with the following keys:
    - mode: 'train' 或者 'test'
    - eps: 一般取1e-8~1e-4
    - momentum: 计算均值、方差的更新参数
    - running_mean: (D,)动态变化array存储训练集的均值
    - running_var:(D,)动态变化array存储训练集的方差

  Returns a tuple of:
  - out: 输出y_i(N,D)维
  - cache: 存储反向传播所需数据
  """
  mode = bn_param['mode']
  eps = bn_param.get('eps', 1e-5)
  momentum = bn_param.get('momentum', 0.9)

  N, D = x.shape
  # 动态变量,存储训练集的均值方差
  running_mean = bn_param.get('running_mean', np.zeros(D, dtype=x.dtype))
  running_var = bn_param.get('running_var', np.zeros(D, dtype=x.dtype))

  out, cache = None, None
  # TRAIN 对每个batch操作
  if mode == 'train':
    sample_mean = np.mean(x, axis = 0)
    sample_var = np.var(x, axis = 0)
    x_hat = (x - sample_mean) / np.sqrt(sample_var + eps)
    out = gamma * x_hat + beta
    cache = (x, gamma, beta, x_hat, sample_mean, sample_var, eps)
    running_mean = momentum * running_mean + (1 - momentum) * sample_mean
    running_var = momentum * running_var + (1 - momentum) * sample_var
  # TEST:要用整个训练集的均值、方差
  elif mode == 'test':
    x_hat = (x - running_mean) / np.sqrt(running_var + eps)
    out = gamma * x_hat + beta
  else:
    raise ValueError('Invalid forward batchnorm mode "%s"' % mode)

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

  return out, cache

上述代码基于CS231N Assignment2,值得注意的是Batch Normalization对于在训练和测试阶段的计算方法不一样,因为训练阶段的均值和方差是基于一个Batch的数据,而测试阶段是基于整个训练集求得。

梯度反向传播

Batch Normalization最让人头疼的就是理清楚反向传播梯度并写成代码,当然它依然遵循链式求导法则。首先我们基于上图,将变量定义如下:

  • σ 为一个batch所有样本的方差
  • μ 为样本均值
  • xˆ 为归一化后的样本数据
  • yi 为输入样本 xi 经过尺度变化的输出量
  • γ β 为尺度变化系数
  • Ly 为已知,并假设 x y 都为(N,D)维,即有N个维度为D的样本

由于网络正向传播是根据 γ β xˆ xi 变换为 yi ,那么反向传播则是根据 Lyi 求得 Lγ Lβ Lxi

  • 23
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值