Introduction
批规范化,batch normalization,即著名的 BN 操作。
顾名思义,是 对batch的操作 。
y = γ ⋅ x − μ δ 2 + ϵ + β = { γ , g a m m a : s c a l e μ , m u : m e a n δ , d e l t a : v a r β , b e t a : o f f s e t y = \gamma \cdot \frac{x-\mu}{\sqrt{\delta^2 + \epsilon}} + \beta = \left\{\begin{aligned} &\gamma&, & gamma:& scale \\ &\mu&, & mu:& mean \\ &\delta&, & delta:& var \\ &\beta&, & beta:& offset \\ \end{aligned}\right. y=γ⋅δ2+ϵx−μ+β=⎩ ⎨ ⎧γμδβ,,,,gamma:mu:delta:beta:scalemeanvaroffset
Birth
15年2月的论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift。
Motivation
为了防止隐层的输入分布老是变来变去,BN让每个隐层节点的 激活输入分布 缩小到 (-1, 1) 。
Note:
- 是缩小到 (-1, 1),而非缩小到 (0, 1)。
计算流程
- 计算 均值 和 方差;
- 做 规范化;
- 乘上缩放矩阵,加上平移向量 。
输入为 i n : B = { x 1 , . . . , x N } in:B = \{x_1, ..., x_N\} in:B={x1,...,xN} ,输出为 o u t : y ′ = { B N γ , β ( x 1 ) , . . . } out:y^{\prime} = \{BN_{\gamma,\beta}(x_1), ... \} out:y′={BNγ,β(x1),...} 。
- μ ← 1 N ∑ i = 1 N x i ,计算 b a t c h 的均值 \mu \gets \frac{1}{N}\sum^{N}_{i=1}{x_i},计算batch的均值 μ←N1∑i=1Nxi,计算batch的均值
- δ 2 ← 1 N ∑ i = 1 N ( x i − μ ) 2 ,计算 b a t c h 的方差 \delta^2 \gets \frac{1}{N}\sum^{N}_{i=1}{(x_i-\mu)^2},计算batch的方差 δ2←N1∑i=1N(xi−μ)2,计算batch的方差
- x ^ i ← x i − μ δ 2 + ϵ ,规范化 \hat{x}_i \gets \frac{x_i - \mu}{\sqrt{\delta^2 + \epsilon}},规范化 x^i←δ2+ϵxi−μ,规范化
- y i ← γ ⋅ x ^ i + β ,缩放和平移 y_i \gets \gamma \cdot \hat{x}_i + \beta,缩放和平移 yi←γ⋅x^i+β,缩放和平移
- r e t u r n 学到的 γ 和 β return \ \ 学到的 \gamma 和 \beta return 学到的γ和β
作用
- 前向时约束输入空间:
- 1.突出重点区域的响应,提高泛化性。
- 2.好调参。
- 反向时防止梯度问题:
- 1.(把小的放大,把大的放小)快速收敛。
python实现
Summary
- “ conv -> bn -> relu ” 套件目前早已成为了CNN标配module。
- BN因为在前馈的时候缩小了输入空间,而前馈时的输入空间又直接影响了反馈计算时的梯度状况。所以说,BN其实帮助减缓了梯度问题。
- 假设输入是shape为 [N, H, W, C] 的tensor,则bn是沿着C维,对各channel的 [N, H, W] 分别求出一个mean和variance。所以最终输出的mean和variance的shape都是 [C, ] 。
[1] Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
[2] Understanding Batch Normalization
[3] Batch Normalization导读
[4] 深度学习中 Batch Normalization为什么效果好?
[5] 深度学习: gradient diffusion (梯度弥散)