【免费下载链接】tipsv1-so400m14
本文带你快速读懂TIPSv1-So400m/14 的文本编码器:它是 TIPS(Text-Image Pre-training with Spatial awareness,ICLR 2025)对比视觉-语言模型中,负责把一句话压缩成 1152 维向量的 27 层 Transformer。下面重点剖析正弦位置编码(Sinusoidal Positional Embedding)与全局平均池化(Global Average Pooling)两大核心机制,无需深厚数学背景也能看懂。🧩
一、先认识 TIPS 文本编码器:一张参数全景表
TIPS 把"图像特征"与"文本特征"映射到同一空间做相似度匹配。文本侧由一条独立的 Transformer 主干完成,关键超参数全部可以在 config.json 的text_config中查到:
| 参数 | 取值 | 含义 |
|---|---|---|
num_hidden_layers | 27 | Transformer 层数 |
hidden_size | 1152 | 词向量/隐藏层维度 |
num_attention_heads | 16 | 多头注意力头数 |
intermediate_size | 4304 | MLP 前馈层中间维度 |
max_position_embeddings | 64 | 最大序列长度(token 数) |
vocab_size | 32000 | SentencePiece 词表大小 |
hidden_act | relu | 前馈层激活函数 |
pooling_epsilon | 1e-08 | 池化时的防除零项 |
文本先经过 SentencePiece 分词器(见 tokenizer.model,配置在 tokenizer_config.json 中):统一转小写、不加 BOS/EOS、最长 64 个 token,不足补 0。分词逻辑见 text_encoder.py 的Tokenizer类。
二、正弦位置编码原理详解 📈
Transformer 的自注意力本身"看不到"词的先后顺序,TIPS 用经典的正弦/余弦函数叠加来给每个位置注入身份信息。实现位于 text_encoder.py 的PositionalEmbedding类。
2.1 576 组几何间隔的频率
位置编码维度是 1152,代码把它拆成1152 / 2 = 576对 sin/cos 信号:
log_timescale_increment = log(10000 / 1) / 575 inv_timescales = 1 * exp(arange(576) * -log_timescale_increment) scaled_time = 位置编号 × inv_timescales signal = [sin(scaled_time); cos(scaled_time)] # 拼接成 1152 维min_timescale=1、max_timescale=10000:频率从慢到快按对数等比分布,即第 j 组频率约为10^(j/575)倍速;- 慢波(低频)像"长镜头",变化缓慢,让模型感知远距离位置关系;快波(高频)像"秒针",区分相邻位置;
- 所有位置编码可预先算好、不含任何可训练参数,换长度也只需插值即可。
💡 这套公式与 Google T5 的
PositionalEmbedding一脉相承,属于工业界验证过的稳定方案。
2.2 加在词嵌入上
在 text_encoder.py 中,位置编码直接加到词嵌入上:
x = Embedding(token_ids) # 词向量 x = x * sqrt(1152) # scale_sqrt_depth 缩放,稳定训练 x = x + pos_embedder(seq_length) # 叠加正弦位置编码注意缩放项embedding_dim ** 0.5:词嵌入数值较小,乘以√1152 ≈ 34后量纲才和位置信号匹配,这是 T5 系列的惯用技巧。
三、全局平均池化如何过滤 padding 🎯
文本长短不一,短的会补 0(padding)。如果直接对所有位置求平均,填充位会稀释真实语义。GlobalAvgPooling(text_encoder.py)用三步解决:
- 置零:把
compatible_paddings > 0的位置向量整体替换为 0; - 计数:
valid = Σ(1 - paddings) + epsilon,只统计有效 token 个数(epsilon=1e-8防止除零); - 求均值:对置零后的向量沿序列维求和,再除以有效个数,输出单条句子一个向量。
一句话概括:只对真实存在的 token 求平均,padding 完全"隐身"。
四、一次前向传播的完整链路
把以上机制串起来,TextEncoder.__call__(text_encoder.py)的完整流程是:
token ids → 词嵌入 (× √1152 缩放) → + 正弦位置编码 → 27 层 Transformer(Pre-LayerNorm + 带 mask 的多头注意力 + ReLU 前馈) → 最终 LayerNorm → 全局平均池化(屏蔽 padding) → 输出 (B, 1152) 文本向量几个值得注意的细节:
- 注意力带 mask:text_encoder.py 中 padding 位置被置为
-inf,真实 token 永远不会"偷看"填充位; - Pre-LN 结构:先归一化再进注意力/MLP,训练更稳定;
- 输出对齐图像塔:得到的 1152 维向量与 image_encoder.py 输出的图像 CLS 向量做余弦相似度,支撑零样本分类(用法示例见 README.md);相似度还带一个可学习的温度参数(初始值 0.0027,见 config.json)。
入口封装在encode_text(modeling_tips.py):传字符串会自动走 SentencePiece 分词,传 tensor 则直接使用;权重保存在 model.safetensors。
五、关键文件速查 ✅
| 文件 | 内容 |
|---|---|
| text_encoder.py | 正弦位置编码PositionalEmbedding |
| text_encoder.py | 带 padding 掩码的GlobalAvgPooling |
| text_encoder.py | 完整TextEncoder前向流程 |
| modeling_tips.py | encode_text对外接口 |
| configuration_tips.py | 模型配置类TIPSv2Config |
| config.json | 文本塔超参数 |
| tokenizer.model | SentencePiece 分词模型 |
| README.md | 使用示例与模型细节 |
小结
TIPSv1-So400m/14 的文本编码器 =SentencePiece 分词 + 正弦位置编码 + 27 层带 mask Transformer + 屏蔽 padding 的全局平均池化,最终输出一条 1152 维文本向量。正弦编码用"多频率时钟"优雅地解决了顺序问题,全局平均池化则保证了变长文本在对比学习中得到干净的全局表示——理解这两点,你就掌握了该模型文本塔的核心原理。🚀
【免费下载链接】tipsv1-so400m14
相关推荐
源码精读tipsv1-l14(二):text_encoder.py分词、正弦位置编码与Mask池化原理
源码精读tipsv1 l14(二):text_encoder.py分词、正弦位置编码与Mask池化原理 tipsv1 l14(TIPS)是 Google 开源的
3个维度深度解析:res-downloader如何重塑你的多媒体资源获取体验
3个维度深度解析:res downloader如何重塑你的多媒体资源获取体验 你是否曾在微信视频号中看到精彩的短视频却无法保存?是否在抖音上发现优质内容却只能在
源码逐行解析(下):text_encoder.py的Transformer文本塔、正弦位置编码与掩码池化
源码逐行解析(下):text_encoder.py的Transformer文本塔、正弦位置编码与掩码池化 TIPSv1 s14 是谷歌发布的 TIPS 系列中
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考