LLMs 对比篇
整理自:AiGC面试宝典 作者:宁静致远 日期:2024年01月27日
一、谈谈你对当前出现的各种大模型的见解?
- 相同点:目前开源了各式各样的大模型,大家用到的基础架构基本一致,都是基于 Transformer 架构
- 不同点:
- 大模型使用的架构不同(Encoder 或 Decoder)
📝通俗解释:大模型就像不同的汽车品牌,虽然外观和配置不同,但核心都是发动机(Transformer架构)。有的是纯发动机驱动的(Decoder-only),有的是发动机和变速箱配合的(Encoder-Decoder)。
二、目前大模型常见的 Base 模型训练和 Chat 模型训练方式的区别?
Chat 模型对齐训练使用的方式比较一致:SFT(有监督微调)的微调或者 RLHF(基于人类反馈的强化学习,包括 RM 模型+PPO)。Chat 模型回答效果好坏,主要还是靠 Base 模型效果决定,并且不同开源模型的 Base 模型训练方式也不一样。
📝通俗解释:Base 模型就像一个刚毕业的学生,学了很多基础知识;Chat 模型则像是经过职业培训的员工,会更懂得如何与人交流、回答问题。Chat模型通常是在Base模型基础上进行"微调"得到的。
三、Llama、Baichuan、ChatGLM、Bloom 和 Qwen 等开源大模型技术对比篇
3.1 Llama 系列篇
3.1.1 Llama 篇
论文:Llama: Open and efficient foundation language models 论文地址:https://arxiv.org/pdf/2302.13971.pdf
3.1.1.1 Llama 训练数据介绍
LLaMA 是 Meta 提出的大语言模型。训练数据以英语为主的拉丁语系,另外还包含了来自 GitHub 的代码数据。训练数据以英文为主,不包含中日韩文,所有训练数据都是开源的,分词之后大约有 1400B 的 tokens。
| Dataset | Sampling prop. | Epochs | Disk size |
|---|---|---|---|
| CommonCrawl | 67.0% | 1.10 | 3.3 TB |
| C4 | 15.0% | 1.06 | 783 GB |
| Github | 4.5% | 0.64 | 328 GB |
| Wikipedia | 4.5% | 2.45 | 83 GB |
| Books | 4.5% | 2.23 | 85 GB |
| ArXiv | 2.5% | 1.06 | 92 GB |
| StackExchange | 2.0% | 1.03 | 78 GB |
📝通俗解释:这个表格展示了Llama训练数据的来源和比例。CommonCrawl(网页数据)占了67%,是最主要的数据来源,就像一个人通过上网浏览了大量内容来学习。
3.1.1.2 Llama 模型参数量介绍
按照模型参数量,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。
📝通俗解释:这说明了一个重要观点——"数据量比参数量更重要"。就像一个学生(模型),与其让他记住很多知识(更多参数),不如让他多读、多看、多学习(更多数据),效果可能更好。
3.1.1.3 Llama 模型结构介绍
与 GPT 相同,LLaMA 采用了 Causal Decoder-only 的 Transformer 模型结构。
- Layer Normalization:为了提升训练的稳定性,没有使用传统的 Post Layer Norm,而是使用了 Pre Layer Norm。具体地,去除了 Layer Normalization 中的偏置项,采用了 RMS Norm(即均方根 Norm)
- 激活函数:没有采用 ReLU 激活函数,而是采用了 SwiGLU 激活函数。FFN 通常有两个权重矩阵,先将向量从维度 $d$ 升维到中间维度 $4d$,再从 $4d$ 降维到 $d$。而使用 SwiGLU 激活函数的 FFN 增加了一个权重矩阵,共有三个权重矩阵,为了保持参数量一致,中间维度采用了 $2/3 \cdot 4d$,而不是 $4d$
- 位置编码:去除了绝对位置编码,采用了旋转位置编码 RoPE
📝通俗解释:这些技术细节都是为了训练更稳定、效果更好。Pre Layer Norm 就像提前做好规范,让训练过程更平稳;SwiGLU 是一种更复杂的"激活函数",能让模型学到更复杂的模式;RoPE 是一种处理位置信息的方法,让模型更好地理解词语的顺序。
3.1.1.4 Llama 训练目标介绍
在训练目标上,LLaMA 的训练目标是语言模型,即根据已有的上文去预测下一个词。
📝通俗解释:就像做完形填空,给定前面的词语,预测下一个最可能出现的词。这是训练大语言模型最基础的任务。
3.1.1.5 Llama Tokenizer 介绍
关于 Tokenizer,LLaMA 的训练语料以英文为主,使用了 Sentence Piece 作为 Tokenizer,词表大小只有 32000。词表里的中文 token 很少,只有几百个,LLaMA Tokenizer 对中文分词的编码效率比较低。
📝通俗解释:Tokenizer 就像一个"分词器",把文本拆分成模型能理解的小单元。LLaMA的词表只有32000个词,对于英文够用,但中文词很少,所以处理中文时经常会把一个字拆成多个碎片,效率很低。
3.1.1.6 Llama 衍生模型介绍
- Alpaca:斯坦福大学在 52k 条英文指令遵循数据集上微调了 7B 规模的 LLaMA
- Vicuna:加州大学伯克利分校在 ShareGPT 收集的用户共享对话数据上,微调了 13B 规模的 LLaMA
- Baize:在 100k 条 ChatGPT 产生的数据上,对 LLaMA 通过 LoRA 微调得到的模型
- StableLM:Stability AI 在 LLaMA 基础上微调得到的模型
- BELLE:链家仅使用由 ChatGPT 生产的数据,对 LLaMA 进行了指令微调,并针对中文进行了优化
📝通俗解释:这些都是基于LLaMA"微调"出来的模型,相当于在LLaMA这个"通才"基础上进行"专项培训",让其在特定场景表现更好。
3.1.1.7 Llama 词表扩展:Chinese LLaMA
1. 为什么需要词表扩展?
LLaMA 原模型的词表大小是 32000,Tokenizer 主要是在英文语料上进行训练的,在中文上和多语种上效果比较差。LLaMA 在中文上效果差,一方面是由于 LLaMA 模型是在以英文为主的拉丁语系语料上进行训练的,训练语料不包含中文;另一方面,与 Tokenizer 有关,词表规模小,可能将一个汉字切分为多个 token,编码效率低,模型学习难度大。LLaMA 词表中只包含了很少的中文字符,在对中文文本进行分词时,会将中文切分地更碎,需要多个 token 才能表示一个汉字,编码效率很低。扩展中文词表后,单个汉字倾向于被切分为 1 个 token,避免了一个汉字被切分为多个 token 的问题,提升了中文编码效率。
2. 如何扩展词表?
尝试扩展词表,将中文 token 添加到词表中,提升中文编码效率,具体方式如下:
- 在中文语料上使用 Sentence Piece 训练一个中文 Tokenizer,使用了 20000 个中文词汇。然后将中文 Tokenizer 与原始的 LLaMA Tokenizer 合并起来,通过组合二者的词汇表,最终获得一个合并的 Tokenizer,称为 Chinese LLaMA Tokenizer。词表大小为 49953
- 为了适应新的 Tokenizer,将 Transformer 模型的 Embedding 矩阵从 $V \times h \times V \times h$ 扩展到 $V' \times h \times V' \times h$,新加入的中文 token 附加到原始 Embedding 矩阵的末尾,确保原始词表的 Embedding 矩阵不受影响
- 在中文语料上进一步预训练,冻结和固定 Transformer 的模型参数,只训练 Embedding 矩阵,学习新加入中文 token 的词向量表示,同时最小化对原模型的干扰
- 在指令微调阶段,可以放开全部模型参数进行训练
3. 扩展词表后效果怎么样?
从 Chinese-LLaMA-Alpaca 和 BELLE 的结果来看,扩充中文词表,可以提升中文编码效率,并提升模型性能。
| Factor | Base model | Training data | Score_w/o_others |
|---|---|---|---|
| 词表扩充 | LLaMA-7B-EXT | zh(alpaca-3.5&4) + sharegpt | 0.670 |
| LLaMA-7B | zh(alpaca-3.5&4) + sharegpt | 0.652 | |
| 数据质量 | LLaMA-7B-EXT | zh(alpaca-3.5) | 0.642 |
| LLaMA-7B-EXT | zh(alpaca-4) | 0.693 | |
| 数据语言分布 | LLaMA-7B-EXT | zh(alpaca-3.5&4) | 0.679 |
| LLaMA-7B-EXT | en(alpaca-3.5&4) | 0.659 | |
| LLaMA-7B-EXT | zh(alpaca-3.5&4) + sharegpt | 0.670 | |
| LLaMA-7B-EXT | en(alpaca-3.5&4) + sharegpt | 0.668 | |
| 数据规模 | LLaMA-7B-EXT | zh(alpaca-3.5&4) + sharegpt | 0.670 |
| LLaMA-7B-EXT | zh(alpaca-3.5&4) + sharegpt + BELLE-0.5M-CLEAN | 0.762 |
📝通俗解释:扩展词表就像给只会英语的人一本中英词典。扩展后,中文处理效率明显提升(从0.652提升到0.670),而且数据越多、质量越好,效果提升越明显(0.762)。
3.2 Llama2 篇
3.2.1 Llama2 系列数据预处理方式?
由于 Llama2 开源的公司为 Facebook,业务主要为社交的软件,社交数据都是 UGC(用户生成内容),对于大模型提升知识能力没太多作用并且都是隐私的数据不能用于大模型训练。
为此 Llama2 仅仅使用公开的数据来源,对具有事实性的来源加权,以增加权威的知识并减少幻想。最终使用 2 trillion token 数据上进行了训练。
📝通俗解释:Llama2只使用公开的、可靠的知识来源,就像一个学生只读教科书和权威期刊,不看网上随意发布的内容,这样可以减少"胡说八道"的情况。
3.2.2 Llama2 系列 Tokenizer 处理方式?
使用 Byte Pair Encoding (BPE) 算法进行分词。针对连续数字会拆为单独的数字并且未在词典中的词使用 bytes 替换,最终词典大小为 32k。
📝通俗解释:BPE就像一种拼图游戏,把常用的字符组合打包成一个"词块",既节省空间又能保持完整性。
3.2.3 Llama2 系列 Architectural?
- 位置编码:Rotary Positional Embeddings(RoPE)
- 激活函数:SwiGLU
- Normal 方法:RMSNorm
3.2.4 Llama2 系列 Context 长度?
Grouped-Query Attention (GQA):将 Llama1 长度 2048 提升至 4096
[MHA、GQA、MQA 结构对比]
- Multi-Head (MHA):多个 Queries 分别对应多个 Keys 和多个 Values(一对一或多对多)
- Grouped-Query (GQA):多个 Queries 分成几组,每组共享一个 Key 和一个 Value
- Multi-Query (MQA):所有的 Queries 共享同一个 Key 和同一个 Value
传统的 Transformer 为多头注意力(MHA)模型,分组查询注意力变体为 GQA 模型,另外还有 MQA 模型,该结构为特殊的 GQA 模型,group 为 1。
📝通俗解释:GQA是一种"共享钥匙"的技术。传统方法每个问题都需要一把独立的"钥匙"去查找答案,GQA让一组问题共用钥匙,这样内存占用更少,但效果差不多。
3.3 Mistral 7B 系列篇
3.3.1 Mistral 7B Architectural?
1. Sliding Window Attention(滑动窗口注意力)
Attention 中的操作数量与序列长度呈二次关系,通过 Sliding Window Attention,可减少计算,但是会牺牲一点的效果。
做法如下:第 2 层中的位置 4 的隐藏状态,关注来自前一层中位置在 $4-W$ 和 $4$ 之间的所有隐藏状态,下图中 $w=3$
📝通俗解释:就像人阅读文章时,不需要记住每一个字,只需要关注当前句子附近的内容。滑动窗口让模型只关注附近的词,减少计算量。
2. Rolling Buffer Cache(滚动缓存)
显存消耗与序列长度呈二次关系。当长度比较长时,显存的消耗是比较多的。
Rolling Buffer Cache 使用的是 LRU 算法,选择最久未使用的数据予以淘汰,相当于缓存最新数据。
📝通俗解释:就像手机后台应用管理,最近使用的应用保留,最久没用的应用被关闭,以节省内存。
3. 效果对比
从下表可看出同一个数量级的参数 Mistral 都比 Llama2 效果好:
| 指标 | Mistral 7B 效果相当于 Llama2 |
|---|---|
| MMLU | 23B (3.3倍) |
| Reasoning | 38B (5.4倍) |
| Knowledge | 13B (1.9倍) |
| Comprehension | 21B (3倍) |
📝通俗解释:Mistral 7B 虽然参数少,但效果接近比自己大3-5倍的Llama2模型,堪称"小而美"的典范。
3.4 Qwen 系列篇
3.4.1 Qwen 系列数据预处理方式?
- 去重:标准化后进行完全匹配重复数据删除,以及使用 MinHash 和 LSH 算法进行模糊重复数据删除
- 过滤低质量:过滤低质量的数据,采用了规则型和基于机器学习的方法的组合。多个模型对内容进行评分,包括语言模型,文本质量评分模型以及用于识别潜在的攻击性或不适当内容的模型。人工从各种来源中对文本进行抽样并审阅,以确保其质量
- 高质量指令:由于多任务指令可以增强他们的零样本和少样本性能,预训练过程中加入了高质量的指令数据
📝通俗解释:Qwen的数据处理就像"淘金",先去掉重复的沙子,再筛掉质量差的石头,最后还加入了"金种子"(高质量指令数据)来提升模型能力。
3.4.2 Qwen 系列 Tokenizer 处理方式?
使用基于 Byte Pair Encoding (BPE) 的 tiktoken 算法,其相当于 BPE Tokenizer 分词更快。首先使用 cl100k 作为 base token,针对连续数字会拆为单独的数字,最终词典大小为 152K。
编码压缩率越小,则传递的信息就更多。每种语言 100 万个文档语料库来测试和比较不同模型的编码压缩率,可看到 Qwen 编码压缩率是比较低的。
📝通俗解释:Qwen的词表有15.2万个词,是LLaMA的近5倍。词表越大,中文编码效率越高,"压缩率"越低,意味着同样长度的文本包含的信息量更大。
3.4.3 Qwen 系列 Architecture?
- Embedding 和 Output 投影层:解开输入嵌入和输出投影的权重,这一决定是为了以内存成本为代价获得更好的性能
- 位置嵌入:RoPE,选择使用 FP32 精度的逆频率矩阵,而不是 BF16 或 FP16,以优先考虑模型性能并获得更高的准确性
- 激活函数:SwiGLU
- Normal 方法:RMSNorm,前馈网络(FFN)的维度从隐藏大小的 4 倍减少到隐藏大小的 8/3 倍
- Context 长度:长度外推,苏剑林发现(https://spaces.ac.cn/archives/9577),在 QKV 注意力层中添加 bias 以增强模型的外推能力
📝通俗解释:Qwen在位置编码上使用更高精度的FP32,就像用更精确的尺子来测量位置,能让模型更准确地理解词与词之间的距离。
长度外推测试结果:
| 512 | 1024 | 2048 | 4096 | |
|---|---|---|---|---|
| w/o Bias | 52.37% | 33.15% | 22.85% | 17.87% |
| w/ Bias | 52.75% | 50.99% | 45.25% | 39.55% |
📝通俗解释:加了bias后,即使序列长度从1024扩展到4096,模型效果下降也相对较小(从51%降到40%),而不加bias则直接崩溃(从33%降到18%)。
其他外推技术:
- NTK-aware interpolation:动态 NTK-aware 插值,每个块比例不同
- LogN-Scaling:q 和 v 乘以一个系数,根据 context length 和 training length 的长度关系,来保持注意力的稳定
- Window Attention:将注意力限制在有限的上下文窗口内,防止模型关注距离太远的标记。基于这一发现,为每个层分配不同的窗口大小,对较低层使用较短的窗口,对较高层使用较长的窗口
Perplexity 指标对比:
| Model | Sequence Length | ||||
|---|---|---|---|---|---|
| 1024 | 2048 | 4096 | 8192 | 16384 | |
| QWEN-7B | 4.23 | 3.78 | 39.35 | 469.81 | 2645.09 |
| + dynamic_ntk | 4.23 | 3.78 | 3.59 | 3.66 | 5.71 |
| + dynamic_ntk + logn | 4.23 | 3.78 | 3.58 | 3.56 | 4.62 |
| + dynamic_ntk + logn + window_attn | 4.23 | 3.78 | 3.58 | 3.49 | 4.32 |
| QWEN-14B | - | 3.46 | 22.79 | 334.65 | 3168.35 |
| + dynamic_ntk + logn + window_attn | - | 3.46 | 3.29 | 3.18 | 3.42 |
📝通俗解释:Perplexity是衡量语言模型好坏的指标,越低越好。不加优化时,长文本的Perplexity会飙升到几千;加上这些技术后,即使16384长度也能保持在4左右,效果非常稳定。
3.5 Baichuan 系列篇
3.5.1 Baichuan2 篇
论文:Baichuan2
3.5.1.1 Baichuan2 系列数据预处理方式?
- 数据来源:来源收集数据,包括常规互联网网页、书籍、研究论文、代码库等,以构建一个广泛的世界知识体系
- 数据去重:构建了一个大规模的重复数据删除和聚类系统,支持 LSH 类似特征和稠密嵌入特征。最终只保留原始数据的 31.68% 的数据进行训练
数据清洗流程:
- Raw corpus (100%) → Exact deduplication (70.11%) → Heuristic approach (68.34%) → Sent-wise quality filter (65.28%) → Sent-wise, paragraph-wise deduplication (50.81%) → Document-wise deduplication (31.68%)
📝通俗解释:Baichuan2的数据清洗就像"精挑细选",从100%的原始数据中只保留31.68%的高质量数据,去掉了近70%的"垃圾"数据。
3.5.1.2 Baichuan2 系列 Tokenizer 处理方式?
字节对编码(BPE),不对输入文本应用任何规范化,也不添加虚拟前缀。将数字拆分为单独的数字,处理额外空格的代码数据,向分词器添加仅空格标记,最大标记长度设置为 32,以处理长中文词组。
3.5.1.3 Baichuan2 系列 Architecture?
- 位置嵌入:RoPE
- 激活函数:SwiGLU
- 注意力层:xFormers 减少内存
- Normal 方法:RMSNorm,并且规范化输出嵌入 lm_head。在我们规范化头部之后,在刚开始训练的 2000 step 左右训练变得非常稳定,这导致了更好的性能
- 最大 z 损失:在训练过程中,发现 LLM 的 logits 可能变得非常大。添加了一个最大 z 损失来规范化 logits。其中 z 是最大 logit 值,这有助于稳定训练,并使推理更加稳健地适应超参数
$$ \mathcal{L}_{\text{max-z}} = 2e^{-4} * z^2 $$
📝通俗解释:Baichuan2的"NormHead"技术就像给输出加了一个"稳定器",让训练过程更平稳,避免训练后期出现"崩溃"的情况。最大z损失则像给logits加了一个"限速器",防止数值过大导致不稳定。
3.6 GLM 系列篇
3.6.1 ChatGLM-6B 篇
论文:ChatGLM-6B
3.6.1.1 ChatGLM-6B 结构特点?
ChatGLM-6B 采用了 Prefix Decoder-only 的 Transformer 模型框架,在输入上采用双向的注意力机制,在输出上采用单向注意力机制。在模型细节上,做了以下几点改动:
- Embedding 层梯度缩减:为了提升训练稳定性,减小了 embedding 层的梯度。具体地,$word_embedding = word_embedding * \alpha + word_embedding.detach() * (1-\alpha)$,其中 $\alpha = 0.1$,这里 detach() 函数的作用是返回一个新的 tensor,并从计算图分离出来。梯度缩减的效果相当于把 embedding 层的梯度缩小了 10 倍,减小了梯度的范数
- Layer Normalization:采用了基于 Deep Norm 的 Post Layer Norm
- 激活函数:采用了 GeGLU 激活函数。相比于普通的 FFN,使用线性门控单元的 GLU 新增了一个权重矩阵,共有三个权重矩阵,为了保持参数量一致,中间维度采用了 $\frac{8}{3} * d$,而不是 $4d$
- 位置编码:去除了绝对位置编码,采用了旋转位置编码 RoPE
📝通俗解释:ChatGLM的Prefix Decoder结构比较特殊,输入部分能看到全局(双向),输出部分只能看之前的内容(单向)。这就像一个"先听后说"的学生,先理解整个问题,再逐步回答。
3.6.1.2 ChatGLM-6B 训练目标?
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 能力还缺少足够的验证。
📝通俗解释:Prefix Decoder训练效率较低,因为只对"答案"部分计算损失,而Causal Decoder对"问题+答案"都计算损失。但ChatGLM通过其他技术优化,效果依然不错。
3.6.1.3 ChatGLM-6B Tokenizer?
ChatGLM 在 25GB 的中英双语数据上训练了 SentencePiece 作为 Tokenizer,词表大小为 130528。
📝通俗解释:ChatGLM的词表有13万个词,比LLaMA大了4倍多,中文处理效率更高。
3.7 BLOOM 系列篇
3.7.1 BLOOM 篇
论文:BLOOM
3.7.1.1 BLOOM 训练数据构建?
BLOOM 系列模型是由 BigScience 团队训练的大语言模型。训练数据包含了英语、中文、法语、西班牙语、葡萄牙语等共 46 种语言,另外还包含 13 种编程语言。1.5TB 经过去重和清洗的文本,转换为 350B 的 tokens。训练数据的语言分布:
- English - 30.04%
- Chinese (Simplified) - 16.2%
- French - 12.9%
- Code - 10.8%
- Spanish - 10.8%
- Portuguese - 4.9%
- Arabic - 4.6%
- 其他语言 - 10.57%
📝通俗解释:BLOOM是一个真正的"多语言"模型,训练数据包含了46种语言,特别注重语言的多样性和包容性,中文占比约16%。
3.7.1.2 BLOOM 模型参数量?
BLOOM 模型有 560M、1.1B、1.7B、3B、7.1B 和 176B 这几个不同参数规模的模型。
BLOOMZ 系列模型是在 xP3 数据集上微调得到的,推荐用于英语提示的场景。
BLOOMZ-MT 系列模型是在 xP3mt 数据集上微调得到的,推荐用于非英语提示的场景。
3.7.1.3 BLOOM 模型结构?
模型结构上,与 GPT 相同,BLOOM 采用了 Causal Decoder-only 的 Transformer 模型结构。在模型细节上,做了以下几点改动:
- Embedding Layer Norm:在 Embedding 层后添加了一个 Layer Normalization,来使训练更加稳定
- Layer Normalization:为了提升训练的稳定性,没有使用传统的 Post Layer Norm,而是使用了 Pre Layer Norm
- 激活函数:采用了 GeLU 激活函数
- 位置编码:去除了绝对位置编码,采用了相对位置编码 ALiBi。相比于绝对位置编码,ALiBi 的外推性更好,即虽然训练阶段的最大序列长度为 2048,模型在推理过程中可以处理更长的序列
📝通俗解释:BLOOM使用ALiBi位置编码,这是一种"相对位置"编码,让模型更关注词与词之间的相对距离,而不是绝对位置。这样在处理长文本时效果更好。
3.7.1.4 BLOOM 训练目标?
BLOOM 的训练目标是语言模型,即根据已有的上文去预测下一个词。
3.7.1.5 BLOOM Tokenizer?
BLOOM 在多语种语料上使用 Byte Pair Encoding (BPE) 算法进行训练得到 Tokenizer,词表大小为 250880。
📝通俗解释:BLOOM的词表最大(25万个词),因为要支持46种语言,需要更多的词来覆盖各种语言的词汇。
四、分析与总结
Llama2、Qwen 和 Baichuan2 的论文从数据到技术结构详细公开其实现方式,Mistral 只是公开了针对 Context 长度较长时如何修改和优化网络结构。
4.1 大模型训练共同点?
Llama2、Qwen 和 Baichuan2 的论文都提到使用 RoPE 位置嵌入、SwiGLU 激活函数、RMSNorm 方法。并且都在尽可能实现更长长度的预测。
📝通俗解释:这些是当前大模型训练的"标准配置",就像现代汽车的标配:自动挡、涡轮增压、安全气囊等。
4.2 大模型训练不同点?
数据上:Qwen 和 Baichuan2 在去重上做了许多工作。并且 Qwen 在数据质量上做了两方面工作:首先过滤低质量语料,其次加入高质量指令提高预训练效果。
模型结构上:都在更长预测上下文长度进行提升,只是每个模型使用方式不一样。
- Llama2 使用 GQA
- Mistral 使用 Sliding Window Attention 和 Rolling Buffer Cache
- Qwen 在 QKV 注意力层中添加 bias 以增强模型的外推能力、NTK-aware interpolation、LogN-Scaling 和 window attention
- Baichuan2 使用规范化输出嵌入 lm_head 和最大 z 损失提升模型稳定性
- Qwen 在核心的矩阵计算中使用 FP32 换取更好效果
📝通俗解释:各模型"八仙过海,各显神通",用不同的技术手段来解决同一个问题——如何让模型处理更长的文本。每种方法都有优缺点,适用于不同的场景。
五、对比
5.1 LLaMA、ChatGLM 和 BLOOM 对比
| 模型 | 训练数据 | 训练数据量 | 模型参数量 | 词表大小 |
|---|---|---|---|---|
| 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 | Causal Decoder | RoPE | SwiGLU | Pre RMS Norm |
| ChatGLM-6B | Prefix Decoder | RoPE | GeGLU | Post Deep Norm |
| BLOOM | Causal Decoder | ALiBi | GeLU | Pre Layer Norm |
5.2 LLaMA、ChatGLM 和 BLOOM 的 Tokenizer 比较
| 模型 | 词表大小 | 中文平均 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 |
📝通俗解释:中文平均token数越低,说明分词效率越高。LLaMA中文需要1.45个token表示一个汉字(经常切碎),而BLOOM只需要0.53个(更完整)。
5.3 LLaMA、ChatGLM 和 BLOOM 的结果比较
- LLaMA 的词表是最小的,LLaMA 在中英文上的平均 token 数都是最多的,这意味着 LLaMA 对中英文分词都会比较碎,比较细粒度。尤其在中文上平均 token 数高达 1.45,这意味着 LLaMA 大概率会将中文字符切分为 2 个以上的 token
- Chinese LLaMA 扩展词表后,中文平均 token 数显著降低,会将一个汉字或两个汉字切分为一个 token,提高了中文编码效率
- ChatGLM-6B 是平衡中英文分词效果最好的 Tokenizer。由于词表比较大,中文处理时间也有增加
- BLOOM 虽然是词表最大的,但由于是多语种的,在中英文上分词效率与 ChatGLM-6B 基本相当。需要注意的是,BLOOM 的 Tokenizer 用了 Transformers 的 BloomTokenizerFast 实现,分词速度更快
分词示例:
原文:"男儿何不带吴钩,收取关山五十州。"(共16字)
- LLaMA 分词为 24 个 token:切得很碎
- Chinese LLaMA 分词为 14 个 token:较为完整
- ChatGLM-6B 分词为 11 个 token:最完整
- BLOOM 分词为 13 个 token:较为完整
📝通俗解释:从例子可以看出,ChatGLM-6B的分词最符合直觉("男儿"、"何不"、"关山"等作为一个整体),LLaMA则把每个字都拆开了,就像把成语拆成单个字来理解,自然效率低很多。
致谢
感谢 AiGC面试宝典 和作者 宁静致远 的整理分享。