当前位置: 首页 > news >正文

多模态学习架构

一、什么是多模态学习?

多模态(Multimodal)指的是不同类型的数据形式:文本、图像、音频、视频、点云、传感器信号等。人类天然就是多模态学习 者——同时通过视觉、听觉、听觉来理解世界。 多模态学习的核心目标是让模型能够联合理解并关联来自不同模态的信息。比如一张狗的图片,同时听到“汪汪”的声音,模型应该能够把这两者关联起来。

二、核心挑战

1.表示不同性

不同模态的数据结构差异巨大:图像是密集的像素网格,文本是离散的符号序列,音频是连续的波形信号。如何把它们映射到一个可比较的语义空间?

2.对齐问题

如何建立跨模态的对应关系? 比如一句话“一只棕色的狗在草地上跑步”,其中“棕色”对应图像的哪个区域?“跑步”对应视频的哪一帧?

3.融合策略

何时融合、如何融合不同模态的信息?过早融合可能会丢失模态信息,过晚融合可能会丢失跨模态交易。

4.模态与不平衡

训练时某些模态数据可能失效或噪声大,如何保证鲁棒性?

三、架构演进路线

1.双塔结构

最简洁的设计思路:每个模态用独立的编码器,最后在共享空间中对齐。

图像 → Image Encoder → 图像向量 ↘ → 对比学习(Contrastive) 文本 → Text Encoder → 文本向量 ↗

代表模型:CLIP (2021)

Python# CLIP的核心思想伪代码 image_features = image_encoder(images) # [B, D] text_features = text_encoder(texts) # [B, D] # L2归一化 image_features = F.normalize(image_features, dim=-1) text_features = F.normalize(text_features, dim=-1) # 计算相似度矩阵 logits = image_features @ text_features.T * temperature # [B, B] # 对比损失:对角线上的配对应该相似度最高 labels = torch.arange(B) loss = (F.cross_entropy(logits, labels) + F.cross_entropy(logits.T, labels)) / 2 **优点**:结构简单,推理高效(可以预计算特征),zero-shot能力强 **缺点**:缺乏深度跨模态交互,难以处理细粒度理解任务

2.融合编码器

在编码过程中就让不同模态交互,通过Cross-Attention实现深度融合。

图像tokens ──┐ ├──→ Transformer (带Cross-Attention) → 融合表示 文本tokens ──┘

代表模型:ViLT、ALBEF、BLIP

# Cross-Attention的核心机制 class CrossAttention(nn.Module): def forward(self, x, context): # x: 查询模态 [B, N, D] # context: 被查询模态 [B, M, D] Q = self.W_q(x) # Query来自x K = self.W_k(context) # Key来自context V = self.W_v(context) # Value来自context attn = softmax(Q @ K.T / sqrt(d)) return attn @ V # x的每个token"看"context

3. 统一序列建模

把所有模态都tokenize成序列,用统一的Transformer处理。

核心思想:

图像 → ViT 切为补丁标记 文本 → 词表标记化 音频 → 声谱图补丁或离散化音频标记
# 统一序列的构建 image_tokens = vit_patchify(image) # [B, 196, D] text_tokens = embed(tokenize(text)) # [B, L, D] # 拼接成统一序列 unified_seq = concat([image_tokens, text_tokens], dim=1) # 统一Transformer处理 output = transformer(unified_seq)

四、关键技术组件深度解析

多模态完整框架

┌─────────────────────────────────────────────────────────────────┐ │ 多模态大模型 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 视觉编码器 │ → │ 投影层 │ → │ 跨模态融合 │ → │ LLM │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ ↑ ↓ │ │ ┌──────────┐ ┌──────────┐ │ │ │ 图像输入 │ │ 输出头 │ │ │ └──────────┘ └──────────┘ │ │ ↓ │ │ ┌──────────┐ ┌──────────┐ 生成的文本 │ │ │ 文本输入 │ → │ Tokenizer │ ─────────────────────→ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────────┘

1. 视觉编码器

视觉编码器的任务是把图像转换成神经网络能理解的数值表示(特征表达)。

为什么需要它?

图像原始是像素矩阵,比如一张224×224的RGB图像就是[224, 224, 3]数组,里面是0-255的数值。这些原始 像素对模型来说就是“噪声”——它看不出是一只猫还是一只狗。 视觉编码器的作用就是提取抽取特征:把像素信息压缩成包含“这是什么”的功能。

1. 1 CNN系列(本质神经网络)

主流框架
传统的视觉逐层编码器,通过卷积层提取特征:

原始图像 [224, 224, 3] ↓ Conv层 边缘、纹理特征 [112, 112, 64] ↓ Conv层 局部模式特征 [56, 56, 128] ↓ Conv层 物体部件特征 [28, 28, 256] ↓ Conv层 高级语义特征 [7, 7, 512] ↓ 池化 最终特征向量 [512]

代表模型:ResNet、ConvNeXt

1.2 ViT系列(视觉变压器)

现在多模态模型的主流选择。核心思想是把图像破坏小块(补丁),用“视觉单词”来处理:
图示:

原始图像 224×224 ┌──┬──┬──┬──┐ │P1│P2│P3│..│ 切成14×14=196个patch ├──┼──┼──┼──┤ 每个patch 16×16像素 │P4│P5│P6│..│ ├──┼──┼──┼──┤ │..│..│..│..│ └──┴──┴──┴──┘ ↓ 展平 + 线性投影 [CLS] [P1] [P2] ... [P196] ← 197个tokens ↓ Transformer处理 [全局特征] [局部特征1] [局部特征2] ... [局部特征196]

常用的预训练视觉编码器

模型训练方式特点
CLIP ViT图文对比学习语义理解强,适合多模态
DINOv2自监督学习细粒度特征好,适合分割定位
SigLIP改进的对比学习比CLIP更稳定

1.3 LLM (Large Language Model,大语言模型)

LLM是处理和生成文本的大型神经网络,本质是一个强大的"文字接龙"机器。

核心能力

给定前文,预测下一个词:

输入: "今天天气真" 输出概率: "好"(0.6), "差"(0.2), "热"(0.1), ... ## 2. 投影层 / 连接器 视觉编码器和LLM是独立预训练的,它们的特征空间完全不同。投影层的任务是桥接两个世界,把视觉特征“翻译”成LLM能理解 的语言。 打个比方:编码器说“法语”,LLM说“中文”,投影层就是翻译官 但因为在海量文本上训练,它学会了:语言规律、世界知识、推理能力、指令遵循

架构:仅解码器变压器
现代LLM(GPT系列、LLaMA、Qwen等)都采用了这个架构:

class LLMBlock(nn.Module): def forward(self, x): # 1. 自注意力(Causal/Masked):每个token只能看到之前的tokens x = x + self.self_attention(x, mask=causal_mask) # 2. 前馈网络:非线性变换 x = x + self.feed_forward(x) return x class LLM(nn.Module): def forward(self, input_ids): # 1. 词嵌入:token ID → 向量 x = self.embedding(input_ids) # [B, L, D] # 2. 通过多层Transformer Block for block in self.blocks: # 比如32层 x = block(x) # 3. 预测下一个token的概率分布 logits = self.lm_head(x) # [B, L, vocab_size] return logits

五、训练策略

第一阶段:特征扫描预训练
目标:视觉特征和语言空间景观

# 典型任务:Image Captioning for image, caption in dataloader: visual_tokens = projector(vision_encoder(image)) input_ids = concat([visual_tokens, tokenize(caption)]) loss = llm.forward(input_ids, labels=caption_ids)

第二阶段:指令调优
目标:让模型能够遵循饮食的指令

# 数据格式 { "image": "path/to/image.jpg", "conversations": [ {"from": "human", "value": "<image>\n这张图片里有什么?"}, {"from": "gpt", "value": "这张图片显示了一只金毛犬在海滩上奔跑..."}, {"from": "human", "value": "狗看起来开心吗?"}, {"from": "gpt", "value": "是的,从它张开的嘴巴和..."} ] }
http://www.cnnetsun.cn/news/42653.html

相关文章:

  • day37简单的神经网络@浙大疏锦行
  • 【水果识别】基于机器视觉苹果和香蕉的成熟度和大小检测附Matlab代码
  • JAVA的平凡之路——此峰乃是最高峰JVM-附加小菜-04
  • 【电力系统】电力系统优化与控制热液调度附Matlab代码和报告
  • 基于6种最新算法(小龙虾优化算法COA、MSA、RTH、NOA、BFO、SWO)求解机器人路径规划研究附Matlab代码
  • Golang实战:构建综合多头(逾期+反欺诈)风险查询的高性能客户端
  • 【TSP问题】基于蜣螂算法DBO和改进的蜣螂算法FADBO求解旅行商TSP问题(可根据自己的经纬度设置自己想要到达的地区)附Matlab代码
  • 【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析附Matlab代码
  • 数据结构:二叉排序树,平衡二叉树,红黑树的介绍
  • 软件复用的分类与实现
  • google服务
  • 进程PCB
  • 实战教程:1小时掌握逆向Unity游戏 (共13课时)
  • [从零构建操作系统]08 函数调用时栈的底层行为解析
  • 力扣hot100:搜索插入位置
  • Java冷启动全指南:从原理到实战优化
  • 测试 - 单元测试(JUnit)
  • C++中多态
  • c++经典练习题-多分支
  • qt为什么转向用cmake放弃qmake
  • 云屋音视频 SDK 凭何成为信创技术困局的 “破局者”?
  • 纯电动汽车动力经济性仿真:Cruise与Simulink联合仿真(2015版),包含BMS、再...
  • 【怎么理解maven中的镜像和仓库?】
  • comsol枝晶生长,沉积模型,包括:典型,形状成核,随机成核,均匀沉积,雪花晶形成过程。 适...
  • 终极指南:Qwen3-30B-A3B多GPU分布式推理完整解决方案
  • 腾讯混元语音驱动数字人技术:重塑动态视频生成新范式
  • 【MicroPython编程-ESP32篇】-Web页面显示DHT11传感器数据
  • DCDC电池模型:基于Matlab 2018b及以上的应用
  • Day 38 - Dataset 和 DataLoader
  • [C#][winform]基于yolov11的打架行为检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面