MoE混合专家模型详解:稀疏激活、路由算法与工程实践

有段时间没聊架构层面的东西了,今天想好好写一写MoE(Mixture of Experts,混合专家)。这两年它几乎成了超大模型的标准配置,GPT系列、各类开源大模型都在用,开源社区里也越来越多出现基于MoE的模型。核心原因就一条:MoE能在不增加推理计算量的前提下,把参数量做上去,也就是“稀疏激活”带来的效率红利。

这篇文章我会从数学原理讲到工程实现,重点放在稀疏激活到底怎么算、路由和负载均衡loss的设计逻辑、以及真正落地时那些文档里不常写的坑。适合想从用户视角转向模型内部实现的人,或者已经在跑大模型、想搞清楚参数量与计算量关系的同学。

1. MoE架构的整体思路与设计动机

1.1 从稠密模型到稀疏模型:参数和计算不再是同一件事

先想一个问题:一个稠密的Transformer模型,比如某一层是d_model=4096的FFN,它对每个token都做同样计算。无论token是“你好”还是“量子纠缠的数学表达”,它都要经过同样规模的矩阵乘法。这意味着模型的参数量基本决定了推理时的计算量——一次前向要把所有参数都用一遍。

MoE要打破的就是这个绑关。它的思路很朴素:如果模型有很多个“专家”子网络,而每个token只挑少数几个专家来算,那参数总量可以很大,但单个token的计算量只由被激活的专家数量决定。这就是稀疏激活的核心含义。

用一个生活化的类比:一个综合医院的科室配置。医院里可能有一百个科室(大量专家),但一个病人只去两三个科室(Top-2稀疏激活)。医院要维护整个大楼(显存加载全部参数),但每个病人看病的时间只取决于他去的科室数量,而不是科室总数。MoE本质上就是这个逻辑。

1.2 为什么说“成本不变、能力变大”

这里要区分两个容易混的概念:参数量(Memory Footprint)和计算量(FLOPs)。MoE并不减少显存占用,恰恰相反,它通常会显著增加显存需求——因为所有专家参数都必须驻留在内存里。它的优势集中在推理的FLOPs上:一个200B参数的MoE模型,如果每次只激活2个专家,那单token的FFN计算量可能只相当于一个20B稠密模型。这就是为什么很多模型号称有“几百B参数”,但实际部署推理速度却接近小模型。

但有一个容易被忽略的推论:训练成本并不会因为稀疏而大幅降低。因为训练时要更新所有专家的梯度,每个专家都要有样本流过,从整体训练FLOPs来看,MoE相比稠密模型并不省。省的是推理时的单token计算量。这个认知差异我见过很多人栽过,别以为是“白嫖”了参数量。

1.3 适合MoE的场景和反例

适合的场景包括:超大语言模型的推理服务、多任务场景(不同专家可能隐式分工)、以及需要容量大但单次推断不要太高延迟的场景。

不适合的情况也很明确:小模型(比如参数量不到1B)加MoE收益很低,路由开销占比过大;对显存有严格限制的边缘部署也不适合;训练资源紧缺的场景更不适合,因为MoE训练对通信带宽和稳定性要求很高。

2. 稀疏激活的数学原理详解

2.1 从Router说起:门控函数的定义

MoE层里最重要的两个组件:Router(路由器,也叫Gate)和专家网络(Expert)。专家网络通常就是FFN结构,数学上与标准Transformer FFN没区别,只是数量上有E个(比如8个、64个、甚至128个)。

Router本质是一个线性层,输入是token的隐层向量 x,输出是E维的logits。写作:

h(x) = W_r · x

W_r 的维度是E × d_model。然后对logits做softmax,得到每个专家的概率分布:

p_i(x) = softmax(h(x))_i = exp(h_i(x)) / Σ_j exp(h_j(x))

如果Top-2,就取p值最大的两个专家,其余概率直接置零。最终输出是:

y = Σ_{i ∈ TopK(x)} p_i(x) · E_i(x)

这里E_i(x)代表第i个专家网络的输出。有些实现会把p_i再归一化一次(除以TopK范围内的概率和),保证两个专家的权重和等于1。有的实现(比如Switch Transformer的Top-1)更简单,直接取最大概率那个专家:

