GLU 函数

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

GLU 其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个 Sigmoid 函数用来控制信息能够通过多少。它结合了线性单元和门控机制,能够有效地学习输入数据的不同特征

数学定义

GLU 函数的数学表达式为:

其中 ⊗ 表示逐元素乘法, 是输入, 是权重矩阵, 是偏置项

关键性质

  1. 门控机制:GLU 引入了门控机制,通过 Sigmoid 函数控制输入的线性变换,从而使得神经网络能够学习输入数据的不同特征(选择性地通过信息),从而提高模型的表达能力
  2. 非线性:GLU 结合了线性变换和非线性激活,使得模型能够学习复杂的模式
  3. 信息过滤:通过门控机制,GLU 能够过滤掉不重要的信息,从而增强模型的表现
  4. 自适应性:GLU 函数的输出取决于输入值,这使得它能够自适应地调整激活函数的形状

提出时间

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

解决的问题

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

示例

以下是一个简单的 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))

Swish 函数

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

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

数学定义

Swish 函数的数学表达式为:

其中:

  • 是输入
  • 是 Sigmoid 函数,定义为
  • 是一个可学习的参数,控制函数的形状

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

关键性质

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

Swish 函数在一些实验中表现出了比 ReLU 更好的性能,尤其是在一些深度神经网络中。然而,Swish 函数的计算复杂度较高,因为它涉及到 Sigmoid 函数的计算。因此,在实际应用中,需要根据具体的任务和模型结构来选择合适的激活函数

提出时间

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

解决的问题

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

示例

以下是一个简单的 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))

SwiGLU 函数

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

数学定义

SwiGLU 函数的数学表达式为:

其中:

  • 是输入张量
  • 是 Swish 激活函数
  • 是 Sigmoid 激活函数
  • 表示逐元素乘法(Hadamard 乘积)

关键性质

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

提出时间

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

解决的问题

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

应用

由于这些优势,SwiGLU 在大型语言模型如 LLAMA、OLMO 和 PALM 中得到了应用。它通过结合 Swish 的平滑性和 GLU 的门控机制,提供了一种有效的激活函数,以支持复杂和高效的深度学习模型训练

在大型语言模型中,SwiGLU 作为激活函数的使用已经成为了一种趋势

示例

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

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))