手撕RMSNorm和LayerNorm

import torch
import torch.nn as nn

class RMSNorm(nn.Module):
    def __init__(self, d_model, eps=1e-8):
        """
        d_model: 输入特征的维度
        eps: 防止除零的微小数值,确保数值稳定性
        """
        super().__init__()
        self.eps = eps
        # 可学习的缩放参数,初始化为1
        self.scale = nn.Parameter(torch.ones(d_model))
        # 可选:可学习的偏移参数,初始化为0
        self.bias = nn.Parameter(torch.zeros(d_model))

    def forward(self, x):
        # 计算RMS (均方根),沿着最后一个维度进行
        rms = torch.sqrt(torch.mean(x ** 2, dim=-1, keepdim=True) + self.eps)
        # 对输入进行RMS归一化
        x_norm = x / rms
        # 应用可学习的缩放参数和偏移
        return self.scale * x_norm + self.bias

# 示例
batch_size = 2
seq_len = 5
d_model = 10

# 随机生成输入张量
x = torch.randn(batch_size, seq_len, d_model)

# 创建RMSNorm层
rmsnorm = RMSNorm(d_model)

# 前向传播,输出归一化后的结果
output = rmsnorm(x)
print("输出张量:", output)

import torch
import torch.nn as nn

class LayerNorm(nn.Module):
    def __init__(self, d_model, eps=1e-5):
        """
        d_model: 输入特征的维度
        eps: 防止除零的微小数值,确保数值稳定性
        """
        super().__init__()
        # 可学习的缩放参数,初始化为1
        self.scale = nn.Parameter(torch.ones(d_model))
        # 可学习的偏移参数,初始化为0
        self.bias = nn.Parameter(torch.zeros(d_model))
        self.eps = eps  # 小数值以防止除零错误

    def forward(self, x):
        # 计算均值和标准差,沿着最后一个维度(特征维度)进行
        mean = x.mean(dim=-1, keepdim=True)
        std = x.std(dim=-1, keepdim=True)
        # 使用均值和标准差对输入进行归一化
        x_norm = (x - mean) / (std + self.eps)
        # 应用可学习的缩放参数和偏移参数
        return self.scale * x_norm + self.bias

# 示例
batch_size = 2
seq_len = 5
d_model = 10

# 随机生成输入张量
x = torch.randn(batch_size, seq_len, d_model)

# 创建 LayerNorm 层
layernorm = LayerNorm(d_model)

# 前向传播,输出归一化后的结果
output = layernorm(x)
print("输出张量:", output)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值