autowzry-agent

模型架构重构

日期: 2025-11-22 类型: 架构优化


背景

原有模型设计过于简单,存在以下问题:

  1. 单一固定架构,无法适配不同场景
  2. 参数分配不合理(头重脚轻)
  3. 缺少BatchNorm等训练稳定性措施
  4. 降维策略粗暴(全局池化丢失位置信息)
  5. 缺少模型设计文档和原理说明

需要重新设计模型架构,参考其他MOBA AI(OpenAI Five、王者绝悟、AlphaStar)的经验。


设计讨论

核心原则确定

  1. 参数分配原则:70-80%卷积 + 20-30%全连接
    • 卷积层负责特征提取(任务重,需要更多参数)
    • 全连接层负责决策映射(任务轻,参数较少)
  2. 模块化接口
    • input_channels 由buffer决定(当前3,未来帧叠加会变6/9)
    • num_actions 由action_space决定
    • 模型接收5个独立参数,不依赖外部配置
  3. 三层模式系统
    • mini: 快速测试,资源受限
    • full: 推荐使用,平衡性能
    • high: 追求极致效果

关键设计决策

1. 卷积层设计

2. 降维策略

讨论了三种方案:

关键洞察:”参数量要和整体模型对比,不能孤立看”

3. Dueling DQN架构

采用Dueling DQN分离状态价值和动作优势,提升训练稳定性。


实现内容

1. 重写模型文件

文件: core/lightweight_dqn.py

主要变更

架构细节(以full模式为例):

输入: C×540×960
├─ Conv1: C→64, stride=2, BN, ReLU
├─ Conv2: 64→128, stride=2, BN, ReLU
├─ Conv3: 128→256, stride=2, BN, ReLU
├─ Conv4: 256→512, stride=2, BN, ReLU
├─ Conv5: 512→512, stride=2, BN, ReLU
├─ Reduce: 512→128 (1×1 conv)
├─ Pool: (4,8) AdaptiveAvgPool
├─ Flatten
└─ Dueling Head: 512 hidden → num_actions

2. 更新配置系统

文件: config/config.py, config/agent.config.yaml

新增配置

model:
  mode: mini  # 'mini'/'full'/'high'

移除配置

3. 更新训练器

文件: core/trainer.py

主要变更

4. 更新buffer模块

文件: data/training_buffer.py

新增属性

self.input_channels = 3  # 当前RGB图像,未来帧叠加会更新

5. 创建设计文档

文件: docs/design/MODEL_DESIGN.md

内容


配置更新

config/agent.config.yaml

model:
  mode: mini  # 模型规模: mini(快速测试), full(推荐), high(追求极致)

checkpoint:
  resume_model: ./checkpoints/model_mini.pth  # 与mode对应

training:
  use_target_network: true  # 使用目标网络,提升训练稳定性
  target_update_epochs: 5   # 每5个epoch更新目标网络
  samples_per_epoch: null   # 每epoch样本数,null=使用所有buffer数据

文档更新

1. README.md

2. docs/design/ARCHITECTURE.md

3. config/agent.config.yaml


参数量对比

模式 卷积层参数 全连接参数 总参数 卷积占比
mini ~1.2M ~0.3M ~1.5M 80%
full ~7M ~2M ~9M 78%
high ~24M ~6M ~30M 80%

测试验证

更新测试配置 scripts/test_pipeline.py

config_data = {
    'model': {
        'mode': 'mini'  # 测试使用mini模式
    }
}
MODEL_FILE = "test_model_mini.pth"

设计要点总结

为什么这样设计?

  1. 为什么用CNN?
    • 全连接层参数量爆炸(8亿参数)
    • CNN利用空间结构,参数共享
  2. 为什么3-6层?
    • 太浅:表达能力不足
    • 太深:训练困难,数据需求大
    • MOBA任务复杂度适合中等深度
  3. 为什么通道数递增?
    • 空间维度减小,通道数增加补偿信息
    • 浅层提取简单特征,深层组合高级特征
  4. 为什么1×1卷积+池化?
    • 全局池化丢失位置信息
    • MOBA需要知道敌人方位
    • 参数增加仅10%,性价比高
  5. 为什么70%卷积+30%全连接?
    • 特征提取是核心任务
    • 决策映射相对简单
    • 避免头重脚轻导致过拟合

模块化设计


未来改进

下一步:帧叠加

可选改进


经验总结

  1. 先讨论再实现:架构设计需要充分讨论各方案优劣
  2. 参数量相对比较:不孤立看某个层,要和整体模型对比
  3. 模块职责清晰:buffer管输入,action管输出,config管规模
  4. 文档与代码同步:重大架构变更需要更新相关文档
  5. 保持灵活性:模型是可替换的组件,不是项目亮点

相关文件

代码文件

文档文件

测试文件