作者:金一鸣
本文约9400字,建议阅读10+分钟
本文从技术的角度聚焦大模型的实战经验,总结大模型从业者关注的具体方向以及相关发展,帮助打算参与到大模型工作的人高效上手相关工作。
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,216
图2
Part 2:非嵌入层参数(Non-Embedding Parameters)
这次Gemma使用的是Multi-Head attention,由上图得知Transformer结构由多个相同的层组成(Gemma是decoder-only模型,我们只需要关注decoder部分的网络结构就行),每个层分为三大部分:
多头注意力层(Multi-head attention)
前馈网络(Feed-forward network)
归一化层(Layer normalization)
注意力机制层参数(每层):
查询(query)权重:dmodel * dq *
键(key)权重:dmodel * dk *
值(value)权重:dmodel * dv *
注意力输出权重:dmodel * dkqv *
注意力层总参数量:3* * dmodel * dkqv + (dmodel * * dkqv)
这里注意一下注意力输出权重的计算是用Multi-head Attention的方式,从图2的Multi-Head Attention组件结构可知,Q、K、V做完 Scaled Dot-Product Attention之后,将得到的加权值(Values)通过一个线性变换来生成最终的输出。在一个典型的Transformer模型中,每个头会输出一个dmodel维的向量,然后把所有头的输出被拼接起来,形成一个更长的向量,这个向量随后会通过一个线性层的权重矩阵W_O实现的,它的维度是dmodel