想象一位米其林三星大厨,他有一本 500 页的菜谱,每道菜都精确到 0.01 克盐、0.001 毫升油。有一天他要徒步穿越沙漠,背包却只有巴掌大——他必须把整本菜谱压缩成一张小卡片。最极端的做法是:每种调料只记录“放”或“不放”两个状态(二值化);或者多给一个“半勺”的中间档(三值化)。这就是模型压缩中的二值化/三值化网络:把神经网络里动辄 32 位浮点数表示的权重,压成 1 位或 2 位的离散值,换来 16~32 倍的体积缩减与数量级的推理加速。本篇将带你顺着这位大厨的“极简菜谱”之旅,从量化概念、数学原理、训练技巧到硬件加速与工程落地,完整走一遍这条边缘 AI 的核心技术路线。

岗位关联

掌握二值化/三值化网络,意味着你能把大模型塞进手机、耳机和传感器芯片,在算力受限的边缘端跑出实时 AI 应用——这是边缘 AI 工程师的核心竞争力。

目录
  1. 可视化演示
  2. 量化入门概念
  3. 二值化网络原理
  4. 三值化网络原理
  5. 训练关键技术
  6. 硬件加速收益
  7. 性能权衡评估
  8. 工程落地实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

三步展示模型极端量化:FP32→1bit二值化(+1/-1)与2bit三值化(-1/0/+1)的压缩原理、Sign函数前向传播与STE梯度直通反向传播、FPGA上XNOR-Popcount位级并行硬件加速。

本节配有交互动效(进入视口后自动加载,约 3KB)。

量化压缩原理 FP32:32位浮点,精度最高但存储大 BNN:1bit二值化,+1/-1,压缩32倍 TWN:2bit三值化,-1/0/+1,压缩16倍 compression_ratio = 32 / bits_per_weight 极端量化以精度换取极致压缩。

量化入门概念

大厨 Daniel 收到了沙漠远征邀请,背包只能放下一张卡片。他翻开那本 500 页的米其林菜谱,痛苦地意识到:总不能背着一整箱调味瓶和电子秤上路。于是他想——调料用量能不能简化成几个固定档位?比如“放”或“不放”,或者再细一点:“少放、中放、多放”。这正是量化(Quantization)思想的起点:用少量离散档位去逼近原本连续的数值。

在神经网络里,“调料用量”就是权重。训练好的模型里,每个权重是一个 32 位浮点数,例如 0.0038471。二值化网络用符号函数把每个权重映射成 +1 或 -1 两个值;三值化网络则保留 -1、0、+1 三档。从存储角度看,全精度一个权重占 32 位,二值化只占 1 位,三值化占 2 位——这就是“压缩率”的来源。

从数学上看,二值化本质上就是给每个权重做一次“正负判断”,由符号函数(sign)完成。理解了这一步,就理解了二值化的全部核心。

大厨发现,二值化就像把菜谱里所有“几克盐”改成“放/不放”两个勾选框,卡片上每道菜只占一行,背包瞬间空出 32 倍空间。但口味还能保持吗?这个疑问,把他引向了下一项关键设计——缩放因子。

\displaystylew_{b} = \text{sign}(w_{r}) = \begin{cases} +1, & w_{r} \geq 0 \\ -1, & w_{r} < 0 \end{cases}
这个公式说:把每个浮点权重看一眼正负,非负就记 +1,负数就记 -1,其余信息全部丢弃。
  1. 实值权重输入原始训练好的权重是浮点数,取值范围包含正数、负数和零。
    wr∈Rw_{r} \in \mathbb{R}
  2. 非负值归为 +1只要权重不小于零,就统一映射为正一。
    wr≥0⇒wb=+1w_{r} \geq 0 \Rightarrow w_{b} = +1
  3. 负值归为 -1所有小于零的权重被映射为负一,完成离散化。
    wr<0⇒wb=−1w_{r} < 0 \Rightarrow w_{b} = -1

二值化网络原理

大厨试做了几道“两档菜谱”的菜,发现有些菜需要“中量盐”时只能硬选一边,味道偏咸或偏淡。他意识到,光有“放/不放”还不够,得给每个档位配一个“换算系数”:这一档“放盐”大约等于原来的几克?这个系数,就是二值化网络中的缩放因子(Scaling Factor)。

