news 2026/8/29 3:56:19

FFN、SwiGLU 、MoE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FFN、SwiGLU 、MoE

FFN、SwiGLU 与 MoE

1. FFN

FFN(Feed-Forward Network)是 Transformer Block 中除 Attention 外的另一核心模块,对每个 token 独立进行非线性特征变换

经典 FFN:

FFN(x)=W2σ(W1x) \mathrm{FFN}(x)=W_2\sigma(W_1x)FFN(x)=W2σ(W1x)

通常维度变化为:

dmodel→dff→dmodel d_{\text{model}} \rightarrow d_{\text{ff}} \rightarrow d_{\text{model}}dmodeldffdmodel

一般有:

dff>dmodel d_{\text{ff}}>d_{\text{model}}dff>dmodel

例如:

4096→16384→4096 4096\rightarrow16384\rightarrow40964096163844096

即:

先升维扩展特征,再降回 hidden size。

不过这并不是强制要求,在一些现代模型,尤其是 MoE Expert 中,也可能有:

dff<dmodel d_{\text{ff}}<d_{\text{model}}dff<dmodel

PyTorch 实现

importtorchimporttorch.nnasnnclassFFN(nn.Module):def__init__(self,d_model,d_ff):super().__init__()self.up=nn.Linear(d_model,d_ff)self.activation=nn.GELU()self.down=nn.Linear(d_ff,d_model)defforward(self,x):x=self.up(x)x=self.activation(x)x=self.down(x)returnx

2. SwiGLU

SwiGLU 可以看作一种带门控机制的 FFN 变体,广泛应用于 LLaMA、Qwen 等现代大模型。

核心公式:

SwiGLU(x)=Wdown[SiLU(Wgatex)⊙(Wupx)] SwiGLU(x)= W_{\text{down}} \left[ \mathrm{SiLU}(W_{\text{gate}}x) \odot (W_{\text{up}}x) \right]SwiGLU(x)=Wdown[SiLU(Wgatex)(Wupx)]

相比普通 FFN,SwiGLU 增加了一条 Gate 分支:

g=SiLU(Wgatex) g=\mathrm{SiLU}(W_{\text{gate}}x)g=SiLU(Wgatex)

u=Wupx u=W_{\text{up}}xu=Wupx

然后进行逐元素相乘:

h=g⊙u h=g\odot uh=gu

最后再映射回模型维度:

y=Wdownh y=W_{\text{down}}hy=Wdownh

其中包含三个线性投影:

Wgate,Wup,Wdown W_{\text{gate}}, \quad W_{\text{up}}, \quad W_{\text{down}}Wgate,Wup,Wdown

其中:

SiLU(Wgatex) \mathrm{SiLU}(W_{\text{gate}}x)SiLU(Wgatex)

可以理解为一个Gate,动态控制 (W_{\text{up}}x) 中哪些特征被保留。

因此可以简单记为:

SwiGLU = 带 SiLU 门控机制的 FFN。

PyTorch 实现

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassSwiGLU(nn.Module):def__init__(self,d_model,d_ff):super().__init__()self.gate_proj=nn.Linear(d_model,d_ff)self.up_proj=nn.Linear(d_model,d_ff)self.down_proj=nn.Linear(d_ff,d_model)defforward(self,x):gate=F.silu(self.gate_proj(x))up=self.up_proj(x)x=gate*up x=self.down_proj(x)returnx

3. MoE

MoE(Mixture of Experts,混合专家)可以理解为:

将 Transformer 中的一个 FFN 替换成多个 FFN Expert,再通过 Router 为每个 token 选择少量 Expert。

假设共有 (N) 个 Expert:

E1,E2,…,EN E_1,E_2,\ldots,E_NE1,E2,,EN

Router 首先根据 token hidden state (x) 计算各个 Expert 的路由分数:

r=Wrx r=W_rxr=Wrx

经过 Softmax:

p=softmax⁡(r) p=\operatorname{softmax}(r)p=softmax(r)

其中:

pi p_ipi

表示当前 token 被分配到第 (i) 个 Expert 的概率。

随后只选择概率最高的 Top-(K) 个 Expert:

E(x)=TopK⁡(p) \mathcal E(x)=\operatorname{TopK}(p)E(x)=TopK(p)

最终输出:

y=∑i∈E(x)piEi(x) y= \sum_{i\in\mathcal E(x)} p_iE_i(x)y=iE(x)piEi(x)

例如共有 8 个 Expert,使用 Top-2 Routing,则每个 token 只经过其中两个 Expert,而不是计算全部 8 个 Expert。

MoE 的核心优势在于:

大量总参数+少量激活参数 \boxed{ \text{大量总参数} + \text{少量激活参数} }大量总参数+少量激活参数

即模型可以拥有大量不同的 Expert 参数,但一个 token 只需要计算其中少数几个 Expert。

MoE 中的 Expert 本质上通常就是 FFN,现代模型中也经常直接使用SwiGLU FFN作为 Expert。

简单 PyTorch 实现

