【大模型】RMS Normalization原理及实现

news2024/11/29 7:52:12

1.RMS Normalization的原理

        说RMS Normalization之前,先讲Layer Normalization 和 Batch Normalization。

         BN和LN是两种常见的归一化方法。它们的目的是帮助模型训练更稳定、收敛更快。BN是在Batch维度上进行归一化,即对同一batch中每个特征维度的值进行归一化。LN则是在层的维度上进行归一化,即对每一个样本的特征进行归一化。

        RMS Normalization属于LN。

        再来说RMS Normalization和Layer Normalization。

        Layer Normalization:利用均值方差对特征进行归一化。

        RMS Normalization:利用均方根对特征进行归一化。

        LLaMA架构中采用RMS Normalization的原因是通过只计算均方根,从而减少计算量,同时在实验中也确实获得了更加稳定的训练。

        在这里插入一点NLP任务中,对于将特征进行“归一化”目的的一些个人小理解:在NLP中,使用Layer Normalization进行归一化是为了使输入特征在每一层的神经元中保持稳定的分布,避免特征值之间出现过大的波动。通过归一化,Layer Normalization 将特征重新调整为均值为 0、方差为 1 的分布,从而让模型的训练更加稳定和高效,使得数据变得更加“平滑”。这里的“平滑”是指数值的尺度更一致、更稳定,不会有特别大的数值差异,能够防止特征值在网络层中传递时变得过大或过小。这种一致性有助于缓解模型训练中的一些问题,如梯度爆炸梯度消失,并能让模型更容易优化。在使用RMS Normalization进行归一化则是直接使特征本身的数值变得更加“平滑”。

2.RMS Normalization公式

2.RMS Normalization的实现

        该函数在神经网络中需要对输入的数据进行处理,再输出相应的处理好的数据,对应的实现方式就用层来实现

        因为RMS Normalization属于LN,所以,x-->[batch_size, hidden_states]

import torch


class RMSNorm(torch.nn.Module):  # nn.Module是所有层的父类,层元素就必须继承nn.Module
    def __init__(self, dim, eps):  # 用于储存层的元素
        super().__init__()
        self.weight = torch.nn.Parameter(torch.ones(dim))  # 初始化权重参数
        self.eps = eps  # 防止根号下为0

    def _norm(self, x):  # 定义类函数里的方法("_"表示只在该类的内部调用)
        return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)
        # x.pow(2):求平方
        # x.pow(2).mean(-1, keepdim=True):所有的平方求一个均值
        # x.pow(2).mean(-1, keepdim=True) + self.eps:加上一个防止根号下为0的元素
        # torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps):开平方再求导
        # rsqrt(x) = 1 / sqrt(x)
        # x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps):最后用求得的导数乘以x

    def forward(self, x):  # 数据流
        output = self._norm(x.float().type_as(x))  # 将x变成浮点数进行归一化,并保持x原始的数据类型
        return output * self.weight  # 将归一化后的输出乘以可学习的参数 weight,调整每一个维度的缩放


if __name__ == '__main__':

    batch_size = 1
    dim = 4  # 特征维度
    x = torch.Tensor([0.1, 0.1, 0.2, 0.3])
    # 初始化RMSNorm对象
    rms_norm = RMSNorm(dim=dim, eps=0)
    output = rms_norm(x)

    print("输入数据: \n", x)
    print("RMSNorm输出数据: \n", output)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统的了解及安装

一、linux系统认识 linux是指操作系统的内核,ubuntu是指基于这种内核的操作系统,Ubuntu属于Linux的一个发行版本,有简易的用户界面,完善的包管理系统,Ubuntu还对大多数硬件有着良好的兼容性,包含最新的图形…

一文区分SSTI 和 CSTI

前言 有时,SSTI(服务器端模板注入)和 CSTI(客户端模板注入)可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell,即使payload仅限于客户端。 定义 &#x1d…

10.11 QT数据库实现学生信息的增、删、改、查

.pro文件 QT core gui sql .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //数据库查寻类 #include <QSqlRecord> //记录类 #include <QMessage…

从数据到洞察:ChatGPT如何革新Python数据分析流程

导读&#xff1a;通过ChatGPT与Python的结合&#xff0c;数据分析流程得到了极大的优化和提升&#xff0c;从数据获取、清洗、代码生成到智能分析和可视化展示&#xff0c;每一步都变得更加高效和智能化。这不仅提高了分析的准确性和效率&#xff0c;还降低了技术门槛&#xff…