y = p_k(x) · E_k(x)

注意一个细节:加权求和中的p_i来自于Router的softmax概率,不是logits。这两个东西的区别在于,logits经过softmax后会改变相对比例,概率分布会让最优专家的权重占比更大。这个设计背后的意图是让Router的输出不仅决定“选谁”,还决定“按多大权重混合”,相当于给每个token的专家输出做一个软混合。

2.2 Top-K选择:稀疏性是L0范数的体现

“稀疏激活”的数学本质可以理解为:对每个token,我们施加了一个L0约束,即选中专家集合的基数不超过K。形式化表达:

S(x) = { i | p_i(x) ∈ TopK({p_j(x)}) } |S(x)| = K

当K远小于E时,理论上每个token需要计算的专家参数只有全部参数的 K/E。这个比例决定了计算的稀疏程度。

但要强调一个容易误解的点:单个token是稀疏的,但一个batch整体通常不是稀疏的——因为不同token选的是不同专家,从设备角度看,每一个专家几乎都会收到来自某个token的请求。所以真正意义上的稀疏只存在于单token计算图上,不体现在数据流层面。工程上为了让这个稀疏带来真实收益,必须配合“专家并行”把每个专家放到不同设备上,否则单卡上所有专家参数依然都要参与计算器的加载和矩阵乘法。

这里有一条重要的实操经验:MoE的稀疏性收益不是天然就有,它依赖并行方案。在实现时如果所有专家都在一张卡上,那么这个“稀疏”更多只是数学形式上的描述,FLOPs并没有实质下降。

2.3 负载均衡:辅助损失(Load Balance Loss)的公式与直觉

稀疏路由带来了一个致命问题:如果所有token都倾向选择同一个专家,那么专家1就过载,其他专家完全闲置。这样不仅浪费资源,而且由于专家权重的更新频率差异,训练也会很不稳定。

解决方式是引入一个辅助损失函数,惩罚路由分布的不均衡。业界最经典的负载均衡loss来自Switch Transformer / GShard,定义如下:

L_aux = α · E · Σ_{i=1}^{E} f_i · P_i

其中:

  • f_i表示被分配给第i个专家的token数占batch总token数的比例:f_i = count_i / Σ_j count_j
  • P_i表示Router对所有token分配给专家i的平均概率:P_i = (1/T) Σ_{t∈batch} p_i(x_t)
  • E是专家数量
  • α是权重超参,常见初始值在0.01到0.1之间

这个loss为什么能平衡?看f_i和P_i的乘积结构。当所有token均匀分配给各专家时,f_i大概都是 1/E,P_i也接近 1/E,乘积和接近 1,L_aux 接近 α。当分布极度不均时,比如半数token都指向专家1,那么f_1接近0.5,P_1也较高,乘积和会明显大于1,loss变大。梯度下降会调整Router权重,使得f_i和P_i趋近均匀。注意f_i是离散计数,不可导,实现时通常要stop-gradient(detach),让梯度只回传到P_i的那条路径上。

另一个值得说的点是:为什么用f_i · P_i而不是只用Σ f_i²或Σ P_i²?GShard原始设计里用这个乘积形式,好处在于同时惩罚了“时域上的不均衡”和“概率分布上的不均衡”——f_i强调真实路由结果的偏差,P_i强调Router概率输出的偏差。两者相乘后,即使某个专家实际收到的token不多,但Router对它的概率分布方差很大,也一样会受惩罚。

2.4 容量因子与Token丢弃(Token Dropping)

即使加了辅助loss,batch内仍然可能出现短时的不均衡。为此需要给每个专家设定一个容量上限(Capacity),超过上限的token会被“丢弃”。容量因子(Capacity Factor,CF)定义如下:

capacity = ceil(CF · (num_tokens / E))

CF=1.0表示每个专家平均只能处理均匀分配的量;如果某个专家收到的token超过这个容量,多出的token会被丢弃(或者被重新路由到其他专家,取决于实现)。CF在训练中通常取 1.25 到 2.0 之间。

