Informed_machine_learning

logic_net_toy 代码逐行解析

这份文档对应当前目录下的 toy 项目代码,目标是把代码从“能跑”解释成“你能自己改”。

说明:


1. 先看整个项目是怎么串起来的

这个 toy 的执行路径是:

  1. run.py
    • 解析命令行参数
    • 生成 ExperimentConfig
    • 调用 experiment.py 里的 run_experiment
  2. experiment.py
    • 设置随机种子
    • 生成数据集
    • 读取规则集
    • 分别训练 baseline 和 logic-guided model
    • 调用 trainer.py 评估和画图
  3. trainer.py
    • baseline:纯监督训练
    • logic-guided:监督损失 + 蒸馏损失
    • teacher 不是一个单独网络,而是由 rules.py 动态构造的 soft target
  4. rules.py
    • 定义 rule set
    • 把规则转成概率分布
    • 把多条规则聚合成 teacher
  5. data.py
    • 生成二维二分类 toy 数据
    • 保证类别大致平衡

所以你可以把整个项目压成一句话:

先造二维数据,再把规则转成 teacher 分布,然后让 student 同时学标签和 teacher。


2. config.py

这个文件只做一件事:集中定义实验配置。

2.1 导入部分

2.2 配置类声明

2.3 随机性和数据规模

2.4 模型和 batch 配置

2.5 优化相关配置

2.6 规则相关配置

2.7 画图和设备相关

2.8 输出目录相关

2.9 目录创建函数

2.10 序列化函数

这个文件的核心思想很简单:

所有超参数统一放在一个对象里,训练、评估、画图都只依赖这个对象。


3. data.py

这个文件负责生成 toy 数据。

3.1 导入和数据结构

3.2 随机种子

3.3 真实决策函数

这一行的意义是:

3.4 标签生成

3.5 候选池采样

3.6 平衡采样函数

3.7 最终数据集构造

这一整个文件要表达的是:

先定义一个真实但不太复杂的二维分类边界,再人为制造“少标注 + 多无标签”的环境。


4. model.py

这个文件非常简单,只定义模型。

4.1 导入

4.2 模型类

这里的设计意图是:


5. rules.py

这个文件是项目的关键,因为它把“规则”变成了“teacher 概率分布”。

5.1 导入

5.2 单条规则的数据结构

5.3 规则集字典

single_good

single_bad

multi_good

multi_mixed

multi_bad

5.4 规则集查询函数

5.5 规则序列化

5.6 单条规则的 margin

这个 margin 的意义是:

5.7 单条规则的软概率

5.8 单条规则的分布形式

5.9 单条规则的硬预测

5.10 多规则聚合

这里的设计相当于:

多条规则在 log-probability 空间做加权融合。

5.11 聚合后的硬预测

5.12 teacher 构造

5.13 规则标签简写

这个文件的核心思想可以压缩成一句话:

规则先变成概率分布,多条规则先聚合,再和当前 student 概率融合,形成 teacher。


6. trainer.py

这是整个项目最重要的文件,真正实现训练、评估和画图。

6.1 导入部分

6.2 手写优化器 ManualAdamW

这个类是因为当前环境里 torch.optimsympy 问题影响,所以这里手写了一个简版 AdamW。

初始化

清梯度

更新一步

6.3 小工具函数

6.4 评估函数

6.5 优化器工厂

6.6 baseline 训练

6.7 logic-guided 训练

每轮开头

每个 step

每轮末尾

6.8 指标保存

6.9 训练曲线画图

6.10 规则边界画图

6.11 决策边界图

这个文件是整个项目的核心,因为它把“论文思想”真正变成了:


7. experiment.py

这个文件是实验编排层。

7.1 导入

7.2 实验总入口

这个文件的作用是:

把“配置 -> 数据 -> 训练 -> 评估 -> 落盘”串成一条统一流程。


8. run.py

这个文件是单次实验入口。

8.1 导入

8.2 参数解析

8.3 参数转配置对象

8.4 主函数

8.5 脚本入口


9. sweep.py

这个文件负责批量参数扫描。

9.1 导入

9.2 CSV 风格字符串解析

9.3 sweep 参数解析

9.4 规则集合法性检查

9.5 保存 sweep 汇总

9.6 sweep 主函数

9.7 遍历每个实验组合

9.8 sweep 收尾

这个文件的意义是:

把单次 toy 实验变成了可做 ablation、可比较不同规则集和超参数的实验平台。


10. 这套代码最值得你记住的 5 个点

  1. data.py 定义了一个“少标注 + 多无标签”的 toy 场景。
  2. rules.py 的核心不是规则本身,而是“把规则变成 teacher 概率分布”。
  3. trainer.py 的 logic-guided 版本本质是监督损失和 KL 蒸馏损失的组合。
  4. experiment.py 负责把数据、规则、训练和画图串起来。
  5. sweep.py 让这个 toy 不再只是 demo,而是可以做系统实验。

如果你下一步要改代码,最推荐先改的地方是: