特征提取基础:图像、文本与音频的“翻译”过程

做跨模态检索,说白了就是让机器理解不同形态的数据。图像、文本、音频,它们本质上是不同的信号。怎么让计算机“看懂”图片、“听懂”语音、“理解”文字?

答案就是特征提取。把原始数据转换成机器能处理的向量。这一步做不好,后面的检索全是空中楼阁。我个人习惯把特征提取比作“翻译”——把人类能感知的信号,翻译成计算机能计算的数字语言。

图像特征:从像素到语义

一张图片,对计算机来说就是一堆像素值。但直接拿像素去比相似度,效果很差。为什么?因为像素级的信息太底层了。两张内容相同但亮度不同的图片,像素值可能天差地别。

我们需要提取高层语义特征。这就得靠卷积神经网络(CNN)了。

CNN 的核心思想

CNN 通过卷积核在图像上滑动,提取局部特征。浅层网络提取边缘、纹理;深层网络提取形状、物体部件。我刚开始接触时也觉得玄乎,其实你可以把它想象成“搭积木”。

  • 卷积层:用滤波器扫描图像,提取特征图
  • 池化层:下采样,保留主要特征,减少计算量
  • 全连接层:把特征图展平,做分类或回归

关键点:做跨模态检索时,我们通常取全连接层之前的特征向量,而不是最后的分类结果。那个向量才是图像的“语义指纹”。

ResNet 与残差学习

CNN 越深,效果越好?理论上是的。但实践中发现,网络深到一定程度,准确率反而下降。这不是过拟合,是“退化问题”。

ResNet 的解决方案很巧妙——引入残差连接。让网络学习“残差”而不是直接学习映射。说白了,就是让每一层去拟合输入和输出之间的差值。

# 残差块的伪代码
def residual_block(x):
    identity = x
    out = conv2d(x, filters=64, kernel_size=3)
    out = batch_norm(out)
    out = relu(out)
    out = conv2d(out, filters=64, kernel_size=3)
    out = batch_norm(out)
    out = add([out, identity])  # 残差连接
    out = relu(out)
    return out

我在项目中遇到过一个问题:用 ResNet-50 提取特征时,直接取最后一层输出,发现同类图片的特征距离反而很大。后来排查发现,是没做 L2 归一化。加上归一化后,检索效果提升明显。嗯,这个小细节很多人会忽略。

文本特征:从词到句的向量化

文本特征提取,经历了从离散到连续、从静态到动态的演进。

Word2Vec:词的“坐标”

Word2Vec 的核心思想很简单:一个词的含义由它周围的词决定。它有两种训练模式:CBOW(用上下文预测当前词)和 Skip-gram(用当前词预测上下文)。

我个人更常用 Skip-gram,因为它对低频词的效果更好。训练完成后,每个词对应一个稠密向量。比如“国王”减去“男人”加上“女人”,结果会接近“女王”。

避坑指南:Word2Vec 的向量是静态的。同一个词在不同语境下向量不变。比如“苹果”在“吃苹果”和“苹果手机”里是同一个向量。这显然不合理。所以后来有了 BERT。

BERT:动态上下文理解

BERT 用 Transformer 的编码器,通过双向注意力机制理解上下文。它有两个预训练任务:Masked LM(随机遮住词,让模型预测)和 Next Sentence Prediction(判断两句话是否连续)。

做特征提取时,我通常取 BERT 最后一层的 [CLS] 向量,或者对所有 向量做平均池化。具体用哪种?我建议根据任务来定。分类任务用 [CLS] 好一些,相似度计算用平均池化更稳定。

方法 维度 是否动态 适用场景
Word2Vec 100-300 否 短文本、关键词匹配
BERT 768/1024 是 长文本、语义理解

音频特征:MFCC 的提取原理

音频信号是一维时序数据。直接拿原始波形做特征,维度太高且包含大量噪声。我们需要提取更紧凑、更具区分性的特征。

MFCC(梅尔频率倒谱系数)是语音领域最经典的特征。它模拟了人耳的听觉特性——对低频信号更敏感,对高频信号不敏感。

MFCC 提取流程

  1. 预加重:提升高频部分,补偿语音信号的高频衰减
  2. 分帧:把音频切成短帧,通常 25ms 一帧,帧移 10ms
  3. 加窗:对每帧加汉明窗,减少频谱泄漏
  4. FFT:把时域信号转换到频域
  5. 梅尔滤波器组:用三角滤波器模拟人耳频率响应
  6. 取对数:压缩动态范围
  7. DCT:离散余弦变换,去相关,保留主要信息

注意:MFCC 的维度通常取 13 或 40。我见过有人直接取 40 维,结果模型过拟合了。建议先试 13 维,不够再加。另外,别忘了做均值归一化,消除信道影响。

三种特征的对比与选择

做跨模态检索时,三种特征需要映射到同一个语义空间。但它们的维度、分布、语义层级都不一样。怎么选?

特征类型 典型维度 语义层级 提取工具
图像 (ResNet) 2048 物体/场景 PyTorch/TensorFlow
文本 (BERT) 768 语义/句法 HuggingFace Transformers
音频 (MFCC) 13-40 音素/韵律 librosa/python_speech_features

我曾经在一个项目里,直接用 ResNet 的 2048 维特征和 BERT 的 768 维特征做对齐,结果训练特别慢。后来用 PCA 把图像特征降到 256 维,效果没降多少,速度提升了好几倍。你想想看,特征维度不是越高越好,够用就行。

本章知识体系

下面这张图概括了三种特征的提取流程和核心工具。你可以把它当作一个快速参考。

特征提取知识体系 图像特征 CNN / ResNet 输出: 2048维向量 工具: PyTorch/TF 文本特征 Word2Vec / BERT 输出: 768维向量 工具: HuggingFace 音频特征 MFCC 输出: 13-40维向量 工具: librosa 统一语义空间映射 跨模态检索 / 相似度计算 核心思路:不同模态的特征通过映射网络对齐到同一空间,实现跨模态检索 维度不是越高越好,够用就行。建议先降维再训练,效率更高

特征提取是整个跨模态检索系统的基石。图像、文本、音频各有各的特点,但最终都要落到向量上。我个人建议,刚开始做的时候,先用现成的预训练模型提取特征,别自己从头训练。等系统跑通了,再考虑微调。

嗯,这一章的内容就到这里。记住一句话:特征的质量决定了检索效果的上限,模型只是去逼近这个上限。