多模态融合——眼睛+耳朵=更聪明
📚 《从零到一造大脑:AI架构入门之旅》专栏
专栏定位:面向中学生、大学生和 AI 初学者的科普专栏,用大白话和生活化比喻带你从零理解人工智能
本系列共 42 篇,分为八大模块:
- 📖 模块一【AI 基础概念】(3 篇):AI/ML/DL 关系、学习方式、深度之谜
- 🧠 模块二【神经网络入门】(4 篇):神经元、权重、激活函数、MLP
- 🏗️ 模块三【深度学习核心】(6 篇):损失函数、梯度下降、反向传播、过拟合、Batch/Epoch/LR
- 🎯 模块四【注意力机制】(5 篇):从 Attention 到 Transformer
- 🔬 模块五【NCT 与 CATS-NET 案例】(8 篇):真实架构演进全记录
- 🔄 模块六【架构融合方法】(6 篇):如何设计混合架构
- ⚙️ 模块七【参数调优实战】(6 篇):学习率、正则化、超参数搜索
- 🚀 模块八【综合应用展望】(4 篇):未来趋势与职业规划
本文是模块五第 3 篇,带你理解多模态融合的奥秘。👨💻 作者简介:NeuroConscious Research Team,一群热爱 AI 科普的研究者,专注于神经科学启发的 AI架构设计与可解释性研究。理念:“再复杂的概念,也能用大白话讲清楚”。
💻 项目地址:https://github.com/wyg5208/nct.git
🌐 官网地址:https://neuroconscious.link
📝 作者 CSDN:https://blog.csdn.net/yweng18
📦 NCT PyPI:https://pypi.org/project/neuroconscious-transformer/
⭐ 欢迎 Star⭐、Fork🍴、贡献代码🤝
📌 本文核心比喻:上课时眼睛看PPT、耳朵听老师、手记笔记——多感官配合学得更好
⏱️ 阅读时间:约 23 分钟
🎯 学习目标:理解什么是多模态融合,掌握 NCT 如何整合视觉、听觉和内感受信息
📝 文章摘要

本文讲解 NCT 的多模态融合机制。想象你在课堂上:眼睛看着 PPT,耳朵听着老师讲解,手里记着笔记——三种感官同时工作,让你理解得更透彻。AI 也是如此:能同时"看"图像、"听"声音、"感知"内部状态,会比只依赖单一信息源更聪明。本文将介绍 NCT 的三种编码器(视觉、听觉、内感受)如何协同工作,以及交叉注意力如何实现深度模态融合。
🎯 你需要先了解
阅读本文前,建议你:
- ✅ 了解 Transformer 编码器的结构(参考第 17 篇)
- ✅ 理解全局工作空间的概念(参考第 21 篇)
- ✅ 知道什么是嵌入(Embedding)
如果还没读前文,[点这里返回](21-全局工作空间 大脑的黑板_version_B.md)
📖 正文
一、什么是多模态?
1.1 模态的定义
常见模态类型:
👀 视觉模态:
- 图像、视频、图表
- 信息特点:空间结构强
👂 听觉模态:
- 语音、音乐、环境音
- 信息特点:时序结构强
📝 文本模态:
- 书面文字、符号
- 信息特点:高度抽象
💓 内感受模态(Interoception):
- 心跳、呼吸、体温、饥饿感
- 信息特点:反映内部状态
🤚 触觉模态:
- 压力、温度、纹理
- 信息特点:直接接触感知
1.2 为什么需要多模态?
场景1:看图识物
- 只看图像,可能误判
- 例如:看到圆形物体,是球?还是盘子?
场景2:听声辨意
- 只听声音,可能误解
- 例如:“bank” 是银行?还是河岸?
场景3:纯文本理解
- 没有上下文,可能歧义
- 例如:“这个苹果很棒”——是水果?还是手机?
信息互补:
- 图像+文字 → 更准确的语义理解
- 声音+画面 → 更完整的场景感知
鲁棒性提升:
- 一个模态出问题,其他模态可以补偿
- 例如:视频模糊时,声音仍可提供信息
更接近人类:
- 人类天生就是多感官的
- AI 也应该如此
1.3 生活中的多模态例子
| 场景 | 视觉 | 听觉 | 文本 | 内感受 |
|---|---|---|---|---|
| 看电影 | 画面 | 对话、音效 | 字幕 | 无 |
| 开车 | 路况 | 导航语音 | 路牌文字 | 车辆震动 |
| 玩游戏 | 游戏画面 | 音效、语音 | UI文字 | 手柄震动 |
| 演讲 | 观众表情 | 掌声 | 幻灯片文字 | 紧张心跳 |
二、NCT 的多模态架构

