开源模型对比


最近流行大模型对比

模型 训练数据 训练数据量 模型参数量 词表大小
LLaMA 以英语为主的拉丁语系,不包含中日韩文 1T/1.4T tokens 7B、13B、33B、65B 32000
ChatGLM-6B 中英双语,中英文比例为1:1 1T tokens 6B 130528
Bloom 46种自然语言和13种编程语言,包含中文 350B tokens 560M、1.1B、1.7B、3B、7.1B、176B 250880
模型 模型结构 位置编码 激活函数 layer norm
LLaMA Casual decoder RoPE SwiGLU Pre RMS Norm
ChatGLM-6B Prefix decoder RoPE GeGLU Post Deep Norm
Bloom Casual decoder ALiBi GeLU Pre Layer Norm

LLama

LLaMA是Meta提出的大语言模型。训练数据是以英语为主的拉丁语系,另外还包含了来自GitHub的代码数据。训练数据以英文为主,不包含中韩日文,所有训练数据都是开源的,分词之后大约有1400B的tokens。 按照模型参数量,LLaMA模型有7B、13B、33B、65B这四个不同参数规模的模型版本。7B和13B版本使用了1T的tokens进行训练,33B和65B的版本使用了1.4T的tokens进行训练。有实验证明了在给定训练预算的情况下,即使减少模型参数量,只要增加预训练的数据大小和训练时长(更多的训练tokens数),可以达到甚至超过原始大小模型的效果。作为对比,280B的Gopher模型只训练了300B的tokens,176B的BLOOM模型只训练了350B的tokens,GLM-130B只训练了400B的tokens,LLaMA模型则训练了1T/1.4T的tokens,显著增大了训练数据量。从结果来看,虽然LLaMA-13B模型参数量只有GPT3的不到1/10,但在大部分任务上效果都超过了GPT3。

模型结构上,与GPT相同,LLaMA采用了causal decoder-only的transformer模型结构。在模型细节上,做了以下几点改动:

  • 1.Pre-layer-normalization [参考GPT3]. 为了提高训练稳定性,LLaMA 对每个 transformer 子层的输入进行归一化,使用 RMSNorm (即只有均方根,没有均值u)归一化函数,Pre-normalization 由Zhang和Sennrich(2019)引入。
  • 2.SwiGLU 激活函数 [参考PaLM]. 没有采用ReLU激活函数,而是采用了SwiGLU激活函数。FFN通常有两个权重矩阵,先将向量从维度d升维到中间维度4d,再从4d降维到d。而使用SwiGLU激活函数的FFN增加了一个权重矩阵,共有三个权重矩阵,为了保持参数量一致,中间维度采用了\frac{2}{3}\cdot d ,而不是4d.
  • 3.位置编码:Rotary Embeddings [参考GPTNeo]. 模型的输入不再使用 positional embeddings,而是在网络的每一层添加了 positional embeddings (RoPE),RoPE 方法由Su等人(2021)引入。
  • 4.使用了AdamW优化器,并使用cosine learning rate schedule,
  • 5.使用因果多头注意的有效实现来减少内存使用和运行时间

下面是一些基于LLaMA衍生出来的大模型:

  • Alpaca
  • Vicuna
  • baize
  • StableLM
  • BELLE
  • Llama 2 :
    • 训练数据增加40%
    • 上下文窗口4k
    • 分组查询注意力( Grouped-query attention)
    • 开源7B、13B、70B模型

词表扩展:Chinese LLaMa

词表扩充的必要性。 LLaMA原模型的词表大小是32000,tokenizer主要是在英文语料上进行训练的,在中文上和多语种上效果比较差。LLaMA在中文上效果差,一方面是由于LLaMA模型是在以英文为主的拉丁语系语料上进行训练的,训练语料不包含中文;另一方面,与tokenizer有关,词表规模小,可能将一个汉字切分为多个token,编码效率低,模型学习难度大。LLaMA词表中只包含了很少的中文字符,在对中文文本进行分词时,会将中文切分地更碎,需要多个token才能表示一个汉字,编码效率很低。扩展中文词表后,单个汉字倾向于被切分为1个token,避免了一个汉字被切分为多个token的问题,提升了中文编码效率。

如何扩展词表呢?,将中文token添加到词表中,提升中文编码效率,具体方式如下。

  • 1.在中文语料上使用Sentence Piece训练一个中文tokenizer,使用了20000个中文词汇。然后将中文tokenizer与原始的 LLaMA tokenizer合并起来,通过组合二者的词汇表,最终获得一个合并的tokenizer,称为Chinese LLaMA tokenizer。词表大小为49953。
  • 2.为了适应新的tokenizer,将transformer模型的embedding矩阵从 Vh 扩展到 V'h ,新加入的中文token附加到原始embedding矩阵的末尾,确保原始词表表的embedding矩阵不受影响。(这里输出层应该也是要调整的)
  • 3.在中文语料上进一步预训练,冻结和固定transformer的模型参数,只训练embedding矩阵,学习新加入中文token的词向量表示,同时最小化对原模型的干扰。
  • 4.在指令微调阶段,可以放开全部模型参数进行训练。

ChatGLM-6B

ChatGLM-6B是清华大学提出的支持中英双语问答的对话语言模型。ChatGLM-6B采用了与GLM-130B相同的模型结构。截止到2022年7月,GLM-130B只训练了400B的tokens,中英文比例为1:1。ChatGLM-6B则使用了更多的训练数据,多达1T的tokens,训练语料只包含中文和英文,中英文比例为1:1。

