主线和任务整理
- 毕设:潜在事件链推理
- 期刊:在潜在事件链之上的多智能体协同因果推理
题目:基于多智能体协同的视频因果事件推理
这周,继续复现Flipped-VQA项目(把结构看了看,彻底跑通了原论文其他几个数据集),
准备复用:
- 现成的 NExT-QA 数据流
- 稳定的预提取特征读取方式
- 可直接复用的初始 answerer
关于数据集事件链具体怎么建立的方案:
把视频统一表示成 T 个 clip 单元,再从这些 clip 自适应聚合出 K 个潜在事件节点。
(我想继续调研思考一下如何聚合,暂时没想好,打算边做边想)
这样一来
- 在 MECD 这种有事件级监督的数据上,能学到更像“真实事件”的结构(之后那个数据集也可以用同样的结构);
- 在 NExT-QA / Causal-VidQA 这种没有人工事件边界的 QA 数据上,仍然能工作。
关于目前具体的实施方案
模块 1:Grounder
输入:
- 问题
q - 选项
o_k - 事件节点
e1...eK
输出:
- 每个事件节点对该选项的支持度
g_k(i)
直白讲就是:
这个选项最依赖哪几个事件节点?
第一版可以用两层 MLP 或轻量 cross-attention,先不要搞复杂。
模块 2:Causal Linker
在每个选项自己的 top-M 事件节点上判断因果边。
默认建议:
topM = 4- 只允许
i < j - 也就是只考虑时间向前的有向边
边分数可以写成:
p_ij^(k) = sigmoid(MLP([e_i, e_j, q, o_k, Δt]))
这一步的直觉是:
不是全视频建一张大图,而是对每个选项单独找最支持它的因果结构。
模块 3:Chain Search
先不要做完整图搜索,第一版就搜链:
- 长度 2
- 长度 3
链分数 = 节点支持分数之和 + 边分数之和。
这样你就能得到每个选项的一条 best chain。
模块 4:Answerer
输入:
- 全局视频表示
- 问题表示
- 选项表示
- 该选项的链摘要表示
输出:
- 该选项最终分数
这里工程上最稳的做法是:
- 第一版直接复用你现有 Flipped-VQA 里的 answer scoring 逻辑
- 论文里把它叫 base answerer
- 后面想独立出来,再换成自己的 scorer
毕设版损失
建议直接用这个:
L_thesis = L_ans + 0.2 L_chain_rank + 0.1 L_chain_mask + 0.01 L_sparse
解释一下:
L_ans:正常答案分类损失L_chain_rank:正确答案的 best chain 要比错误答案更强L_chain_mask:把预测链遮掉,正确答案应该比遮随机链更受伤L_sparse:约束不要选一大堆“伪关键事件”
之后进一步的工作计划,添加模块,提升可解释性和效果,最终目标是期刊:
模块 5:Verifier
Verifier 检查三件事:
1)覆盖度
链上的节点是不是 Grounder 认为的高相关节点。
2)自洽性
链上的边是不是方向一致、分数一致为正。
3)必要性
把 best chain 上的事件 mask 掉,再看正确答案分数下降多少。
同时做一个随机 mask 对照。
定义:
drop_chaindrop_rand
你的目标是:
drop_chain > drop_rand
这一步的意义非常直接:
真正关键的因果链被拿掉后,正确答案应该更受伤。NExT-GQA 之所以对你重要,就是因为它把“证据对不对”这件事单独拉了出来;作者也明确指出,很多模型虽然 QA 分高,但 grounding 很弱。你的 Verifier 正好是在补这个缺口。([arXiv][4])
模块 6:Organizer
这一步才真正把它写成“多智能体协同”。
V1:规则版 Organizer
先不学,直接按题型路由。
在 NExT-QA 上:
- descriptive → route 0:Answerer only
- temporal → route 1:Grounder + Answerer
- causal → route 2:Grounder + Causal Linker + Verifier + Answerer
在 Causal-VidQA 上:
- description → route 0
- explanation → route 2
- prediction / counterfactual → route 2
这样做很自然,因为 NExT-QA 和 Causal-VidQA 本身都带有题型划分。Causal-VidQA 一共 107,600 个 QA,对 description / explanation / prediction / counterfactual 做了明确区分,这正好适合作为 Organizer 的外部验证集。
V2:学习版 Organizer
等规则版跑稳后,再做一个小分类器:
输入:
- question text embedding
输出:
- route 0 / 1 / 2
- 可选预算
budget ∈ {2,4,6}
损失加一项:
L_route
再加一个轻量代价惩罚:
L_cost
于是期刊版总损失可以写成:
L_journal = L_ans + 0.2 L_rank + 0.1 L_int + 0.05 L_route + 0.01 L_cost + 0.01 L_sparse
其中如果你在 MECD 上做了 causal edge 预训练,那 L_edge 在预训练阶段单独加,不一定非要在 NExT-QA 联训时一起加。