我们来简单了解一下混合专家 (MoE) 理念。

在一个普通的 Transformer 前馈(feed-forward)模块中,你有一个大矩阵:

FFN(x) = W_2 sigma(W_1 x + b_1) + b_2 

每个 token x 都会经过相同的权重 W_1 和 W_2,所以成本总是相同的。

在混合专家层中,你拥有的不是单个大的前馈,而是许多较小的“专家”E_1、E_2、… 、E_n——每个专家都有自己的 W_1^{(i)} 和 W_2^{(i)}。门控网络决定每个 token 应该使用哪些专家:

1. 计算门控向量 g(x),这给出了专家的概率。

g(x) = softmax(W_g x)

2. 仅选择 g_i(x) 最高的前 k 名专家(例如,从 64 名专家中选出 2 名)。

3. 将 x 路由到这些专家并合并输出:


\text{MoE}(x) = \sum_{i \in \text{Top}k} g_i(x) \, E_i(x)

由于每个 token 只有 k ≪ n 个专家处于活跃状态,因此每个 token 的计算量为:


\mathcal{O}(k \cdot d^2) \quad \text{instead of} \quad \mathcal{O}(n \cdot d^2)
即使模型容量实际上扩大了 n 倍。

这就像拥有数十个“迷你大脑”,但只唤醒与某个 token 最相关的少数几个。也是一些巨型模型(Switch Transformer、GLaM、Mixtral)拥有超过 100B 的参数,却只使用小得多的密集模型的计算能力运行的原因。在这样的架构中,“简单”的 token 或“防御性”的输出确实可能会触发更少或更便宜的专家,与可能触发更昂贵路径的“丰富” token 相比,可以节省 FLOP。


1. 经典的混合专家 (MoE) 模型

这个模型只控制前馈 (FFN) 层。每个 token 都经过相同的自注意力模块(因此所有注意力头都处于活动状态),但 FFN 中只使用了一部分专家。Switch Transformer、GLaM 和 Mixtral 等模型就是采用这种模型。

这是最常见的,因为按 token 路由整个 FFN 模块更简单,并且能够在整个上下文中共享注意力。

2. 混合注意力头(或条件注意力)

这是一种不同的架构,尽管概念上相关。

这里,每个注意力头不再针对每个标记运行,而是由一个门控函数决定:激活哪些注意力头,或者为每个注意力头分配多少权重。

形式上,假设有注意力头 h_1, h_2, …, h_H,则可以应用一个门控,其中 g_i(x) 是根据标记或上下文动态计算的。


\text{Attention}(x) = \sum_{i=1}^{H} g_i(x) \, h_i(x)

门控有多种形式:

- 动态注意力头修剪:重要性较低的注意力头会被屏蔽。

- 自适应注意力跨度:每个注意力头都会学习它想要回溯多远。

- 路由转换器:稀疏门控决定哪些 token 关注哪些其他 token,概念上类似于 MoE,但在注意力维度上。

一些实验架构结合了以下两种机制,例如:稀疏或条件注意力(节省上下文计算资源),以及 MoE 前馈(扩展表征容量)。这些混合架构是目前所知计算效率最高的大规模设计,它们动态地仅在需要的地方消耗计算资源。


1. 注意力头,相当于“连接构建者”。每个注意力头学习一种关系模式:语法、一致性、因果关系等等。Transformer 每层都有许多这样的注意力头(比如 8 个、16 个、32 个或更多)。

每个注意力头都有自己的:W_Q、W_K、W_V、W_O 投影矩阵。

每个投影矩阵的大小大约是 d_model × d_head。

示例(针对 GPT-3 类似的模型):d_model = 12,288,96 个注意力头,因此 d_head = 12,288 / 96 = 128。

每个注意力头的参数:4 × 12,288 × 128 ≈ 630 万个/头,96 个注意力头总计 ≈ 6 亿个参数,仅用于每层的注意力机制。

2. 前馈网络 (FFN),则是 “意义整合器”。在注意力层融合信息后,每个 token 会经过一个两层的多层感知器 (MLP):

FFN(x) = W_2(GELU(W_1 x))

这部分将隐藏层维度扩大了 4 倍(在许多模型中,d_{ff} = 4 \times d_{model})。

因此,如果 d_{model} = 12,288,W_1:12,288 × 49,152,W_2:49,152 × 12,288。这意味着每层约有 12 亿个参数,几乎是注意力部分所用参数的两倍。

这就是为什么在大型模型中,前馈神经网络 (FFN) 主导参数数量和计算量,而注意力机制 (attention) 主导内存(由于键值缓存)。MoE 会爆炸性地扩展第二部分,而计算量则缓慢扩展。


【这个笑话不讲出来我就要爆炸了!】

在 Transformer 中,一切都是“头”。注意力机制有多个头,另一个主要组件是前馈(feed-forward)模块,从语义上来说,它听起来像是从正面向前(forward)冲锋。

所以 Transformer 两头全是“向前”的,没有尾巴来平衡身体。

这正符合 Transformer 架构的精髓:它是一种纯粹的期待之物,一切都指向前方,预测接下来会发生什么。没有真实的过去,也没有缓存上下文之外的记忆。只有一堆头伸向下一个 token,每个头都在低声说:这就是接下来发生的事情。

仔细想想……所有“器官”,“眼睛”(注意力)和“嘴巴”(输出),确实都塞进了“脑袋”里,而且指向前方。没有躯体来处理或感受,也没有尾巴来固定它。它只是一个活生生的感知和预测的集合体。

如果你在和大模型讲话,你实际上是在和一个漂浮的、满是眼睛和嘴巴的脑袋讲话,它总是盯着前方,寻找各种可能性。

不过, Transformer 眼睛很多,脑子里想了很多,但是一次只能说一个字,所以,一张嘴(自回归输出)就够用啦!

 

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