1. 前言
OpenAI的GPT系列大语言模型中的前馈神经网络模块共包含两个Linear层以及一个GELU(Gaussian Error Linear Unit)激活函数。第一个Linear层会对每个token对应的维度为 n n n的输入向量做变换,将向量的维度拓展至 4 n 4n 4n。GELU激活函数对第一个Linear层输出向量中的每个元素做变换,并将经过变换后的向量输入第二个Linear层。第二个Linear层会将各个token对应向量的维度压缩回原来的 n n n维,得到前馈神经网络模块的输出。
本文详解GELU激活函数的基本原理,介绍并实现OpenAI的GPT系列大语言模型结构中的前馈神经网络模块FeedForward
。
2. GELU激活函数
深度神经网络模型中最常用的激活函数是ReLU(Rectified Linear Unit)激活函数。激活函数ReLU是一个分段线性函数, ReLU ( x ) = max { x , 0 } \text{ReLU}(x)=\max\{x, 0\} ReLU(x)=max{ x,0}。当输入 x > 0 x\gt0 x>0时,ReLU激活函数的输出值与输入 x x x相同,且导数恒等于1。当输入 x < 0 x\lt0 x<0时,ReLU激活函数的输出值及其导数均恒等于0。
大语言模型一般不会使用ReLU作为激活函数,ReLU的导数值会在输入 x = 0 x=0 x=0时发生突变,这种不平滑特性会降低大语言模型参数的精细化调整能力。当输入 x x x的值小于0时,ReLU的导数值会恒等于0,因此使用ReLU作为激活函数会使部分模型参数在反向传播时的梯度等于0,这些参数在当次模型训练过程中不会被更新。大语言模型中常用的激活函数包括GELU和SwiGLU(Swish-Gated Linear Unit),激活函数GELU和SwiGLU的函数曲线均与ReLU非常相似。深度学习实践已经证明,当深度学习模型层数特别大或模型结构特别复杂时,使用GELU或SwiGLU激活函数能够显著增强模型效果。
OpenAI的GPT系列大语言模型中使用的激活函数是GELU激活函数。激活函数GELU是一个平滑的非线性函数,