别只盯着模型参数了:聊聊多模态时代最容易被忽视的一件事——训练数据准备
很多人一聊 AI 多模态,第一反应就是:
“模型多大?”
“参数多少?”
“是不是用了 Transformer + Diffusion + RLHF?”
但说句大实话:
模型只是厨师,数据才是食材。
如果食材本身不新鲜,再厉害的厨师也做不出米其林。
这几年我做大数据和 AI 项目,最大的感触其实就一句话:
多模态 AI 的核心不是模型,而是数据工程。
尤其是 文本 + 图像 + 音频 三种数据混合的时候,真正难的其实不是训练,而是 数据准备(Data Preparation)。
今天咱就聊聊:
多模态训练数据到底是怎么准备出来的。
尽量不装学术,咱用工程视角聊点实在的。
一、多模态训练的本质:让不同数据“说同一种语言”
先看一个典型训练样本:
图片: 一只猫坐在键盘上
文本: "A cat sitting on a keyboard"
音频: "a_cat_on_keyboard.wav"
对于模型来说,这三样东西其实是:
image -> tensor
text -> token
audio -> spectrogram
但关键问题来了:
如何保证这三样数据描述的是同一个东西?
这就是多模态数据工程的核心:
跨模态对齐(Cross-modal Alignment)
也就是:
文本 <-> 图像 <-> 音频
必须是 语义一致 的。
否则模型学到的就是:
狗 -> 猫
猫 -> 飞机
飞机 -> 苹果
模型就彻底疯了。
二、多模态数据准备的第一步:统一数据结构
在真实工程里,我们一般先做 统一数据Schema。
比如:
{
"id": "sample_001",
"text": "a dog barking",
"image_path": "images/dog_001.jpg",
"audio_path": "audio/dog_bark.wav",
"source": "web_dataset"
}
这样做有两个好处:
1️⃣ 数据可扩展
2️⃣ 数据可追溯
接下来我们用 Python 做个简单数据读取器。
import json
def load_dataset(path):
dataset = []
with open(path, "r", encoding="utf-8") as f:
for line in f:
sample = json.loads(line)
dataset.append(sample)
return dataset
data = load_dataset("multimodal_dataset.jsonl")
print("dataset size:", len(data))
print(data[0])
工程里一般用:
- JSONL
- Parquet
- TFRecord
大规模数据一般都会转 Parquet,因为列式存储更适合大数据分析。
三、文本数据清洗:AI 世界的“扫地阿姨”
文本数据其实最脏。
互联网文本通常长这样:
Buy cheap shoes now!!!
CLICK HERE!!!
www.xxxx.com
如果这些数据进了训练集:
恭喜你,你的 AI 可能学会 疯狂打广告。
所以必须清洗。
示例代码:
import re
def clean_text(text):
# 去URL
text = re.sub(r"http\S+", "", text)
# 去HTML
text = re.sub(r"<.*?>", "", text)
# 去多余空格
text = re.sub(r"\s+", " ", text)
return text.strip()
text = "Buy cheap shoes now!!! http://spam.com"
print(clean_text(text))
真实工程里还会做:
- 语言检测
- 去重
- toxic 内容过滤
- 低质量文本过滤
比如:
重复率 > 0.9
句子长度 < 3
这些都要过滤。
四、图像数据准备:不只是 resize
很多人以为图像处理就是:
resize -> normalize
其实远不止。
我们一般会做:
- 图像质量检测
- 去重
- NSFW 过滤
- OCR 检测
举个例子:
用 Python 批量 resize 图像。
from PIL import Image
import os
def resize_image(path, size=(224,224)):
img = Image.open(path)
img = img.resize(size)
return img
img = resize_image("dog.jpg")
img.save("dog_resized.jpg")
但真正的大规模图像处理一般用:
- Spark
- Ray
- Dask
比如:
10亿张图像
单机跑根本不现实。
五、音频数据处理:把声音变成可学习的数据
音频数据通常要转成:
Mel Spectrogram
因为神经网络更擅长处理图像型结构。
示例代码:
import librosa
import numpy as np
def audio_to_mel(path):
y, sr = librosa.load(path, sr=16000)
mel = librosa.feature.melspectrogram(
y=y,
sr=sr,
n_mels=128
)
return mel
mel = audio_to_mel("dog_bark.wav")
print(mel.shape)
这样:
audio -> spectrogram
就变成了类似图像的二维矩阵。
模型就能学了。
六、多模态数据的真正难点:对齐
最麻烦的其实是 数据对齐。
比如:
image: dog.jpg
text: "a dog running"
audio: "dog_bark.wav"
如果配错:
image: dog
text: "a plane"
audio: baby crying
模型就会崩。
所以大厂都会做:
自动对齐 + 人工校验
一个简单例子:
用 CLIP 做相似度过滤。
import torch
import clip
from PIL import Image
model, preprocess = clip.load("ViT-B/32")
def check_alignment(image_path, text):
image = preprocess(Image.open(image_path)).unsqueeze(0)
text_tokens = clip.tokenize([text])
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text_tokens)
similarity = torch.cosine_similarity(
image_features,
text_features
)
return similarity.item()
score = check_alignment("dog.jpg", "a dog running")
print("similarity:", score)
如果相似度低:
score < 0.2
我们就可以 自动过滤。
七、大模型时代:数据工程师越来越重要
很多人觉得:
未来 AI 世界是 模型工程师的天下。
但我越来越觉得:
真正的核心岗位,其实是数据工程师。
为什么?
因为:
模型 -> 开源越来越多
数据 -> 永远是稀缺资源
真正的护城河其实是:
高质量数据管道
包括:
- 数据采集
- 数据清洗
- 数据标注
- 数据对齐
- 数据版本管理
这些东西看起来不起眼。
但没有它们:
再强的模型也没用。
最后聊点我的真实感受
这些年做 AI 项目,我越来越有一个感触:
很多团队把 90%精力放在模型。
但真正决定效果的往往是:
数据质量
就像种地。
大家都在研究:
拖拉机多先进
但真正决定收成的其实是:
土壤
而 数据工程师,其实就是 AI 世界里的 农民。
没有他们:
再牛的算法,都是空中楼阁。