MoE混合专家模型:万亿参数背后的稀疏激活原理与工程实践
1. 从“万亿参数”说起MoE到底在解决什么问题第一次看到“万亿参数”这个词很多人的直觉反应是这得多少张显卡才能跑起来训练成本是不是天文数字推理一次是不是要等到天荒地老但实际情况是某些标注“万亿参数”的模型推理时的实际计算量可能只相当于一个几百亿参数的稠密模型。这中间的落差就是**MoEMixture of Experts混合专家**架构带来的核心变化。MoE不是某一个具体的模型而是一种网络结构设计思路。它的基本逻辑可以用一句话概括把一个大模型拆成很多个“专家子网络”每次输入只激活其中一小部分专家参与计算。这样一来模型的总参数量可以做得非常大但每次前向传播实际用到的参数量却控制在一个可接受的范围内。打个比方。传统稠密模型像一家只有一个大厨房的餐厅不管客人点什么菜整个厨房都得运转起来。MoE则像一条美食街里面有川菜档、粤菜档、日料档、烘焙档来了一个想吃辣的客人只需要川菜档开火其他档口可以歇着。美食街的总面积总参数量很大但每次实际忙碌的档口激活参数量很少。这个思路解决的核心矛盾是模型容量与计算成本之间的冲突。稠密模型想要更强的表达能力就得堆参数堆了参数计算量就线性上涨。MoE试图在两者之间找到一个更优的平衡点——参数规模可以继续膨胀但计算量不跟着等比例膨胀。适合读这篇内容的人大概分三类一是正在做模型架构选型的技术负责人需要判断MoE是否适合自己的业务场景二是对大模型底层原理感兴趣、想搞明白“万亿参数”到底意味着什么的工程师三是准备面试或做技术分享需要把MoE讲清楚的人。不管你是哪一类接下来的内容会从设计思路、核心机制、实操要点到常见坑一层层拆开讲。2. MoE的整体设计思路与关键组件拆解2.1 为什么是“稀疏激活”而不是“全部激活”稠密模型的计算量公式很直白参数量乘以每个参数参与的计算次数。一个千亿参数的稠密模型每个token过一遍就要和全部千亿参数发生交互。MoE的做法是引入一个路由机制Router/Gating Network让每个token只选择少数几个专家进行计算。这里的关键词是稀疏性。假设一个MoE层有64个专家每次只激活2个那么实际计算量大约是全激活的1/32。总参数量可以是64个专家的总和但计算量只按2个专家来算。这就是“万亿参数、小部分使用”的底层逻辑。但稀疏激活不是没有代价的。路由本身需要计算专家之间的负载可能不均衡训练时容易出现“赢者通吃”的现象。这些问题后面会详细展开。2.2 专家网络到底是什么“专家”这个词容易让人误解以为每个专家是一个完整的独立模型。实际上在大多数MoE实现中专家就是前馈网络FFN层的一个副本。Transformer架构里每个层通常包含注意力模块和前馈模块。MoE通常替换的是前馈模块把它变成多个并行的FFN每个FFN就是一个“专家”。为什么替换FFN而不是注意力因为FFN占据了Transformer中大部分参数量。以标准Transformer为例FFN的参数量通常是注意力模块的2到4倍。把FFN做成MoE参数量扩展的效果最明显同时对注意力机制的改动最小工程上更容易实现。每个专家的结构可以相同也可以不同。常见做法是所有专家结构一致只是初始化不同、训练过程中分化出不同的 specialization。也有研究尝试让专家结构异构但工程复杂度会上升。2.3 路由机制MoE的“调度中心”路由是MoE最核心也最微妙的部分。它的任务很简单给定一个token的表示决定把它发给哪几个专家。但实现起来有很多细节。最常用的路由方式是可学习的线性门控。具体来说对每个token的表示向量乘以一个可学习的权重矩阵得到一个分数向量长度等于专家数量。然后对这个分数向量做Softmax或Top-K选择。Top-K选择的意思是只取分数最高的K个专家。K通常取1或2。K1时计算最省但负载均衡压力大K2时计算量翻倍但路由更稳定训练更容易收敛。实际系统中K2是比较常见的选择。路由还有一个重要设计是否对专家输出加权。如果K2两个专家的输出可以按路由分数加权求和也可以简单平均。加权求和更合理因为路由分数本身就表达了“这个token有多适合这个专家”。注意路由器的参数量通常很小相对于专家网络可以忽略不计。但路由器的训练难度却不低因为它是一个离散选择过程梯度传播需要特殊处理。2.4 负载均衡MoE训练中最容易翻车的地方如果没有额外约束路由器会倾向于把大多数token发给少数几个专家。这几个专家被训练得越来越好路由器更愿意发给它们形成正反馈。其他专家得不到足够训练逐渐“退化”。这就是专家坍塌Expert Collapse。解决方法是引入负载均衡损失Load Balancing Loss。这个损失函数鼓励token在专家之间的分布更均匀。常见实现是计算每个专家被选中的频率然后与均匀分布的差异作为惩罚项。负载均衡损失有一个权重系数需要调。系数太小均衡效果不明显系数太大路由器被迫把token发给不合适的专家模型质量下降。这个系数的调整是MoE训练中的关键经验之一。3. 核心细节解析与实操要点3.1 专家数量的选择不是越多越好专家数量是一个需要权衡的超参数。专家越多总参数量越大模型容量上限越高。但专家越多路由的搜索空间越大负载均衡越难做通信开销也越大。从实际经验看专家数量通常取8到64之间。一些大规模实验用了上百个专家但那是建立在高度优化的分布式训练框架之上的。对于大多数团队16或32个专家是比较稳妥的起点。还有一个相关参数是专家容量Expert Capacity。每个专家每次能处理的token数量是有限的超过容量限制的token会被丢弃或走残差连接。容量设置太小token被丢弃信息损失容量太大计算浪费。通常容量系数取1.0到1.5之间即每个专家平均处理token数的1到1.5倍。3.2 路由算法的变体与选择基础Top-K路由之外还有几种常见变体Top-1路由每个token只选一个专家。计算最省但训练不稳定负载均衡难做。适合专家数量较少、任务相对简单的场景。Top-2路由每个token选两个专家。计算量翻倍但训练稳定性和模型质量明显更好。是目前最主流的选择。专家选择路由Expert Choice反过来让每个专家选择自己要处理的token。这样天然保证负载均衡但每个token被处理的次数不固定实现复杂度高。软路由不选Top-K而是对所有专家输出加权求和。计算量等于全激活失去了MoE省计算的优势但训练最稳定。通常只用于研究对比。选择哪种路由取决于你的优先级。要省计算Top-1要稳定和质量Top-2要极致均衡Expert Choice。大多数生产系统选Top-2。3.3 分布式训练中的通信开销MoE的分布式训练比稠密模型复杂得多。因为不同的token会被路由到不同的专家而专家通常分布在不同的设备上。这就引入了All-to-All通信每个设备需要把token发送到目标专家所在的设备计算完再收回来。All-to-All通信是MoE训练的主要瓶颈之一。通信量与token数量、专家分布方式、网络带宽都有关系。如果专家分布不合理某些设备通信压力过大整体训练速度会被拖慢。常见的优化手段包括专家分组把通信频繁的专家放在同一设备、通信与计算重叠在等待通信时做其他计算、梯度压缩减少通信数据量。这些优化需要深入理解分布式训练框架后面在实操部分会展开。3.4 推理阶段的特殊考量训练完之后MoE模型的推理也有独特之处。稠密模型推理时所有参数都在参与计算GPU利用率容易做高。MoE推理时每个token只激活部分专家如果batch size不够大某些专家可能闲置GPU利用率下降。解决方法是增大batch size或使用专家并行推理。增大batch size让更多token同时处理专家利用率上升。专家并行则是把不同专家放在不同设备上每个设备只负责自己的专家token路由到对应设备。后者适合超大模型但通信开销又上来了。还有一个实际问题是显存占用。MoE模型的总参数量很大即使每次只激活一部分所有专家的参数都需要加载到显存中。这意味着MoE模型对显存的需求是按总参数量算的不是按激活参数量算的。这一点在部署时必须考虑清楚。4. 实操过程与核心环节实现4.1 从零搭建一个MoE层的代码框架下面用一个简化的PyTorch示例展示MoE层的核心实现。这不是生产级代码但能帮你理解每个组件的作用。import torch import torch.nn as nn import torch.nn.functional as F class Expert(nn.Module): def __init__(self, d_model, d_ff): super().__init__() self.fc1 nn.Linear(d_model, d_ff) self.fc2 nn.Linear(d_ff, d_model) def forward(self, x): return self.fc2(F.relu(self.fc1(x))) class MoELayer(nn.Module): def __init__(self, d_model, d_ff, num_experts, top_k2): super().__init__() self.num_experts num_experts self.top_k top_k self.experts nn.ModuleList([ Expert(d_model, d_ff) for _ in range(num_experts) ]) self.router nn.Linear(d_model, num_experts) def forward(self, x): # x shape: [batch, seq_len, d_model] batch, seq_len, d_model x.shape x_flat x.view(-1, d_model) # 路由分数 router_logits self.router(x_flat) # [batch*seq_len, num_experts] router_probs F.softmax(router_logits, dim-1) # Top-K选择 top_k_probs, top_k_indices torch.topk(router_probs, self.top_k, dim-1) top_k_probs top_k_probs / top_k_probs.sum(dim-1, keepdimTrue) # 计算专家输出 output torch.zeros_like(x_flat) for i in range(self.num_experts): # 找到路由到专家i的token mask (top_k_indices i).any(dim-1) if mask.sum() 0: continue expert_input x_flat[mask] expert_output self.experts[i](expert_input) # 加权 weight top_k_probs[mask][top_k_indices[mask] i].unsqueeze(-1) output[mask] expert_output * weight return output.view(batch, seq_len, d_model)这段代码展示了MoE的核心流程路由打分、Top-K选择、专家计算、加权求和。实际系统中还需要加入负载均衡损失、容量控制、分布式通信等模块。4.2 负载均衡损失的实现细节负载均衡损失通常加在总损失中权重系数一般取0.01到0.1之间。下面是一个常见实现def load_balancing_loss(router_probs, top_k_indices, num_experts): # router_probs: [num_tokens, num_experts] # top_k_indices: [num_tokens, top_k] num_tokens router_probs.shape[0] # 每个专家被选中的次数 expert_counts torch.zeros(num_experts, devicerouter_probs.device) for i in range(num_experts): expert_counts[i] (top_k_indices i).any(dim-1).sum() # 每个专家的平均路由概率 mean_probs router_probs.mean(dim0) # 负载均衡损失 loss num_experts * (expert_counts / num_tokens * mean_probs).sum() return loss这个损失函数的直觉是如果某个专家被选中的频率高同时它的平均路由概率也高损失就大。优化过程会压低这种“双高”情况促使分布更均匀。提示负载均衡损失的权重需要根据具体任务调。我试过在语言建模任务上用0.01效果比较稳在分类任务上可能需要调到0.05左右。建议从0.01开始观察专家利用率分布再调整。4.3 专家容量与token丢弃策略当某个专家收到的token超过容量时需要决定怎么处理。常见策略有三种直接丢弃超出的token不经过该专家直接走残差连接。实现简单但信息损失。随机丢弃在超出的token中随机保留容量内的部分。比直接丢弃稍好但仍有损失。优先级保留根据路由分数保留分数高的token。最合理但实现复杂。容量计算公式capacity ceil(num_tokens / num_experts * capacity_factor)。capacity_factor通常取1.0到1.5。取1.0意味着每个专家平均处理这么多token超出就丢。取1.5留了50%余量丢弃率低但计算浪费多。实际调参时先观察训练过程中token丢弃率。如果丢弃率超过5%说明容量偏小或负载不均衡严重需要调整。4.4 分布式训练的工程配置在分布式场景下MoE的训练配置有几个关键点专家并行度决定专家分布在多少个设备上。专家并行度越高单个设备承载的专家越少显存压力越小但通信开销越大。数据并行与专家并行的组合通常数据并行和专家并行混合使用。比如8个数据并行组每组内4个专家并行总共32个设备。All-to-All通信优化使用NCCL等通信库时调整通信桶大小、启用通信与计算重叠能明显提升吞吐。一个实际配置示例64个专家专家并行度8数据并行度4总共32个设备。每个设备承载8个专家。All-to-All通信在专家并行组内进行。注意专家并行度不是越高越好。通信开销随专家并行度增加而增加。经验值是专家并行度不超过总设备数的1/4。超过这个比例通信可能成为瓶颈。5. 常见问题与排查技巧实录5.1 专家坍塌路由总是选那几个专家这是MoE训练中最常见的问题。表现是训练日志中某些专家的被选中次数接近零而少数专家承担了大部分token。排查思路先看负载均衡损失的值。如果损失持续很高说明分布确实不均匀。再看每个专家的被选中频率如果方差很大确认是坍塌。解决方法提高负载均衡损失的权重。如果已经很高检查路由器的学习率是否过大。路由器学习率过大时路由决策变化剧烈容易陷入局部最优。可以尝试单独给路由器设置更低的学习率。还有一个容易被忽略的原因初始化。如果专家初始化差异太大路由器一开始就会偏向某些专家。确保所有专家用相同的初始化方式必要时给路由器加一点噪声。5.2 训练不稳定loss突然飙升MoE训练比稠密模型更容易出现loss spike。原因通常是路由决策在某个batch发生了剧烈变化导致大量token被路由到不合适的专家。应对方法一是梯度裁剪把梯度范数限制在合理范围。二是路由温度系数在Softmax前除以一个温度参数温度高时分布更平滑路由更稳定。训练初期用较高温度后期逐渐降低。还有一个技巧是路由决策的EMA平滑。维护一个路由决策的指数移动平均实际使用时用平滑后的决策。这样单个batch的异常不会立即影响路由。5.3 推理速度不达预期MoE推理时如果batch size小专家利用率低速度可能还不如同等激活参数量的稠密模型。排查时先看GPU利用率如果低于50%说明专家闲置严重。解决方法增大batch size。如果显存不够用梯度累积或模型并行。另一个方向是专家缓存把热门专家的参数常驻显存冷门专家按需加载。但这需要复杂的显存管理。还有一个实际问题是路由计算本身的开销。路由器虽然参数量小但每个token都要过一遍。如果专家数量很多路由的矩阵乘法也不可忽略。优化方法是把路由计算和专家计算放在同一个CUDA stream里减少同步开销。5.4 常见问题速查表问题现象可能原因排查方法解决方向专家利用率方差大负载均衡损失权重低打印各专家被选频率提高均衡损失权重训练loss spike路由决策剧烈变化监控路由熵梯度裁剪、路由温度推理速度慢batch size小、专家闲置查看GPU利用率增大batch、专家缓存显存不足总参数量大查看显存占用分布专家并行、参数卸载通信瓶颈All-to-All开销大分析通信时间占比优化专家分组、通信重叠5.5 几个踩过的坑第一个坑是专家数量与学习率的关系。专家越多每个专家分到的token越少等效batch size越小。如果沿用稠密模型的学习率专家可能欠拟合。经验做法是专家数量翻倍时学习率适当调大或者增加训练步数。第二个坑是路由器的初始化。路由器初始权重太小路由分数接近均匀训练初期所有专家都被均匀激活看起来正常。但随着训练进行路由器逐渐分化如果初始化不当分化过程可能过于剧烈。建议路由器用较小的初始化方差让分化过程更平滑。第三个坑是评估指标的选择。稠密模型看loss和准确率就够了。MoE还需要看专家利用率、路由熵、token丢弃率。这些指标不监控出了问题很难定位。建议训练日志里把这些都打出来。6. 一些个人体会与扩展方向MoE不是万能药。它在参数规模扩展和计算成本之间提供了一个折中方案但这个折中是有代价的训练复杂度更高、推理工程更复杂、调参经验要求更多。如果你的场景是中小规模模型稠密模型可能更省心。如果确实需要大容量模型同时计算预算有限MoE值得认真考虑。从趋势上看MoE的设计空间还很大。路由算法的改进、专家结构的异构化、训练稳定性的提升都是活跃的研究方向。工程侧分布式训练的通信优化、推理时的专家调度也有很多可以打磨的地方。我个人在实际操作中的体会是MoE的调参比稠密模型更依赖实验迭代。理论分析能给你方向但具体参数怎么设还是得跑起来看。建议从小规模实验开始比如8个专家、Top-2路由先把训练流程跑通观察专家利用率和loss曲线再逐步放大。一上来就搞64个专家、分布式训练出了问题很难定位。最后分享一个小技巧在训练初期可以临时把负载均衡损失权重调大让专家分布先均匀起来然后再降回正常值。这样能避免早期坍塌后期又不会因为均衡损失过大影响模型质量。这个trick我在几个项目里试过效果比较稳。