2.1 三大编码器
NCT 设计了三种专门的编码器,分别处理不同模态的信息:
| 编码器 | 处理内容 | 技术方案 | 输出维度 |
|---|---|---|---|
| Vision Transformer | 图像、视频 | 图像切块 + 自注意力 | 768 |
| Audio Spectrogram Transformer | 声音、语音 | 频谱图 + 自注意力 | 768 |
| Interoception Encoder | 内部状态 | MLP + 时序编码 | 768 |
import torch
import torch.nn as nn
class VisionEncoder(nn.Module):
"""
视觉编码器:基于 Vision Transformer (ViT)
工作原理:
1. 将图像切成小块(patch)
2. 每个块线性投影为向量
3. 加入位置编码
4. 通过 Transformer 编码器
"""
def __init__(self, image_size=224, patch_size=16, d_model=768, n_heads=12, n_layers=12):
super().__init__()
self.patch_size = patch_size
self.n_patches = (image_size // patch_size) ** 2 # 196 patches
# 图像块嵌入
self.patch_embed = nn.Conv2d(
in_channels=3,
out_channels=d_model,
kernel_size=patch_size,
stride=patch_size
)
# 位置编码
self.pos_embed = nn.Parameter(torch.randn(1, self.n_patches + 1, d_model))
self.cls_token = nn.Parameter(torch.randn(1, 1, d_model))
# Transformer 编码器
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=n_heads,
dim_feedforward=d_model * 4,
batch_first=True
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=n_layers)
def forward(self, images):
"""
images: [batch, 3, H, W]
返回: [batch, n_patches+1, d_model]
"""
batch_size = images.shape[0]
# 图像块嵌入
patches = self.patch_embed(images) # [batch, d_model, H/P, W/P]
patches = patches.flatten(2).transpose(1, 2) # [batch, n_patches, d_model]
# 加入 CLS token
cls_tokens = self.cls_token.expand(batch_size, -1, -1)
patches = torch.cat([cls_tokens, patches], dim=1)
# 加入位置编码
patches = patches + self.pos_embed
# Transformer 编码
output = self.transformer(patches)
return output
class AudioEncoder(nn.Module):
"""
音频编码器:基于 Audio Spectrogram Transformer (AST)
工作原理:
1. 将音频转换为频谱图
2. 频谱图视为"图像"处理
3. 使用类似 ViT 的架构
"""
def __init__(self, sample_rate=16000, n_mels=128, d_model=768, n_heads=12, n_layers=12):
super().__init__()
# 频谱图参数
self.sample_rate = sample_rate
self.n_mels = n_mels
# 简化版:假设频谱图已经预处理
# 实际使用时需要 torchaudio 转换
self.spectrogram_embed = nn.Linear(n_mels, d_model)
# 位置编码(时序)
max_len = 1000
self.pos_embed = nn.Parameter(torch.randn(1, max_len, d_model))
# Transformer 编码器
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=n_heads,
dim_feedforward=d_model * 4,
batch_first=True
)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=n_layers)
def forward(self, spectrogram):
"""
spectrogram: [batch, n_mels, time_steps]
返回: [batch, time_steps, d_model]
"""
# 转置为 [batch, time_steps, n_mels]
spectrogram = spectrogram.transpose(1, 2)
# 线性投影
x = self.spectrogram_embed(spectrogram)
# 加入位置编码
seq_len = x.shape[1]
x = x + self.pos_embed[:, :seq_len, :]
# Transformer 编码
output = self.transformer(x)
return output
class InteroceptionEncoder(nn.Module):
"""
内感受编码器:处理身体内部状态
工作原理:
1. 接收内部信号(心率、体温、压力等)
2. 通过 MLP 编码
3. 加入时序信息(如需要)
"""
def __init__(self, n_signals=10, d_model=768, hidden_dim=256):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(n_signals, hidden_dim),
nn.LayerNorm(hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, hidden_dim),
nn.LayerNorm(hidden_dim),
nn.GELU(),
nn.Linear(hidden_dim, d_model),
nn.LayerNorm(d_model)
)
def forward(self, signals):
"""
signals: [batch, n_signals] 或 [batch, seq_len, n_signals]
返回: [batch, d_model] 或 [batch, seq_len, d_model]
"""
return self.encoder(signals)
2.2 内感受:身体的"第六感"
大多数 AI 系统只处理视觉和听觉,但 NCT 引入了内感受(Interoception)编码器,这是一个创新。
什么是内感受?
- 感知身体内部状态的能力
- 包括:心跳、呼吸、饥饿、口渴、温度等
为什么 AI 需要内感受?
- 模拟"情绪"状态:紧张时心跳加速
- 提供"动机"信号:需要充电(类似饥饿)
- 增强"自我意识":感知自身状态
应用场景:
- 机器人:电池电量、传感器状态
- 游戏 AI:游戏角色的"紧张程度"
- 医疗 AI:监测患者生命体征
三、交叉注意力:模态融合的核心

