大模型学习笔记------Llama 3模型架构之RMS Norm与激活函数SwiGLU

devtools/2025/3/10 11:44:36/

大模型学习笔记------Llama 3模型架构之RMS Norm激活函数SwiGLU


    上文简单介绍了 Llama 3模型架构。在以后的文章中将逐步学习并记录Llama 3模型中的各个部分。本文将首先介绍归一化模块RMS Norm激活函数SwiGLU

1、归一化模块RMS Norm

    归一化模块是各个网络结构中必有得模块之一。Llama 3模型基于Transformer,Transformer中采用的归一化模块通常为层归一化Layer Norm(LN),如下图所示。而Llama模型采用LN的改进版RMS Norm
在这里插入图片描述

其中,N为batch size的大小,C为特征图通道数,H为特征图高,W为特征图宽。

    LN层的计算为:在这里插入图片描述
    实质上,LN是针对layer维度进行标准化,在C,H,W上进行归一化,也就是与batch无关,执行完有B个均值,B个方差。每个样本共用相同的均值和方差。

    RMS Norm是一种简化版的层归一化,它是通过均方根(Root Mean Square)计算得到归一化尺度,不需要计算均值和标准差。具体如下:
在这里插入图片描述
    与层归一化相比,RMSNorm不需要计算均值和标准差,减少了计算复杂度,提高了计算的效率,同时保持了良好的归一化效果。

SwiGLU_15">2、激活函数SwiGLU

    Llama 3采用的是SwiGLU(Swish-Gated Linear Unit)激活函数SwiGLU激活函数是一种结合Swish激活函数与GLU(Gated Linear Unit)机制的激活函数

2.1 常用激活函数

    其实,Swish激活函数与GLU激活函数都不是最常见的激活函数,在transformer结构中常用的激活函数是ReLU(Rectified Linear Unit)、GELU(Gaussian Error Linear Unit)等。在GPT3中采用的就是GELU激活函数,他们的形式如下图所示:
在这里插入图片描述
2.2 Swish激活函数

    Swish激活函数是一种平滑且连续的激活函数,在Transformer等模型中应用广泛。具体计算公式如下所示:

                                Swish(x) = x * sigmoid(βx)

其中 sigmoid(x) = 1 / (1 + exp(-x)), β 是一个可学习的参数或一个常数。
    通常 β 设置为 1,即 Swish(x) = x * sigmoid(x),此时的激活函数通常称为SiLU,有没有熟悉的感觉。当 β = 0 时,Swish 变为线性函数 x/2。 当 β 趋近于无穷大时,Swish 接近 ReLU。 因此,Swish 可以看作是 ReLU 和线性函数之间的插值。Swish与RuLU的对比如下所示:

在这里插入图片描述
2.3 GLU(Gated Linear Unit)激活函数
    GLU是一种强大的激活函数,它通过引入门控机制来动态地控制信息流。 它在许多任务中都表现出色,尤其是在需要处理复杂依赖关系的场景中。具体计算函数如下:

                        GLU(x) = (W_a * x + a) ⊗ σ(W_b * x +b)

其中,W_a, W_b 是权重矩阵; a, b 是偏置向量;σ 是 sigmoid 函数。在 GLU 中,输入特征被分成两个部分:

  • 线性部分: (W_a * x + a)
  • 门控部分:σ(W_b * x +b)

    具体表现形式如下所示:
在这里插入图片描述
2.4 SwiGLU激活函数
    SwiGLU(Swish-Gated Linear Unit)是一种结合Swish激活函数与GLU(Gated Linear Unit)机制的激活函数。具体计算如下所示:
在这里插入图片描述    SwiGLU是对输入进行两次线性变换,将其中一个结果通过Swish激活函数,将两个结果逐元素相乘,形成最终输出。
    SwiGLU在处理复杂的文本数据时表现出更好的泛化能力。由于引入了Swish激活函数,其平滑的曲线特性有助于稳定梯度,减少梯度消失和爆炸的可能性。