直接用符号函数取二值会彻底丢失幅度信息:权重 0.5 和 0.01 都会被压成 +1,可两者对结果的贡献天差地别。为了补偿,研究者用 α 对二值矩阵做整体放缩,让重建出的 α·B 尽量接近原始权重 W。α 通常取所有权重绝对值的平均值,这会使建模的 L2 重建误差最小。

大厨给卡片上的“放盐”旁加了一行小字“≈0.8 克”,重做的菜立刻接近原版。进一步,他把同样的思路用到“尝菜温度”(激活值)上:激活也压成 ±1,整个网络从“称量调料”彻底变成“拨开关”。而这套开关逻辑,即将在硬件上释放惊人的能量——那是后话,眼下他还要解决“沙漠里如何学习新菜”的问题。

\displaystyleW \approx \alpha B, \qquad \alpha = \frac{1}{n}\sum_{i=1}^{n} |w_{i}|
一句话理解:先给每个权重贴“正负标签”,再算一个平均幅度作为标签的“含金量”,两者相乘来近似原权重。
  1. 符号函数作用先对原始权重矩阵逐元素取符号,得到由正负一组成的二值矩阵。
    B=sign(W)B = \text{sign}(W)
  2. 求解最优缩放所有权重绝对值取平均,这个平均幅度正是 L2 重建的最优系数。
    α=1n∑i=1n∣wi∣\alpha = \frac{1}{n}\sum_{i=1}^{n}|w_{i}|
  3. 近似重建权重用系数乘以二值矩阵,逼近原始的全精度权重。
    min⁡α∥W−αB∥2\min_{\alpha} \| W - \alpha B \|^{2}

三值化网络原理

大厨又发现,有些菜“不放盐”和“微盐”天差地别,两档开关实在粗暴。于是他在卡片上加了第三档:“不咸不淡”——对应数学上的 0。三值化网络正是为这种中间状态而生,权重从两档变成三档:-1、0、+1。

关键问题是:哪些权重该归 0?这需要设定一个阈值 Δ。权重的绝对值大于 Δ 时,保留正一或负一;绝对值不超过 Δ 的,说明它对结果影响微弱,直接清零。经典论文给出的经验阈值是:Δ 等于 0.7 倍权重绝对值均值。这样划分后,矩阵中会出现大量零元素,形成天然的稀疏结构,计算时可以跳过这些位置,这是三值化独有的优势。

三值化还可以像二值化一样配置缩放因子:分别统计正一和负一两组权重的平均幅度,做二次校准,精度还能再涨一点。大厨的卡片多了一列“不加也不减”,口味更细腻,卡片也只是从一页变成两页——16 倍压缩,依然很轻。他满意地点点头,随即皱起眉头:到了沙漠,怎么继续“改良菜谱”?

\displaystylew_{t} = \begin{cases} +1, & w_{r} > \Delta \\ 0, & |w_{r}| \leq \Delta \\ -1, & w_{r} < -\Delta \end{cases}, \qquad \Delta = \frac{0.7}{n}\sum_{i=1}^{n} |w_{i}|
这个公式做了两件事:算出阈值 Δ,再按“大正、小零、大负”三档给每个权重归类。
  1. 求平均幅度先计算全部权重绝对值的平均值,作为判断大小用的基准尺度。
    wˉ=1n∑i=1n∣wi∣\bar{w} = \frac{1}{n}\sum_{i=1}^{n}|w_{i}|
  2. 设定经验阈值取 0.7 倍平均幅度作为切分边界,这一比例来自大量实验验证。
    Δ=0.7⋅wˉ\Delta = 0.7 \cdot \bar{w}
  3. 分配极值档位大于正阈值的权重取正一,小于负阈值的取负一,信息显著者保留。
    wr>Δ⇒wt=+1;wr<−Δ⇒wt=−1w_{r} > \Delta \Rightarrow w_{t} = +1; \quad w_{r} < -\Delta \Rightarrow w_{t} = -1
  4. 清零中间权重阈值以内的小权重全部置零,形成稀疏的三值矩阵。
    ∣wr∣≤Δ⇒wt=0|w_{r}| \leq \Delta \Rightarrow w_{t} = 0