我个人的建议是:训练初期CF取高一些(比如1.5),因为这时候Router还在学习,丢token会导致信息丢失,影响收敛。到了训练稳定后再逐步降低CF,这样可以在接近推理的设置下做进一步训练,避免推理时token丢失比例过大影响生成质量。

还有一点很关键:推理时的CF直接影响效果。如果推理时CF=1.0,而某个关键token被丢弃,生成质量会肉眼可见地下降。实际推理一般要么提高CF,要么直接把丢弃改成强制分配——即超出的token在剩余专家里重新top选择,避免信息彻底丢失。

2.5 Switch Transformer的简化:从Top-2到Top-1

Switch Transformer是MoE在各领域“翻红”的关键论文。它的做法非常激进:只保留Top-1。这让Router从“选几个专家并加权融合”直接退化为“选一个专家”的硬路由:

y = p_k(x) · E_k(x)

这种简化大幅降低了通信量,因为每个token只需要发到一个目标设备。代价是表达能力变弱——单个专家的输出没有融合结构,模型在推理时对特征的混合能力打了折扣。但Switch Transformer用更大的专家数量和工作量补偿了这一点,实证效果相当好。

从数学角度看,Top-1的负载均衡loss可以写成一模一样的形式:L_aux = α · E · Σ f_i · P_i,因为Top-1情况下P_i就是Router在专家i上的平均softmax概率。如果你用Top-2,公式不变,只是P_i计算时需要把TopK集合外的概率设为0。

2.6 Router的稳定性:从logits到Z-Loss

在训练MoE模型时,还有一个数值稳定性问题:Router的logits值如果不断增大,softmax会越来越接近one-hot,梯度会越来越小,路由进入“死区”。这个问题在项目实践中很容易被忽略,因为训练loss表面上看不出大问题,但模型的生成多样性会下降。

一种缓解方式是加Z-loss,给logits的平方施加惩罚:

L_z = β · (1/E) Σ_{i=1}^{E} exp(h_i(x)) 或 L_z = β · (1/E) Σ_{i=1}^{E} h_i(x)²

不同实现细节略有差异,核心逻辑都是抑制logits的绝对值膨胀,让Router保持“软路由”的能力,防止梯度消失。实际使用中,β取1e-4到1e-2的量级比较常见,具体需要通过小规模实验调。

3. 核心细节解析与实操要点

3.1 专家层的结构设计与初始化

大多数MoE模型把专家网络设计成标准的FFN,包含两个线性层和中间的激活函数:

E_i(x) = W_i2 · activation(W_i1 · x)

这里W_i1的维度是d_model × d_hidden,W_i2是d_hidden × d_model,d_hidden通常是d_model的2~4倍。与标准FFN唯一区别是每个专家独立拥有自己的权重。

初始化的细节也很重要。我见过不少MoE模型因为专家初始化不当而收敛缓慢,尤其是深层MoE。建议专家的线性层初始化方差比标准Transformer更小一些,比如标准差按sqrt(2 / (d_model + d_hidden))再除以一个稍大于1的系数,让专家输出的方差在大模型里更平稳。

另外,Padding Token的处理要注意。训练时需要把Padding Token丢掉,不让它们参与路由和专家计算,否则Router会学到一些对padding的固定偏好,浪费容量。推理时如果序列中有padding,也必须走掩码逻辑,不能直接混入计算。

3.2 实现Router的几行关键伪代码

下面用伪代码展示Router的核心逻辑,方便你在自己的框架里对照。假设输入是[batch, seq, d_model],专家数量E,Top-K选K。

# x: [B*T, D], router_logits: [B*T, E] router_logits = router_proj(x) # W_r x probs = softmax(router_logits, dim=-1) # 每个token在每个专家上的概率 # 取Top-K topk_values, topk_indices = topk(probs, k=K, dim=-1) # topk_values: [B*T, K], topk_indices: [B*T, K] # 构造用于加权的mask(相当于把非TopK概率置零) mask = zeros_like(probs).scatter(1, topk_indices, topk_values) # 对概率重新归一化(可选) norm_probs = mask / mask.sum(dim=-1, keepdim=True) # 后续把 token 按 topk_indices 分发到对应专家,计算后再按 norm_probs 加权求和

