-
1 介绍一下 FFN 块 计算公式?
💡FFN(Feed-Forward Network)块是Transformer模型中的一个重要组成部分,用于对输入数据进行非线性变换。它由两个全连接层(即前馈神经网络)和一个激活函数组成。下面是FFN块的计算公式:
假设输入是一个向量 x,FFN块的计算过程如下:
- 第一层全连接层(线性变换): z = xW1 + b1 其中,W1 是第一层全连接层的权重矩阵,b1 是偏置向量。
- 激活函数: a = g(z) 其中,g() 是激活函数,常用的激活函数有ReLU(Rectified Linear Unit)等。
- 第二层全连接层(线性变换): y = aW2 + b2 其中,W2 是第二层全连接层的权重矩阵,b2 是偏置向量。
在Transformer模型中,FFN块通常被应用在每个Transformer编码层的每个位置上,用于对位置编码的向量进行非线性变换。这样可以增加模型的表达能力,提高对输入数据的建模能力。
需要注意的是,上述公式中的 W1、b1、W2、b2 是FFN块的可学习参数,它们会通过训练过程进行学习和更新。
-
2 介绍一下 GeLU 计算公式?
💡GeLU(Gaussian Error Linear Unit)是一种激活函数,常用于神经网络中的非线性变换。它在Transformer模型中广泛应用于FFN(Feed-Forward Network)块。下面是GeLU的计算公式:
假设输入是一个标量 x,GeLU的计算公式如下:
GeLU(x) = 0.5 * x * (1 + tanh(sqrt(2 / pi) * (x + 0.044715 * x^3)))
其中,tanh() 是双曲正切函数,sqrt() 是平方根函数,pi 是圆周率。
GeLU函数的特点是在接近零的区域表现得类似于线性函数,而在远离零的区域则表现出非线性的特性。相比于其他常用的激活函数(如ReLU),GeLU函数在某些情况下能够提供更好的性能和更快的收敛速度。
需要注意的是,GeLU函数的计算复杂度较高,可能会增加模型的计算开销。因此,在实际应用中,也可以根据具体情况选择其他的激活函数来代替GeLU函数。
-
3 介绍一下 Swish 计算公式?
💡Swish是一种激活函数,它在深度学习中常用于神经网络的非线性变换。Swish函数的计算公式如下:
Swish(x) = x * sigmoid(beta * x)
其中,sigmoid() 是Sigmoid函数,x 是输入,beta 是一个可调节的超参数。
Swish函数的特点是在接近零的区域表现得类似于线性函数,而在远离零的区域则表现出非线性的特性。相比于其他常用的激活函数(如ReLU、tanh等),Swish函数在某些情况下能够提供更好的性能和更快的收敛速度。
Swish函数的设计灵感来自于自动搜索算法,它通过引入一个可调节的超参数来增加非线性程度。当beta为0时,Swish函数退化为线性函数;当beta趋近于无穷大时,Swish函数趋近于ReLU函数。
需要注意的是,Swish函数相对于其他激活函数来说计算开销较大,因为它需要进行Sigmoid运算。因此,在实际应用中,也可以根据具体情况选择其他的激活函数来代替Swish函数。
-
4 介绍一下 使用 GLU 线性门控单元的 FFN 块 计算公式?
💡使用GLU(Gated Linear Unit)线性门控单元的FFN(Feed-Forward Network)块是Transformer模型中常用的结构之一。它通过引入门控机制来增强模型的非线性能力。下面是使用GLU线性门控单元的FFN块的计算公式:
假设输入是一个向量 x,GLU线性门控单元的计算公式如下:
GLU(x) = x * sigmoid(W_1 * x) (1)
其中,sigmoid() 是Sigmoid函数,W_1 是一个可学习的权重矩阵。
在公式(1)中,首先将输入向量 x 通过一个全连接层(线性变换)得到一个与 x 维度相同的向量,然后将该向量通过Sigmoid函数进行激活。这个Sigmoid函数的输出称为门控向量,用来控制输入向量 x 的元素是否被激活。最后,将门控向量与输入向量 x 逐元素相乘,得到最终的输出向量。
GLU线性门控单元的特点是能够对输入向量进行选择性地激活,从而增强模型的表达能力。它在Transformer模型的编码器和解码器中广泛应用,用于对输入向量进行非线性变换和特征提取。
需要注意的是,GLU线性门控单元的计算复杂度较高,可能会增加模型的计算开销。因此,在实际应用中,也可以根据具体情况选择其他的非线性变换方式来代替GLU线性门控单元。
-
5 介绍一下 使用 GeLU 的 GLU 块 计算公式?
💡 **介绍一下 使用 GeLU 作为激活函数的 GLU 块 计算公式?**使用GeLU作为激活函数的GLU块的计算公式如下:
GLU(x) = x * GeLU(W_1 * x) (1)
其中,GeLU() 是Gaussian Error Linear Unit的激活函数,W_1 是一个可学习的权重矩阵。
在公式(1)中,首先将输入向量 x 通过一个全连接层(线性变换)得到一个与 x 维度相同的向量,然后将该向量作为输入传递给GeLU激活函数进行非线性变换。最后,将GeLU激活函数的输出与输入向量 x 逐元素相乘,得到最终的输出向量。
GeLU激活函数的计算公式如下:
GeLU(x) = 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3))) (2)
其中,tanh() 是双曲正切函数,sqrt() 是平方根函数,pi 是圆周率。
在公式(2)中,GeLU函数首先对输入向量 x 进行一个非线性变换,然后通过一系列的数学运算得到最终的输出值。
使用GeLU作为GLU块的激活函数可以增强模型的非线性能力,并在某些情况下提供更好的性能和更快的收敛速度。这种结构常用于Transformer模型中的编码器和解码器,用于对输入向量进行非线性变换和特征提取。
需要注意的是,GLU块和GeLU激活函数是两个不同的概念,它们在计算公式和应用场景上有所区别。在实际应用中,可以根据具体情况选择合适的激活函数来代替GeLU或GLU。
-
6 介绍一下 使用 Swish 的 GLU 块 计算公式?
💡 **介绍一下 使用 Swish 作为激活函数的 GLU 块 计算公式?**使用Swish作为激活函数的GLU块的计算公式如下:
GLU(x) = x * sigmoid(W_1 * x) (1)
其中,sigmoid() 是Sigmoid函数,W_1 是一个可学习的权重矩阵。
在公式(1)中,首先将输入向量 x 通过一个全连接层(线性变换)得到一个与 x 维度相同的向量,然后将该向量通过Sigmoid函数进行激活。这个Sigmoid函数的输出称为门控向量,用来控制输入向量 x 的元素是否被激活。最后,将门控向量与输入向量 x 逐元素相乘,得到最终的输出向量。
Swish激活函数的计算公式如下:
Swish(x) = x * sigmoid(beta * x) (2)
其中,sigmoid() 是Sigmoid函数,beta 是一个可学习的参数。
在公式(2)中,Swish函数首先对输入向量 x 进行一个非线性变换,然后通过Sigmoid函数进行激活,并将该激活结果与输入向量 x 逐元素相乘,得到最终的输出值。
使用Swish作为GLU块的激活函数可以增强模型的非线性能力,并在某些情况下提供更好的性能和更快的收敛速度。GLU块常用于Transformer模型中的编码器和解码器,用于对输入向量进行非线性变换和特征提取。
需要注意的是,GLU块和Swish激活函数是两个不同的概念,它们在计算公式和应用场景上有所区别。在实际应用中,可以根据具体情况选择合适的激活函数来代替Swish或GLU。
-
各LLMs 都使用哪种激活函数?