训练关键技术

大厨到了沙漠,第一晚想研发一道新菜,却犯了难:做菜时只能看卡片上的“放/不放”档位,可他想微调“盐量 +0.3 克”怎么办?他灵机一动:随身带一本微型笔记本,把精确克数记在笔记本上,做菜时看卡片,改配方时用笔记本上的精确数字。

这正是二值化网络训练的核心思想:实值影子权重 + 直通估计器(Straight-Through Estimator, STE)。前向传播时,用 sign(w_r) 得到的二值权重做计算,模拟真实部署环境;反向传播时,sign 函数导数几乎处处为零,梯度传不回来,STE 让梯度“直通”复制到实值权重上,再更新影子权重——每一轮都在“卡片”和“笔记本”之间完成一次同步。

除了 STE,工程师还有两件法宝:知识蒸馏——让全精度“大厨师父”全程示范,二值化学徒跟着学,精度损失大幅收窄;渐进量化——先训练三值化版本,稳定后再切换成二值化,让模型像人一样“逐步适应简陋厨房”。这些技巧合在一起,使大厨在沙漠里也能保持接近米其林的水准。

∂L∂wr≈∂L∂wb⋅1∣wr∣≤1\displaystyle\frac{\partial L}{\partial w_{r}} \approx \frac{\partial L}{\partial w_{b}} \cdot \mathbb{1}_{|w_{r}| \leq 1}
这个公式是 STE 的灵魂:梯度照样往前传,但只对幅度在 [-1, 1] 内的权重生效,超出边界的权重不再更新,防止影子权重无限膨胀。
  1. 前向二值化前向传播使用符号量化后的二值权重参与矩阵计算。
    wb=sign(wr)w_{b} = \text{sign}(w_{r})
  2. 近似传播梯度把符号函数的导数近似为指示函数,幅度超界就截断为 0。
    ∂wb∂wr≈1∣wr∣≤1\frac{\partial w_{b}}{\partial w_{r}} \approx \mathbb{1}_{|w_{r}| \leq 1}
  3. 更新影子权重用这一近似梯度更新实值的影子权重,让模型在离散约束下继续演化。
    wr←wr−η⋅∂L∂wbw_{r} \leftarrow w_{r} - \eta \cdot \frac{\partial L}{\partial w_{b}}

硬件加速收益

沙漠深处没有厨房,大厨只剩一块简易电路板。他发现一件奇妙的事:当菜谱只剩下“放/不放”两种状态时,他根本不需要电子秤——所有操作都变成了“拨开关”。硬件上的道理完全一样:浮点乘法在芯片里需要大量晶体管和多个时钟周期,而位运算几乎瞬时完成。

关键洞察在于:当输入和权重都被量化成 +1/-1 时,点积运算可以拆成两步——先逐位做 XNOR(同或)判断“这两个位是否相同”,再用 popcount 指令数一数到底有多少个位置相同。整个过程只需要逻辑门和计数器,完全不需要乘法器。这就是二值化网络在专用芯片上“起飞”的物理基础。

大厨的“开关电路板”不仅快,还省电:1 位存储让内存带宽需求断崖式下降,芯片发热骤减,手机 NPU、DSP、FPGA 这类边缘芯片天然适配这种位逻辑。他终于明白,这份“极简菜谱”天生就是为沙漠而生的。

\displaystylex \cdot w = 2 \times \text{popcount}\left(\text{XNOR}(x_{b}, w_{b})\right) - n
这个等式说明:两个 ±1 向量的内积,可以用“数相同位数”来等价计算,乘法彻底消失。
  1. 量化输入与权重把实值输入和权重量化成正负一组成的位向量,长度同为 n。
    xb,wb∈{−1,+1}nx_{b}, w_{b} \in \{-1, +1\}^{n}
  2. 逐位 XNOR 判定每个位置用同或门比较,相同输出 1,不同输出 0。
    XNOR(a,b)=1  ⟺  a=b\text{XNOR}(a, b) = 1 \iff a = b
  3. 统计还原内积数出相同位数 k,代入 2k - n 即可还原真实内积结果。
    x⋅w=2k−n,k=popcount(XNOR(xb,wb))x \cdot w = 2k - n, \quad k = \text{popcount}(\text{XNOR}(x_{b}, w_{b}))

