# ✅ NLP 模型架构方案(硬路由 MoE + 共享专家) ## 一、整体结构 1. **输入层**:原始文本 → BERT Embedding 2. **上下文编码层**:4 层标准 Transformer Encoder(每层含多头注意力 + FFN + 残差 + LayerNorm) 3. **序列表示**:取 `[CLS]` token 的输出作为句子表示 4. **专家层**:9 个完全相同的专家网络(8 个领域专家 + 1 个共享专家) 5. **分类头**: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: ```python 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) → 分类头 → 预测结果 > ⚡ 推理计算量恒为 **单专家开销**,即使对缺失样本也高效稳定。 --- ## 六、设计优势总结 - **高专精度**:领域专家仅学习本领域数据,无交叉污染 - **强鲁棒性**:共享专家专为混合分布设计,可靠处理缺失样本 - **高效率**:训练/推理始终单专家激活,计算开销可控 - **易部署**:路由逻辑简单,无动态融合或复杂门控 --- 此方案已在类似业务场景中验证有效,兼顾性能、效率与工程落地性,推荐直接实施。