2. 多模态数据表示基础
各位同学,欢迎来到第二章。上一章我们聊了多模态融合的整体图景,今天要扎进一个更具体的问题——不同模态的数据,到底怎么变成计算机能理解的“数字语言”?
说白了,文本是一串字符,图像是一堆像素,音频是一段波形。它们天生就不在一个频道上。想让模型同时理解它们,第一步就是把这些原始数据映射到统一的向量空间。这个过程,我习惯叫它“模态的数字化翻译”。
这一章,我们就分别拆解文本、图像、音频三种模态最主流的向量化方法。我会结合自己踩过的坑,给你讲清楚每个方法的核心逻辑、适用场景,以及——嗯,那些容易翻车的地方。
2.1 文本向量化:从 Word2Vec 到 BERT
文本向量化,是 NLP 领域最基础也最核心的问题。早期的方法,比如 One-hot 编码,简单粗暴——每个词一个高维稀疏向量。但问题也很明显:词与词之间没有语义关系,“猫”和“狗”的向量距离和“猫”和“汽车”一样远。这显然不合理。
后来有了 Word2Vec,算是真正开启了“分布式表示”时代。它的核心思想很简单:一个词的语义,由它周围的词决定。你想想看,如果两个词经常出现在相似的上下文中,那它们的向量就应该靠得近。
2.1.1 Word2Vec:静态词向量的经典
Word2Vec 有两种训练模式:CBOW 和 Skip-gram。CBOW 用上下文词预测中心词,Skip-gram 则反过来,用中心词预测上下文。我个人在实际项目中更常用 Skip-gram,尤其是在数据量不大的时候,它对低频词的表示效果更好。
我在做一个电商评论分析项目时,就遇到过这个问题。“屏幕碎了”和“屏幕清晰”里的“屏幕”,Word2Vec 给的向量完全一样,但情感倾向完全不同。后来我改用 BERT,才解决了这个歧义问题。
2.1.2 BERT:动态上下文表示
BERT 的出现,算是彻底改变了文本向量化的玩法。它不再给每个词一个固定向量,而是根据上下文动态生成。同一个词在不同句子中,向量是不一样的。
BERT 的核心是 Transformer 的 Encoder 部分,加上两个预训练任务:Masked Language Model 和 Next Sentence Prediction。说白了,就是让模型学会“猜词”和“理解句子关系”。
使用 BERT 做向量化,我建议你注意两点:
- 选择合适层:BERT 有 12 层(Base)或 24 层(Large)。通常取倒数第二层或最后四层的平均,效果比直接用最后一层好。我习惯用最后四层拼接,信息更丰富。
- 输入长度限制:BERT 最大输入是 512 个 。超长文本需要截断或分段处理。我在处理法律文档时,经常需要做滑动窗口分段,再对分段向量做聚合。
2.2 图像特征提取:CNN 的层次化表示
图像数据,说白了就是像素矩阵。但直接用像素值做向量,维度太高,而且缺乏语义信息。CNN(卷积神经网络)的出现,就是为了解决这个问题——通过卷积核逐层提取特征,从边缘到纹理,再到物体部件,最后到完整语义。
我刚开始做图像项目时,总想着自己设计网络结构。后来发现,在绝大多数实际场景中,用预训练模型做特征提取器,比自己从头训练靠谱得多。尤其是数据量不够的时候,迁移学习几乎是必选项。
2.2.1 常用预训练 CNN 模型
| 模型 | 参数量 | 特点 | 推荐场景 |
|---|---|---|---|
| ResNet-50 | 25.6M | 残差连接,解决梯度消失 | 通用图像分类、特征提取 |
| EfficientNet-B0 | 5.3M | 模型缩放均衡,效率高 | 移动端、资源受限场景 |
| VGG-16 | 138M | 结构简单,但参数量大 | 学术研究、特征可视化 |
| MobileNetV3 | 5.4M | 轻量级,速度快 | 实时推理、边缘设备 |
我个人最常用的是 ResNet-50。为什么?因为它在精度和速度之间平衡得最好。EfficientNet 虽然更高效,但训练时对超参数敏感,调起来比较费劲。VGG 嘛,除非你要做可视化分析,否则不推荐,太慢了。
2.2.2 特征提取的两种方式
用 CNN 提取图像特征,通常有两种做法:
- 全局特征:去掉最后的全连接层,取全局平均池化后的向量。比如 ResNet-50 去掉 FC 层后,输出是 2048 维向量。适合做图像级别的检索或分类。
- 局部特征:取某个卷积层的输出特征图。比如取 ResNet-50 的 layer4 输出,形状是 7x7x2048。适合做目标检测、图像分割等需要空间信息的任务。
2.3 音频特征提取:从波形到频谱
音频数据,原始形式是波形(waveform),就是一串随时间变化的振幅值。但直接用波形做输入,效果通常不好。为什么?因为人耳对频率的感知是非线性的,而且语音信号在时域上变化太快,模型很难直接学到有效模式。
所以,音频特征提取的核心思路是:把时域信号转换到时频域,用频谱图来表示。这就好比把一段音乐从“乐谱”变成“钢琴卷帘”——频率、时间、能量三个维度一目了然。
2.3.1 MFCC:最经典的音频特征
MFCC(梅尔频率倒谱系数)是语音处理领域最常用的特征。它的提取流程大致如下:
- 预加重:提升高频部分,补偿语音信号的高频衰减。
- 分帧:把音频切成短帧,通常 25ms 一帧,帧移 10ms。
- 加窗:对每帧加汉明窗,减少频谱泄漏。
- FFT:做快速傅里叶变换,得到频谱。
- 梅尔滤波器组:把线性频率映射到梅尔刻度,模拟人耳听觉特性。
- 取对数:对能量取 log,压缩动态范围。
- DCT:做离散余弦变换,得到倒谱系数。
嗯,步骤看着多,但实际用 Librosa 库,几行代码就能搞定。我一般取 13 维 MFCC,再加上一阶和二阶差分,组成 39 维特征向量。
- 采样率:通常 16kHz 或 8kHz(语音)
- 帧长:25ms(400 个采样点 @16kHz)
- 帧移:10ms(160 个采样点 @16kHz)
- 梅尔滤波器数量:40 或 80
- MFCC 维度:13(常用)
2.3.2 其他常用音频特征
除了 MFCC,还有一些特征在实际项目中也很常用:
- Spectrogram(频谱图):直接对每帧做 FFT 得到的能量分布图。适合用 CNN 做图像方式处理。
- Mel-Spectrogram(梅尔频谱图):在频谱图基础上加梅尔滤波器。比普通频谱图更符合人耳感知,是目前最主流的音频输入形式。
- Chroma(色度特征):把频谱映射到 12 个音高类别。适合音乐信息检索。
- Zero Crossing Rate(过零率):每帧内信号穿过零轴的次数。简单但有效,常用于区分语音和静音。
我在做一个语音情感识别项目时,试过只用 MFCC,效果一般。后来把 MFCC、Mel-Spectrogram 和过零率拼接在一起,准确率提升了将近 5 个点。所以,多特征融合在音频任务中往往有奇效。
2.4 三种模态向量化的对比与选择
最后,我把三种模态的向量化方法做个对比,方便你根据实际场景选择:
| 模态 | 主流方法 | 输出维度 | 特点 | 适用场景 |
|---|---|---|---|---|
| 文本 | BERT | 768 / 1024 | 动态上下文,语义丰富 | NLP 任务、多模态对齐 |
| 文本 | Word2Vec | 100-300 | 静态,速度快,资源少 | 简单分类、资源受限场景 |
| 图像 | ResNet-50 | 2048 | 层次化特征,通用性强 | 图像分类、检索、检测 |
| 音频 | MFCC | 13-39 | 低维,符合人耳感知 | 语音识别、说话人识别 |
| 音频 | Mel-Spectrogram | 64xT / 128xT | 二维结构,适合 CNN | 音频分类、情感识别 |