性能权衡评估

大厨用简陋菜谱做了三天饭,客人们反馈:大多数菜能吃,但个别精致菜品相稍差。世界上没有免费的午餐,二值化/三值化网络同样面临性能权衡——用压缩率换精度。

定量地看,二值化把 32 位压成 1 位,模型体积缩小 32 倍;三值化 2 位,缩小 16 倍。作为代价,模型的表达能力骤降:FP32 有 2^32 种取值,三值化只有 3 种,二值化只有 2 种。精度损失一般在 1~5 个百分点,具体取决于任务。任务适配的原则是:模型越大、冗余越高,二值化越安全;而对数值敏感的小模型或回归类任务,需要更谨慎,常保留部分高精度层作为折中。

好在损失并非不可挽回:知识蒸馏、渐进量化、损失函数加权缩放、残差连接保持全精度等“补救技法”叠加后,精度通常能拉回 1 个百分点以内。正如食材虽然精简了,但火候、刀工和调味手法可以补足——大厨找到了属于自己的平衡点。

\displaystyler = \frac{32}{b}, \qquad b_{\text{bin}} = 1, \ b_{\text{ter}} = 2
压缩率的计算非常朴素:全精度占 32 位,除以量化后的位宽,就是体积缩小的倍数。
  1. 全精度位宽FP32 格式每个权重固定占用 32 位存储空间。
    bfp32=32b_{\text{fp32}} = 32
  2. 量化后位宽二值化每个权重只占 1 位,三值化占 2 位。
    bbin=1,bter=2b_{\text{bin}} = 1, \quad b_{\text{ter}} = 2
  3. 计算压缩倍数用全精度位宽除以量化位宽,即得到体积缩小倍数。
    r=32/1=32,r=32/2=16r = 32/1 = 32, \quad r = 32/2 = 16

工程落地实践

远征第 30 天,菜谱卡片终于定稿。但装进背包前,大厨还要解决一堆实操问题:用什么工具记录卡片?怎么保证路上仍能微调?模型部署是类似的“最后一公里”。

主流框架都已支持量化训练:PyTorch 可用 torch.autograd.Function 自定义前向/反向逻辑,三五行代码就能写出 STE 算子;TensorFlow 提供 QAT API;Larq 等专用库则内置了现成的二值化层。训练流程一般分三步:先在正常环境训练全精度模型,然后接入量化感知训练(QAT)让模型适应离散权重,最后导出为整型权重部署。部署时还有不少技巧:把权重打包成位数组、把批归一化层折叠进卷积消除额外计算、对三值化的零值用稀疏索引跳过。

大厨最后把卡片封进防水袋,贴上标签“二值化 ver 2.0”,背包轻松上肩。此刻,手机里的人脸解锁、智能音箱里的唤醒词、工厂产线上的质检摄像头——无数“背着卡片进沙漠”的故事,正在真实的边缘 AI 世界里同步上演。

\displaystyleS = \frac{n \times b}{8} \ \ (\text{Bytes})
这条公式让工程师在部署前就能心算出模型体积:参数量 × 每个参数的位数 ÷ 8。
  1. 统计参数量逐层累加输入维度与输出维度的乘积,得到模型总参数量。
    n=∑linl×outln = \sum_{l} \text{in}_{l} \times \text{out}_{l}
  2. 乘以量化位宽每个参数按二值化 1 位或三值化 2 位计算总位数。
    n×b  bitsn \times b \ \ \text{bits}
  3. 换算部署字节总位数除以 8,得到模型在磁盘或内存中占用的字节数。
    S=(n×b)/8S = (n \times b) / 8

AI 应用场景

手机端人脸检测与解锁

阶段:模型训练 → 量化压缩 → 边缘端部署推理

解决的问题:人脸检测模型通常有数十 MB,手机内存和 NPU 算力有限。传统浮点模型推理延迟高、功耗大,无法满足锁屏常驻场景的实时响应与省电要求。

具体案例:某手机厂商将 50 MB 的检测模型二值化压缩至约 1.6 MB,配合 NPU 上的位运算指令,把解锁检测延迟从 200 ms 压到 20 ms,功耗下降约 60%。就像大厨把整套厨房设备换成一张开关面板,照样能快速出餐。

智能音箱语音唤醒词检测

阶段:音频预处理 → 三值化模型推理 → 唤醒触发

解决的问题:唤醒词模型需要常驻运行、持续监听麦克风,全精度模型在低功耗 DSP 上根本跑不动,漏唤醒和误唤醒问题突出。

具体案例:某智能音箱将三值化后的唤醒模型部署在 1 MB 内存的 DSP 芯片上,16 倍压缩后整体功耗低于 5 mW,误报率仅 0.2 次/小时,实现“一声唤醒、随叫随到”,电池续航翻倍。

工业质检边缘摄像头

阶段:缺陷检测模型量化 → 边缘盒子部署 → 实时上报

解决的问题:工厂产线每秒需要处理 30 帧图像,上传云端延迟高且断网即瘫痪;传统浮点模型体积大,边缘盒子装不下多路模型。

具体案例:某工厂把 PCB 缺陷检测模型三值化后部署到边缘计算盒,模型从 300 MB 缩至 19 MB,检测精度仅下降 1.2%,单台设备同时流畅运行 4 路摄像头,每年节省数十万元云端带宽费用。

Python 演示

python59 行
import numpy as np np.random.seed(42) def sign_quantize(w):    """二值化: 返回缩放因子和二值矩阵"""    alpha = np.mean(np.abs(w))    return alpha, np.where(w >= 0, 1.0, -1.0) def ternary_quantize(w):    """三值化: 0.7 阈值划分, 返回阈值和三值矩阵"""    delta = 0.7 * np.mean(np.abs(w))    tw = np.where(w > delta, 1.0,         np.where(w < -delta, -1.0, 0.0))    return delta, tw class BinaryLinear:    """带直通估计器的二值化线性层"""     def __init__(self, in_dim, out_dim):        self.fp_w = np.random.randn(in_dim, out_dim) * 0.1        self.bias = np.zeros(out_dim)     def forward(self, x):        self.alpha, self.bw = sign_quantize(self.fp_w)        self.x_in = x        return x @ (self.alpha * self.bw) + self.bias     def backward(self, dout, lr):        clip = (np.abs(self.fp_w) <= 1).astype(float)        grad_w = self.x_in.T @ dout        self.fp_w -= lr * grad_w * clip        self.bias -= lr * dout.sum(axis=0)        return dout @ (self.alpha * self.bw).T def sigmoid(z):    return 1.0 / (1.0 + np.exp(-z)) # 构造线性可分的二分类数据X = np.random.randn(200, 4)y = ((X[:, 0] + X[:, 1]) > 0).astype(float) model = BinaryLinear(4, 1)for epoch in range(200):    logits = model.forward(X)[:, 0]    pred = sigmoid(logits)    loss = -np.mean(y * np.log(pred + 1e-8) +                    (1 - y) * np.log(1 - pred + 1e-8))    dout = (pred - y).reshape(-1, 1) / len(X)    model.backward(dout, lr=0.8)    if epoch % 40 == 0:        acc = ((pred > 0.5) == y).mean()        print('epoch', epoch, 'loss %.4f' % loss, 'acc %.0f%%' % (acc * 100)) alpha, bw = sign_quantize(model.fp_w)delta, tw = ternary_quantize(model.fp_w)print('缩放因子 alpha = %.4f' % alpha)print('二值化后唯一取值:', np.unique(bw))print('三值化后唯一取值:', np.unique(tw))
目的:实现一个带直通估计器的二值化线性层,端到端跑通“二值化网络也能正常训练”的全过程,并对比三值化量化结果。
  1. alpha = np.mean(np.abs(w))计算缩放因子,相当于给“放盐”档标上大约几克。
  2. return alpha, np.where(w >= 0, 1.0, -1.0)一行完成符号函数量化,权重只剩 ±1。
  3. delta = 0.7 * np.mean(np.abs(w))三值化经验阈值,决定哪些权重被清零。
  4. np.where(w > delta, 1.0, np.where(w < -delta, -1.0, 0.0))三档映射:大正值、大负值保留,中间权重归零。
  5. self.alpha, self.bw = sign_quantize(self.fp_w)前向传播始终用二值权重计算,模拟部署环境。
  6. clip = (np.abs(self.fp_w) <= 1).astype(float)构造 STE 梯度裁剪掩码,超界权重不再更新。
  7. self.fp_w -= lr * grad_w * clip更新实值影子权重,这是模型能继续学习的关键。
  8. return dout @ (self.alpha * self.bw).T梯度经二值权重继续往上游回传。
  9. np.unique(bw)验证二值化后权重矩阵确实只剩两个独特取值。

