神经网络的激活函数(五)门控系列 GLU、Swish和SwiGLU

1. GLU函数

请添加图片描述

GLU(Gated Linear Unit,门控线性单元)是一种在深度学习中用于增强模型表现的激活函数。GLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力和性能。

1.1 数学定义

GLU函数的数学表达式为:

GLU ( x ) = ( X ∗ W + b ) ⊗ σ ( X ∗ V + c ) \text{GLU}(x) = (X ∗ W + b) ⊗ σ(X ∗ V + c) GLU(x)=(XW+b)σ(XV+c)
其中 ⊗ 表示逐元素乘法, X X X 是输入, W W W V V V 是权重矩阵, b b b c c c 是偏置项。

1.2 关键性质

  1. 门控机制:GLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 非线性:GLU结合了线性变换和非线性激活,使得模型能够学习复杂的模式。
  3. 信息过滤:通过门控机制,GLU能够过滤掉不重要的信息,从而增强模型的表现。

1.3 提出时间

GLU激活函数是在2017年由Yann Dauphin等人在论文《Language Modeling with Gated Convolutional Networks》中提出的。

1.4 解决的问题

  1. 信息选择性:GLU通过门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 非线性增强:GLU结合了线性变换和非线性激活,从而增强了模型的非线性特性。
  3. 提高模型性能:GLU在许多任务中表现出色,特别是在自然语言处理(NLP)和序列建模任务中。

1.5 示例

以下是一个简单的Python示例,展示如何计算GLU函数:

import numpy as np
def glu(x):
    """GLU 激活函数

    参数:
    x -- 输入数组,维度必须是偶数

    返回:
    GLU 激活后的数组
    """
    assert x.shape[-1] % 2 == 0, "输入数组的最后一个维度必须是偶数"
    half_dim = x.shape[-1] // 2
    return x[..., :half_dim] * sigmoid(x[..., half_dim:])

def sigmoid(x):
    """Sigmoid 函数

    参数:
    x -- 输入值

    返回:
    Sigmoid 函数的输出值
    """
    return 1 / (1 + np.exp(-x))

2. Swish函数

请添加图片描述

Swish激活函数是一种在深度学习中广泛应用的激活函数,由Google Brain团队提出。Swish函数通过引入一个可学习的参数,使得激活函数在训练过程中能够自适应地调整,从而提高模型的性能。

数学定义

Swish函数的数学表达式为:

Swish ( x ) = x ⋅ σ ( β x ) \text{Swish}(x) = x \cdot \sigma(\beta x) Swish(x)=xσ(βx)

其中:

  • x x x 是输入。
  • σ \sigma σ 是Sigmoid函数,定义为 σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
  • β \beta β 是一个可学习的参数,控制函数的形状。

在大多数情况下, β \beta β 被设置为1,从而简化为:

[ \text{Swish}(x) = x \cdot \sigma(x) ]

关键性质

  1. 平滑性:Swish函数是连续且平滑的,这有助于提高模型的稳定性和收敛速度。
  2. 非单调性:Swish函数是非单调的,这意味着它在某些区间内是递增的,而在其他区间内是递减的。这种特性使得Swish能够捕捉到更复杂的模式。
  3. 可学习性:通过引入可学习参数 β \beta β,Swish函数能够在训练过程中自适应地调整,从而提高模型性能。
  4. 近似ReLU:当 β \beta β趋向于无穷大时,Swish函数近似于ReLU函数;当 β \beta β趋向于0时,Swish函数近似于线性函数。

提出时间

Swish激活函数是在2017年由Google Brain团队在论文《Searching for Activation Functions》中提出的。

解决的问题

  1. 平滑激活:Swish通过引入Sigmoid函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性。
  2. 非单调性:Swish的非单调性使得它能够捕捉到更复杂的模式,比ReLU等单调激活函数更具表现力。
  3. 可学习性:Swish通过引入可学习参数 β \beta β,使得激活函数能够自适应地调整,从而提高模型性能。

示例

以下是一个简单的Python示例,展示如何计算Swish函数:

import numpy as np
def swish(x,beta=1.0):
    """Swish 激活函数

    参数:
    x -- 输入值

    返回:
    Swish 激活后的值
    """
    return x * sigmoid(beta*x)

def sigmoid(x):
    """Sigmoid 函数

    参数:
    x -- 输入值

    返回:
    Sigmoid 函数的输出值
    """
    return 1 / (1 + np.exp(-x))

3. SwiGLU函数

SwiGLU(Swish-Gated Linear Unit)是一种结合了Swish和GLU(Gated Linear Unit)特点的激活函数,旨在提高深度学习模型的性能。SwiGLU通过引入门控机制和Swish激活函数,使得模型能够更有效地选择性通过信息,从而增强模型的表达能力和性能。

3.1 数学定义

SwiGLU函数的数学表达式为:

SwiGLU ( a , b ) = Swish ( a ) ⊗ σ ( b ) \text{SwiGLU}(a, b) = \text{Swish}(a) \otimes \sigma(b) SwiGLU(a,b)=Swish(a)σ(b)

其中:

  • a a a b b b 是输入张量。
  • Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=xσ(x) 是Swish激活函数。
  • σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1 是Sigmoid激活函数。
  • ⊗ \otimes 表示逐元素乘法(Hadamard乘积)。

