Batch Normalization

2020-01-15 10:34:03 浏览数 (1)

Batch Normalization(批量归一化)是深度学习中经常用到的

我们知道Sigmoid函数在定义域为$(-infty,-4) cup (4,infty)$内导数趋于0,由于容易出现梯度消失的现象,因此ReLU函数使用的较多

但在某些场合不可避免的要去使用Sigmoid函数,因此我们希望能把输入的$x$值控制在有效的区间内,进行一个等效变化,使这些值均匀的分布在0附近,这样输入到Sigmoid函数后就能大概率避免梯度消失

如下面左侧的图所示,$x_1$的值处于一个比较小的区间$x_2$的值处于一个比较大的区间,因此对于$w_2$来说,少量的变化就会对Loss产生急剧的变化,而对$w_1$来说,变化就会相对小一点,可以看下面的“等高线”图,沿着纵轴方向变化的话,等高线会急剧的变化,沿着横轴方向变化,等高线的变化就稍平缓一点

但如果如右图所示,输入的值区间都很接近,这样$w_1$和$w_2$对Loss的影响就比较接近,就会形成一种“圆形”路径,在这种情况进行搜索的时候,不管从哪个点出发,梯度的方向都是指向全局最小解的方向,这种搜索过程会比较快一些,而且更稳定

Batch Normalization较多的应用于两个方面

  • Image Normalization,例如对RGB三通道进行Normalization,将数据进行统一缩放
代码语言:javascript复制
normalize = transforms.Normalize(mean=ean[0.485, 0.456, 0.406],
                                 std=[0.229, 0.224, 0.225])

mean有三个值,分别对应RGB三个通道的均值,具体的Normalize过程就是

$$ begin{align*} x_R&= frac{x_R-0.485}{0.229} \ x_G&= frac{x_G-0.456}{0.224} \ x_B&= frac{x_B-0.406}{0.225} \ end{align*} $$

  • Batch Normalization Batch Normalization现在有四种用法

假设一张图片有3个channel,长28,宽28,假设一个batch有6张图片,那么一个Batch的数据就是[6, 3, 28, 28],这里我们把28和28合并起来,就变成一个三维的矩阵[6, 3, 784]

在最左侧图中,它是对6和784进行normalize,因为有3个channel,所以[6, 3, 784]就变成了[3],而3个位置上的值,分别表示channel0的均值,channel1的均值,channel2的均值

同理,后面的Layer Norm就由[6, 3, 784]变成了[6]

0 人点赞