层标准化详解(Layer Normalization)

为什么Batch Normaization难以应用于RNNs?

Batch Normalization使用mini-batch的均值和标准差对深度神经网络的隐藏层输入附加标准化操作,可有效地提升训练速度。对于前向神经网络应用Batch Norm,使用简单SGD优化器,训练速度也能有较大提升。

  • BN的效果受制于batch的大小,小batch未必能取得预期效果;

  • 对于前向神经网络可以很直接地应用BN,因为其每一层具有固定的神经元数量,可直接地存储每层网络各神经元的均值、方差统计信息以应用于模型预测,但在RNNs网络中,不同的mini-batch可能具有不同的输入序列长度(深度),计算统计信息比较困难,而且测试序列长度不能大于最大训练序列长度

  • Barch Normalization也很难应用于在线学习模型,以及小mini-batch的分布式模型


如何对RNNs网络进行标准化?

网络层的输出经过线性变换作为下层网络的输入,网络输出直接影响下层网络输入分布,这是一种协变量转移的现象。我们可以通过 固定网络层的输入分布(固定输入的均值和方差) 来降低协变量转移的影响。

BN对同一mini-batch中对不同特征进行标准化(纵向规范化:每一个特征都有自己的分布),受限于batch size,难以处理动态神经网络中的变长序列的mini-bach。

RNNs不同时间步共享权重参数,使得RNNs可以处理不同长度的序列,RNNs使用 Layer Normalization 对不同时间步进行标准化(横向标准化:每一个时间步都有自己的分布),从而可以处理单一样本、变长序列,而且 训练和测试处理方式一致

Batch Normalization和Layer Normalization的应用

  • 对于CNNs图像x=shape(batch_size, channels, height, weight),则
bn_mean=np.mean(x, axis=(0, 2, 3)), shape=(1, channels, 1, 1)
  • 对于RNNs序列x=shape(batch_size, seq_len, hidden_size), 则
ln_mean=np.mean(x, axis=2), shape=(batch_size, seq_len, 1)

对于前向神经网络的第 l l 隐藏层(等价于RNNs时刻 l l 对应的隐藏层),令 a l \boldsymbol a^l 表示输入向量(前层网络输出加权后的向量), H H 表示隐藏单元数量,则 Layer Normalization 的均值和方差统计量为
μ l = 1 H i = 1 H a i l , σ l = 1 H i = 1 H ( a i l μ l ) 2 \mu^l = \frac{1}{H}\sum_{i=1}^Ha^l_i,\quad \sigma^l=\sqrt{\frac{1}{H}\sum_{i=1}^H(a^l_i-\mu^l)^2}

同层网络的所有隐藏单元共享均值和方差。


对于标准RNN,若当前输入为 x t \boldsymbol x^t ,上一隐藏状态为 h t 1 \boldsymbol h^{t-1} ,则加权输入向量(非线性单元的输入)为
a t = W h h h t 1 + W x h x t \boldsymbol a^t=W_{hh}\boldsymbol h^{t-1}+W_{xh}\boldsymbol x^t
则对输入向量进行层标准化,再进行 缩放和平移(用于恢复非线性)得标准化后输入 y \boldsymbol y :
y = g a ^ t + b , a ^ t = a t u t σ t \boldsymbol y= \boldsymbol g\odot\hat \boldsymbol a^t+\boldsymbol b,\quad \hat \boldsymbol a^t=\frac{\boldsymbol a^t-u^t}{\sigma^t}

对于使用LN的RNNs,每个时刻加权后的输入通过标准化被重新调整在合适的范围,很大程度避免了梯度消失、梯度爆炸问题,隐藏状态的传递更加稳定。

Reference
1.Ba, Jimmy et al. “Layer Normalization.” ArXiv abs/1607.06450 (2016): n. pag.

猜你喜欢

转载自blog.csdn.net/sinat_34072381/article/details/106173365