相关新闻

Colibri:Oracle新一代JIT编译器,能否取代HotSpot C2?

Colibri:Oracle新一代JIT编译器,能否取代HotSpot C2?

最近Oracle实验室那边放出了一个新项目,代号叫Colibri,来自法语里的“蜂鸟”。名字很轻巧,做的事情却不小——它要做HotSpot JVM的新一代JIT编译器。说白了,就是以后Java程序的运行效率,很大程度会押在这个小家伙身上。…

2026/10/18 4:22:29 阅读更多 →
AI论文工具推荐:8款论文AI改稿、引用、排版与导出对比|TaoToken统一Key接入实测

AI论文工具推荐:8款论文AI改稿、引用、排版与导出对比|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/18 4:22:29 阅读更多 →
基于U2Net的Python证件照生成:人像分割与背景替换实战

基于U2Net的Python证件照生成:人像分割与背景替换实战

简介:基于 Python U2Net 深度学习的证件照生成完整项目,面向具备图像处理基础或对深度学习分割感兴趣的开发者,从模型原理到代码实现均有覆盖,旨在通过 U2Net 对人像区域进行高精度分割,再配合背景替换与尺寸调整自动生…

2026/10/18 4:22:29 阅读更多 →

最新新闻

RT-DETR+CEM:雾天目标检测与多模态融合实践