常见误区

误区“训练完 FP32 模型后,把权重直接 sign 一下变成 ±1 就完成部署了,简单又高效。”

正解直接对训练好的模型做后量化,精度会大幅崩溃。正确做法是量化感知训练(QAT):训练阶段前向就用二值权重计算,反向时才在实值影子权重上更新。这就像大厨从练菜第一天起就用便携锅具,而不是等出餐时才临时换锅,火候自然完全不同。

为何常见:sign 函数太简单了,容易让人误以为压缩只是“最后一步取整”,忽略了训练与部署必须保持一致这个关键原则。

误区“二值化存 1 位、三值化存 2 位,所以二值化一定快三值化一倍、快 FP32 三十二倍。”

正解32 倍是存储压缩比,不是运行加速比。实际推理速度取决于硬件指令支持程度:如果芯片没有高效的 XNOR-popcount 指令,二值化可能跑得比预想慢;而三值化的大量零值可以通过稀疏跳过,实际延迟可能逼近二值化。必须实测,不能只看位宽。

为何常见:把“存储体积缩小倍数”直接等同于“运行速度提升倍数”,忽略了计算指令、访存带宽与硬件架构的复杂耦合。

误区“三值化多了一个 0 档,精度更高,所以选三值化准没错。”

正解三值化模型体积是二值化的两倍(16 倍 vs 32 倍压缩),且零值需要额外的稀疏索引或掩码来记录位置;在硬件缺少对应稀疏加速指令时,收益会打折扣。选型要综合精度、体积、硬件支持三方面权衡,而不是无脑选精度高的那个。

为何常见:只对比了精度数字,没有把存储开销、索引开销和硬件适配成本算进总账。

误区“±1 只有两种取值,信息丢了大半,精度损失是不可避免的宿命。”

正解通过知识蒸馏、渐进量化、缩放因子校准、残差全精度化等组合技巧,二值化在 MNIST、CIFAR-10 等任务上可以逼近甚至达到全精度准确率。神经网络本身有很强的冗余与自校正能力,大模型恢复空间更大。菜谱虽然简了,但独特的烹饪手法依然能把味道拉回来。

为何常见:把神经网络理解成“精确数值计算器”,而忽略了它本质上是“有冗余的统计学习机”,对噪声和离散化有天然的容忍度。

面试题

Q1. 二值化网络把每个权重映射为哪一对取值?

单选题 · easy

  • A.+1 和 -1← 正确答案
  • B.0 和 1
  • C.0 和 255
  • D.1 和 2

答案:A。二值化的目标是把连续浮点权重压缩成 1 位表示,符号函数将所有非负值归为 +1、负值归为 -1,好比菜谱只写“放盐/不放盐”。B、C、D 都不是二值化网络的标志性取值集合。

Q2. 三值化网络比二值化网络多出的一个取值档位是?

单选题 · easy

  • A.整数零档← 正确答案
  • B.小数半档
  • C.整数二档
  • D.负值档位

答案:A。三值化权重取值集合为 {-1, 0, +1},0 档让落在阈值区间的小权重直接跳过,形成稀疏结构,相当于菜谱里的“不加也不减”档。B/C/D 均不在三值化取值集合中。

Q3. 关于二值化网络的缩放因子 α,下列说法正确的有?

多选题 · mid

  • A.通常取权重绝对值的均值← 正确答案
  • B.用于近似保留权重幅度← 正确答案
  • C.训练期间不可动态调整
  • D.二值化后不需要任何缩放