3.1 什么是交叉注意力?
类比:两个人对话
自注意力:
- 一个人自言自语
- Q、K、V 都来自同一个人
交叉注意力:
- A 问 B 问题
- Q 来自 A,K 和 V 来自 B
- A 通过"提问"获取 B 的信息
多模态中的交叉注意力:
- 视觉"问"听觉:这个图像对应什么声音?
- 听觉"问"视觉:这个声音来自画面中的哪里?
- 双向交叉,互相"提问"和"回答"
3.2 NCT 的跨模态整合模块
class CrossModalIntegration(nn.Module):
"""
跨模态整合模块
核心思想:
1. 每个模态都可以"问"其他模态问题
2. 通过交叉注意力实现深度信息交换
3. 输出融合后的多模态表示
"""
def __init__(self, d_model=768, n_heads=8, dropout=0.1):
super().__init__()
# 视觉 -> 其他模态的交叉注意力
self.visual_to_audio = nn.MultiheadAttention(d_model, n_heads, dropout, batch_first=True)
self.visual_to_interoception = nn.MultiheadAttention(d_model, n_heads, dropout, batch_first=True)
# 听觉 -> 其他模态的交叉注意力
self.audio_to_visual = nn.MultiheadAttention(d_model, n_heads, dropout, batch_first=True)
self.audio_to_interoception = nn.MultiheadAttention(d_model, n_heads, dropout, batch_first=True)
# 内感受 -> 其他模态的交叉注意力
self.intero_to_visual = nn.MultiheadAttention(d_model, n_heads, dropout, batch_first=True)
self.intero_to_audio = nn.MultiheadAttention(d_model, n_heads, dropout, batch_first=True)
# 融合层
self.fusion_proj = nn.Sequential(
nn.Linear(d_model * 3, d_model),
nn.LayerNorm(d_model),
nn.GELU(),
nn.Linear(d_model, d_model)
)
# 残差连接
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
def forward(self, visual_emb, audio_emb, intero_emb):
"""
visual_emb: [batch, seq_v, d_model]
audio_emb: [batch, seq_a, d_model]
intero_emb: [batch, seq_i, d_model]
返回:融合后的表示 [batch, 1, d_model]
"""
# 视觉从其他模态获取信息
visual_audio, _ = self.visual_to_audio(
query=visual_emb,
key=audio_emb,
value=audio_emb
)
visual_intero, _ = self.visual_to_interoception(
query=visual_emb,
key=intero_emb,
value=intero_emb
)
# 听觉从其他模态获取信息
audio_visual, _ = self.audio_to_visual(
query=audio_emb,
key=visual_emb,
value=visual_emb
)
audio_intero, _ = self.audio_to_interoception(
query=audio_emb,
key=intero_emb,
value=intero_emb
)
# 内感受从其他模态获取信息
intero_visual, _ = self.intero_to_visual(
query=intero_emb,
key=visual_emb,
value=visual_emb
)
intero_audio, _ = self.intero_to_audio(
query=intero_emb,
key=audio_emb,
value=audio_emb
)
# 残差连接 + 融合
visual_enhanced = self.norm1(visual_emb + visual_audio + visual_intero)
audio_enhanced = self.norm1(audio_emb + audio_visual + audio_intero)
intero_enhanced = self.norm1(intero_emb + intero_visual + intero_audio)
# 池化为单一向量
visual_pooled = visual_enhanced.mean(dim=1, keepdim=True)
audio_pooled = audio_enhanced.mean(dim=1, keepdim=True)
intero_pooled = intero_enhanced.mean(dim=1, keepdim=True)
# 拼接融合
concat = torch.cat([visual_pooled, audio_pooled, intero_pooled], dim=-1)
fused = self.fusion_proj(concat)
return self.norm2(fused)
class MultiModalEncoder(nn.Module):
"""
NCT 完整的多模态编码器
整合三种编码器和跨模态融合模块
"""
def __init__(self, d_model=768):
super().__init__()
# 三种编码器
self.visual_encoder = VisionEncoder(d_model=d_model)
self.audio_encoder = AudioEncoder(d_model=d_model)
self.intero_encoder = InteroceptionEncoder(d_model=d_model)
# 跨模态融合
self.cross_modal = CrossModalIntegration(d_model=d_model)
def forward(self, images=None, spectrogram=None, signals=None):
"""
处理多模态输入,返回融合后的表示
"""
batch_size = images.shape[0] if images is not None else spectrogram.shape[0]
# 编码各模态
visual_emb = self.visual_encoder(images) if images is not None else torch.zeros(batch_size, 1, 768)
audio_emb = self.audio_encoder(spectrogram) if spectrogram is not None else torch.zeros(batch_size, 1, 768)
intero_emb = self.intero_encoder(signals) if signals is not None else torch.zeros(batch_size, 1, 768)
# 跨模态融合
fused = self.cross_modal(visual_emb, audio_emb, intero_emb)
return fused, {
'visual': visual_emb,
'audio': audio_emb,
'interoception': intero_emb
}
3.3 模态融合的效果
| 任务 | 单模态(仅视觉) | 单模态(仅听觉) | 多模态融合 | 提升幅度 |
|---|---|---|---|---|
| 视频分类 | 78% | 65% | 89% | +11% |
| 情感识别 | 71% | 68% | 85% | +14% |
| 语音识别(噪声环境) | - | 72% | 88% | +16% |
| 机器人导航 | 75% | 60% | 91% | +16% |
四、多模态融合的实际应用