3、一些思考

    1、RMS Norm在模型中的作用仅仅是减少参数量提高效率这么简单吗?

    答案当然是否定的,以下是我的一些思考,仅提供参考:

  • 中心化不是必须的:LN 通过减去均值来中心化数据,使得数据分布以 0 为中心。 然而,对于某些任务,这种中心化可能并不是必需的。 神经网络可以通过后续的权重和偏置来学习合适的偏移。
  • 更关注方差/幅度:RMSNorm 本质上是对输入的幅度进行归一化。 在很多情况下,幅度信息可能比中心化信息更重要。 例如,在语音识别中,信号的能量 (幅度) 通常是重要的特征。
  • 与优化器的结合:RMSNorm 的设计理念与一些优化器 (如 Adam) 相似,它们都关注梯度的幅度。 这种一致性可能有助于提高训练的稳定性。

    2、为什么采用Swish与GLU结合,而不是使用GELU与GLU结合?

    从我的认知中,可能主要是基于以下两个方面的考虑:

  1. 效率考量:虽然从函数的表现形式上来看,Swish与GELU基本差不多。但是GELU采用的主要使用高斯函数,当然,可以使用tanh和sqrt等进行相似计算。而Swish采用Sigmoid函数。从计算角度看,Swish的计算效率更高。
  2. 实验效果:感觉当初开发Llama 3模型的时候,开发者应该考虑过GELU激活函数,但是最终选择 Swish + GLU 可能是因为在 Llama 3 的特定架构、数据集和训练设置下,这种组合取得了更好的实验结果。 深度学习模型的选择很多时候是经验性的,需要大量的实验来验证。

http://www.ppmy.cn/devtools/165991.html

相关文章

揭开AI-OPS 的神秘面纱 第三讲(上)数据平台层技术架构与组件选型分析

今天我们延续继续进行第三讲分析 数据平台层技术架构与组件选型分析 (通用性视角) 数据平台层作为 AI-Ops 架构的核心支撑层,负责接收、存储、处理和管理来自数据采集层的海量运维数据。 数据平台层的通用性至关重要,它需要能够高效、可靠地处理 Metr…

08react基础-react原理

setState()更新数据 setState()更新数据是异步的注意:使用该语法,后面的setState不要依赖前面setState的值多次调用setState,只会触发一次render import React from react import ReactDOM from react-dom class App extends React.Component…

交大智邦后端Java笔试题

交大智邦后端Java笔试题 简答题 只要一个类加上了Component注解,就一定能成为一个Spring Bean吗?如果不是,请举出反例。 不一定 扫描范围不包括 com.code.lab.web.component 或者被 ComponentScan 显式排除 通过 excludeFilters 手动排除特定…

Android Glide 配置与初始化模块源码深度剖析

一、引言 在 Android 开发中,图片加载是一个常见且重要的功能。Glide 作为一款强大的图片加载库,因其高效、灵活和易于使用的特点,被广泛应用于各种 Android 应用中。Glide 的配置与初始化模块是整个库的基础,它允许开发者根据不…

为什么要开源?

互联网各领域资料分享专区(不定期更新): Sheet 正文 开源(Open Source)是软件、硬件或知识产品将其源代码或设计公开,允许任何人自由使用、修改和分发的模式。开源的核心不仅是“免费”,更是一种协作和透明的理念。以下是开源的主要动因和优势: 一、技术驱动:提升质量…

【python爬虫】酷狗音乐爬取

本次爬取的音乐仅有1分钟试听,完整音乐需要下载客户端 一、 初步分析 登陆酷狗音乐后随机选取一首歌,在请求里发现一段mp3文件,复制网址,确实是我们需要的url。 复制音频的名字,搜索找到发起请求的网址,发…

计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量

一、引言 在科技快速发展的背景下,3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域,车辆需实时、准确感知周围环境中的目标物体,如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…

PreTrainedModel 类代码分析:_load_pretrained_model

1 _load_pretrained_model 调用流程: 1. 初始化标志和变量: 判断权重文件是否是 safetensors 格式(is_safetensors)。判断是否使用了量化器(is_quantized)。初始化状态字典的文件夹和索引(sta…