如果后续项目组决定弃用算法创新方案、暂不训练 hybrid 模型,优先阅读
创新实验复原文档.md。该文档说明了如何保留实验文件但回到原 SLS 稳定复现主线,以及如何删除或通过 Git 回退本轮新增的实验性文件。
本文档记录当前项目在原 SLS 主模型复现基础上的创新改进实现情况。当前版本参考了多个方案文档,并将模型结构创新、横向扩展和零训练可解释性能力以隔离方式接入,避免影响原始复现主线。
本轮创新改进参考以下文档:
创新实现一(1).pdf
时间注意力改进实现二_可执行版.md
深度伪造语音检测作品实现过程.md
联合判别矩阵实现说明.md
XLS-R_SLS_大模型可解释性零训练可执行方案(1).md
这些文档对应的方向分别是:
-
创新实现一(1).pdf提出“统计感知的层级、特征、时间三级门控网络”,核心包括:
- Mean+Std 统计感知 SLS;
- SwiGLU 特征门控;
- 时间注意力池化;
- 消融实验和权重可视化。
-
时间注意力改进实现二_可执行版.md提出在 SLS 后端加入:
- 普通时间注意力;
- 通道引导时间注意力;
- 可切换 pooling 类型;
- 独立实验模型文件;
- 训练和评估脚本。
-
深度伪造语音检测作品实现过程.md提出横向应用扩展,包括:
- 视频音画分离;
- Whisper ASR;
- WeSpeaker 声纹识别;
- VLM 图像审计;
- LLM 风险报告;
- 证据固化和时间戳。
-
联合判别矩阵实现说明.md提出将声纹相似度和伪造概率进行二维融合,输出联合风险象限和风险等级。
-
XLS-R_SLS_大模型可解释性零训练可执行方案(1).md提出在不重新训练、不改变 checkpoint 的前提下,通过层权重、遮挡分析、频带扰动、稳定性分析和模板/大模型报告生成结构化可解释证据。
注意:该方案本身不是模型结构创新,也不要求训练新权重。它解释的是“已有模型为什么给出当前分数”。后续文档中提到 hybrid checkpoint 的解释,只是把同一套解释工具扩展到未来训练出来的 hybrid 权重上,并不表示可解释性方案本身必须重新训练。
由于本项目已经完成原 SLS 主模型复现,且原始权重 MMpaper_model.pth 对应的是旧模型结构,本轮改动采用隔离策略:
- 原
model.py不修改; - 原
main.py不修改; - 原评测脚本不修改;
- 新模型结构放入
model_hybrid.py; - 新训练入口放入
main_hybrid.py; - 训练脚本以
scripts/train_hybrid_*.sh命名; - 评测脚本以
scripts/eval_hybrid_*.sh命名; - 若后续不训练,可直接继续使用原主线。
这样既能把老师建议的模型创新先做上去,也不会破坏当前已经复现成功的稳定版本。
新增文件:
model_hybrid.py
新增类:
StatisticalSLS
功能:
- 输入 XLS-R 多层隐藏特征
[B, L, T, D]; - 对每一层计算时间维度上的均值;
- 可选计算标准差;
- 拼接为
[mean, std]统计向量; - 通过 MLP 预测每一层权重;
- 对 24 层特征加权求和,得到
[B, T, D]。
对应开关:
--use_stat_sls 1
--stat_sls_use_std 1消融时可以关闭:
--use_stat_sls 0关闭后使用原 SLS 的均值池化层权重逻辑。
新增类:
SwiGLUGate
功能:
- 输入层融合后的
[B, T, D]特征; - 使用
SiLU(Wg x) * Wv x做维度门控; - 输出仍为
[B, T, D]; - 使用残差连接保持训练稳定。
对应开关:
--use_swiglu 1关闭方式:
--use_swiglu 0新增类:
TemporalAttentionPooling
功能:
- 输入
[B, T, D]; - 通过 MLP 计算每一帧的注意力分数;
- softmax 得到时间权重;
- 加权求和得到
[B, D]; - 接新的二分类头。
对应开关:
--pooling_type temporal新增类:
ChannelGuidedTemporalAttention
功能:
- 计算全局通道统计信息;
- 使用通道上下文引导时间注意力分数;
- 可选加入统计残差;
- 输出
[B, D]; - 接新的二分类头。
对应开关:
--pooling_type cgta
--cgta_use_std 1
--cgta_stat_residual 1当前完整 hybrid 模型默认使用该方式。
为了方便消融,model_hybrid.py 中保留了原始 SLS 后端:
original_sls_fusion()
original_head()
当使用:
--pooling_type maxpool时,模型仍走原始 BatchNorm2d + max_pool2d + fc1 + fc3 路径。
这使得以下消融成为可能:
- 只加 Mean+Std SLS;
- 只加 SwiGLU;
- 不加时间注意力;
- 对比原 head 和 attention head。
model_hybrid.py
main_hybrid.py
test_hybrid_modules.py
说明:
model_hybrid.py:hybrid 创新模型;main_hybrid.py:hybrid 训练与评测入口;test_hybrid_modules.py:模块级 shape 测试。
scripts/test_hybrid_modules.sh
运行:
bash scripts/test_hybrid_modules.sh用于确认:
StatisticalSLS输出维度正确;SwiGLUGate输出维度正确;TemporalAttentionPooling权重归一化;ChannelGuidedTemporalAttention权重归一化。
scripts/train_hybrid_stat_sls.sh
scripts/train_hybrid_swiglu.sh
scripts/train_hybrid_temporal.sh
scripts/train_hybrid_full.sh
对应实验:
train_hybrid_stat_sls.sh 只加 Mean+Std 统计感知 SLS
train_hybrid_swiglu.sh 只加 SwiGLU 特征门控
train_hybrid_temporal.sh 只加普通时间注意力
train_hybrid_full.sh Mean+Std + SwiGLU + CGTA 完整模型
默认参数:
EPOCHS=10
BATCH_SIZE=1
EARLY_STOP_PATIENCE=3
NUM_WORKERS=2
可通过环境变量覆盖,例如:
EPOCHS=3 BATCH_SIZE=1 bash scripts/train_hybrid_full.sh如果后续要展示“适用所有算法改进点之后的模型”,优先训练完整 hybrid:
source venv/bin/activate
bash scripts/test_hybrid_modules.sh
EPOCHS=1 BATCH_SIZE=1 NUM_WORKERS=2 bash scripts/train_hybrid_full.sh
EPOCHS=10 BATCH_SIZE=1 NUM_WORKERS=2 bash scripts/train_hybrid_full.sh完整 hybrid 默认启用:
--use_stat_sls 1
--use_swiglu 1
--pooling_type cgta
训练完成后使用:
models/<hybrid实验目录>/best.pth
这个 best.pth 才是完整 hybrid 模型后续评测、解释和展示用的权重文件。
MMpaper_model.pth 只用于原 SLS baseline,不能当作 hybrid 最终权重。
scripts/eval_hybrid_df_20000.sh
scripts/eval_hybrid_wild_20000.sh
这两个脚本需要指定训练后的 checkpoint:
MODEL_PATH=models/.../best.pth bash scripts/eval_hybrid_df_20000.sh
MODEL_PATH=models/.../best.pth bash scripts/eval_hybrid_wild_20000.sh注意:
必须使用由 main_hybrid.py 训练得到的权重。
不能直接把 MMpaper_model.pth 当作 hybrid 的最终有效权重。
本轮新增的结构包括:
stat_sls.weight_predictor.*swiglu.*temporal_attention.*cgta_pooling.*hybrid_classifier.*
这些参数不存在于原始 MMpaper_model.pth 中。
因此:
- 新结构代码可以先接入;
- 模块 shape 可以先测试;
- 但有效实验结果必须重新训练;
- 如果不训练,新增层只能随机初始化,不能证明创新有效。
main_hybrid.py 支持:
--load_strict 0该参数只适合调试或部分加载旧权重,不适合作为正式实验结论。
最低可展示版本:
- 保留当前原 SLS 结果作为 baseline;
- 跑
train_hybrid_stat_sls.sh; - 跑
train_hybrid_swiglu.sh; - 跑
train_hybrid_temporal.sh; - 跑
train_hybrid_full.sh; - 每组先跑 3 epoch,确认 loss 下降;
- 选择表现较好的组继续跑到 10 epoch 左右;
- 在 DF 20000 和 In-the-Wild 20000 上评测。
建议命令:
bash scripts/test_hybrid_modules.sh
EPOCHS=3 BATCH_SIZE=1 bash scripts/train_hybrid_full.sh训练完成后评测:
MODEL_PATH=models/<hybrid实验目录>/best.pth bash scripts/eval_hybrid_df_20000.sh
python evaluate_2021_DF.py scores/scores_Hybrid_DF_20000.txt ./keys eval
MODEL_PATH=models/<hybrid实验目录>/best.pth bash scripts/eval_hybrid_wild_20000.sh
python evaluate_in_the_wild.py scores/scores_Hybrid_Wild_20000.txt ./keys eval深度伪造语音检测作品实现过程.md 中提出的应用层扩展,当前已放在独立目录:
extensions/
extension_audit.py
已实现能力包括:
- FFmpeg 视频音画分离;
- Whisper ASR 适配;
- WeSpeaker 声纹注册和匹配适配;
- OpenAI-compatible VLM 审计接口;
- 本地模拟 TSA 时间戳存证;
- 多路风险报告汇总;
- 高风险样本清单导出。
这些扩展不改变主模型结构,可与原模型或 hybrid 模型评测结果并行使用。
新增参考文档:
联合判别矩阵实现说明.md
当前已将“声纹相似度 × 伪造概率”的二维联合判别矩阵作为后处理模块接入:
analysis/joint_decision_matrix.py
extension_audit.py joint-risk
web_app.py /api/analyze-recording
web/index.html 单条语音分析
实现方式:
- 不修改
model.py; - 不修改
model_hybrid.py; - 不重新训练模型;
- 将 SLS 输出的
fake_probability与可选的声纹相似度融合; - 输出联合象限、联合风险等级和解释文本。
网页端当前支持两种方式:
- 手动输入声纹相似度,用于演示联合判别矩阵;
- 如果服务端配置了
SPEAKER_ENROLLMENT,则自动调用 WeSpeaker 原声库进行声纹匹配。
命令行示例:
python extension_audit.py joint-risk \
--voice-similarity 0.86 \
--fake-probability 0.92示例输出为:
Q2 / 高危:声纹高度匹配目标人物,且检测为 AI 合成语音。
本次新增了专门的复原说明:
创新实验复原文档.md
如果后续不进行训练,可以采用推荐方案:
保留 hybrid 实验文件,但运行时只使用 main.py 和原评测脚本。
原主线仍然是:
bash scripts/eval_df_20000.sh
bash scripts/eval_wild_20000.sh这保证了项目可以在“创新实验线”和“稳定复现线”之间快速切换。
新增参考文档:
XLS-R_SLS_大模型可解释性零训练可执行方案(1).md
当前已完成第一阶段零训练可解释性功能,新增目录和脚本:
configs/explainability.json
configs/explainability_cpu_debug.json
explainability/
scripts/inspect_model_output.py
scripts/compare_original_output.py
scripts/explain_audio.py
实现原则:
- 不修改
model.py; - 不修改
main.py; - 不新增可训练参数;
- 不重新训练;
- 不改变
MMpaper_model.pth的 state_dict; - 使用原模型输出、SLS 层权重和扰动前后分数变化生成解释证据。
这里需要区分两件事:
- 原 SLS 零训练可解释性:直接解释
MMpaper_model.pth,不训练、不改 checkpoint; - hybrid 训练后可解释性:等后续训练出
models/.../best.pth后,用同一套解释脚本解释新权重。
因此,“可解释性方案”本身不要求重新训练;需要重新训练的是 model_hybrid.py 中新增的 StatisticalSLS、SwiGLU、CGTA 等模型结构创新。
考虑到项目后续计划训练 hybrid 创新模型,当前已在 model_hybrid.py 中加入可解释性接口:
forward(x, return_details=False, layer_mask=None)
说明:
- 默认
return_details=False,训练和评测输出仍为原来的 log-softmax 张量; return_details=True时返回 hidden states、fused sequence、embedding、layer weights、temporal weights 等中间证据;layer_mask用于后续层遮挡解释,遮挡后会按原始层权重总和重新归一化;- 该改动只影响 hybrid 实验线,不影响原
model.py稳定复现线。
已实现能力:
- 原始整段预测;
- SLS 层权重导出;
- 时间遮挡分析;
- 平滑频带遮挡;
- 扰动稳定性分析;
- 结构化
evidence.json; - 固定模板中文报告;
- 报告事实校验与限制性表述。
暂缓能力:
- 修改
model.py内部 forward 以支持真正的归一化层遮挡; - 原型库与 OOD 检测;
- Ollama 本地大模型改写。
暂缓原因:
当前项目已经有稳定复现主线,为避免破坏原 checkpoint 兼容性,本轮采用只读适配器 SLSModelAdapter 获取中间证据,不直接修改 model.py。
hybrid 训练完成后,可使用同一套脚本解释训练得到的新 checkpoint:
python scripts/inspect_model_output.py \
--model-type hybrid \
--audio release_in_the_wild/0.wav \
--checkpoint models/<hybrid实验目录>/best.pth \
--xlsr-checkpoint xlsr2_300m.pt \
--device cpu
python scripts/explain_audio.py \
--model-type hybrid \
--audio release_in_the_wild/0.wav \
--checkpoint models/<hybrid实验目录>/best.pth \
--xlsr-checkpoint xlsr2_300m.pt \
--config configs/explainability_cpu_debug.json \
--output-dir artifacts/reports \
--device cpu验证结果:
hidden_states_shape = [1, 24, 201, 1024]
fused_sequence_shape = [1, 201, 1024]
layer_weights_shape = [24]
fake_class_index = 0
compare_original_output max_abs_difference = 0.0
示例命令:
python scripts/inspect_model_output.py \
--audio release_in_the_wild/0.wav \
--checkpoint MMpaper_model.pth \
--xlsr-checkpoint xlsr2_300m.pt \
--device cpu
python scripts/compare_original_output.py \
--audio release_in_the_wild/0.wav \
--checkpoint MMpaper_model.pth \
--xlsr-checkpoint xlsr2_300m.pt \
--device cpu
python scripts/explain_audio.py \
--audio release_in_the_wild/0.wav \
--checkpoint MMpaper_model.pth \
--xlsr-checkpoint xlsr2_300m.pt \
--config configs/explainability_cpu_debug.json \
--output-dir artifacts/reports \
--device cpu示例输出:
artifacts/reports/0_evidence.json
artifacts/reports/0_report.txt
注意:
报告中的时间片段、频带和层权重表示“模型输出对干预的敏感性”,不能写成真实伪造位置、具体生成器来源或司法鉴定结论。