网络编程(18)——使用asio协程实现并发服务器

十八、day18 到目前为止&#xff0c;我们以及学习了单线程同步/异步服务器、多线程IOServicePool和多线程IOThreadPool模型&#xff0c;今天学习如何通过asio协程实现并发服务器。 并发服务器有以下几种好处&#xff1a; 协程比线程更轻量&#xff0c;创建和销毁协程的开销较…

【python】之socket编程(附带无偿源码)

本章内容 1、socket 2、IO多路复用 3、socketserver Socket socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”&#xff0c;对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现&#xff0c;socket即是一种特殊的文件&…

【路径规划】自主机器人的路径规划和导航

摘要 本文讨论了如何利用路径规划算法对自主机器人进行路径规划和导航。自主机器人在环境中的路径规划是通过参考路径与机器人的当前位置进行比对&#xff0c;采用纯追踪算法&#xff08;Pure Pursuit&#xff09;进行路径跟踪&#xff0c;以确保机器人沿预定路线行驶。本文通…

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中&#xff0c;优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示&#xff0c;到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…

双十一适合买什么?2024双十一值得入手好物推荐

即将来临的2024年双十一&#xff0c;有哪些超值宝贝会令人忍不住疯狂下单呢&#xff1f;双十一购物狂欢节&#xff0c;这个一年一度的盛大庆典&#xff0c;向来使我们这些热衷于购物的消费者们激动万分。那么&#xff0c;在今年的双十一&#xff0c;究竟有哪些商品能够成功吸引…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境&#xff08;一&#xff09; 上一章安装了飞牛FnOS系统&#xff0c;界面如下&#xff0c;这一张配置前端…

Docker安装Minio+SpringBoot上传下载文件

Docker 安装Minio docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外挂磁盘存储使用 mkdir -p…

高清实拍类型视频素材网站推荐

大家好&#xff0c;我是一名新媒体创作者&#xff0c;今天想和大家分享一些平时常用的高清实拍类型视频素材资源。作为新媒体人&#xff0c;视频素材的质量直接影响作品的受欢迎程度&#xff0c;因此找到优质的视频素材库非常重要。接下来&#xff0c;我将为大家推荐一些非常优…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12 1. Autoregressive Large Language Models are Computationally Universal D Schuurmans, H Dai, F Zanini - arXiv preprint arXiv:2410.03170, 2024 https://arxiv.org/pdf/2410.03170 自回归大型语言模型…

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

UE5安卓,多指点击时会调出控制台

参考文章&#xff1a; How to turn off "console window" on swipe (my Lemurs keep opening it!) - Platform & Builds / Mobile - Epic Developer Community Forums (unrealengine.com) 准确来说是4只手指同时在屏幕中按下。这个控制台能像编辑器那样&#xf…

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统&#xff0c;客户端和web的结合&#xff1b; 主要是使用java编写客户端代码&#xff0c;采用selenium控制浏览器&#xff0c;主要是用到selenium自动化测试的功能&#xff1b; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…

小米员工薪资一览表

小米 之前我们写了 京东 和 华为OD&#xff0c;不少同学在后台点名要看小米的职级和薪资。 没问题&#xff0c;在了解小米的薪资分布前&#xff0c;我们要先对小米职级有个初步概念。 小米职级从 13 到 22&#xff0c;共 10 级。 title 大致分为 专员&#xff08;13~15级&#…

go语言中的template使用

在 Go 语言中&#xff0c;你可以使用 text/template 或 html/template 包来创建和执行模板。以下是一个基本示例&#xff0c;展示如何使用 Go 的模板语法&#xff1a; 1. 导入包 import ("os""text/template" )2. 创建数据结构 定义一个数据结构&#x…

反向指标KDJ?只要做个简单的魔改,就能一直在新高路上!

KDJ又叫随机指标&#xff0c;是一个适用于短线的技术指标&#xff0c;在股票、期货等市场受到广泛使用。在老Q看来&#xff0c;这是一个很有趣的指标。但是如果你按照经典用法来使用的话&#xff0c;它就变成财富毁灭机了&#xff01; 下边&#xff0c;老Q就一步步从统计原理、…