下面以Top-2 MoE为例:

importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassExpert(nn.Module):def__init__(self,d_model,d_ff):super().__init__()self.gate_proj=nn.Linear(d_model,d_ff)self.up_proj=nn.Linear(d_model,d_ff)self.down_proj=nn.Linear(d_ff,d_model)defforward(self,x):gate=F.silu(self.gate_proj(x))up=self.up_proj(x)returnself.down_proj(gate*up)classMoE(nn.Module):def__init__(self,d_model,d_ff,num_experts=8,top_k=2):super().__init__()self.num_experts=num_experts self.top_k=top_k# Routerself.router=nn.Linear(d_model,num_experts)# Expertsself.experts=nn.ModuleList([Expert(d_model,d_ff)for_inrange(num_experts)])defforward(self,x):# x: [batch, seq_len, d_model]batch_size,seq_len,d_model=x.shape# 将 token 展平x=x.reshape(-1,d_model)# [num_tokens, d_model]# Router 计算每个 Expert 的概率router_logits=self.router(x)router_probs=F.softmax(router_logits,dim=-1)# 选择 Top-K Experttopk_probs,topk_indices=torch.topk(router_probs,k=self.top_k,dim=-1)# Top-K 权重重新归一化topk_probs=topk_probs/topk_probs.sum(dim=-1,keepdim=True)output=torch.zeros_like(x)# 将 token 分配给对应 Expertforexpert_id,expertinenumerate(self.experts):forkinrange(self.top_k):mask=(topk_indices[:,k]==expert_id)ifmask.any():expert_input=x[mask]expert_output=expert(expert_input)weight=topk_probs[mask,k].unsqueeze(-1)output[mask]+=(weight*expert_output)returnoutput.reshape(batch_size,seq_len,d_model)

例如:

moe=MoE(d_model=4096,d_ff=1024,num_experts=8,top_k=2)
  • Hidden Size:4096
  • 每个 Expert 的中间维度:1024
  • 总 Expert 数:8
  • 每个 token 激活:2 个 Expert
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 3:56:07

基于大语言模型的智能BI平台架构设计与企业级实践

简介&#xff1a;自然语言处理&#xff08;NLP&#xff09;与数据分析的结合&#xff0c;正推动商业智能&#xff08;BI&#xff09;工具的范式革新。其核心原理在于利用大语言模型&#xff08;LLM&#xff09;强大的语义理解能力&#xff0c;将用户的自然语言查询意图&#xf…

作者头像 李华
网站建设 2026/8/29 3:54:12

分布式电源接入配电网可靠性评估:项目实战解析

简介&#xff1a;在新能源高比例接入背景下&#xff0c;配电网从单电源辐射状结构演变为多电源主动网络&#xff0c;可靠性评估成为规划与运行的关键环节。以分布式电源接入为切入点&#xff0c;解析配电网可靠性评估的核心指标&#xff08;如SAIFI、ENS&#xff09;与建模要点…

作者头像 李华
网站建设 2026/8/29 3:51:52

开源AI网站优化平台如何重新定义“优化”?

为什么说 OptiQra 这类开源 AI 网站优化平台&#xff0c;正在重新定义“优化”这件事&#xff1f;先抛一个问题&#xff1a;你现在做网站优化&#xff0c;靠的是什么&#xff1f;大概率是这一套组合拳&#xff1a;Google Analytics 看流量&#xff0c;热力图工具看点击&#xf…

作者头像 李华
网站建设 2026/8/29 3:48:29

蓝桥杯国赛经典题解析:带约束BFS在“穿越雷区”中的实战应用

1. 项目概述&#xff1a;从“穿越雷区”看蓝桥杯国赛的算法思维看到“穿越雷区”这个题目&#xff0c;很多参加过蓝桥杯国赛的老选手估计都会心一笑。这确实是第六届蓝桥杯软件类国赛&#xff08;C/C组&#xff09;的一道经典题目&#xff0c;它不像某些纯数学题那样烧脑&#…

作者头像 李华
网站建设 2026/8/29 3:45:37

SEA驱动机械臂的自适应动态面变阻抗控制设计

简介&#xff1a;机器人控制中&#xff0c;柔顺性是保证机械臂安全交互的关键。串联弹性执行器&#xff08;SEA&#xff09;通过引入弹簧柔性&#xff0c;能有效提升力矩控制精度与碰撞安全性&#xff0c;但低频谐振限制了系统带宽。阻抗控制将机械臂末端建模为质量-阻尼-弹簧系…

作者头像 李华
网站建设 2026/8/29 3:45:30

从可解释到可控:TrustNLP六年演进与NLP模型控制落地指南

TrustNLP 研讨会这些年最值得被记住的一条主线&#xff0c;是把问题从可解释性推向了控制。可解释性回答“模型为什么这么预测”&#xff0c;控制回答“怎么让模型不这么做、只能那么做”。这个转变不是换个热门词&#xff0c;而是可信 NLP 从分析走向工程化部署时必然会发生的…

作者头像 李华