这段代码里有两个细节值得解释:一是topk之后要不要再softmax一次?不用,因为已经softmax过了,只需要对选中的概率做归一化。二是scatter这个操作在框架里是不可导的,但它本身只做索引和复制,梯度会通过它回传到probs路径上,所以没问题。这也是为什么Router可以用真实可行的拓扑结构来学习——选择操作本身是离散的,但权重混合路径是可微的。

3.3 稀疏计算如何真正生效

上面的代码只是Router逻辑,真正的稀疏计算体现在“只对选中的专家执行FFN”。在工程实现中,常见策略是:把所有token送到不同专家时,不是逐个token for循环算专家,而是把属于同一个专家的token打包成一个group,用GroupedGEMM或批量小GEMM来算。这个策略可以大幅减少kernel启动次数,提升GPU利用率。

一个关键体会是:专家的计算量不是固定不变的。batch内token分布不同,每个专家实际拿到的token数也不同,导致每个专家矩阵乘的M维度不同。这就需要支持动态shape的GEMM kernel。如果你只是调框架里的标准GEMM,效率会大打折扣;用专门的GroupedGEMM(比如旧版Triton实现、或者新版框架里的MoE专用kernel)会明显改善吞吐。

3.4 为什么Router不需要归一化输入

有一个常见的疑问:是不是路由之前需要LayerNorm?答案是不一定。Router可以单独用一个权重矩阵,在大多数实现里x已经经过了前一层FFN或Attention的输出响应,已经是规范化的隐状态。如果需要再加LayerNorm,反而会让Router的logits形态受LayerNorm参数影响,调整起来更难。

实践经验是:Router直接接x(或者接残差之后的x)最常见;有些实现会给Router加一个小的偏置项,帮助处理“某些专家被完全零概率选中”的冷启动问题。偏置初始化建议为0,然后在训练中自行调整。

4. 实操过程与核心环节实现

4.1 训练并行策略:专家并行与数据并行怎么组合

MoE训练的第一个坎是并行策略。普通稠密模型最常见的是张量并行+数据并行,但MoE的E个专家如果都在同一设备上,所有参数会被加载到同一份显存,显存爆掉不说,单卡计算也没法利用多节点。

标准的做法叫Expert Parallelism(专家并行):把E个专家分布在E个设备上(或E/p个设备,p为每个设备上的专家数),每个设备保留一份Router和部分专家权重。

训练时,每个token先算Router得到专家索引,然后通过All-to-All通信把token从源设备发往目标设备——目标设备就是该token的专家所在设备——然后用GroupedGEMM计算专家网络,最后再通过一次All-to-All把结果传回源设备。整个过程涉及两次全交换通信,通信数据量约等于2 * total_tokens * K * d_model * 字节数。

这个通信代价是MoE训练的主要开销之一。如果在8个设备上做专家并行,每个设备只放1个专家,但所有token都可能发到任意设备,那么每个设备要接收来自其他7个设备的数据,通信量和设备数成正比。要缓解这个问题,较常用的做法是:

  • 尽量增大单设备batch size,摊薄通信开销
  • 提高K的稀疏性,比如从Top-2降到Top-1
  • 使用分层路由(两级Router),减少需要通信的专家候选数量
  • 把多个专家放在同一设备(减少设备间通信次数,但增加单设备显存负载)——这个需要权衡

4.2 训练配方与超参数调优

MoE训练与稠密模型相比有几个超参数需要额外关注:

路由专家数与维度:专家数量E从8到128都可,专家数量越大代表可以表达的细粒度能力越多,但如果E过大,每个专家在训练中看到的样本数会变少,导致专家退化。GShard论文里有个经验值:每个专家的FFN维度越小,专家数量可以越大,这与计算宽容度有关。

辅助loss权重α:这个参数是训练稳定性与稀疏性的核心矛盾点。α太大会让Router变得过于均匀,丧失了稀疏选择的好效果;α太小,负载不均衡会拖慢训练。我建议先用0.01起步,观察每个step的辅助loss值,如果它在训练前几步就开始下降明显,那么Router分布比较健康;如果辅助loss一直很高且波动大,就要考虑调大CF或适度增大α。

