Normalizing activations in a network
在机器学习中很多算法都是通过添加变量来获取某种“灵活性”或者更广阔的"适应范围",并且使得有机会通过"学习"来获得最合适的参数。
例如在"Normalizing activations in a network"中提到的,我们先把z(i)进行normalizing,这时z(i)norm就会变为相对狭小的一个范围内的数值,但是实际情况可能确实是一个比较大的范围,那么怎么办呢?通过加权重变量可以让它重新拥有变化范围,这跟原先的z是不同的,原先的z过来后就不变了,它可能是个很大的值,也可能是很小的值,但是对于加了权重变量的z(i)norm而言,它是变化的,是可以学习的。
batch norm
- 如上图最右侧的坐标图,当normalizing之后,znorm会被限制在一个较小的范围内,这导致了sigmoid退化成了接近线性函数。
- 为避免上述情况,则需要加γ和β,γ和β使得z<~</up>可以拥有更宽阔的范围,而且γ和β是通过training而调整的。
Fitting Batch Norm into a neural network
针对一个完整的神经网络,batch norm如下运用
adding batch norm to a network
- 可以看出在所有神经元的计算过程中,在z[l] 和 a[l]之间进行了batch norm计算
- 最终梯度下降的过程中,同样也会计算dβ和dγ,(可以简单地认为又加了一层神经网络,但是计算方式不同)
- 实际项目中可以通过框架的函数来实现batch norm,如图中所示运用了TensorFlow的库函数可以直接一行代码实现batch norm
working with mini-batches
- 当我们使用mini-batches的时候,均值𝜇和𝜎是当前batch的𝜎和𝜇,所以每个batch可能不一样
- 另外,由于计算均值𝜇的时候,常数项会相减,所以常数项b可以忽略掉
综合起来,如下图所示:
implementing gradient decent
- 在梯度下降的过程中,我们仍然可以运用momentum或者adam算法来加速梯度下降
Why does Batch Norm work
首先Andrew讲了一个概念叫"Covariate shift", 即当训练集变化的时候,通常我们都需要重新训练我们的模型,如下图所示
covariate shift
而在深度学习的过程中,每个隐层对于下一层来说就相当于输入层,而这个隐层的输出却会不断改变,如下图所示:
hidden layer changes
- 由于w, b的不断变化,导致hidden layer的a也不断变化,这就产生了"covariate shift"问题,所以模型训练就不稳定。
- 而batch-norm将a输出变为相对稳定的范围,从而导致给下一层的输出变得稳定,这样就可以解决"covariate shift"问题
- batch-norm相当于给每一层进行了解耦合,使得每层的训练不会相互影响
另外,Andrew还提到了batch-nom还有轻微的正则化效果。
Batch Norm at test time
batch norm at test time
通过在batch-mini的计算过程中同时计算𝜇和𝜎的指数加权平均值,可以得到一个𝜇和𝜎的平均数,然后用这个平均数作为test时的𝜇和𝜎即可










网友评论