3.2 关键性质

  1. 门控机制:SwiGLU通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 平滑性:Swish函数的平滑性有助于提高模型的稳定性和收敛速度。
  3. 非单调性:Swish函数的非单调性使得SwiGLU能够捕捉到更复杂的模式。
  4. 信息过滤:通过门控机制,SwiGLU能够过滤掉不重要的信息,从而增强模型的表现。

3.3 提出时间

SwiGLU激活函数是在2021年由DeepMind团队在论文《Scaling Vision Transformers》中提出的。

3.4 解决的问题

  1. 信息选择性:SwiGLU通过门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力。
  2. 平滑激活:Swish通过引入Sigmoid函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性。
  3. 非单调性:Swish的非单调性使得SwiGLU能够捕捉到更复杂的模式,比ReLU等单调激活函数更具表现力。

3.5 示例

以下是一个简单的Python示例,展示如何计算SwiGLU函数:
f ( X ) = ( X ∗ W + b ) ⊗ S w i s h ( X ∗ V + c ) f(X) = (X ∗ W + b) ⊗ Swish(X ∗ V + c) f(X)=(XW+b)Swish(XV+c)

import numpy as np
def SwiGLU(x):
    """SwiGLU 激活函数

    参数:
    x -- 输入数组,维度必须是偶数

    返回:
    SwiGLU 激活后的数组
    """
    assert x.shape[-1] % 2 == 0, "输入数组的最后一个维度必须是偶数"
    half_dim = x.shape[-1] // 2
    return x[..., :half_dim] * swish(x[..., half_dim:])

def swish(x,beta=1.0):
    """Swish 激活函数

    参数:
    x -- 输入值

    返回:
    Swish 激活后的值
    """
    return x * sigmoid(beta*x)

def sigmoid(x):
    """Sigmoid 函数

    参数:
    x -- 输入值

    返回:
    Sigmoid 函数的输出值
    """
    return 1 / (1 + np.exp(-x))

总结

SwiGLU激活函数结合了Swish和GLU的优点,通过引入门控机制和平滑非单调特性,解决了ReLU等激活函数的一些固有问题。SwiGLU在许多深度学习任务中表现出色,特别是在计算机视觉和自然语言处理任务中。它通过门控机制和平滑激活,使得模型能够更快地收敛并达到更高的性能。

参考

[1] Language Modeling with Gated Convolutional Networks

[2] Searching for Activation Functions

[3] Scaling Vision Transformers

欢迎关注我的GitHub和微信公众号[真-忒修斯之船],来不及解释了,快上船!

GitHub: LLMForEverybody

仓库上有原始的Markdown文件,完全开源,欢迎大家Star和Fork!

### GLU门控函数的工作原理及其在网络中的实现 GLU(Gated Linear Unit)是一种用于神经网络激活函数,其核心思想是通过引入一个门控机制来控制输入信号的传递。这种设计可以增强模型的学习能力并改善梯度消失问题。 #### GLU 的基本定义 GLU 将输入张量分为两部分:一部分作为线性变换的结果,另一部分则被用作门控向量。具体来说,给定一个输入 \( X \),它会被分成两个相等的部分 \( A \) \( B \)[^1]。随后,计算如下: \[ Y = A \otimes \sigma(B) \] 其中: - \( A \) 是输入的一部分; - \( B \) 是用来生成门控信号的部分; - \( \sigma \) 表示 Sigmoid 函数; - \( \otimes \) 表示逐元素乘法操作。 此过程允许模型动态调整哪些特征应该保留或丢弃,从而提高表达能力灵活性[^1]。 #### 实现代码示例 以下是基于 PyTorch 的简单 GLU 实现方法: ```python import torch import torch.nn as nn class GatedLinearUnit(nn.Module): def __init__(self, input_dim, output_dim=None): super(GatedLinearUnit, self).__init__() if output_dim is None: output_dim = input_dim # 定义全连接层以处理AB self.fc = nn.Linear(input_dim, 2 * output_dim) def forward(self, x): # 前向传播过程中分割成AB a, b = torch.chunk(self.fc(x), chunks=2, dim=-1) # 应用Sigmoid到B上并与A按位相乘 return a * torch.sigmoid(b) ``` 上述代码片段展示了如何构建自定义模块 `GatedLinearUnit` 来执行标准形式下的 GLU 运算逻辑。 #### SwiGLU 变体介绍 除了传统版本外,在某些先进架构比如 LLaMA 中采用了改进型变种——Swish-Gated Linear Units (SwiGLU)[^1]。相比原始方案仅依赖于单一非线性映射器即 Sigmoid ,该新型组件结合了更强大的候选集生成路径以及更加灵活高效的开关控制器设置 。 其公式可表述为 : \[ Y_{swiglu} = f(XW_1+B_1)\odot g(XW_2+B_2), \] 这里, - \(f\)通常指代SiLU(Swish); - \(g\)代表Softmax 或其他适当选项; - 参数矩阵\( W_i , bias\_vector _{Bi}\)(for i∈ {1,2})分别对应不同子空间投影权重集合. 这一改动有助于进一步提升大型语言模型内部交互效率的同时降低过拟合风险水平 . ### 结论 综上所述,Gated Linear Units 提供了一种有效途径使得现代深度学习框架能够更好地捕捉复杂数据模式之间的关系特性;而随着研究进展不断涌现出来的各类优化变形更是极大地推动了整个领域向前发展步伐.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值