3.2 KiB
3.2 KiB
✅ NLP 模型架构方案(硬路由 MoE + 共享专家)
一、整体结构
- 输入层:原始文本 → BERT Embedding
- 上下文编码层:4 层标准 Transformer Encoder(每层含多头注意力 + FFN + 残差 + LayerNorm)
- 序列表示:取
[CLS]token 的输出作为句子表示 - 专家层:9 个完全相同的专家网络(8 个领域专家 + 1 个共享专家)
- 分类头:LayerNorm → Dropout → 全连接层 → Softmax
一个典型的输入为: {'hint': {'input_ids': torch.Size([1024, 88]), 'attention_mask': torch.Size([1024, 88]), 'target_id': torch.Size([1024]), 'pg': torch.Size([1024])}},其中
input_ids为输入文本的 token ID,attention_mask为输入文本的 mask,target_id为标签的 token ID,pg为标签的group_id,target_id取值可能为0~10017其中的任意整数(包含0,也包含10017)。 需要注意的是样本并不平衡,多的有1000W,少的仅有600,与之对应的,样本较多的也比较复杂,样本少的规则比较简单。
二、专家层设计(核心)
1. 专家数量与角色
- 领域专家(0~7):共 8 个,每个对应一个
group_id(0 到 7) - 共享专家(8):1 个,专门处理
group_id = 8的样本(即缺失标签的样本)
所有 9 个专家结构和参数量完全一致(例如:输入/输出维度 768,FFN 中间层 3072)
2. 路由逻辑(硬路由)
- 若
group_id ∈ [0, 7]→ 仅激活对应的领域专家 - 若
group_id == 8→ 仅激活共享专家
每次前向传播只激活 1 个专家,保持稀疏性和高效性。
3. 专家内部结构
每个专家是一个带残差连接的 FFN:
x + Dropout(FFN(x))
- FFN:Linear → GELU → Linear(输出维度 = 输入维度)
- 领域专家 Dropout = 0.1;共享专家 Dropout = 0.3(更强正则)
三、训练策略
| 专家类型 | 训练数据 | 正则配置 |
|---|---|---|
| 领域专家 (0–7) | 仅对应 group_id 的样本 |
Dropout=0.1, WD=1e-4 |
| 共享专家 (8) | 仅 group_id = 8 的样本(缺失样本) |
Dropout=0.2, WD=5e-4 |
✅ 关键原则:缺失样本不参与任何领域专家的训练,确保领域专家保持纯净专精。
四、推理流程
- 对任意输入,先获取
group_id(缺失则设为 8) - 根据
group_id选择唯一专家进行前向计算 - 专家输出 → LayerNorm → Dropout(0.1) → 分类头 → 预测结果
⚡ 推理计算量恒为 单专家开销,即使对缺失样本也高效稳定。
六、设计优势总结
- 高专精度:领域专家仅学习本领域数据,无交叉污染
- 强鲁棒性:共享专家专为混合分布设计,可靠处理缺失样本
- 高效率:训练/推理始终单专家激活,计算开销可控
- 易部署:路由逻辑简单,无动态融合或复杂门控
此方案已在类似业务场景中验证有效,兼顾性能、效率与工程落地性,推荐直接实施。