大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模型领域最新技术跟踪。若对于具身智能感兴趣的请移步具身智能专栏。技术宅麻烦死磕AI架构设计。
Mistral 7B是AI社区中讨论最多的语言模型之一,它是由Mistral AI于 2023年10月在论文“Mistral 7B”中引入的,Mistral AI是一家法国初创公司,也是目前开源大型语言模型研发的领先公司。正如在原始论文中提到的那样,Mistral经过精心设计,具有卓越的性能和效率,优于最好的开放式13B。在初步介绍了Transformer的架构以及注意力机制之后,将Mistral 7B的介绍放在这个时间节点,目前是对两者进行对比,让读者有更深的印象。
Mistral 7B
Mistral 7B 是decoder-only的模型,这意味着它有着类似于transformer架构的解码器模块。如今大多数语言模型都是解码器模型,因为它们的场景不是服务于双向处理的文本生成。Mistral 7B使用大小为4096的Embedding<移步“初识Embedding”>,这意味着每个标记都由 4096 维向量表示。注意力块有32个head<移步“深入注意力机制”>,而Transformer 有8个head,但Mistral使用multi-head注意力机制的变种,带有滑动窗口的分组查询的注意力 (GQA-Grouped Query Attention)。Mistral 7B的上下文长度为 8192,这意味着在预测序列中的下一个Token,它最多可以带上8192个Tokens。
滑动窗口注意力
Mistral 7B引入的较新概念之一是滑动窗口注意力,而不是通常的多头注意力。在正常的self-attention的机制中,每个Token都和它前面的所有Token都进行注意力分析。而Mistral采用的方式则是使用大小为 w 的滑动窗口,该窗口不允许Token与超出窗口的Token进行注意力联动。
如上图所示,窗口大小为3与因果掩码一起极大地有助于加快训练和推理速度,执行了更少的点积计算。聪明的读者会想到会不会导致输出质量下降,毕竟无法捕获完整的上下文。
其实大语言模型由多个相互堆叠的转换器块(Block)组成,意味着有n个转换器块一个堆叠一个。在 Mistral 7B 的情况下是 32 个。这允许Token间接查找与其他Token的关系。
如上图最左侧的图形所示,引入了滑动窗口,Token之间的注意力就需要间接的关联。虽然“on”不考虑第一个单词“The”,但由于堆叠变压器块的传递性质,“on”一词间接地与“The”一词有关。大白话的讲,滑动窗口注意力机制将直接注意力限制在有限的窗口,然后通过多层转换器的模块使得信息在整个序列中传播。<有点类似CNN,下图左>。
滚动缓冲区
Mistral的另一个主要组件是具有滚动缓冲区的KV Cache。由于Mistral是仅解码器模型,因此它是围绕着针对下个Token的预测任务进行训练。
它的推理方式是:从开始Token的特殊令牌为输入开始的标记,然后生成第一个Token。紧接着使用开始Token和第一个生成的Token作为上下文生成第二个Token,如此类推,直到遇到另一个称为结束Token的特殊Token。
因此,在每个时间步都会预测下个Token,将其与输入连接起来并重复该过程。为了避免重复在上个时间步中已计算过的的大量冗余计算,Mistral 采用一种称为键值(KV) 缓存的方法来优化此过程,其中仅缓存键和值向量,同时在每个步骤更新查询向量。这允许模型在多个步骤中重复的使用键和值向量,从而减少冗余计算加快推理速度。
Mistral在注意力块中采用了滑动窗口技术,因此不需要对不属于窗口大小的Token执行计算。因此缓存的大小限制在滑动窗口的范围。在实际工作中,它会循环覆盖之前的缓存,节省了空间的占用率。
当然,语言模型通常与一些PROMPT一起配合使用,由于在 Mistral 中使用了 KV 缓存,可以进行预填充KV缓存。如果PROMPT非常大,可以将其分块成更小的块,并用每个块预填充缓存。
Mixtral 8x7B
Mistral AI还在2024年1月的论文“Mixtral of Experts”中介绍了Mixtral 8x7B,它与Mistral 7B具有相同的架构,但引入了稀疏混合专家的概念,其中每层由8个前馈块组成,称为专家<具体可以移步链接>。专家混合是一种集成技术,在这种技术中,有多个“专家”模型,每个模型都对数据的一个子集进行训练,然后将专家的输出组合在一起以产生一个单一的输出。
Mixtral 8x7B和Mixtral 7B的参数对比
在Mixtral 8x7B中,对于每个Token,路由器网络在每一层都会选择两个专家来处理当前状态并组合他们的输出。因此,每个Token都可以访问 47B参数,但在推理过程中仅使用13B的激活参数。如此可以训练一个具有大量参数的语言模型来捕获更多信息,但不会牺牲推理时间。
下面为一个例子,专家的选择似乎更多地与语法而不是领域保持一致,尤其是在初始层和最终层。