
Transformer模型-Feed Forward前馈网络,MLP和Relu激活函数的简明介绍:即2个线性层,中间通过Relu()连接。
位置感知Position-Wise前馈网络(FFN)由两个全连接层(fully connected dense layers,就是线性层(Linear Layer),或密集层(Dense Layer))组成,或者也可以称为多层感知机(MLP:multi-layer perceptron)。在层与层之间,使用ReLU激活函数,即max(0, X)。任何大于0的值保持不变,而任何小于或等于0的值都将变
今天介绍transformer模型的Feed Forward network前馈网络和Relu激活函数
背景
前馈网络(FFN)也叫作 多层感知器(MLP:multi-layer perceptron)。
多层感知器(Multilayer Perceptron)
多层感知器(Multilayer Perceptron):这是一种人工神经网络(ANN)的类型,是一种前向反馈神经网络,由多个神经元层组成,每个层与下一层全连接。多层感知器至少包含三层:输入层、隐藏层(可以有多个)以及输出层。其中,
- 输入层负责接收原始数据,
- 隐藏层负责对数据进行中间特征的提取,
- 输出层负责输出最终的预测结果。
多层感知器在机器学习和深度学习中具有广泛的应用,被用于分类、回归和其他各种任务。
隐藏层(Hidden Layer)
在神经网络中,隐藏层(Hidden Layer)是位于输入层和输出层之间的层。这些层并不是直接接收外部输入(如用户的输入数据)或产生最终的输出(如分类标签或预测值),而是位于网络内部,对输入数据进行处理并产生中间结果。
隐藏层中的每一个节点(或称为神经元)都接收来自前一层(通常是输入层或上一隐藏层)的输入,对这些输入进行加权求和,并应用一个激活函数来产生输出。这个输出随后会作为下一层(可能是输出层或下一隐藏层)的输入。
隐藏层的数量和每个隐藏层中的节点数量是神经网络设计的重要参数。通过增加隐藏层的数量或每个隐藏层中节点的数量,神经网络可以学习并表示更复杂的函数和关系。然而,这也可能导致过拟合问题,即神经网络在训练数据上表现良好,但在未见过的测试数据上表现不佳。
因此,在设计神经网络时,需要权衡隐藏层的数量和每个隐藏层中节点的数量,以便在训练数据上获得良好的性能,同时避免过拟合。这通常需要使用交叉验证等技术来评估和调整网络结构。
ReLU(Rectified Linear Unit,修正线性单元)
ReLU(Rectified Linear Unit)是一个在神经网络中广泛使用的激活函数(Activation Function)。它的主要特点是对于输入信号,如果输入是负数,则输出为0;如果输入是正数,则输出等于输入。用数学表达式表示,ReLU函数可以写作:
f(x) = max(0, x)
这里,x 是输入信号,f(x) 是输出信号。
ReLU 函数有几个重要的优点:
- 计算效率高:ReLU 函数非常简单,不需要进行复杂的计算,因此可以显著提高神经网络的训练速度。
- 缓解梯度消失问题:在神经网络中,反向传播算法用于计算梯度并更新权重。传统的 Sigmoid 或 Tanh 激活函数在输入值较大或较小时,梯度会接近于0,导致梯度消失问题。而 ReLU 函数在输入为正数时,梯度始终为1,有助于缓解梯度消失问题。
- 稀疏性:ReLU 函数在输入为负数时输出为0,这使得网络中的许多神经元在训练过程中处于“关闭”状态,从而提高了神经网络的稀疏性。稀疏性有助于提取数据中的关键特征,并降低过拟合的风险。
激活函数(Activation Function)
激活函数(Activation Function)是在神经网络中用于将神经元的输入映射到输出端的函数。它通常位于神经网络的神经元(节点)的末尾,用于将神经元的加权输入转换为神经元的输出。这个输出可以作为下一个神经元的输入,或者作为整个神经网络的输出。
激活函数的主要作用是引入非线性因素,使得神经网络可以学习和执行复杂的任务。没有激活函数,神经网络的每一层都仅仅是前一层的线性变换,无论网络有多少层,输出都是输入的线性组合,这样的网络无法学习和模拟复杂的非线性关系。
FFN基本实现-举例
准备:上一次的输出output = 张量(3,6,8)。这表示有3个序列,每个序列包含6个标记,每个标记有8维嵌入。
第一步:这个输出output = 张量(3,6,8)先通过FFN(前馈网络)的第一层。这将把8维嵌入转换为32维嵌入。再通过ReLU激活函数。新的张量形状将是(3, 6, 8) x (8, 32) → (3, 6, 32)。
**隐藏层,d_ffn,通常被设置为d_model值的四倍左右。
第二步:FFN第一层的输出张量(3, 6, 32)通过第二层线性层返回到其正常大小,即(3, 6, 32) x (32, 8) = (3, 6, 8)。这些值已经根据权重和激活函数发生了改变。这样就完成了FFN的全部过程。
FFN 在Transformers的实现:
跟上面2步一模一样,max()就是Relu()
总结:
Transformer里面的FFN前馈网络就是2个线性层,中间通过Relu()连接。
原文链接:https://medium.com/@hunter-j-phillips/position-wise-feed-forward-network-ffn-d4cc9e997b4c

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)