ReLU
公式:ReLU(x)= max(0, x)
含义概述:取x与0的最大值
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def relu(x):
return np.maximum(0, x)
GELU
公式:GELU(x)= x * cdf(x)
含义概述:x乘以x值在正态分布中的概率值,也就是y值
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def gelu(x):
return x * norm.cdf(x)
Swish
公式:Swish(x)= x * sigmoid(x)
含义:x乘以sigmoid结果,sigmoid类似门控概念,正数趋近于1,负数趋近于0,输入为正数时逐渐趋向于线性变换,而在输入为负数时则具有非线性的抑制效果
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def swish(x, beta=1):
return x * (1 / (1 + np.exp(-beta * x)))
GLU
公式:GLU(x)= x ⊗ sigmoid(xW + b)
最终公式:GLU(x)= sigmoid(x A+ b)⊗ (xC + d)
公司计算概述:GLU其实不算是一种激活函数,而是一种神经网络层。它是一个线性变换后面接门控机制的结构。其中门控机制是一个sigmoid函数用来控制信息能够通过多少。
在实际应用中,输入x,W和b会被分为两部分,然后一部分作为激活函数的输入,另一部分直接与激活函数的结果做逐元素乘法。
为了保证整体的参数量不变,会对W,b进行一次大小缩放。
含义概述:GLU的主要作用是引入门控机制,这允许网络选择性地控制信息流过每个神经元的程度。门控机制通过sigmoid函数生成一个介于0到1之间的门控信号,这个信号决定了多少信息应该通过。这种机制有助于缓解梯度消失和爆炸的问题,并且能够增强模型的表达能力,特别是在处理长序列数据时。
GLU通过门控机制实现了自适应的非线性转换,这使得模型能够在训练过程中自动调整每个特征的重要性,从而提高模型的性能。在语言建模和其他序列预测任务中,GLU已经证明了它能够带来显著的性能提升。
SwiGLU
公式:SwiGLU(x)= Swish(xW + b)⊗ (xV + c)
含义概述:更换门控函数为Swish函数,其余和GLU相同。
class FeedForward(nn.Module):
def __init__(self, dim: int, hidden_dim: int, multiple_of: int, dropout: float):
super().__init__()
hidden_dim = multiple_of * ((2 * hidden_dim // 3 + multiple_of - 1) // multiple_of)
self.w1 = nn.Linear(dim, hidden_dim)
self.w2 = nn.Linear(hidden_dim, dim)
self.w3 = nn.Linear(dim, hidden_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.dropout(self.w2(F.silu(self.w1(x)) * self.w3(x)))