一句话定义:二值化嵌入(Binary AI 词典:Embedding">Embedding)是把原本每个维度都是浮点数的向量,压成每维只有 0 或 1 的向量表示,用极小的存储代价换取可接受的检索精度。
它到底做了什么
普通嵌入(embedding)通常是 768 维或 1024 维的 float32 向量:一个维度占 4 字节,768 维就是 3KB 左右。二值化之后,每个维度只占 1 个比特(bit),768 维只要 96 字节——内存直接降到约 1/32。
相似度算法也随之改变。浮点向量一般用余弦相似度(cosine similarity)或内积;二值向量则用汉明距离(Hamming distance):把两个向量逐位异或(XOR),数一数有几个 1,就是它们不同的位数。位数越少越相似。这个操作在 CPU 上就是几条位运算指令,比浮点乘加快得多,而且天然适合并行。
打个比方
原来的嵌入像一份详细的成绩单:"数学 87.5、语文 62.3、英语 91.0……"。二值化之后,它变成了"数学及格、语文不及格、英语及格"的清单。整体趋势还在:理科好的人依然排在前面。但两个人都"及格"时,你分不出谁考得更好——这就是精度损失。
怎么训出来
前向计算时用符号函数(sign)或 tanh 后取正负号,把浮点值拍成 +1/-1。麻烦在于符号函数几乎处处导数为零,反向传播的梯度传不回去。工程上的通行做法是直通估计器(straight-through estimator, STE):反向传播时假装这一步是恒等映射,把梯度原样放过去。另一种更省事的路径是先训好浮点模型,再做二值化,或者先学一个旋转/投影矩阵再取符号,让信息分布更均匀。
和相邻概念的区别
| 方案 | 每维占用 | 相似度 | 相对浮点压缩 | 精度 |
|---|---|---|---|---|
| 浮点嵌入 | 32 bit | 余弦/内积 | 1× | 基准 |
| int8 标量量化 | 8 bit | 内积 | 约 4× | 几乎不掉 |
| 乘积量化(PQ) | 依赖码本 | 查表 | 视配置而定 | 可调 |
| 二值化嵌入 | 1 bit | 汉明距离 | 约 32× | 有可见下降 |
关键差别不在"压缩多少",而在"能不能重排救回来"。
对从业者的实际意义
在向量数据库(vector database)里做十亿级检索时,内存往往是真正的瓶颈,而不是算力。二值化的典型用法是当粗筛:先用汉明距离快速捞出几百个候选,再用原始浮点向量做一次精排(rerank),把丢掉的召回补回来。这样既省内存,最终效果也不会差太多。
代价也很实在:召回率通常会掉几个百分点,且对训练细节更敏感;如果业务本身就要求高精度、数据量又不大,直接用 int8 量化更划算——4 倍压缩几乎不掉点,何必为了 32 倍去承担召回损失。
要不要上二值化,判断标准很简单:内存是不是卡死了,且你能不能接受两阶段检索。具体库和索引类型的支持情况,以官方页面为准。