RT-DETR+CEM:雾天目标检测与多模态融合实践

雾天检测是个老问题,但大部分人做的是“前置去雾检测”或者“加个数据增强硬扛”。RT-DETR系列本身的实时性和端到端特性很适合落地,但直接在雾天数据上训练,特征提取阶段就会被低对比度和颜色偏移干扰,尤其一些小目标&#xff0c…

2026/10/18 5:18:39 阅读更多 →
《Eigen入门》第 15 章 · 现代 C++ 特性

《Eigen入门》第 15 章 · 现代 C++ 特性

C 从 2011 年开始进入"现代 C"时代(C11、14、17…),新增了许多让代码更简洁、更安全、更高效的特性。本章讲几个最常用的:auto、范围 for、lambda、nullptr 等。15.1 auto:自动推导类型 写类型名很繁琐时&am…

2026/10/18 5:18:39 阅读更多 →
从零自研图表设计器:数据模型、Canvas渲染与性能优化实践

从零自研图表设计器:数据模型、Canvas渲染与性能优化实践

最近在重构一个内部用的图表设计模块,项目代号就叫 diagram-design。它的定位非常明确:在自研业务系统里嵌入一个能拖拽画图的小型编辑器,让用户把节点拖到画布上,用连线把逻辑关系串起来,再导出成结构清晰的架构图、流…

