专栏:走进 VLM——从视觉语言模型到多模态 Agent 的技术实战
本文是专栏第 2 篇,共 20 篇。
关键词:Vision Encoder、ViT、CNN、Patch Embedding、Attention、视觉 Token、CLIP
一、上一章回顾:VLM 为什么需要“眼睛”?
在上一篇文章中,我们介绍了 VLM 的整体结构:
Image ↓ Vision Encoder ↓ Visual Features ↓ Projector ↓ Visual Tokens ↓ LLM ↓ Answer其中最前面的:
Image ↓ Vision Encoder就是 VLM 的视觉感知模块。
简单来说:
Vision Encoder 的任务,就是把一张图片转换成语言模型能够理解的信息。
例如:
输入:
一张街道图片计算机看到的不是:
“这是一条街,有汽车,有行人。”
而是一堆像素:
[ [255,120,80], [120,90,60], ... ]对于计算机来说:
图片本质上只是:
一个二维数字矩阵。
那么问题来了:
模型如何从这些数字中提取出“语义”?
答案就是:
Vision Encoder。
二、从像素到语义:视觉模型的发展路线
Vision Encoder 并不是 VLM 出现后才诞生的。
它经历了几十年的发展:
传统图像算法 ↓ CNN ↓ ResNet ↓ Vision Transformer ↓ CLIP Vision Encoder ↓ VLM Vision Encoder其中最重要的两个阶段:
- CNN
- Vision Transformer(ViT)
三、早期视觉理解:CNN 如何看图片?
CNN:
Convolutional Neural Network
中文:
卷积神经网络
曾经是计算机视觉领域的核心技术。
它最大的特点:
利用卷积操作提取局部空间特征。
例如一张猫的图片:
Image ↓ 卷积层1 检测边缘 ↓ 卷积层2 检测纹理 ↓ 卷积层3 检测眼睛、耳朵 ↓ 高层网络 识别猫可以简单理解:
低层:
线条 颜色 边缘中层:
眼睛 鼻子 耳朵高层:
猫 狗 汽车这就是 CNN 的核心思想:
从简单特征逐渐组合成复杂语义。
四、CNN 的核心:卷积到底做了什么?
假设有一张图片:
5×5 像素 [ 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 ]CNN 会使用一个小窗口:
例如:
3×3 Kernel不断滑动:
图片 ┌─────────┐ │ │ │ 3×3区域 │ │ │ └─────────┘计算:
图片区域 × Kernel得到新的特征。
这个过程:
Image ↓ Convolution ↓ Feature Map就是卷积。
五、CNN 为什么适合视觉?
因为图片有一个特点:
空间关系非常重要。
比如:
猫的眼睛一定在:
鼻子上方耳朵通常:
头部两侧CNN 天然利用:
- 局部连接
- 权重共享
- 平移不变性
因此非常适合图片。
六、但是 CNN 有一个限制
CNN 擅长:
看局部。
例如:
它可以发现:
这里有眼睛 这里有耳朵但是:
理解:
“这个人在拿着雨伞,因为正在下雨。”
这种全局关系,需要更强的建模能力。
例如:
图片:
人 + 雨伞 + 天空 + 街道模型需要理解:
雨伞 ↓ 挡雨 ↓ 说明可能下雨 ↓ 人物正在户外这属于:
全局语义理解。
而 Transformer 在这方面表现非常优秀。
七、Vision Transformer(ViT)的出现
Transformer 最初用于 NLP。
例如:
我 喜欢 人工智能转换成:
Token1 Token2 Token3然后输入 Transformer。
研究人员发现:
图片也可以拆成 Token。
这就是 ViT:
Vision Transformer。
八、图片如何变成 Token?
这是理解 VLM 最重要的一步。
假设:
一张图片:
224 × 224ViT 不会直接处理整个图片。
它会切成很多小块:
例如:
16 × 16 Patch那么:
224 / 16 = 14所以:
14 × 14 = 196 个 Patch图片:
┌────┬────┬────┐ │ P1 │ P2 │ P3 │ ├────┼────┼────┤ │ P4 │ P5 │ P6 │ ├────┼────┼────┤ │ P7 │ P8 │ P9 │ └────┴────┴────┘每个 Patch:
就是一个视觉 Token。
九、Patch Embedding:图片 Token 化
原始 Patch:
例如:
16×16×3RGB 三通道:
16 × 16 × 3 =768 个数字然后通过一个线性层:
Patch ↓ Linear Projection ↓ Embedding Vector得到:
Visual Token例如:
Patch1 ↓ [0.23,0.51,0.72,...]于是:
图片:
Image变成:
[ Token1, Token2, Token3, ... Token196 ]十、ViT 的完整流程
整体结构:
Image ↓ Split Patch ↓ Patch Embedding ↓ Position Embedding ↓ Transformer Encoder ↓ Visual Representation展开:
Image ↓ ┌──────────────┐ │ Patch Split │ └──────────────┘ ↓ Patch1 Patch2 ... ↓ Embedding ↓ Transformer ↓ Feature Vector十一、为什么需要 Position Embedding?
Transformer 本身不知道顺序。
例如:
文本:
我 爱 AI如果打乱:
AI 爱 我意思完全不同。
图片同样如此。
如果:
猫的位置被打乱:
模型无法知道:
耳朵在哪里 身体在哪里所以 ViT 加入:
Position Embedding
告诉模型:
这个 Patch 在图片哪个位置。
十二、Attention 如何帮助模型理解图片?
Transformer 最大特点:
Self-Attention。
简单理解:
每个 Patch 会观察其他 Patch。
例如:
猫图片:
Patch A: 眼睛 会关注: Patch B: 耳朵 Patch C: 身体于是模型建立:
眼睛 ↓ 猫 ↓ 整体语义关系。
公式:
经典 Attention:
$$
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt d})V
$$
不用深入数学,可以理解:
Attention 让模型决定哪些区域更加重要。
十三、Vision Encoder 在 VLM 中的位置
回到 VLM:
Image ↓ Vision Encoder ↓ Visual Feature ↓ Projector ↓ LLMVision Encoder 输出:
例如:
[196,1024]表示:
196 个视觉 Token。
每个 Token:
1024 维。
这些信息之后会进入语言模型。
十四、CLIP Vision Encoder
现代 VLM 中非常常见的一类视觉编码器:
CLIP Vision Encoder
CLIP 的结构:
Image ↓ Vision Encoder ↓ Image Embedding Text ↓ Text Encoder ↓ Text Embedding ↓ Similarity它训练的目标:
让:
图片 和 对应文字 距离更近。例如:
图片:
狗文本:
一只狗二者向量:
更加接近。
这让视觉世界第一次和语言世界连接起来。
十五、代码实践:使用 CLIP 提取图片特征
下面使用 Hugging Face 调用 CLIP Vision Encoder。
安装:
pip install transformers torch pillow代码:
import torch from PIL import Image from transformers import CLIPProcessor, CLIPModel model_name = "openai/clip-vit-base-patch32" # 加载模型 model = CLIPModel.from_pretrained( model_name ) processor = CLIPProcessor.from_pretrained( model_name ) # 图片 image = Image.open( "test.jpg" ) # 处理图片 inputs = processor( images=image, return_tensors="pt" ) # 提取视觉特征 with torch.no_grad(): image_features = model.get_image_features( **inputs ) print( image_features.shape )输出类似:
torch.Size([1,512])说明:
图片:
Image已经变成:
512维向量这就是:
Image Embedding。
十六、查看图片和文本的相似度
CLIP 最经典的应用:
图片匹配文字。
代码:
import torch from PIL import Image from transformers import CLIPProcessor, CLIPModel model = CLIPModel.from_pretrained( "openai/clip-vit-base-patch32" ) processor = CLIPProcessor.from_pretrained( "openai/clip-vit-base-patch32" ) image = Image.open( "test.jpg" ) texts = [ "a dog", "a car", "a person" ] inputs = processor( text=texts, images=image, return_tensors="pt", padding=True ) with torch.no_grad(): outputs = model(**inputs) similarity = outputs.logits_per_image print(similarity)输出类似:
dog 8.5 car 1.2 person 2.3模型认为:
图片 ≈ dog十七、Vision Encoder 的未来发展
现在主流 VLM 使用的视觉编码器越来越强:
例如:
- CLIP ViT
- SigLIP
- EVA-CLIP
- InternViT
- Qwen-VL Vision Encoder
未来趋势:
更高分辨率 ↓ 更多视觉 Token ↓ 更强视觉理解 ↓ 视频理解 ↓ 世界模型十八、总结
这一篇我们理解了:
1. Vision Encoder 是什么?
它负责:
图片 ↓ 视觉特征2. CNN 做了什么?
核心:
局部特征提取3. ViT 做了什么?
核心:
图片 Patch ↓ Visual Token ↓ Transformer4. VLM 为什么需要 Vision Encoder?
因为:
LLM 不认识图片。
必须:
Image ↓ Vision Encoder ↓ Visual Token ↓ LLM5. 最重要的一句话:
Vision Encoder 就是 VLM 的眼睛,它负责把现实世界中的图像转换成语言模型能够理解的视觉表示。
下一篇我们继续深入:
《走进 VLM(三):CLIP 如何连接视觉与语言?从图文对齐到多模态理解》
我们将详细拆解:
- CLIP 双塔结构
- Contrastive Learning
- Image Encoder
- Text Encoder
- 为什么 CLIP 成为了 VLM 的基础设施