多模态动态融合模型Predictive Dynamic Fusion阅读与代码分析运行1-信度概念与基础参数指标

多模态动态融合模型Predictive Dynamic Fusion阅读与代码分析运行1-信度概念与基础参数指标

参考文:Cao B, Xia Y, Ding Y, et al. Predictive Dynamic Fusion[J]. arXiv preprint arXiv:2406.04802, 2024.[2406.04802] Predictive Dynamic Fusion

一、理论

今天就先看看论文中的各个指标含义和多模态训练代码的参数吧

文章中一个比较重要的概念就是置信度的概念了,在论文前段,对置信度的扩展比较多同时没有什么具体说明,不知道概念的话读着还是很混乱的;

置信度

在机器学习中,置信度表示模型对其预测结果“有多确定”。
它刻画的是:模型认为自己预测是正确的程度

例如,在分类任务中:“这是正类的概率是 0.92”,那么 0.92 就可以视为模型对该预测的置信度

在监督学习中,给定输入样本 xxx,模型预测类别为 y^\hat{y}y^​,则置信度通常定义为:

即:模型对预测类别的后验概率估计

置信度 和 不确定性(补充)

文中用来衡量整体不确定性,算是置信度的一种扩展:

关于熵的概念,之前在b站看到的一位up主讲的很生动:https://www.bilibili.com/video/BV15V411W7VB/

置信度高 <=> 熵低

分类评价指标对比

指标含义对照

指标一句话解释
Accuracy模型整体准不准
Precision模型说“是”的时候靠谱吗
Recall真正“是”的有没有被找全
F1Precision 和 Recall 的折中
ROC-AUC正样本排在负样本前面的能力

The Mono-Confidences and Holo-Confidences

该文的目的之一是为了解决模态权重融合的权重问题;也就是,多个模态分别从多个维度评价目标的状态,给出不一样的结果,怎么融合这几个结果的问题。

目前可以确定的是:融合权重 ω 应当与损失 l 呈负相关,并且与其他模态的损失呈正相关。也就是:当前模态越可靠 → 权重越大;其他模态越不可靠 → 当前模态权重越大

对单个模态的模型,权重 ω 是要求的权重,损失loss是:

所以,就有人两个信度指标:

The Mono-ConfidencesHolo-Confidences
当前模态本身有多可靠相对其他模态我有多可靠

将他们统合:

Co-Belief(协同信度)

Mono-Confidence:只看自己;Holo-Confidence:只看别人;但多模态融合需要:既考虑自身可靠性,又考虑整体模态状态。

故有:

再由协同信度确定该模态的权重。

理论先到这里,其他的后面再看;

二、代码

1、运行环境

代码训练环境没有明确说明,但根据结构可以看得出来用的是autodl里的云服务器,Ubuntu20.04+python3.11的版本,卡随便租一个都一样。

论文附带代码只有2mb,明显缺失了很多预训练结构与数据集文件;

2、数据集文件

这里选用了代码中可选的第二个训练集MVSA_Single,需要自己到网站下好转到autodl服务器上:MVSA_Single

训练集之类的划分源代码已有了,自己按要求放到同一目录下即可。

3、词向量文件

源代码缺失了预训练好的词向量文件glove.840B.300d,需要自己使用指令下载到指定目录

wget https://nlp.stanford.edu/data/glove.840B.300d.zip

4、源代码逻辑错误

训练代码中的forward函数存在运行逻辑错误,文本和图像的loss(txt_clf_loss和img_clf_loss)定义在了if之外,会运行不成功;估计是作者没有仔细整理,代码算法逻辑倒没什么问题;

原代码150行左右:

def model_forward(i_epoch, model, args, criterion,optimizer, batch,mode='eval'): txt, segment, mask, img, tgt,idx = batch freeze_img = i_epoch < args.freeze_img freeze_txt = i_epoch < args.freeze_txt if args.model == "bow": txt = txt.cuda() out = model(txt) elif args.model == "img": img = img.cuda() out = model(img) elif args.model == "concatbow": txt, img = txt.cuda(), img.cuda() out = model(txt, img) elif args.model == "bert": txt, mask, segment = txt.cuda(), mask.cuda(), segment.cuda() out = model(txt, mask, segment) elif args.model == "concatbert": txt, img = txt.cuda(), img.cuda() mask, segment = mask.cuda(), segment.cuda() out = model(txt, mask, segment, img) elif args.model == "latefusion_pdf": txt, img = txt.cuda(), img.cuda() mask, segment = mask.cuda(), segment.cuda() tgt = tgt.cuda() maeloss = nn.L1Loss(reduction='mean') out, txt_logits, img_logits, txt_tcp_pred, img_tcp_pred = model(txt, mask,segment,img,'pdf_train') label = F.one_hot(tgt, num_classes=args.n_classes) # [b,c] if args.task_type == "multilabel": txt_pred = torch.sigmoid(txt_logits) img_pred = torch.sigmoid(img_logits) else: txt_pred = torch.nn.functional.softmax(txt_logits, dim=1) img_pred = torch.nn.functional.softmax(img_logits, dim=1) txt_tcp, _ = torch.max(txt_pred * label, dim=1,keepdim=True) img_tcp, _ = torch.max(img_pred * label, dim=1,keepdim=True) tcp_pred_loss = maeloss(txt_tcp_pred, txt_tcp.detach()) + maeloss(img_tcp_pred, img_tcp.detach()) else: assert args.model == "mmbt" for param in model.enc.img_encoder.parameters(): param.requires_grad = not freeze_img for param in model.enc.encoder.parameters(): param.requires_grad = not freeze_txt txt, img = txt.cuda(), img.cuda() mask, segment = mask.cuda(), segment.cuda() out = model(txt, mask, segment, img) tgt = tgt.cuda() txt_clf_loss = nn.CrossEntropyLoss()(txt_logits, tgt) img_clf_loss = nn.CrossEntropyLoss()(img_logits, tgt) clf_loss=txt_clf_loss+img_clf_loss+nn.CrossEntropyLoss()(out,tgt) if mode=='train': loss = torch.mean(clf_loss)+torch.mean(tcp_pred_loss) return loss,out,tgt else: loss= torch.mean(clf_loss)+torch.mean(tcp_pred_loss) return loss,out,tgt

修改后:

def model_forward(i_epoch, model, args, criterion, optimizer, batch, mode='eval'): txt, segment, mask, img, tgt, idx = batch tgt = tgt.cuda() clf_loss = 0.0 tcp_pred_loss = 0.0 # ⭐ 先初始化,避免炸 # ---------- 普通单 / 早期融合模型 ---------- if args.model == "bow": txt = txt.cuda() out = model(txt) clf_loss = criterion(out, tgt) elif args.model == "img": img = img.cuda() out = model(img) clf_loss = criterion(out, tgt) elif args.model == "concatbow": txt, img = txt.cuda(), img.cuda() out = model(txt, img) clf_loss = criterion(out, tgt) elif args.model == "bert": txt, mask, segment = txt.cuda(), mask.cuda(), segment.cuda() out = model(txt, mask, segment) clf_loss = criterion(out, tgt) elif args.model == "concatbert": txt, img = txt.cuda(), img.cuda() mask, segment = mask.cuda(), segment.cuda() out = model(txt, mask, segment, img) clf_loss = criterion(out, tgt) # ---------- late fusion(特例) ---------- elif args.model == "latefusion_pdf": txt, img = txt.cuda(), img.cuda() mask, segment = mask.cuda(), segment.cuda() out, txt_logits, img_logits, txt_tcp_pred, img_tcp_pred = \ model(txt, mask, segment, img, 'pdf_train') # 分类 loss txt_loss = criterion(txt_logits, tgt) img_loss = criterion(img_logits, tgt) clf_loss = txt_loss + img_loss # TCP loss maeloss = nn.L1Loss(reduction='mean') label = F.one_hot(tgt, num_classes=args.n_classes) if args.task_type == "multilabel": txt_pred = torch.sigmoid(txt_logits) img_pred = torch.sigmoid(img_logits) else: txt_pred = F.softmax(txt_logits, dim=1) img_pred = F.softmax(img_logits, dim=1) txt_tcp, _ = torch.max(txt_pred * label, dim=1, keepdim=True) img_tcp, _ = torch.max(img_pred * label, dim=1, keepdim=True) tcp_pred_loss = ( maeloss(txt_tcp_pred, txt_tcp.detach()) + maeloss(img_tcp_pred, img_tcp.detach()) ) # ---------- mmbt ---------- else: assert args.model == "mmbt" txt, img = txt.cuda(), img.cuda() mask, segment = mask.cuda(), segment.cuda() out = model(txt, mask, segment, img) clf_loss = criterion(out, tgt) # ---------- 总 loss ---------- loss = clf_loss + tcp_pred_loss return loss, out, tgt

四、各训练参数

主要是get_args里面的参数解释:

训练与优化相关参数

参数名默认值含义说明影响阶段备注 / 建议
batch_sz128每个 batch 的样本数量训练大 batch 更稳定,但占显存
gradient_accumulation_steps24梯度累积步数训练等效 batch = batch_sz × steps
lr1e-4初始学习率训练BERT 微调常用 1e-5~5e-5
weight_decay0.0权重衰减系数(L2 正则)训练防止过拟合
dropout0.1Dropout 概率模型Transformer 常用 0.1
max_epochs100最大训练轮数训练搭配 early stopping
patience10Early stopping 容忍轮数训练验证集无提升时停止
warmup0.1学习率 warmup 比例训练防止初期梯度震荡
lr_factor0.5学习率衰减倍率训练ReduceLROnPlateau
lr_patience2学习率衰减等待轮数训练验证集不提升则降 lr
seed123随机种子全局保证实验可复现
n_workers12DataLoader 线程数数据加载与 CPU 核数相关

文本模态:

参数名默认值含义说明影响阶段备注
bert_model./bert-base-uncasedBERT 预训练模型路径模型可换成 large
freeze_txt0是否冻结文本编码器训练1 表示不更新 BERT
max_seq_len512文本最大 token 长度数据BERT 上限
embed_sz300词向量维度模型对应 GloVe
glove_pathglove.840B.300d.txtGloVe 文件路径数据300 维
hidden_sz768文本隐藏层维度模型BERT-base 默认

图像模态(Image)相关参数

参数名默认值含义说明影响阶段备注
img_hidden_sz2048图像特征维度模型ResNet 输出
num_image_embeds1图像 token 数模型MMBT 中常见
img_embed_pool_typeavg图像特征池化方式模型avg / max
freeze_img0是否冻结图像编码器训练1 表示冻结
drop_img_percent0.0随机丢弃图像比例数据增强模态缺失模拟

融合参数:

参数名默认值含义说明影响阶段备注
modellatefusion_pdf使用的模型结构模型PDF = Predictive Dynamic Fusion
hidden[]额外隐藏层结构模型如 [512,256]
include_bnTrue是否使用 BatchNorm模型提高训练稳定性
dfTrue是否启用动态融合模型PDF 核心开关
baselineNone对比方法名称实验仅用于记录

任务与数据相关参数:

参数名默认值含义说明影响阶段备注
taskMVSA_Single使用的数据集数据多模态情绪识别
task_typeclassification任务类型训练单标签 / 多标签
weight_classes1是否类别加权loss类别不平衡时用
noise0.0标签噪声比例数据鲁棒性实验
data_path/path/to/data_dir/数据集路径数据必须配置
savedir/path/to/save_dir/模型保存路径输出checkpoint

其中,很多任务数据相关参数都需要调整

Read more

Google (Flow) 完全使用指南:从入门到精通AI视频生成

Google (Flow) 完全使用指南:从入门到精通AI视频生成

在AI视频生成领域,Google Flow凭借其出色的电影级视频质量和专为创作者设计的易用性,已经成为影视制作和内容创作者们的首选工具之一。本文将基于我实际使用Google Flow制作玩具宣传视频的经验,详细介绍这个强大工具的各项功能、使用技巧和注意事项。 一、Google Flow 简介 1.1 什么是Google Flow? Google Flow 是由Google DeepMind开发的AI电影制作工具,基于最先进的Veo视频生成模型,能够根据用户的文字描述或参考图片/资产,生成高质量的电影级视频内容。 官网地址: https://labs.google/flow 主要特点: * 支持文生视频(Text-to-Video) * 支持图生视频(Image-to-Video)及多资产一致性生成 * 视频质量高,物理真实、运动流畅自然,支持原生音频(包括对话和环境音) * 生成速度较快(通常几分钟,根据模式而定) * 支持短片段生成(可通过扩展和拼接创建更长叙事) 二、快速上手:第一个视频 2.1

全民“养虾“指南:2026年市面上所有主流AI Agent(小龙虾)完整梳理

全民“养虾“指南:2026年市面上所有主流AI Agent(小龙虾)完整梳理

哈喽,大家好,我是顾北! 最近你的微信群里,大概率出现了这句话:"你的龙虾养好了吗?" 不到半年,一个叫 OpenClaw 的开源项目在 GitHub 上狂揽 27万+ Star,超越 React、Linux,登顶全球开源项目历史第一。国内各大互联网厂商争相入局,深圳有人为帮装一只龙虾排队近千人,闲鱼上代装服务最高喊价 5000 元。 但现在,"龙虾"的阵营已经不只有 OpenClaw 一家了。 本文把目前市面上主要的 AI Agent 产品(统称"小龙虾家族")全部整理出来,包括官方渠道、适合人群和安全情况,帮你选到最适合自己的那只虾。 先说清楚:什么是"小龙虾"? "

人工智能:扩散模型(Diffusion Model)原理与图像生成实战

人工智能:扩散模型(Diffusion Model)原理与图像生成实战

人工智能:扩散模型(Diffusion Model)原理与图像生成实战 1.1 本章学习目标与重点 💡 学习目标:掌握扩散模型的核心原理、前向扩散与反向扩散过程,以及基于扩散模型的图像生成任务实战流程。 💡 学习重点:理解扩散模型的噪声添加与噪声消除机制,学会使用 PyTorch 搭建 DDPM 模型,完成手写数字图像生成任务。 1.2 扩散模型的核心思想 1.2.1 为什么需要扩散模型 💡 传统的生成模型(如 GAN)存在训练不稳定、模式崩溃等问题。扩散模型作为一种基于概率的生成模型,通过逐步添加噪声和逐步去除噪声的双向过程,实现了更稳定的训练和更高质量的生成效果。 扩散模型的灵感来源于非平衡热力学,它的核心是将复杂的生成问题拆解为多个简单的马尔可夫链步骤。在图像生成、文本生成、语音合成等领域,扩散模型的表现已经超越了传统生成模型。 1.2.2 扩散模型的基本框架 💡 扩散模型包含两个核心过程:前向扩散过程和反向扩散过程。 1. 前向扩散过程:从真实数据出发,

【OpenClaw从入门到精通】第01篇:保姆级教程——从零开始搭建你的第一个本地AI助理(2026实测版)

【OpenClaw从入门到精通】第01篇:保姆级教程——从零开始搭建你的第一个本地AI助理(2026实测版)

摘要:本文聚焦2026年开源AI代理工具OpenClaw的本地部署与实操,从核心概念拆解入手,先厘清OpenClaw、Gateway、Skills、ClawHub的关联,再明确硬件系统要求与大模型API-Key准备要点,通过官方一键安装脚本完成本地部署,并配置阿里云百炼API实现大模型对接。以“让AI助理抓取开源中国热门项目”的虚拟实战案例,详细演示Skills调用流程,同时梳理部署中“命令找不到”“API-Key配置失败”等高频问题的解决方法。内容兼顾新手友好性与实操参考性,所有步骤均基于公开技术文档验证,案例为虚拟构建,代码仅作示例未上传GitHub,可指导读者快速搭建本地AI助理并验证核心功能。 优质专栏欢迎订阅! 【DeepSeek深度应用】【Python高阶开发:AI自动化与数据工程实战】【YOLOv11工业级实战】 【机器视觉:C# + HALCON】【大模型微调实战:平民级微调技术全解】 【人工智能之深度学习】【AI 赋能:Python 人工智能应用实战】【数字孪生与仿真技术实战指南】 【AI工程化落地与YOLOv8/v9实战】【C#工业上位机高级应用:高并发通信+性