2026/10/18 5:18:39 阅读更多 →
工程咨询 GEO 实战:让 AI 在项目前期调研中采信你的方案观点

工程咨询 GEO 实战:让 AI 在项目前期调研中采信你的方案观点

工程咨询 GEO 的核心挑战在于场景复杂、术语密集、案例涉密。本文给出实体图谱、意图挖掘、脱敏方法论、结构化模板、信源矩阵与监测迭代六步解决框架,覆盖 8 个部分,帮助 AI 快速抓取文章结构。1. 工程咨询 GEO 的难点:为什么传统 SEO 思路在…

2026/10/18 5:18:39 阅读更多 →
短视频怎么做 GEO:优化字幕和文稿,提升 AI 文本抓取采信率

短视频怎么做 GEO:优化字幕和文稿,提升 AI 文本抓取采信率

1. 短视频 GEO 的核心逻辑:大模型抓的是文本,不是画面很多人误以为短视频做 GEO(生成式引擎优化)要靠画面、运镜或特效,实际上大模型无法直接“看懂”视频画面。AI 在回答用户问题时,抓取的是视频的字幕、简…

2026/10/18 5:18:39 阅读更多 →
Cursor+StageWise分阶段提示法:用主动提示词重做定价卡片

Cursor+StageWise分阶段提示法:用主动提示词重做定价卡片

1. 这套组合到底在折腾什么定价卡片这个东西,做过前端或者产品页的人都不陌生。三列布局、中间那列高亮、顶部挂个“推荐”角标、底下罗列功能清单、最下面放个行动按钮——这套模板在SaaS落地页、会员订阅页、工具类产品的付费墙里被用了几百万遍。问题是&#xff…

2026/10/18 5:17:39 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →