多模态数据表示基础:文本、图像与音频的向量化

各位同学,欢迎来到第二章。上一章我们聊了多模态融合的整体图景,今天要扎进一个更具体的问题——不同模态的数据,到底怎么变成计算机能理解的“数字语言”?

说白了,文本是一串字符,图像是一堆像素,音频是一段波形。它们天生就不在一个频道上。想让模型同时理解它们,第一步就是把这些原始数据映射到统一的向量空间。这个过程,我习惯叫它“模态的数字化翻译”。

这一章,我们就分别拆解文本、图像、音频三种模态最主流的向量化方法。我会结合自己踩过的坑,给你讲清楚每个方法的核心逻辑、适用场景,以及——嗯,那些容易翻车的地方。

多模态数据表示核心流程 文本 (Text) 图像 (Image) 音频 (Audio) Word2Vec / BERT CNN 特征提取 频谱特征 (MFCC) 统一向量空间 (Fusion Input)

2.1 文本向量化:从 Word2Vec 到 BERT

文本向量化,是 NLP 领域最基础也最核心的问题。早期的方法,比如 One-hot 编码,简单粗暴——每个词一个高维稀疏向量。但问题也很明显:词与词之间没有语义关系,“猫”和“狗”的向量距离和“猫”和“汽车”一样远。这显然不合理。

后来有了 Word2Vec,算是真正开启了“分布式表示”时代。它的核心思想很简单:一个词的语义,由它周围的词决定。你想想看,如果两个词经常出现在相似的上下文中,那它们的向量就应该靠得近。

2.1.1 Word2Vec:静态词向量的经典

Word2Vec 有两种训练模式:CBOW 和 Skip-gram。CBOW 用上下文词预测中心词,Skip-gram 则反过来,用中心词预测上下文。我个人在实际项目中更常用 Skip-gram,尤其是在数据量不大的时候,它对低频词的表示效果更好。

核心要点: Word2Vec 生成的词向量是静态的。也就是说,一个词只有一个固定的向量,无法处理一词多义的问题。比如“苹果”这个词,在“吃苹果”和“苹果手机”里,向量是一样的。

我在做一个电商评论分析项目时,就遇到过这个问题。“屏幕碎了”和“屏幕清晰”里的“屏幕”,Word2Vec 给的向量完全一样,但情感倾向完全不同。后来我改用 BERT,才解决了这个歧义问题。

2.1.2 BERT:动态上下文表示

BERT 的出现,算是彻底改变了文本向量化的玩法。它不再给每个词一个固定向量,而是根据上下文动态生成。同一个词在不同句子中,向量是不一样的。

BERT 的核心是 Transformer 的 Encoder 部分,加上两个预训练任务:Masked Language Model 和 Next Sentence Prediction。说白了,就是让模型学会“猜词”和“理解句子关系”。

使用 BERT 做向量化,我建议你注意两点:

  • 选择合适层:BERT 有 12 层(Base)或 24 层(Large)。通常取倒数第二层或最后四层的平均,效果比直接用最后一层好。我习惯用最后四层拼接,信息更丰富。
  • 输入长度限制:BERT 最大输入是 512 个 。超长文本需要截断或分段处理。我在处理法律文档时,经常需要做滑动窗口分段,再对分段向量做聚合。
小技巧: 如果你做的是句子级别的相似度任务,直接用 BERT 输出的 [CLS] 向量,效果往往不错。但如果是词级别的任务,比如命名实体识别,建议用每个 对应的输出向量。

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 提取图像特征,通常有两种做法:

  1. 全局特征:去掉最后的全连接层,取全局平均池化后的向量。比如 ResNet-50 去掉 FC 层后,输出是 2048 维向量。适合做图像级别的检索或分类。
  2. 局部特征:取某个卷积层的输出特征图。比如取 ResNet-50 的 layer4 输出,形状是 7x7x2048。适合做目标检测、图像分割等需要空间信息的任务。
避坑指南: 我曾经在一个项目里直接用了预训练模型的最后一层特征做图像相似度计算,结果发现两张完全不同的图片(比如一只猫和一辆车)在某些角度下相似度很高。后来排查发现,最后一层特征已经高度抽象,丢失了太多细节信息。建议在需要细粒度区分的任务中,使用中间层的特征,或者融合多层特征。

2.3 音频特征提取:从波形到频谱

音频数据,原始形式是波形(waveform),就是一串随时间变化的振幅值。但直接用波形做输入,效果通常不好。为什么?因为人耳对频率的感知是非线性的,而且语音信号在时域上变化太快,模型很难直接学到有效模式。

所以,音频特征提取的核心思路是:把时域信号转换到时频域,用频谱图来表示。这就好比把一段音乐从“乐谱”变成“钢琴卷帘”——频率、时间、能量三个维度一目了然。

2.3.1 MFCC:最经典的音频特征

MFCC(梅尔频率倒谱系数)是语音处理领域最常用的特征。它的提取流程大致如下:

  1. 预加重:提升高频部分,补偿语音信号的高频衰减。
  2. 分帧:把音频切成短帧,通常 25ms 一帧,帧移 10ms。
  3. 加窗:对每帧加汉明窗,减少频谱泄漏。
  4. FFT:做快速傅里叶变换,得到频谱。
  5. 梅尔滤波器组:把线性频率映射到梅尔刻度,模拟人耳听觉特性。
  6. 取对数:对能量取 log,压缩动态范围。
  7. 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 音频分类、情感识别
我的建议: 如果你刚开始做多模态项目,文本用 BERT-base(768 维),图像用 ResNet-50(2048 维),音频用 Mel-Spectrogram(128x时间帧)。这三个组合,在大多数任务中都能取得不错的效果。等跑通基线后,再根据具体问题做优化。