模型结构上,ChatGLM-6B采用了prefix decoder-only的transformer模型框架,在输入上采用双向的注意力机制,在输出上采用单向注意力机制。在模型细节上,做了以下几点改动:

  • 1.embedding层梯度缩减: 为了提升训练稳定性,减小了Embedding层的梯度。
  • 2.Layer Normalization的顺序和残差连接被重新排列,用POST Normal,用Deep Normal
  • 3.用于输出标记预测的单个线性层;
  • 4.用GEGLU作激活函数: 相比于普通的FFN,使用线性门控单元的GLU新增了一个权重矩阵,共有三个权重矩阵,为了保持参数量一致,中间维度采用了 8d/3
  • 而非4d.
  • 5.位置编码:去除了绝对位置编码,采用旋转位置编码RoPE
  • 6.训练目标:ChatGLM-6B的训练任务是自回归文本填空。相比于采用causal decoder-only结构的大语言模型,采用prefix decoder-only结构的ChatGLM-6B存在一个劣势:训练效率低。causal decoder结构会在所有的token上计算损失,而prefix decoder只会在输出上计算损失,而不计算输入上的损失。在有相同数量的训练tokens的情况下,prefix decoder要比causal decoder的效果差,因为训练过程中实际用到的tokens数量要更少。另外,ChatGPT的成功已经证明了causal decoder结构的大语言模型可以获得非常好的few-shot和zero-shot生成能力,通过指令微调可以进一步激发模型的能力。至于prefix decoder结构的大语言模型能否获得相当的few-shot和zero-shot能力还缺少足够的验证。
  • 7.训练时对一个完整的单词做Mask,这样可以避免 一个单词被拆分成多个Tokens,然后根据自己推测自己
  • 8.tokenizer:关于tokenizer,ChatGLM在25GB的中英双语数据上训练了SentencePiece作为tokenizer,词表大小为130528。

下面是一些基于ChatGLM衍生出来的大模型应用:

  • langchain-ChatGLM:基于 langchain 的 ChatGLM 应用,实现基于可扩展知识库的问答。
  • 闻达:大型语言模型调用平台,基于 ChatGLM-6B 实现了类 ChatPDF 功能。

BLOOM

BLOOM[5]系列模型是由BigScience团队训练的大语言模型。训练数据包含了英语、中文、法语、西班牙语、葡萄牙语等共46种语言,另外还包含13种编程语言。1.5TB经过去重和清洗的文本,转换为350B的tokens。训练数据的语言分布如下图所示,可以看到中文语料占比为16.2%。

按照模型参数量,BLOOM模型有560M、1.1B、1.7B、3B、7.1B和176B这几个不同参数规模的模型。BLOOMZ系列模型是在xP3数据集上微调得到的,推荐用于英语提示的场景。BLOOMZ-MT系列模型是在xP3mt数据集上微调得到的,推荐用于非英语提示的场景。 模型结构上,与GPT相同,BLOOM采用了causal decoder-only的transformer模型结构。在模型细节上,做了以下几点改动:

  • 使用 ALiBi 位置嵌入,它根据键和查询的距离直接衰减注意力分数。与原始的 Transformer 和 Rotary 嵌入相比,它可以带来更流畅的训练和更好的下游性能。ALiBi不会在词嵌入中添加位置嵌入;相反,它会使用与其距离成比例的惩罚来偏向查询键的注意力评分。
  • Embedding Layer Norm 在第一个嵌入层之后立即使用,以避免训练不稳定。
  • layer normalization:为了提升训练的稳定性,没有使用传统的post layer norm,而是使用了pre layer Norm。
  • 激活函数:采用了GeLU激活函数。
  • 关于tokenizer,BLOOM在多语种语料上使用Byte Pair Encoding(BPE)算法进行训练得到tokenizer,词表大小为250880。使用了 25 万个标记的词汇表。使用字节级 BPE。这样,标记化永远不会产生未知标记
  • 在训练目标上,BLOOM的训练目标是语言模型,即根据已有的上文去预测下一个词。

下面是一些基于BLOOM衍生出来的大模型应用:

  • 轩辕
  • BELLE

tokenizer比较

以上几个基座模型的tokenizer的词表大小不同,对同一个中文文本的分词结果会产生不同的结果。在news_commentary的6.9万条中英文平行语料上进行分词处理,对比分词结果和分词耗时,结果如下。“中文平均token数”表示了tokenizer分词后,每个中文字符对应的平均token数。

模型 词表大小 中文平均token数 英文平均token数 中文处理时间(s) 英文处理时间(s)
LLaMA 32000 1.45 0.25 12.60 19.40
Chinese LLaMA 49953 0.62 0.249 8.65 19.12
ChatGLM-6B 130528 0.55 0.19 15.91 20.84
Bloom 250880 0.53 0.22 9.87 15.60

从结果来看,

  • 1.LLaMA的词表是最小的,LLaMA在中英文上的平均token数都是最多的,这意味着LLaMA对中英文分词都会比较碎,比较细粒度。尤其在中文上平均token数高达1.45,这意味着LLaMA大概率会将中文字符切分为2个以上的token。
  • 2.Chinese LLaMA扩展词表后,中文平均token数显著降低,会将一个汉字或两个汉字切分为一个token,提高了中文编码效率。
  • 3.ChatGLM-6B是平衡中英文分词效果最好的tokenizer。由于词表比较大,中文处理时间也有增加。
  • 4.BLOOM虽然是词表最大的,但由于是多语种的,在中英文上分词效率与ChatGLM-6B基本相当。需要注意的是,BLOOM的tokenizer用了transformers的BloomTokenizerFast实现,分词速度更快。