Capacity Factor:训练中一般CF在1.2到1.5之间。过高的CF会让某个专家在一个batch内接受远超平均的token数,这些token会转成大量计算,浪费效率;过低的CF会导致丢token比例上升,信息丢失。

学习率与batch size:MoE的收敛对batch size比较敏感,小的batch size会让Router的估计方差变大,负载不均更严重。一般建议MoE的最小有效batch size比稠密模型大一些,比如稠密配512,MoE配1024。

4.3 推理时的Token Dropping与专家权重加载

推理与训练在token处理上有一个关键差异:训练时如果没有碰到某个专家,这一step的梯度就不会流向它,模型可以忍受。但推理时如果token因为容量不足被丢弃,生成结果可能直接出现逻辑断裂。

我的经验是:推理时要么把CF提高到至少1.5~2.0,要么直接用无丢弃策略——也就是当专家token超过容量时,按概率重采样分配到还有空余容量的专家中,而不是简单丢弃。更稳妥的做法是如果业务对延迟有硬性要求,就把模型改成低K(比如Top-1),并训练时也尽量用同样的K部署,让训练推理行为一致。

另外有一个值得了解的思路:推理时并不需要把所有专家权重都加载进显存。如果目标场景是对话,可能只需要高频专家(比如30%-50%的专家)常驻显存,冷门专家放到CPU,按需加载。这个做法在超大规模模型落地时很实用,但需要模型本身路由器具备比较强的偏好聚类——如果路由分布太均匀,冷热专家区分不明显,这种策略收益就有限。

4.4 一个完整的MoE层训练流程串联

为了帮助你把上面的内容串起来,我列一个Mini训练循环的流程,假设你在一个batch内处理多个序列:

  1. 对输入做token embedding,得到[B, S, D]
  2. 进行普通的Attention层计算
  3. 进入MoE-FFN层:
    • 计算Router logits
    • 计算负载均衡loss
    • 得到Top-K索引与权重
    • 把token按索引分发到各专家
    • 在各专家上运行FFN(GroupedGEMM)
    • 加权合并,得到输出
  4. 加上残差和LayerNorm
  5. 计算总loss = 主loss + α * L_aux + β * L_z
  6. 反向传播,更新Router和专家权重

其中第3步是MoE的核心,也是最大的工程复杂度来源。如果使用现成框架,第3步已经被封装好了,但你仍然需要正确设置CF、α、K等参数,并监控路由负载情况。

5. 常见问题与排查技巧实录

5.1 问题速查表

症状可能原因排查方法与解决建议
训练loss不降,Router概率几乎均匀辅助loss权重α过大降低α到0.001~0.005,观察Router的top-1概率分布
某个专家完全没收到token(僵尸专家)Router初始化不当或学习率过大导致震荡给Router加偏置,或用更小的学习率做warmup
推理时输出变空或逻辑断裂容量因子太低导致token被丢弃推理时CF提高到1.5以上,或改用无丢弃重路由
训练速度极慢,通信占比高All-to-All过多 / K过大减少K;增加批次大小;把多个专家放在同一设备
训练spike、loss突然跳高辅助loss值波动剧烈给α加warmup;检查是否在FP16下数值溢出
模型推理质量和稠密版差距大专家数太少或d_hidden太小增大E或增大每个专家的隐层维度

5.2 僵尸专家问题:成因与应对

这个问题的表象是:某一个或几个专家在几十k步训练中几乎从未收到token,权重更新极少,梯度传回后基本为0。最终这些专家相当于白占了显存。

成因有两类:一是Router初始分布不均匀,某些专家在logits空间中位置一直偏低;二是训练初期学习率太大,Router的logits被推到某个局部极值,不同token的top选择都很相似。

最直接的检测方法:每隔几百step打印一次每个专家收到的token数直方图,如果发现某个count长时间为0,就需要处理。处理手段有很多种,按侵入性从低到高排序:

  1. 调整Router初始化:让W_r的scale小一些,初始logits更平缓
  2. 给每个专家编号加一个可学习的偏置,初始为0,让Router有机会把logits重新调高
  3. 在训练早期人为增加随机路由比例(比如10%的概率随机选其他专家),让冷门专家获得初始样本
  4. 更强的做法是直接把接近“死亡”状态的专家权重重置(重新初始化),让Router有机会再尝试它

