01 Gemma模型架构和参数打算
上一篇文章《原创 | 大模型扫盲系列——初识大模型》从比较宏不雅观的角度初步先容大模型领域的干系知识,旨在带领读者构建一个大模型知识框架。近期,大模型干系的技能和运用层出不穷,各个方向的论文百花齐放,底层的核心技能是大家公认的精华部分。本文从技能的角度聚焦大模型的实战履历,总结大模型从业者关注的详细方向以及干系发展,帮助打算参与到大模型事情的人高效上手干系事情。
基座模型参数
在动手实践之初,紧张任务便是选取一款市场上表现卓越的基座模型,为各种任务打下坚实的根本。在这个领域,OpenAI的ChatGPT-4以其独特的上风领跑,一韶光,普通企业难以望其项背。因此,其他顶尖科技公司不得不探求新的道路,争相进入开源领域,竞争打造出最强效果的大型模型。随着大模型技能成为热门趋势,无论是从学术论文的频繁引用还是商业运用实践来看,业界对这些基座模型的效果已达成广泛共识。

目前,业内普遍认可且实用性最高的四个基座模型分别为:Meta的Llama系列,被誉为欧洲\公众OpenAI\"大众的Mistral AI所开源的Mistral系列,海内表现精良的Qwen系列,以及最近发布、在同等参数级别中表现最佳的开源模型——Google的Gemma系列。本文将从模型的参数、网络构造和效果等多个方面进行深入剖析,旨在供应一套适用于理解和评估任何开源模型的方法论和关注点。这里会以目前同量级效果最好的谷歌的Gemma系列作为举例来解释整体流程,详细模型见
https://huggingface.co/docs/transformers/en/model_doc/gemma
Gemma:
谷歌发布了一系列的Gemma模型(如下表格),以最常用的7B模型为例子详细阐发:
从模型卡(model card)中,能快速理解全体模型的架构以及在现有公开数据集上演习的效果,这里用大部分篇幅先容打算模型参数,节制这步打算对模型构造深入理解以及模型支配的推理优化都有非常主要的意义。
图1
参数估算
7B的意思是模型参数的数量为70亿,这个数据包含嵌入层(Embedding)的参数,模型网络构造中的权重(weight)和偏差(bias)的总和,从官方发布的报告(https://storage.googleapis.com/deepmind-media/gemma/gemma-report.pdf)来看,所有参数总和该当是85亿(Table2中嵌入层参数+非嵌入层参数),这里的7b命名可能也是考虑到与差不多量级的Llama2进行比拟。
对付Table 1的7B模型,结合图1中的config.json文件中的参数得到详细打算流程
Part 1:嵌入层参数(Embedding Parameters)
词汇嵌入(vocab embeddings):vocab_size dmodel
位置嵌入(position embeddings):max_position_embeddings dmodel
嵌入层总参数量:(vocab_size + max_position_embeddings) dmodel把稳Table 1中的dmodel便是指隐蔽层的维度大小,对应json文件中的hidden size,而Gemma采取的是RoPE的位置编码办法,以是实际上位置嵌入的参数不算入嵌入层的参数,以是最后代入详细对应的数值有:256128 3072 = 786,825,216Part 2:非嵌入层参数(Non-Embedding Parameters)这次Gemma利用的是Multi-Head attention,由上图得知Transformer构造由多个相同的层组成(Gemma是decoder-only模型,我们只须要关注decoder部分的网络构培养行),每个层分为三大部分:多头把稳力层(Multi-head attention)前馈网络(Feed-forward network)归一化层(Layer normalization)把稳力层总参数量:3 dmodel dkqv + (dmodel dkqv)这里把稳一下把稳力输出权重的打算是用Multi-head Attention的办法,从图2的Multi-Head Attention组件构造可知,Q、K、V做完 Scaled Dot-Product Attention之后,将得到的加权值(Values)通过一个线性变换来天生终极的输出。在一个范例的Transformer模型中,每个头会输出一个dmodel维的向量,然后把所有头的输出被拼接起来,形成一个更长的向量,这个向量随后会通过一个线性层的权重矩阵W_O实现的,它的维度是dmodeldmodel,以将拼接后的向量重新投影回原来的维度。7B一共是16个头,以及每个头是256维,以是末了的结果经由化简近似于:gate_proj 的权重:intermediate_size dmodelup_proj 的权重:dmodel intermediate_sizedown_proj 的权重:intermediate_size dmodel前馈网络层总参数量:intermediate_size dmodel 324576 3072 3 = 226,492,416Gemma用了RMSNorm,源码中只有一个weight缩放参数进行学习每个decoder模块有两个归一化层,以是总参数量:2 1 dmodel可以看到这个参数太小了,在近似打算中可以忽略不计。每层的总参数量:把稳力层总参数量 + 前馈网络层总参数量 + 层归一化总参数量所有层的总参数量:每层的总参数量 num_hidden_layers末了可以得到非嵌入层参数:(50,331,648 + 226,492,416 + 6144 ) 28 = 7,751,245,824这部分参数是模型参数末了一个组成部分,模型的末了一层是一个分类头,这层紧张功能便是输出对所有tokenizer分类的概率,一样平常都是由一个线性层构成,也是模型末了输出结果的层。从代码可以知道,这层的参数量是:3072 256128 = 786,825,216总参数量: 嵌入层参数 + 非嵌入层参数 + LM Head786,825,216 + 7,751,245,824 + 786,825,216 = 9,324,896,256 ≈ 9.3b末了我们可以看到显式的参数是在9.3b旁边,但由于利用了权重共享(weight tying),末了整体参数在8.5b旁边,这种类似操作也涌如今GPT-2 和XLNet等模型中,利用输入嵌入层和末了输出的LM Head分类层中共享相同的权重,总的来说还是比Llama2要大一些。从这个打算步骤下来,会创造基本上理清楚了Gemma的整体模型构造,这里再从多方面对模型构造进行一个总结,同时也可以当做回顾主流大模型构造的一个总结。Attention形式
Gemma7B用的是最经典的Transformer论文中的Multi-head attention(MHA)构造,而2B版本则用了Multi-Query attention(MQA)的构造,这也是基于在较小规模下的性能和打算效率考虑 。标准的把稳力机制中,查询(query)、键(key)和值(value)是三个核心组件,打算的是一个查询和所有键之间的相似度,然后这个相似度被用来加权相应的值。而在Multi-query attention中,可以同时处理一组查询,让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而可以共享键和值的表示,提高打算效率。其余还有比较常见的是Grouped-query attention(GQA),是MQA的一个变形构造,这个构造出来的缘故原由也是由于实验表明MQA在演习的质量上会实在相对付MHA会有衰减。该构造大略来说可以理解为Multi-head attention和Multi-Query attention的\"大众中间构造\"大众,相对付MHA的每个query都有其各自的Key和Value,以及MQA的所有query都共享一份Key和Value,GQA则是把query进行分组,每个组的query共享一份key和value,这种办法奥妙的兼顾了演习的速率和质量的平衡。在论文中的实验数据可以看出,GQA在大多数任务上表现和MHA差不多,并且评估效果优于MQA。由于MHA独立处理每个头部的查询(Q)、键(K)和值(V),它在演习时须要更多的参数和内存。MQA和GQA通过共享K和V的投影减少了参数量,从而减少了模型演习时的内存需求。当前主流的基模型基本上都是利用变形的attention机制,比如Llama2中末了选择了GQA给出的思路则是通过溶解证明了GQA在均匀性能上与MHA相称,且优于MQA。GQA在为更大模型的推理缩放供应效率的同时,还考虑了分布式设置中的操作考虑,强调了在不危害模型性能的条件下提高打算效率的计策采取。Tokenizer算法
当前大措辞模型的效能很大程度上依赖于其能力去理解和处理自然措辞,而这一过程的基石便是有效的文本tokenization。Tokenization是将文本分解为更小单元(如单词、子词或字符)的过程,这些单元随后被用于模型演习。但是切分的时候须要考虑以什么粒度去切分?1. 尽可能避免Out-of-vocabulary(OOV)征象带来的问题,这个问题可以用更细粒度的字符级去办理,只要对词再分的足够细,就可以表达一些生僻词;但是同时会带来序列长度的增长,导致打算本钱变大很多。2. 又须要高效地来表示所有的语义,比如用小规模的词库也能表达一些长尾的生僻字;以及相似词之间的关系,不会导致相似词语义上的割裂。这时就须要平衡词粒度(word)和字符粒度(character)的方法来进行分词,也便是子词(subword)粒度的分词,该方法核心理念是,常见词保留完全形态,而较为罕见的词则分解为更小的子单元,以此实现对token空间的高效共享,通过一定程度拆解的办法办理性能和效果的平衡。当前Byte-Pair Encoding (BPE)、Byte-level BPE 、Unigram language model和WordPiece是构建大型措辞模型时最主流的四种subword分词办法。WordPiece (BERT,DistilBERT,MobileBERT,Funnel Transformers,MPNET) 将单词分解为更小的单元,这些单元要么是全体单词,要么是子单词。通过迭代过程逐渐构建词汇表。在每一步,它选择合并词汇表中的一对符号,这对合并将最大限度地减少措辞模型的丢失(常日是基于n-gram频率),通过合并频繁共现的字符对来构建词汇。实践中会看到“##”,表示是前一个token的延续,比如Tokenizer会分成“To”, “##ken”,“##izer”这三个表示。Byte-Pair Encoding(GPT系列,LLaMA系列,ChatGLM-6B,Baichuan) 通过迭代合并最常见的字节对来减少序列长度,提高编码效率,有助于有效处理未知词汇和稀疏数据问题,提高模型的泛化能力。Byte-level BPE (RoBERTa)在BPE根本上,以字节为基本单位来构建词汇表,而非传统的字符。该过程从将文本以UTF-8格式编码开始,个中每个符号可能占用1至4个字节。随后,在这些字节序列上运用BPE算法,实行基于字节级别的相邻合并操作,以此办法优化词表的天生和文本的表示。这种方法不仅提高了模型对文本的理解能力,还增强了对多种措辞及其分外字符的支持,从而为模型供应了更丰富、更精确的文本表示办法。Unigram language model (AlBERT,T5,mBART,Big Bird,XLNet) 基于单个词的涌现概率来进行文本分割,它通过统计大量文本数据来预测每个可能的单词(包括子词)的涌现频率或概率。在分词过程中,算法考试测验将句子分解成一系列单词或子词,来最大化全体句子的概率,适用于处理未知或罕见词汇。通过剪枝最不可能的分割来达到终极的词汇表。这里提一下,实践中主流的大模型都是用的SentencePiece处理Tokenizer,这个算法工具包是支持BPE和unigram两种算法,为Tokenizer处理供应了极大的灵巧性,也基本上是谷歌家族标配的处理办法。为了方便读者比拟各个算法的差异,下图是对同一句话不同Tokenizer算法得到的结果,这个句子包含了大小写、标点符号、分外符号、两个空格和数字,可以当做一个范例case供大家比拟:Gemma这次延用了PaLm中与SentencePiece兼容的tokenizer,报告中说这同时也是从Gemini模型的词库中取了一部分。这份词库的tokenizer是完备来源于演习数据,以是整体演习的时候会更加高效。其余,全体词汇表是完备无损和可逆的,这意味着词汇表中完备保留了空格(对代码类的数据尤其主要),词汇表外的 Unicode 字符被拆分为 UTF-8 字节,每个字节都有一个词汇标记。数字则会被拆分为单独的数字标记,例如123.5→1 2 3 . 5。总体来看便是tokenizer做的粒度更细,且更方向于保留原始数据的语义。并且从词表量级角度,相对付其他基模型(Llamma2 7b和mistral 7b都是32000)所用的256k量级的tokenizer词汇表还是大很多的,预测也是比拟同等量级模型效果好的缘故原由之一。03 向量位置编码
由于主流的措辞模型基本都是基于Transformer构造,个中的自把稳力机制造成它们本身不处理输入数据的顺序,以是位置编码成为了供应序列中每个元素位置信息的关键手段,它们能使模型能够捕捉到序列中单词的顺序信息。位置编码通过增加额外的信息到每个单词的表示中,使模型能够区分单词在句子中的位置,从而理解词序和语法构造,这对付理解句子含义至关主要(见下面例子)。这次Gemma中采取的是被多个主流模型验证兼顾处理长序列的能力,同时保持较低的打算繁芜度的旋转位置编码Rotary Positional Embeddings (RoPE)。首先我们回顾一下紧张位置编码的办法,一种是之前Bert和Transformer用的绝对位置编码,Bert把位置的Embedding作为模型演习的一部分,通过演习学习的办法来表征每个token的位置信息,该位置向量只与输入的位置有关,这类编码办法理解起来非常直不雅观,实现也比较随意马虎。但是这里有一个明显的毛病便是对付模型处理长序列的能力有限,由于绝对位置编码是预先定义的,这可能导致模型难以泛化到比演习时见过的序列更长的情形。也便是所说的没有外推能力。这就会影响模型捕捉序列内长间隔依赖关系的能力,特殊是会在处理繁芜的措辞构造或须要细腻理解序列内关系的任务上,会表现比较差。后来Transformer又进行了优化,利用三角函数的周期性来表示位置编码(Sinusoidal Positional Encoding),实质可以总结成,通过在不同维度运用正弦和余弦函数的不同频率,产生了能够代表不同位置的高维位置向量。公式中的pos代表当前token在句子中的位置,dmodel与上文算参数的表示是一个意思,便是代表总的向量维度,i则代表个中一个向量维度。论文中提到利用这种办法紧张缘故原由是在实验效果差不多的情形下,三角函数位置编码对演习中没见过的词也有很好的外推能力。RoPE Embeddings
然而以上编码实质还是绝对位置的形式,都还不足高效,接下来就要重点说到Gemma及现在主流的基模型中都会利用的相对位置编码办法,个中主流是Rotary Position Embedding,RoPE,这种办法是凑集相对和绝对编码的上风设计出来的,通过对词嵌入进行旋转变换,以一种高效且紧凑的办法捕捉序列中元素的相对位置信息。用原作者概括的话便是“合营Attention机制能达到‘绝对位置编码的办法实现相对位置编码’的设计”,这个打算是在模型的自把稳力(Self-Attention)打算步骤中进行。在这一步骤中,模型会根据序列中各元素之间的相对位置关系,动态调度它们之间的把稳力权重,从而有效捕捉和利用位置信息来理解文本内容。与传统的位置编码方法比较,RoPE 的上风在于它能够在不显著增加打算繁芜度的情形下,有效处理长序列数据,并保持了对相对位置关系的敏感性。这种方法在提高模型对长间隔依赖关系捕捉能力的同时,还能减少模型演习和推理过程中的资源花费。核心:利用数学上的旋转操作来仿照单词嵌入随位置变革的动态,进而在Attention打算中隐式地表达单词之间的相对位置关系。这里以2维的向量作为例子进行解释,方法可以直接推广到高维。1. 给定一个二维的查询或键的向量(x1,x2),它代表未经位置编码的原始嵌入。个中,是与位置 m 干系的旋转角度。旋转矩阵Rm是线性的,这意味着旋转操作可以通过矩阵乘法运用于向量上,保持了向量之间的线性关系。实际中,纵然在长句子中,模型也能够有效地理解和利用单词之间的相对位置信息。第一行 x1'=x1cos()-x2sin()打算的是旋转后向量的x1坐标。第二行 x2'=x1sin()+x2cos()打算的是旋转后向量的x2坐标。旋转后的向量(x1,x2)表示了经由位置编码的查询或键,即原始向量绕原点旋转角度后的新位置。在这个过程中,每一维度的查询或键都被视作二维空间中的点,并通过相应的旋转矩阵进行旋转。对每个位置运用相应的旋转矩阵,模型可以嵌入单词的相对位置信息,使得Attention机制能够利用这些信息来更好地理解单词之间的关系。同时三角函数本身具有的周期性性子在处理长序列时表现出更高的灵巧性。想象一下,你在一个广阔的旋转餐厅里用餐。你的位置是固定的,但是通过旋转,你可以看到餐厅里的每个角落。这和在措辞处理中理解单词的“位置”有些相似。每个单词都像是餐厅里的一个顾客,他们的“位置”对付他们如何相互互换是非常主要的。在模型理解措辞时,我们须要见告它每个单词不仅是什么,还在哪里。传统的做法就像是给每个顾客一个编号,号码越小表示越靠近餐厅的入口。这种方法很直接,但是当餐厅扩大,或者当顾客移动位置时,这些编号就不太有用了。RoPE这种编码办法,就像是通过不雅观察顾客是如何相对付入口旋转来定位他们。而不是说“这个顾客在第5号桌”,我们会说“从入口开始,逆时针转90度,你会看到这个顾客。”这样的好处是,无论餐厅多大,或者顾客如何移动,描述都是有效的。这也意味着纵然在餐厅扩建之后,我们依然能够描述新顾客的位置。在实际的措辞模型中,RoPE许可模型更好地理解单词之间的关系,就像是能够理解顾客之间在旋转餐厅中的相对位置一样。纵然句子变得很长,或者模型碰着了新的、更长的句子,这种编码办法仍旧能帮助模型准确地“看到”每个单词的位置,就像你能够看到餐厅中每个顾客的位置一样。激活函数
模型中的激活函数紧张目的是为网络引入非线性,使得神经网络能够学习和仿照繁芜的、非线性的函数映射。如果没有激活函数,纵然网络拥有很多层,每层有很多神经元,网络整体仍旧只能表示线性的函数关系,极大限定了网络模型的表达能力和繁芜度。通过引入非线性激活函数,神经网络能够学习到更加繁芜的数据模式,特殊大模型这类参数量很大的繁芜模型,选择得当的激活函数对模型学习数据非线性表达至关主要。以下紧张先容基模型主流的激活函数:1. ReLU(Rectified Linear Unit)
从公式知,输入是正的,则直接输出该值;如果输入是负的,则输出0。ReLU因其大略性和效率在深度学习中非常盛行。它有助于办理梯度消逝问题,加速了神经网络的收敛,并且打算大略。办理梯度消逝问题:对付正输入,梯度恒为1,因此不会发生梯度消逝问题。去世亡ReLU问题:如果输入为负,则梯度为0,该神经元可能再也不会更新,称为“Dead ReLU”。2. GeLU(Gaussian Error Linear Unit)
个中P(X<=x)是基于高斯分布的输入小于输出的概率,也可以用偏差函数(erf)来表示。事理是输入常日是呈现正态分布,通过输入的概率打算决定是否置为0(被丢弃)。如果有时候为了打算快速,也可以用近似的打算:GeLU通过引入输入数据的概率分布,可以自适应地调度其非线性程度,从而在某些任务中供应比ReLU更好的性能。自适应非线性:根据输入数据的分布调度激活函数的形状。办理梯度消逝问题:对付大部分输入值,其导数不为零,有助于缓解梯度消逝问题。打算繁芜度较高:相对付ReLU,GeLU的打算更繁芜。目前大模型更盛行的是门控类型的激活函数,首先大略补充一下最根本的GLU(Gated Linear Unit)。GLU由两部分组成,a和b,个中a是原始输入,b用于打算门控旗子暗记。把稳这里的a和b实在都是输入x的变换,始终输入就一个x(见下面代码),门控旗子暗记是通过对b利用Sigmoid函数得到,这个旗子暗记介于0和1之间,然后与a相乘(⊗表示逐元素乘法),从而动态调度每个元素的通报。GLU许可部分信息根据门控旗子暗记的强度通报,而抑制其他信息。3. SwiGLU(Switched Gated Linear Unit)
SwiGLU是GLU的一个变体,它将输入分为两部分,一部分通过线性变换,另一部分由新的线性变换(通过权重$W_b$和偏置$B_b$,先对b运用一个额外的线性变换)然后套个sigmoid函数得到,许可门控旗子暗记不仅仅依赖于原始输入的状态,还依赖于通过演习学到的变换,使得模型可以学习到更加繁芜的非线性表示。提高模型繁芜度:通过门控机制,模型可以捕捉更繁芜的特色。打算繁芜度增加:由于增加学习参数W和b,SwiGLU的打算本钱更高。4. GeGLU(Gated Linear Unit with Gaussian Error Linear Unit)
GeGLU是GeLU的一个变体,结合了门控机制。它常日包括两个并行的分支,一个运用线性变换,另一个运用GeLU变换,然后将两者相乘。GeGLU综合了GeLU的自适应性和门控机制的优点,旨在供应更加强大和灵巧的激活功能。增强表示能力:通过结合GeLU和门控机制,供应更强大的模型表示能力。打算繁芜度:同样的,打算本钱较高,特殊是在大型模型中。在Gemma中便是采取GeGLU Activations,从代码中可以看到,门控机制是通过输入数据$x$的变换作为门控旗子暗记的天生办法,然后再与另一个变换的输入数据进行元素级别的乘法操作,终极通过另一个线性变换调度输出维度。关于利用选择问题,提出GLU变形的作者在T5模型上做过火歧激活函数的溶解实验效果比拟,从这个实验看,GeGLU和SwiGLU综合来看是效果最好的,这两个激活函数也是目前主流基座大模型被采取的。归一化办法
模型中利用归一化(Normalization)技能,紧张是为了提高深度学习网络的演习效率、稳定性和泛化能力。归一化通过对输入数据或网络层的激活值进行处理,使其分布更加规范,从数学的角度来看,这个操作有助于优化丢失函数的几何特性。没进行归一化的数据可能导致丢失函数表面涌现尖锐的曲率,这使得找到最优解变得困难。归一化有助于使丢失函数的等高线更加规则,从而使梯度低落等优化算法更随意马虎找到全局最小值。此外,对付深度学习模型来说,每一层的输出都依赖于前一层的参数。如果不进行归一化,这种依赖关系可能导致激活值在网络深层中累积偏差,归一化通过规范这些值,确保了网络深层依然可以吸收到有效的梯度信息,提高模型学习效率,不会导致梯度爆炸或消逝等问题。接下来先容一下主流的大模型利用的归一化办法。Batch Normalization (Batch Norm)Batch Norm核心思想是在网络的输入的每一个batch上运用归一化,使得该批数据输入分布保持相同。由于其与图像数据特性比较契合,特殊是在处理大规模图像数据集和演习深层网络时,常日会有比较好的效果。假设一个层的输入为X={x1,x2,...,xm},个中m是批量大小。Batch Norm 归一化步骤如下:位移和缩放: ,个中γ和β是可学习的参数,用于规复归一化可能丢失的表示能力。但是批归一化也有一些明显问题。比如对批量大小敏感,较小的批量大小会导致估计的均值和方差不准确,影响模型性能;其余在类似措辞的可变长序列模型中运用不足灵巧,由于批的每条样本序列长度必须保持同等,在措辞的样本中常常会有batch中句子长短不一,如果用这个方法则须要对token空的对应位置进行padding操作,导致效率低下。以是现在很多措辞模型会采取Layer Normalization,来办理了对批量大小敏感的问题,通过在特色维度上进行标准化而不是批量维度,使得它适用于小批量和可变长度序列的处理。Layer Normalization (Layer Norm)紧张用于办理 RNNs 和其他序列模型中的演习问题。与 Batch Norm 最大的不同,Layer Norm 在单个样本的所有维度的输入上进行归一化,而不是在一个批量的维度上进行归一化。公式:基本与batch norm步骤一样,最大差异便是输入的X的m维换成向量或者特色的维度数值,按照这个维度对每个x进行归一化打算。值得把稳的是,layer norm是针对单个样本的每个特色进行的(类比NLP任务中句子转换成的每个token),而不是跨样本。这使得 Layer Norm 特殊适用于处理韶光序列数据和循环神经网络,可以不依赖于批次的大小,稳定的处理不同韶光步长的序列数据。本次Gemma采取的便是RMSNorm,这种办法基于每层激活的均方根(Root Mean Square)来进行归一化。RMS Norm 其实在简化 Layer Norm 的打算,通过省略均值的打算,直策应用方差进行归一化。虽然简化了打算,但是从效果上看,基本与Layer Norm持平,并且拥有更快的收敛速率(从打算角度随意马虎理解)。该公式简化了Layer Norm 的打算,降落了打算繁芜度。也有文章(见Ref: 2102.11972)做了很多比拟实验证明这种办法的有效性,从而使得浩瀚主流大模型都采纳这种办法。03 总结
该文旨在带领想要深入理解大模型技能领域的同学进行一个回顾形式的总结,在大模型发展迅速的时期,以上的内容险些是每个技能同学打仗大模型的人必须节制的知识,只有从事理出发理解大模型,才能更好地利用大模型为我们供应更大的代价。从微调大模型实践来看,这些知识也在细节上对能否成功演习好一个模型产生比较大的影响,很可能由于上面的某个点理解不到位,导致在详细任务上产生loss干系问题或者测试效果不及预期。下一篇文章将从实践技能角度先容模型效果优化干系知识。Vaswani, A.et al. (2017) Attention Is All You Need, arXiv.org. Available at: https://arxiv.org/abs/1706.03762.Ainslie, J.et al. (no date) GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints. Available at: https://arxiv.org/pdf/2305.13245.pdf.Su, J.et al. (2021) ‘RoFormer: Enhanced Transformer with Rotary Position Embedding’. Available at: https://doi.org/10.48550/arxiv.2104.09864.Google, N. (2020)GLU Variants Improve Transformer. Available at: https://arxiv.org/pdf/2002.05202.pdf.Xiong, R.et al. (2020) On Layer Normalization in the Transformer Architecture. Available at: https://arxiv.org/pdf/2002.04745.pdf.Narang, S.et al. (no date) Do Transformer Modifications Transfer Across Implementations and Applications? Available at: https://arxiv.org/pdf/2102.11972.pdf (Accessed: 1 April 2024).