图像token的详细理解
在深度学习中token是指文本或图像中的最小单位。在自然语言处理NLP中token 通常是一个单词、字符或子词而在计算机视觉CV中token 则是图像切割后的小块(patch)。先导知识Token在自然语言处理中的应用在 NLP 中tokenization 是将文本分割成更小的单位token的过程。例如句子 Never give up 可以被分割成三个单词 tokenNever、give 和 up。此外token 还可以是字符或子词例如 smarter 可以被分割成字符 tokens、m、a、r、t、e、r或者子词 tokensmart 和 er。中文把经常出现的词高频词看作一个token。好处把文本token化了计算量变小了。例子我喜欢玩-------------------------我喜欢玩token解析如果以单个字拆分有4个。如果以token来拆分有3个token.计算token的网址Tiktokenizerhttps://tiktokenizer.vercel.app/在大型语言模型中token 是模型处理文本的基本单位。模型接收一串 token 作为输入并尝试预测下一个最可能的 token。为了提高处理速度和减少内存占用通常使用特定的 tokenization 方法如字节对编码BPE或 WordPiece。1.图像的token1图片切换1把图片切成小方块patch)想象一下你有一张512×512像素的图片。Qwen3-VL不会直接看整张图而是像切豆腐一样把它切成很多14×14像素的小方块patch。1个patch 14×14196个像素。计算一下512÷14≈36.57向上取整为37。所以横竖各37个patch总共37×371369个patch。2.每个patch转换为向量现在我们有1369个小方块但模型看不懂方块需要把每个方块变成数字向量。输入Patch 1 (14×14×3的RGB像素值)步骤1Flatten 14×14×3 588个数字步骤2Linear Projection (线性投影)##Linear(588,1280)输出变成一个向量: [0.23, -0.15, 0.88, ..., 0.05] 维度: 1280 (hidden_dim)即特征向量的长度是1280.这个过程叫Patch Embedding本质上是一个卷积层Conv2d在做这件事# 伪代码patch_embed Conv2d(in_channels3, # RGB三通道out_channels1280, # 输出维度kernel_size14, # 14×14的卷积核stride14 # 步长14不重叠)此时数据形状输入:[batch_size, 3, 512, 512]输出:[batch_size, 1369, 1280]batch_size是同时处理几张图1369是patch数量1280是每个patch的向量维度。2patches变为token现在我们有了1369个向量但这还不是最终的token。直接把这1369个向量当token用行不行不行太多了 1369个token太占计算资源需要进一步压缩。1关键操作PatchMerger2×2合并Qwen3-VL用了一个叫PatchMerger的模块把2×2相邻的4个patch合并成1个token。相邻4个patch合并为1个token1369➗4342.5具体怎么合并不是简单的取平均而是用一个可学习的神经网络层把4个向量融合成1个向量# 伪代码PatchMergerdef merge_2x2(patches):# patches: [batch, 37, 37, 1280]# 把2×2的格子分组grouped reshape(patches, [batch, 18, 18, 4, 1280])# 4个patch的特征拼在一起: 4×12805120维# 用线性层压缩回1280维merged Linear(5120, 1280)(grouped)return merged # [batch, 18, 18, 1280] [batch, 324, 1280]此时数据形状输入:[batch_size, 1369, 1280]输出:[batch_size, 324, 1280]324≈1369/42每个token覆盖多大区域原始图片: 512×512 像素PatchEmbed (14×14): 1369个patchPatchMerger (2×2合并): 324个token每个token覆盖: 28×28 像素 (14×2)###########2×2个patch合并为一个token实际等效: 约32×32 像素/token (因为取整和padding)这就是为什么Qwen3-VL的token计算公式是32×32的原因3 图片 → Token 的完整流程现在我们把整个流程串起来看看一张图片是怎么一步步变成token序列的.。1完整流程2.Token数计算公式总结对于一张 H×W 像素的图片1 预处理调整为32的倍数H ceil(H/32) × 32W ceil(W/32) × 322计算Token数num_tokens (H/32) × (W/32) 22 是 |vision_bos| 和 |vision_eos|3 如果超过max_pixels (默认8,388,608像素)先等比例压缩再计算举几个例子512×512图片: (512/32)×(512/32)2 16×162 258 tokens1920×1080图片: (1920/32)×(1080/32)2 60×33.75→60×342 ≈ 2042 tokens4K图片 (3840×2160): 超过8,388,608先压缩到约3552×2368然后→ 约8194 tokens写在最后所以图片算token数的本质是切分把图片切成14×14的小块patches嵌入每个patch变成1280维的向量合并2×2的patches合并成1个visual token约32×32像素标记加上BOS和EOS特殊token拼接和文本token拼在一起输入LLM应用Token化模型常用的token化模型包括CNN、Transformer和MLP等这些模型将原始图片压缩成维度更低的序列向量。