【大模型】激活函数之SwiGLU详解

SWiGLU是大模型常用的激活函数,是2020年谷歌提出的激活函数,它结合了Swish和GLU两者的特点。SwiGLU激活函数因其在多个方面的优势而被广泛应用于大型语言模型中。

1. Swish

基本定义

Swish是由Google Brain提出的一种激活函数,它的数学表达式如下:
在这里插入图片描述

其中 σ ( x ) \sigma(x) σ(x) 是sigmoid函数,β是一个可学习的参数。

  • 当β趋近于0时,Swish函数趋近于线性函数 y = x 2 y = x^2 y=x2
  • 当β取值为1时,Swish函数是光滑且非单调的,等价于SiLU激活函数
  • 当β趋近于无穷大时,Swish函数趋近于ReLU函数。

Swish函数的图如下所示:
在这里插入图片描述

Swish的名称可能来源于其形状与鱼的尾巴相似,给人一种平滑、流畅的联想,这与"swish"这个词的含义相吻合。

补充:SiLU(Sigmoid Linear Unit)激活函数表达式如下:
在这里插入图片描述
SiLU具备无上界有下界、平滑、非单调的特性。SiLU在深层模型上的效果优于 ReLU。可以看做是平滑的ReLU激活函数。

主要特点

Swish函数的特点包括:

  • 非线性:Swish引入了非线性,使得神经网络能够学习和模拟复杂的函数。
  • 平滑性:Swish函数在整个定义域内都是光滑且连续的,这有助于在优化过程中计算梯度。
  • 自适应性:Swish函数的输出取决于输入值,这使得它能够自适应地调整激活函数的形状。

Swish函数在一些实验中表现出了比ReLU更好的性能,尤其是在一些深度神经网络中。Swish函数既有 ReLU(Rectified Linear Unit)激活函数的一些优点(例如,能够缓解梯度消失问题),又能解决 ReLU 函数的一些缺点(例如,ReLU 函数不是零中心的,且在负数部分的梯度为零)。此外,Swish 函数还是平滑函数,这意味着它在整个定义域内都有导数,这有利于优化。然而,Swish函数的计算复杂度较高,因为它涉及到sigmoid函数的计算。因此,在实际应用中,需要根据具体的任务和模型结构来选择合适的激活函数。

代码实现

Swish函数的代码实现如下:

import numpy 
### Transformer模型中使用的激活函数详解 #### 背景介绍 Transformer架构自2017年被提出以来,已经成为自然语言处理(NLP)领域的核心技术之一[^2]。随着研究的深入,不同的变体和改进版本逐渐涌现,其中激活函数的选择对于提升模型性能起到了重要作用。 #### 原始Transformer中的激活函数 原始的Transformer模型在其前馈神经网络(Feed-Forward Network, FNN)部分采用了ReLU作为默认的激活函数[^2]。ReLU定义如下: ```python def relu(x): return max(0, x) ``` 尽管ReLU具有计算简单、梯度不会消失的优点,但在某些场景下可能会导致死区问题(即一些神经元永远不被激活),从而影响训练过程。 #### SwiGLU——现代大模型常用的激活函数 近年来,为了进一步优化Transformer的表现力,研究人员提出了多种新的激活函数。其中,SwiGLU作为一种高效的门控线性单元(Gated Linear Unit, GLU)变种,在许多最新的大型语言模型中得到了广泛应用[^1]。 SwiGLU的具体表达形式可以写成: \[ \text{Swish}(x) = x \cdot \sigma(\beta x), \quad \text{GLU}(x) = (A \odot \sigma(B)), \] 综合两者特性后形成的新结构为: \[ \text{SwiGLU}(x) = (\text{SiLU}(W_1x+b_1))\odot(W_2x+b_2). \] 这种设计通过引入额外参数增强了模型灵活性的同时保持较低复杂度,使得它成为诸如LLaMA、PALM、Qwen(通义千问)、Baichuan(百川)等诸多先进模型的标准配置[^1]。 #### 总结 综上所述,虽然最初的Transformer依赖于相对简单的ReLU来实现非线性变换;但是随着时间推移和技术进步,更复杂的激活方案比如SwiGLU已经被证明能够带来显著增益,并广泛应用于当前主流的大规模预训练模型之中。 ```python import torch import torch.nn as nn class SwiGLU(nn.Module): def __init__(self, dim_in, dim_out): super(SwiGLU, self).__init__() self.linear1 = nn.Linear(dim_in, dim_out * 2) self.linear2 = nn.Linear(dim_out * 2, dim_out) def forward(self, x): x = self.linear1(x) x, gate = x.chunk(2, dim=-1) x = x * torch.sigmoid(gate) x = self.linear2(x) return x ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值