5.3 负载均衡loss的监控与调整

我见过很多人在训练MoE时只看训练loss,不关注负载均衡loss,结果训练到一半模型生成效果还可以,但推理吞吐很拉胯——因为所有token都挤在两三个专家里,稀疏度名存实亡。

建议训练日志里始终包含两个指标:

  • aux_loss:负载均衡损失,记录每个step的值,看趋势是否下降
  • fraction_tokens_left:被丢弃的token比例

如果辅助loss在下降过程中出现了平台期,且fraction_tokens_left较高,说明当前容量因子可能太小,需要适度提高;如果辅助loss降到很低但主loss下降变慢,说明路由过于均匀,稀疏性优势被削弱了,可以稍微降低α,允许模型走一点“片向”路线。

5.4 训练稳定性:FP16下的梯度问题

MoE训练在混合精度下经常出现的一个隐蔽问题:Router的softmax在FP16下,如果logits差值较大,softmax反而更容易溢出或梯度消失。这也会导致训练spike。

缓解办法是在Router部分用FP32计算,不参与FP16的自动混合精度,或者对logits加一个恒定的缩放,让它落在FP16的高精度区间。很多框架在混合精度时默认对softmax保持FP32,但自定义Router需要手动确认这一点。另外,Z-loss对这种问题也有效,因为它抑制了logits的绝对值增长。

5.5 一个实用的调参顺序

当你拿到一个新任务要训练MoE,建议按这个顺序做可行性验证:

  1. 先跑一个极小的模型(专家数8,d_model 512,几千万参数级别),配置好并行和通信
  2. 用一个小型数据集验证路由能否收敛,观察辅助loss变化和token丢弃率
  3. 在1B左右的参数量级上做一次完整训练,确定α、CF、学习率的合理区间
  4. 再放大到目标规模,这时候核心关注点是通信瓶颈与专家负载均衡

这样做的好处是可以快速过滤掉那些“框架层”错误(比如并行配置不对、通信死锁),而不是在几B参数的模型上反复试错,浪费时间也浪费算力。

6. 扩展方向与个人体会

MoE这套架构远不止“选几个专家”这么简单。现在已经有各种变体:Soft MoE(全专家软混合)、DeepSeek MoE(细粒度专家共享)、Mixtral为代表的开源MoE实践,以及各种在MoE基础上叠加强化学习和自适应路由的新想法。数学上稀疏激活的核心公式并没有变,但工程上的融合、调度、量化都在不断演进。

我个人的体会是,MoE最大的门槛不是理解router公式,而是当你真正把一个MoE层接到自己的训练框架中时,通信、负载、稳定性、显存管理这些问题交织在一起,任何一个环节没做好,最终性能都上不去。所以如果你想深入这个方向,不要只读论文,建议真去把一个小型MoE模型从头训练一遍,亲手看看token传路由时All-to-All的通信开销,调一次辅助loss的权重,你会有比读十篇论文更深的理解。

分享一个我踩过几次的坑:有一个阶段,为了追求测试集上的指标,我把辅助loss权重压得很低,训练最终loss确实不错,但推理时的模型专家负载极不均匀,常规batch的吞吐下降了大约40%。后来在训练中加了一点随机路由扰动,才把负载平衡拉回来。这个教训告诉我——MoE的稀疏性优势只有在负载均衡时才会真正兑现,否则它只是一个参数效率很差的稠密模型。

如果你正在规划把模型从稠密改成MoE,建议从参数量增量不超过3倍、Top-2或Top-1起步,不要一上来就做128专家的大规模实验。先跑通一个极小的MoE,把辅助loss、容量因子、并行通信这些基本功掌握扎实,再逐步放大,这样会稳妥很多。

相关新闻

沐曦GPU年亏8亿背后:16亿营收与国产芯片的生存逻辑

沐曦GPU年亏8亿背后:16亿营收与国产芯片的生存逻辑

看到沐曦2025年的这份财务预测时,我第一反应不是“又一家亏损的GPU公司”,而是先拿计算器把数字拆开:营收16亿到17亿,扣非后净亏7亿到8.35亿。这家公司等于每收回来100块钱收入,就有40多块钱的经营净流出。数字摆在台面…

