系列目录-大模型学习篇
问题场景(Problems)
在了解Transformer架构以后,我们介绍了attetion机制和位置编码函数,紧接着学习了旋转位置编码。本章节我们就初步了解一些常见的大模型结构和相关基础知识。
解决方案(Solution)
相关的术语:
AI (人工智能)
ML(机器学习)
DL(深度学习)
foundation model (基础模型)
LLM (大语言模型)
GPT4(OpenAI的应用产品)
从上到下,依次为上面的子集。
Generation AI (生成式AI)
可以指任何需要生成文本、语音、视频和图像的场景。
对于大模型而言,我们需要了解具有代表性的三个开源模型:Llama、ChatGLM和BLOOM。
模型 | 训练数据 | 训练数据量 | 模型参数量 | 词表大小 | 模型结构 | 模型结构 | 激活函数 | layer norm |
---|---|---|---|---|---|---|---|---|
LLaMA | 以英语为主的拉丁语系,不包含中日韩文 | 1T/1.4T tokens | 7B、13B、33B、65B | 32000 | Casual decoder | RoPE | SwiGLU | Pre RMS Norm |
ChatGLM | 中英双语,中英文比例为 1:1 | 1T tokens | 6B | 130528 | Prefix decoder | RoPE | GeGLU | Post Deep Norm |
Bloom | 46 种自然语言和 13 种编程语言,包含中文 | 350B tokens | 560M、1.1B、1.7B、3B、7.1B、176B | 250880 | Casual decoder | ALiBi | GeLU | Pre Layer Norm |
由于前文已经介绍过RoPE位置编码,此处不再进行介绍。需要注意的是:虽然Llama和chatGLM都使用了RoPE,但是在源码实现上Llama是将RoPE放在了multiHeadAttention类里面,每次进行自注意力机制计算前都要进行一次RoPE变换,而ChatGLM只是在输入层进行了RoPE的变换操作,其他层没有进行操作。
针对表格的内容,我们介绍一下模型架构(casual decoder、prefix decoder、encoder-decoder)的区别:
(1)encoder-decoder:
模型由两种block组成,encoder block和decoder block,其中decoder block比encoder block多一个掩码多头注意力机制。
掩码方式为:输入时是双向注意力掩码,输出时是单向注意力掩码
优点:在输入上采用双向注意力,对问题的编码理解更充分
缺点:在长文本生成任务上效果差,训练效率低。
代表模型:T5、Flan-T5、BART。
(2)casual decoder:
掩码方式:单向注意力掩码,确保每个输入token只能注意到过去的token和它本身。Causal Decoder是一种自回归模型,这种模型架构适用于文本生成任务,如文本续写或问答系统,因为它可以保证生成文本的连贯性。
优点:文本生成任务效果好,训练效率高,zero-shot 能力更强,已被证明具有涌现能力
缺点:生成效率低,序列生成结果的前后依赖性强。
代表模型:GPT/LLaMA/BLOOM系列模型
(3)prefix decoder:
掩码方式:输入部分采用双向注意力机制,任意两个token都可以相互看见。输出部分采用单向注意力,待生成的token可以看到Encoder侧所有token(包括上下文)和Decoder侧已经生成的token,但不能看未来尚未产生的token。允许模型同时考虑前缀信息和单向生成特性,主要用于条件生成任务,比如机器翻译、摘要生成等。
优点:灵活性更高:,前缀部分提供了上下文信息,能够更好地控制生成的主题或风格,或者改善生成质量 。
缺点:prefix的token互相能看到,可以让模型充分学习到前缀包含的上下文信息,但是训练效率低。因为在相同训练量下,关注到的token数量要少于casual decoder模型。另外,前缀质量也成为了影响模型性能的一个限制因素。
代表模型:ChatGLM系列模型,ChatGLM、ChatGLM2、U-PaLM
LlaMA(casual decoder):
LLaMA-7B 有 32 个 transformer 层,隐藏维度为 4096。LLaMA 原模型的词表大小是 32000,tokenizer 主要是在英文语料上进行训练的,在中文上和多语种上效果比较差。LLaMA 在中文上效果差,一方面是由于 LLaMA 模型是在以英文为主的拉丁语系语料上进行训练的,训练语料不包含中文;另一方面,与 tokenizer 有关,词表规模小,可能将一个汉字切分为多个 token,编码效率低,模型学习难度大。
LLaMA 词表中只包含了很少的中文字符,在对中文文本进行分词时,会将中文切分地更碎,需要多个 token 才能表示一个汉字,编码效率很低。Chinese LLaMA 扩展中文词表后,单个汉字倾向于被切分为 1 个 token,避免了一个汉字被切分为多个 token 的问题,提升了中文编码效率。
Chinese LLaMA的训练&微调:
①在中文语料上使用 Sentence Piece 训练一个中文 tokenizer,然后将中文 tokenizer 与原始的 LLaMA tokenizer 合并起来,获得一个合并的 tokenizer,词表大小为 49953。
②将 transformer 模型的 embedding 矩阵扩展,新加入的中文 token 附加到原始 embedding 矩阵的末尾。
③在中文语料上进一步预训练,冻结和固定 transformer 的模型参数,只训练 embedding 矩阵。
④在指令微调阶段,可以放开全部模型参数进行训练。
ChatGLM(prefix decoder):
ChatGLM-6B 采用了与GLM-130B[4]相同的模型结构。使用的Tokenizer是SentencePiece,词表大小为 130528。截止到 2022 年 7 月,GLM-130B 只训练了 400B 的 tokens,中英文比例为 1:1。ChatGLM-6B 则使用了更多的训练数据,多达 1T 的 tokens,训练语料只包含中文和英文,中英文比例为 1:1。
在训练目标上,ChatGLM-6B 的训练任务是自回归文本填空。相比于采用 causal decoder-only 结构的大语言模型,为什么prefix decoder的训练效率低呢?因为causal decoder 结构会在所有的 token 上计算损失,而 prefix decoder 只会在输出上计算损失,而不计算输入上的损失。所以,在有相同数量的训练 tokens 的情况下,prefix decoder 要比 causal decoder 的效果差,因为训练过程中实际用到的 tokens 数量要更少。
BLOOM(casual decoder):
BLOOM 的训练目标是语言模型,即根据已有的上文去预测下一个词。关于tokenizer,BLOOM 在多语种语料上使用 Byte Pair Encoding(BPE)算法进行训练得到的 tokenizer,词表大小为 250880。BLOOM的训练数据包含了英语、中文、法语、西班牙语、葡萄牙语等共 46 种语言,另外还包含 13 种编程语言。1.5TB 经过去重和清洗的文本,转换为 350B 的 tokens。训练数据的语言里面中文语料占比为 16.2%。模型结构上,与 GPT 相同,BLOOM 采用了 causal decoder-only 的 transformer 模型结构。在模型细节上,做了以下几点改动:
1)embedding layer norm:在 embedding 层后添加了一个 layer normalization,来使训练更加稳定。
2)layer normalization:为了提升训练的稳定性,没有使用传统的 post layer norm,而是使用了 pre layer Norm。
3)激活函数:采用了 GeLU 激活函数,而不是ReLU,增加了收敛速度和训练稳定性。
4)位置编码:去除了绝对位置编码,采用了相对位置编码 ALiBi。相比于绝对位置编码,ALiBi 的外推性更好,即虽然训练阶段的最大序列长度为 2048,模型在推理过程中可以处理更长的序列。
相关问答(Q&A)
以下是一些开放性的问题,欢迎各位读者给出自己的见解,并在评论区对笔者提出批评和指正,谢谢。
问题一:为何现在的大模型大部分是Decoder only结构?
1)decoder-only结构模型在没有任何微调数据的情况下,zero-shot的表现能力最好。
encoder decoder则需要在一定量的标注数据上做multitask-finetuning才能够激发最佳性能。
2)因为Encoder的双向注意力会存在低秩问题,这可能会削弱模型的表达能力。
Attention矩阵本身就是由一个低秩分解矩阵加softmax而来,具体来说就是一个n* d的矩阵与d* n的矩阵相乘后再加softmax,其中n是远远大于d的,这种形式的Attention矩阵会因为低秩问题而带来表达能力下降。
解释:Decoder-only架构的attention矩阵是一个下三角,三角阵的行列式等于它对角线元素之积,由于softmax的存在,对角线必然都是正数,所以它的行列式必然是正数,即Decoder-only架构的Attention矩阵一定是满秩的!满秩意味着理论上有更强的表达能力。
问题二:为什么大模型具有涌现能力?
1)任务的评价指标不够平滑;
2)宏观上看到了涌现现象,但是子任务效果其实是平滑增长的。
比如我们假设某个任务 T 有 5 个子任务 Sub-T 构成,每个 sub-T 随着模型增长,指标从 40% 提升到 60%,但是最终任务的指标只从 1.1% 提升到了7%。
经验总结(Conclusion)
在学习大模型时,要注意实践和理论结合,很多有趣的开放平台和开源框架都可以自己尝试玩一玩。尝试本地部署以后微调跑一跑,可以在枯燥的理论之余获得额外的乐趣。