GLU 函数
GLU(Gated Linear Unit,门控线性单元)是一种在深度学习中用于增强模型表现的激活函数。GLU 通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力和性能
GLU 其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个 Sigmoid 函数用来控制信息能够通过多少。它结合了线性单元和门控机制,能够有效地学习输入数据的不同特征
数学定义
GLU 函数的数学表达式为:
其中 ⊗ 表示逐元素乘法, 是输入, 和 是权重矩阵, 和 是偏置项
关键性质
- 门控机制:GLU 引入了门控机制,通过 Sigmoid 函数控制输入的线性变换,从而使得神经网络能够学习输入数据的不同特征(选择性地通过信息),从而提高模型的表达能力
- 非线性:GLU 结合了线性变换和非线性激活,使得模型能够学习复杂的模式
- 信息过滤:通过门控机制,GLU 能够过滤掉不重要的信息,从而增强模型的表现
- 自适应性:GLU 函数的输出取决于输入值,这使得它能够自适应地调整激活函数的形状
提出时间
GLU 激活函数是在 2017 年由 Yann Dauphin 等人在论文《Language Modeling with Gated Convolutional Networks》中提出的
解决的问题
- 信息选择性:GLU 通过门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力
- 非线性增强:GLU 结合了线性变换和非线性激活,从而增强了模型的非线性特性
- 提高模型性能: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,从而简化为:
关键性质
- 平滑性:Swish 函数是连续且平滑的,这有助于提高模型的稳定性和收敛速度
- 非单调性:Swish 函数是非单调的,这意味着它在某些区间内是递增的,而在其他区间内是递减的。这种特性使得 Swish 能够捕捉到更复杂的模式
- 可学习性:通过引入可学习参数 ,Swish 函数能够在训练过程中自适应地调整,从而提高模型性能
- 近似 ReLU:当 趋向于无穷大时,Swish 函数近似于 ReLU 函数;当 趋向于 0 时,Swish 函数近似于线性函数
Swish 函数在一些实验中表现出了比 ReLU 更好的性能,尤其是在一些深度神经网络中。然而,Swish 函数的计算复杂度较高,因为它涉及到 Sigmoid 函数的计算。因此,在实际应用中,需要根据具体的任务和模型结构来选择合适的激活函数
提出时间
Swish 激活函数是在 2017 年由 Google Brain 团队在论文《Searching for Activation Functions》中提出的
解决的问题
- 平滑激活:Swish 通过引入 Sigmoid 函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性
- 非单调性:Swish 的非单调性使得它能够捕捉到更复杂的模式,比 ReLU 等单调激活函数更具表现力
- 可学习性: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 乘积)
关键性质
- 门控机制:SwiGLU 通过引入门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力,使得模型在处理长序列数据时能够更好地捕捉长距离依赖关系
- 平滑性:Swish 函数的平滑性有助于提高模型的稳定性和收敛速度
- 非单调性:Swish 函数的非单调性使得 SwiGLU 能够捕捉到更复杂的模式
- 信息过滤:通过门控机制,SwiGLU 能够过滤掉不重要的信息,从而增强模型的表现
提出时间
SwiGLU 激活函数是在 2021 年由 DeepMind 团队在论文《Scaling Vision Transformers》中提出的
解决的问题
- 信息选择性:SwiGLU 通过门控机制,使得模型能够选择性地通过信息,从而提高模型的表达能力
- 平滑激活:Swish 通过引入 Sigmoid 函数,使得激活函数在输入的正负区间内都具有平滑性,从而提高模型的稳定性
- 非单调性: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))