2026/10/20 17:12:41 阅读更多 →
MFC对话框程序接入MySQL:从环境配置到数据写入

MFC对话框程序接入MySQL:从环境配置到数据写入

MFC和MySQL这个组合,听起来确实有点“复古”,但直到今天,我身边仍然有一大批内部工具、工装配套软件、实验室记录程序是用MFC对话框写的,后端数据清一色落在MySQL里。我在VS2019下把一个MySQL 8.0.25数据库接进现成的MFC工程&…

2026/10/20 17:12:41 阅读更多 →
欧洲首家量子计算公司上市:IQM与SPAC合并背后的逻辑与风险

欧洲首家量子计算公司上市:IQM与SPAC合并背后的逻辑与风险

量子计算公司要上市了,而且是在欧洲。这条消息我第一时间看到时,第一反应是量子赛道终于在欧洲跨出了资本市场那一步。欧洲量子计算领军企业IQM宣布与特殊目的收购公司Real Asset Acquisition Corp.达成合并协议,交易完成后将成为欧洲首家上市…

2026/10/20 17:11:38 阅读更多 →

最新新闻

JMeter接口测试进阶:从参数化、断言到结果分析的核心能力

JMeter接口测试进阶:从参数化、断言到结果分析的核心能力

做接口测试这行,接触JMeter是早晚的事。早年我还在手工点接口文档、拿浏览器调试工具一个个试请求的时候,第一次用JMeter跑通一个几十线程的并发场景,那感觉确实挺新鲜。但说句实在话,从“会用JMeter”到“能把接口测试做出价值”…

2026/10/20 17:52:45 阅读更多 →
Java学籍管理系统毕业设计全攻略:技术栈选型、数据库设计与避坑指南

Java学籍管理系统毕业设计全攻略:技术栈选型、数据库设计与避坑指南

简介:基于Java与MySQL的大学生学籍管理系统毕业设计资源包,面向计算机相关专业毕业设计或课程设计的学生。功能覆盖学生信息、班级、院系、专业、课程、成绩、奖惩等管理模块,并设计视图、存储过程与触发器,用于查询学生成绩单、自…

2026/10/20 17:52:45 阅读更多 →
能力矩阵实战:从skills拆解到团队协作的完整指南

能力矩阵实战:从skills拆解到团队协作的完整指南

1. 从“skills”这个词说起:它到底指什么“skills”这个词看起来简单,但放在不同语境里,指向的东西差别很大。有人看到它想到的是简历上那一栏“专业技能”,有人想到的是游戏里的技能树,还有人想到的是团队协作中每个人…

2026/10/20 17:52:45 阅读更多 →
GPT-5.5切换后API报401?不是Key失效而是Organization头强制校验

GPT-5.5切换后API报401?不是Key失效而是Organization头强制校验

前两天我在配合一个长期维护的某跨平台系统做模型升级时,撞上一个非常典型的鉴权坑:同一个 API Key,model 参数填 GPT-5.4 一切正常,一换成 GPT-5.5,接口立刻返回 401 Unauthorized。看到报错的第一眼,几乎…

2026/10/20 17:52:45 阅读更多 →
永磁同步电机模型预测转矩控制仿真实现与调试实战

永磁同步电机模型预测转矩控制仿真实现与调试实战

刚接手这个"永磁同步电机传统模型预测转矩控制研究(Simulink仿真实现)"课题时,我第一反应是:这不就是把直接转矩控制(DTC)的滞环换成滚动优化吗?真做起来才发现,坑全藏在细…

2026/10/20 17:52:45 阅读更多 →
基于CAN总线的DSP28335 IAP在线升级方案与Bootloader设计详解

基于CAN总线的DSP28335 IAP在线升级方案与Bootloader设计详解

做DSP28335应用开发的人,基本都体会过一种尴尬:整机已经装配完毕,外壳固定好了,或者设备已经在现场跑了大半年,这时候突然要改一个控制参数、修一个不起眼的逻辑bug,拿JTAG下载器过去才发现,拆机…

2026/10/20 17:51:45 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →