【深度学习】Layer Normalization原理及其代码实现

简介

Layer Normalization 是一种用于归一化神经网络内部激活的技术,旨在提高训练稳定性和速度。与 Batch Normalization 不同,Layer Normalization 对每个样本的特征维度进行归一化,而不是对整个 mini-batch 进行归一化。它特别适用于处理序列数据,如自然语言处理中的模型。

原理

Layer Normalization 的目标是对每个样本的特征维度进行归一化,确保每个特征的均值为零,方差为一。这是通过以下步骤实现的:

  1. 计算均值和方差
    对每个样本在特征维度上计算均值和方差。

    mean i , s = 1 L ∑ l = 1 L x i , s , l \text{mean}_{i, s} = \frac{1}{L} \sum_{l=1}^{L} x_{i, s, l} meani,s=L1l=1Lxi,s,l

    variance i , s = 1 L ∑ l = 1 L ( x i , s , l − mean i , s ) 2 \text{variance}_{i, s} = \frac{1}{L} \sum_{l=1}^{L} (x_{i, s, l} - \text{mean}_{i, s})^2 variancei,s=L1l=1L(xi,s,lmeani,s)2

  2. 归一化
    使用计算出的均值和方差对每个特征进行归一化。

    x ^ i , s , l = x i , s , l − mean i , s variance i , s + ϵ \hat{x}_{i, s, l} = \frac{x_{i, s, l} - \text{mean}_{i, s}}{\sqrt{\text{variance}_{i, s} + \epsilon}} x^i,s,l=variancei,s+ϵ xi,s,lmeani,s

  3. 缩放和平移
    使用可学习的参数 γ \gamma γ β \beta β 对归一化后的数据进行缩放和平移。

    y i , s , l = γ s ⋅ x ^ i , s , l + β s y_{i, s, l} = \gamma_s \cdot \hat{x}_{i, s, l} + \beta_s yi,s,l=γsx^i,s,l+βs

公式

Layer Normalization 的公式如下:

x ^ i , s , l = x i , s , l − mean i , s variance i , s + ϵ \hat{x}_{i, s, l} = \frac{x_{i, s, l} - \text{mean}_{i, s}}{\sqrt{\text{variance}_{i, s} + \epsilon}} x^i,s,l=variancei,s+ϵ xi,s,lmeani,s

y i , s , l = γ s ⋅ x ^ i , s , l + β s y_{i, s, l} = \gamma_s \cdot \hat{x}_{i, s, l} + \beta_s yi,s,l=γsx^i,s,l+βs

其中:

  • mean i , s \text{mean}_{i, s} meani,s 是每个样本在序列维度上计算的均值。
  • variance i , s \text{variance}_{i, s} variancei,s 是每个样本在序列维度上计算的方差。
  • ϵ \epsilon ϵ 是一个小常数,用于避免除零错误。
  • γ s \gamma_s γs β s \beta_s βs 是可学习的参数,用于缩放和平移归一化后的值。

实现

Layer Normalization 类实现:

import numpy as np

class LayerNorm3D:
    def __init__(self, num_features, epsilon=1e-5):
        self.num_features = num_features
        self.epsilon = epsilon
        self.gamma = np.ones((1, num_features))
        self.beta = np.zeros((1, num_features))
        
    def forward(self, x):
        # 计算每个样本每个序列的均值和方差
        mean = np.mean(x, axis=2, keepdims=True)
        variance = np.var(x, axis=2, keepdims=True)
        
        # 归一化输入
        x_normalized = (x - mean) / np.sqrt(variance + self.epsilon)
        
        # 应用 gamma 和 beta
        out = self.gamma * x_normalized + self.beta
        return out

参数量

对于输入张量形状为 ([N, S, L]) 的 3D 张量:

  • 缩放参数 γ \gamma γ偏移参数 β \beta β 的数量都是 2 × L 2 \times L 2×L,其中 L L L 是特征维度长度。

例如,对于特征维度 L = 6 L = 6 L=6,参数量是:

参数量 = 2 × 6 = 12 \text{参数量} = 2 \times 6 = 12 参数量=2×6=12

应用

Layer Normalization 被广泛应用于各种深度学习任务,尤其是在处理序列数据和生成任务中,如 Transformer 和 RNN 等模型中。它有助于提高训练稳定性,并加速收敛。

Code

代码已上传至:AI_With_NumPy
此项目汇集了更多AI相关的算法实现,供大家学习参考使用,欢迎点赞收藏👏🏻

备注

个人水平有限,有问题随时交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值