在经过前面3节关于 Transformer 论文的解读之后,相信你对提出 Transformer 架构的这篇论文有了一定的了解了,你可以点击下面的链接复习一下前3节的内容。
《Attention is all you need》通俗解读,彻底理解版:part1
《Attention is all you need》通俗解读,彻底理解版:part2
《Attention is all you need》通俗解读,彻底理解版:注意力机制的运算
总的来说,这篇论文虽然重要且经典,但很多关于Transformer 架构的技术细节并没有介绍的很清楚,因此读起来有些晦涩。
之前的几节文章在通读这篇论文时,采用的是原文+注解的方式来进行的。这么做的目的也很简单:帮助你了解这篇论文中每一部分的写作意图是什么。
至于论文中没有详细阐述的技术细节内容,本专栏后续会继续完善。本节开始解读一下论文的3.3节,主要是 FFN 层。
3.3 节:Position-wise Feed-Forward Networks (FFN)
In addition to attention sub-layers, each of the layers in our encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between. FFN(x) = max(0, xW1 + b1)W2 + b2 While the linear transformations are the same across different positions, they use different parameters from layer to layer. Another way of describing this is as two convolutions with kernel size 1. The dimensionality of input and output is dmodel = 512, and the inner-layer has dimensionality df f = 2048.
关于 FFN 层,作者就在第 3.3节写了上面一段话(真的非常简单😓)。
每次看到这,都会触发我感慨一下:我之前也发表过英文论文,在自己发布的论文中,尤其是自己原创的内容时,恨不得将每一处细节都介绍清楚,恨不得把文章写的篇幅超长,以此来体现我的文章的专业和创新性(😅)。
作者这种一笔带过的写法真的让人不太习惯。不过后来和其他人聊这个话题,有些人说可能是限于发表期刊的篇幅要求,导致很多细节不能写的过多(😝)。
作者在这一段就介绍了 FFN 层的基本结构,并且默认读者对于其中的算法是非常了解的。
在注意力层后面,无论是encoder结构还是decoder结构中,都设计了一个全连接前馈网络层( fully connected feed-forward network),也就是 FFN 层(如下红框所示)。
FFN 层实际上就是一个线性变换层,用来完成输入数据到输出数据的维度变换(细节这里不介绍,相关链接暂时留白)。
这个FFN层是一个顺序结构:包括一个全连接层(FC) + relu激活层 + 第二个全连接层,其公式可以表示为:FFN(x) = max(0, xW1 + b1)W2 + b2。
上式中,xW1 + b1 为第一个全连接层的计算公式,max(0, xW1 + b1) 为 relu 的计算公式,max(0, xW1 + b1)W2 + b2 则为第二个全连接层的计算公式。
随后作者提到,添加这个 FFN 层的作用,主要是通过第一个FC层将输入词向量的512维变换到2048维,随后通过第二个FC层再将2048维变换回512维,从而保证 FFN 的输入输出维度一致。
FFN 层的结构展开可以表示如下:
为什么要加 FFN?
你可能会有疑惑?既然 FFN 的输入和输出的维度都一样,那为什么还要加这个结构呢?
首先从 FFN 中添加的 Relu 激活函数看起。如果你学过《AI视觉入门专栏》的话,肯定对Relu 这一类的激活函数非常熟悉。
Relu 激活函数的重要作用是为模型施加非线性因素,从而可以使模型拟合出更加复杂的关系。
关于线性和非线性的内容,可以参考这里 和 这里。
因为 FFN 层由两个线性变换层(FC)和一个非线性激活函数(ReLU)组成,通过在两个 FC 中间添加非线性变换(这是非常常见的操作),可以增加模型的表达能力,使模型能够捕捉到复杂的特征和模式。
怎么理解“使模型能够捕捉到复杂的特征和模式”呢?这就得看 Relu 前后的两个的 FC 层了:FC层线性变换的主要作用可以理解为数据的升维和降维,这一点通过 FC 的算法就可以看出来。
设想一下,原始输入的特征维度为512维,也就是 FFN 之前的注意力层提取了单词(token)的512维特征。
但很多时候512维不够用,我们希望模型可以提取出更多维度的特征,于是,通过 FFN 两个相邻 FC 层的运算,可以将 512 维扩展到2048维( FFN 的隐层),随后再降维到512维作为 FFN 的输出。
这种维度的一升一降,带来了两个变化:
-
增加了两个可学习的权值矩阵,也就是上面表达公式中的两个 W 矩阵。通过和权值矩阵的相乘将输入 512 维度向量映射到隐层的 2048 维度空间中,使得输入数据可以完成更加丰富的特征表达和运算。
-
虽然FFN的输入输出维度都是512,但是输出的512维度特征和输入的512为特征是不一样的。输出的512维度特征是在隐层空间(2048)的基础上进一步融合得到的。可以说,输出的512维比输入的512维具有更加丰富和准确的特征表示。
如果把 FFN 中的隐层 2048维看做 2048 个极具智慧的头脑,那么经过这 2048 个极具智慧的大脑的头脑风暴后,将输入512维特征进行了再加工,那么很明显输出就更具有代表性了。
所以,总结一下 FFN 的作用:
-
增强特征提取能力:这主要就是 FC 的线性变换到 2048 的高维空间带来的好处。
-
提高计算效率:这一点是 FC 算法决定的。FC 层的计算是可以并行的,这就使 FFN 层可以在GPU上高效地并行计算。相对于传统的循环神经网络(RNN)中由于时间步长的依赖导致无法并行的情况,基于 Transformer 结构的计算便可以大幅完成并行优化,从而极大提高模型的训练和推理效率。
-
防止模型退化:这一点主要是在 FFN 中引入了 Relu 这种非线性激活函数带来的。如果没有 FFN 层的存在, Transformer 模型可能会退化为简单的线性变换模型,从而失去捕捉复杂特征的能力。FFN 层通过引入非线性变换,保证了模型能够保持其表达能力,有效捕捉到输入数据中的复杂特征。
我的技术专栏已经有几百位朋友加入了。如果你也希望了解AI技术,学习AI视觉或者大语言模型,戳下面的链接加入吧,这可能是你学习路上非常重要的一次点击呀
CV视觉入门第三版(细化版)完成
我的Transformer专栏努力更新中
最后,送一句话给大家:生活不止眼前,还有诗和远方,共勉~