4.1 视频理解:画面+声音
视频内容理解:
- 视觉:识别人物、场景、动作
- 听觉:对话、音乐、环境音
- 融合:完整理解视频内容
例子:
- 视觉看到"张嘴"动作
- 听觉听到"喵"的声音
- 融合结论:这是在学猫叫,不是打哈欠
4.2 医疗诊断:影像+病历+体征
模态组成:
- 医学影像(X光、CT、MRI)
- 病历文本
- 生命体征(心率、血压、体温)
优势:
- 影像可能漏诊,结合病历可提高准确率
- 生命体征提供动态信息
- 多模态交叉验证,减少误诊
4.3 机器人:视觉+触觉+听觉
场景:机器人抓取物体
视觉:定位物体位置、识别形状
触觉:感知抓取力度、物体硬度
听觉:听到碰撞声判断是否成功
内感受:电池电量、关节温度
融合效果:
- 单视觉:可能抓空或捏碎
- 多模态:精确控制,成功率高
五、多模态融合的挑战
5.1 模态对齐问题
问题:
- 视觉和听觉可能有时间差
- 例如:声音传播速度 vs 光速
解决方案:
- 学习时间偏移量
- 使用滑动窗口对齐
- 交叉注意力自动学习对齐
5.2 模态缺失问题
问题:
- 实际场景中,某些模态可能缺失
- 例如:视频无声、图像模糊
解决方案:
- 缺失模态用默认值填充
- 训练时随机丢弃模态(增强鲁棒性)
- 模态权重动态调整
5.3 计算复杂度
问题:
- 三种编码器 + 跨模态注意力 = 计算量大
- 实时应用可能面临延迟
解决方案:
- 编码器共享参数
- 早期融合(低层合并)
- 模态选择(根据任务选择相关模态)
⚠️ 常见误区澄清
❌ 误区 1:“多模态就是简单拼接”
真相:
简单拼接(Early Fusion)只是多模态融合的一种,效果往往不好。
NCT 使用交叉注意力实现深度交互——每个模态都可以"问"其他模态问题。
这种交互比简单拼接更能捕获模态间的复杂关系。
❌ 误区 2:“模态越多越好”
真相:
更多模态意味着:
- 更多计算资源
- 更难对齐
- 更容易引入噪声
选择模态要根据任务需求,不是越多越好。例如,文本分类任务可能不需要视觉信息。
❌ 误区 3:“内感受编码器没用”
真相:
内感受是人类意识的重要组成部分,NCT 引入它是为了更完整地模拟意识机制。
在某些任务中(如情绪识别、机器人控制),内感受信号可以提供关键信息。
❌ 误区 4:“多模态模型一定比单模态好”
真相:
如果多模态融合设计不当,可能引入噪声,效果反而不如单模态。
需要精心设计融合策略,并进行充分实验验证。
🧪 动手实验:简单的图文跨模态融合
"""
实验:简单的图文跨模态融合
演示如何用交叉注意力实现图像和文本的融合
"""
import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
import numpy as np
# ==================== 定义模块 ====================
class SimpleTextEncoder(nn.Module):
"""简单的文本编码器(模拟)"""
def __init__(self, vocab_size=1000, d_model=64):
super().__init__()
self.embedding = nn.Embedding(vocab_size, d_model)
self.fc = nn.Linear(d_model, d_model)
def forward(self, text_ids):
"""
text_ids: [batch, seq_len]
返回: [batch, seq_len, d_model]
"""
x = self.embedding(text_ids)
return self.fc(x)
class SimpleImageEncoder(nn.Module):
"""简单的图像编码器(模拟)"""
def __init__(self, d_model=64):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
)
self.fc = nn.Linear(64 * 8 * 8, d_model)
def forward(self, images):
"""
images: [batch, 3, 32, 32]
返回: [batch, 1, d_model]
"""
x = self.conv(images)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x.unsqueeze(1)
class CrossModalFusion(nn.Module):
"""跨模态融合模块"""
def __init__(self, d_model=64, n_heads=4):
super().__init__()
# 文本 -> 图像 的交叉注意力
self.text_to_image = nn.MultiheadAttention(
d_model, n_heads, batch_first=True
)
# 图像 -> 文本 的交叉注意力
self.image_to_text = nn.MultiheadAttention(
d_model, n_heads, batch_first=True
)
# 融合层
self.fusion = nn.Linear(d_model * 2, d_model)
def forward(self, text_emb, image_emb):
"""
text_emb: [batch, seq_len, d_model]
image_emb: [batch, 1, d_model]
"""
# 文本"问"图像
text_attended, attn_t2i = self.text_to_image(
query=text_emb,
key=image_emb,
value=image_emb
)
# 图像"问"文本
image_attended, attn_i2t = self.image_to_text(
query=image_emb,
key=text_emb,
value=text_emb
)
# 融合
text_pooled = text_attended.mean(dim=1, keepdim=True)
concat = torch.cat([text_pooled, image_attended], dim=-1)
fused = self.fusion(concat)
return fused, {
'text_to_image_attn': attn_t2i,
'image_to_text_attn': attn_i2t
}
# ==================== 创建模拟数据 ====================
def create_mock_data(batch_size=4, seq_len=10, d_model=64):
"""创建模拟的图文数据"""
# 模拟文本:随机词ID
text_ids = torch.randint(0, 1000, (batch_size, seq_len))
# 模拟图像:随机像素
images = torch.randn(batch_size, 3, 32, 32)
return text_ids, images
# ==================== 运行实验 ====================
def run_experiment():
"""运行跨模态融合实验"""
print("=" * 60)
print("🧪 图文跨模态融合实验")
print("=" * 60)
# 初始化模型
text_encoder = SimpleTextEncoder()
image_encoder = SimpleImageEncoder()
fusion = CrossModalFusion()
# 创建数据
text_ids, images = create_mock_data(batch_size=1)
print(f"\n输入数据:")
print(f" 文本ID序列: {text_ids[0][:5].tolist()}...")
print(f" 图像形状: {images.shape}")
# 编码
text_emb = text_encoder(text_ids)
image_emb = image_encoder(images)
print(f"\n编码后:")
print(f" 文本嵌入: {text_emb.shape}")
print(f" 图像嵌入: {image_emb.shape}")
# 跨模态融合
fused, attention = fusion(text_emb, image_emb)
print(f"\n融合后:")
print(f" 融合表示: {fused.shape}")
print(f" 文本->图像注意力: {attention['text_to_image_attn'].shape}")
print(f" 图像->文本注意力: {attention['image_to_text_attn'].shape}")
# ==================== 可视化 ====================
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# 图1:文本嵌入可视化
ax1 = axes[0]
text_np = text_emb[0].detach().numpy()
im1 = ax1.imshow(text_np.T, aspect='auto', cmap='RdBu')
ax1.set_xlabel('词位置')
ax1.set_ylabel('特征维度')
ax1.set_title('文本嵌入')
plt.colorbar(im1, ax=ax1)
# 图2:图像嵌入可视化
ax2 = axes[1]
image_np = image_emb[0].detach().numpy()
im2 = ax2.imshow(image_np, aspect='auto', cmap='viridis')
ax2.set_xlabel('特征维度')
ax2.set_title('图像嵌入')
plt.colorbar(im2, ax=ax2)
# 图3:图像对文本各词的注意力
ax3 = axes[2]
i2t_attn = attention['image_to_text_attn'][0].detach().numpy()
im3 = ax3.imshow(i2t_attn, aspect='auto', cmap='YlOrRd')
ax3.set_xlabel('文本位置')
ax3.set_ylabel('注意力头')
ax3.set_title('图像对文本的注意力')
plt.colorbar(im3, ax=ax3)
plt.tight_layout()
plt.savefig('cross_modal_fusion_experiment.png', dpi=150)
plt.show()
print("\n" + "=" * 60)
print("✅ 实验完成!结果已保存为 cross_modal_fusion_experiment.png")
print("=" * 60)
return fused, attention
# ==================== 主程序 ====================
if __name__ == "__main__":
fused, attention = run_experiment()
预期输出:
============================================================
🧪 图文跨模态融合实验
============================================================
输入数据:
文本ID序列: [xxx, xxx, xxx, xxx, xxx]...
图像形状: torch.Size([1, 3, 32, 32])
编码后:
文本嵌入: torch.Size([1, 10, 64])
图像嵌入: torch.Size([1, 1, 64])
融合后:
融合表示: torch.Size([1, 1, 64])
文本->图像注意力: torch.Size([1, 10, 1])
图像->文本注意力: torch.Size([1, 1, 10])
============================================================
✅ 实验完成!结果已保存为 cross_modal_fusion_experiment.png
============================================================
💡 一句话总结
多模态融合 = 三种编码器 + 交叉注意力
眼睛看、耳朵听、身体感受,
通过交叉注意力深度交互,形成完整感知。
记忆口诀:
眼睛看图画,
耳朵听声音,
身体有感觉。
三者问彼此,
融合成一统,
理解更全面。
🔗 延伸阅读
📚 推荐书籍
-
《Multimodal Machine Learning》 - 更多关于多模态学习的前沿技术
-
《Vision Transformers》 - 深入理解 Vision Transformer 的设计
🎬 推荐视频
-
CLIP: Connecting Text and Images
- OpenAI 的多模态模型讲解
- 理解图文对齐的核心思想
-
Multimodal Learning Overview (Stanford CS330)
- 斯坦福大学的多模态学习课程
📄 推荐论文
- “Attention Is All You Need” - Transformer 原论文
- “An Image is Worth 16x16 Words” - Vision Transformer
- “AST: Audio Spectrogram Transformer” - 音频 Transformer
✍️ 课后作业
选择题(每题 10 分)
1. NCT 使用几种专门的编码器?
A. 1 种
B. 2 种
C. 3 种 ✅
D. 4 种
2. 交叉注意力与自注意力的区别是?
A. 计算公式不同
B. Q、K、V 的来源不同 ✅
C. 没有区别
D. 输出维度不同
3. 内感受编码器处理的是什么信息?
A. 图像信息
B. 声音信息
C. 身体内部状态信息 ✅
D. 文本信息
4. 以下哪个是多模态融合的挑战?
A. 参数量太少
B. 模态对齐问题 ✅
C. 激活函数选择
D. 损失函数设计
思考题(20 分)
问题:假设你要设计一个智能健身教练系统,需要哪些模态?它们如何协同工作?
参考答案要点:
- 视觉:识别用户动作姿势是否正确
- 听觉:识别呼吸节奏、语音指令
- 内感受:监测心率、体温(通过可穿戴设备)
- 融合:结合动作和生理状态,给出个性化建议
代码题(30 分)
任务:修改上面的实验代码,添加第三个模态——“心率信号”(一维时序数据),实现三模态融合。观察融合效果的变化。
提示:
- 心率信号可以用
torch.randn(batch_size, 10, 1)模拟 - 添加一个简单的心率编码器
- 修改 CrossModalFusion 支持三模态
📝 下一篇预告
题目:γ同步机制——AI 的"心跳"
我们会学到:
- 什么是 γ 波?为什么与意识相关?
- NCT 如何实现 40Hz 的 γ 同步
- 同步机制的三大作用
- PING 模型简介
作者:NeuroConscious Research Team
更新时间:2026 年 3 月
版本号:V1.0(图文并茂版)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)