答案:AB。α = (1/n)Σ|w_i| 是令 L2 重建误差最小的最优系数,相当于给“放盐/不放盐”标注“约等于几克”,幅度信息因此得以保留,A、B 正确。α 会随影子权重更新而动态变化,C 错误;不做缩放的纯符号量化会丢弃全部幅度信息,精度明显下降,D 错误。

Q4. 直通估计器(STE)在训练中主要解决的问题是?

单选题 · mid

  • A.符号函数导数为零梯度难回传← 正确答案
  • B.训练数据样本太少难以拟合
  • C.模型参数量太大内存溢出
  • D.推理芯片不支持位运算

答案:A。sign(w) 的导数几乎处处为 0,反向传播梯度会消失。STE 让梯度跳过符号函数直接作用在实值影子权重上(限制在 |w|≤1 内),类似沙漠里做菜看卡片、改配方却用精确笔记本。B/C/D 与离散化训练的核心矛盾无关。

Q5. 二值化点积在硬件上通常由哪两个指令组合完成?

单选题 · mid

  • A.XNOR 加 popcount← 正确答案
  • B.FMA 加 LUT 查表
  • C.SIMD 加 DMA 搬运
  • D.ReLU 加 softmax

答案:A。当输入和权重都是 ±1 时,内积 = 2×popcount(XNOR(……)) - n,只需逻辑门与计数器即可完成,不需要乘法器。这好比开关电路不需要电子秤。B/C/D 要么需要乘加器,要么不属于完成点积的指令对。

Q6. 二值化模型相对全精度模型体积缩小约多少倍?

单选题 · mid

  • A.约 32 倍← 正确答案
  • B.约 8 倍
  • C.约 16 倍
  • D.约 64 倍

答案:A。FP32 每个权重占 32 位,二值化后只占 1 位,体积比为 32:1,因此缩小约 32 倍。三值化占 2 位才是 16 倍,8 倍对应 4 位量化,64 倍对应半精度压缩,均与二值化不符。

Q7. 三值化网络阈值 Δ 的经典经验公式是?

单选题 · hard

  • A.0.7 倍的权重绝对值均值← 正确答案
  • B.0.5 倍的权重绝对值均值
  • C.权重最大值除以权重总数
  • D.权重方差的算术平方根

答案:A。经典三值化论文采用 Δ = 0.7/n·Σ|w_i| 作为经验阈值,超过 Δ 的权重保留 ±1、其余置 0,兼顾显著特征保留与稀疏性引入。B/C/D 都不是主流三值化论文使用的阈值公式。

Q8. 下列哪些技术能够缓解二值化造成的精度损失?

多选题 · mid

  • A.知识蒸馏辅助训练← 正确答案
  • B.渐进式两阶段量化← 正确答案
  • C.无限增大学习率
  • D.直通估计器训练← 正确答案

答案:ABD。知识蒸馏让二值化学徒跟着全精度师父学,渐进量化先三值后二值逐步适应,STE 保证离散训练梯度稳定,三者都能有效挽回精度。把学习率调到无穷大只会让权重发散、模型崩溃,C 属于错误操作。

Q9. 二值化网络对硬件友好的原因包括哪些?

多选题 · hard

  • A.权重仅占 1 位存储← 正确答案
  • B.乘法退化为逻辑门← 正确答案
  • C.仍需大量浮点乘法器
  • D.内存带宽需求大幅下降← 正确答案

答案:ABD。1 位存储使模型瘦身 32 倍,访存带宽需求同步骤降;点积用 XNOR+popcount 位逻辑完成,不再依赖浮点乘法器。C 与事实相反——二值化正是为了摆脱昂贵浮点乘法器而生的。

Q10. 二值化网络训练时,前向传播与反向传播分别使用什么权重?

单选题 · hard

  • A.前向二值且反向实值更新← 正确答案
  • B.前向实值且反向二值更新
  • C.前向反向均用二值权重
  • D.前向反向均用实值权重

答案:A。前向必须用二值权重才能模拟真实部署环境,反向时梯度经 STE 直通到实值影子权重上完成更新,下一轮再重新量化。C 无法传播梯度会导致训练失败,D 训练环境与部署不一致会出现严重的量化误差,均不可行。