把“读取温度”和“解释振动异常”都送进同一个小语言模型,确实会遇到计算量分配的问题。早退让某些 token 在中间层结束计算,但它不是在现有模型里随手加一句if probability > 0.9。中间输出头有没有训练过、概率有没有校准、后续 token 能不能访问完整缓存,都会影响答案。
10 月 19 日发布的 LiteRT Tensor API让开发者更直接地表达端侧计算图。它提供的是实现和调度工具,不能替一个未经训练的早退策略证明质量。本文只验证门控的一个数值陷阱,不声称已在 ARM NPU 上完成动态跳层。
Top-K 归一化会把信心抬高
假设词表有 10 个候选,最大 logit 为 0,其他 9 个都是 -2。全词表最大概率约 0.451;只保留前两个重新归一化,最大概率就变成约 0.881。被裁掉的概率质量并没有消失,只是从分母里被拿走了。
因此,Top-K 内部的局部概率不能直接充当全词表置信度。局部熵也有同样的问题。若旁路是一个固定类别的意图分类头,它的类别概率又不能替代生成词表概率,二者必须分别训练、验证和校准。
import math def softmax(logits): if not logits or not all(math.isfinite(x) for x in logits): raise ValueError("finite, non-empty logits required") peak = max(logits) weights = [math.exp(x - peak) for x in logits] total = sum(weights) return [x / total for x in weights] logits = [0.0] + [-2.0] * 9 full = max(softmax(logits)) local = max(softmax(sorted(logits, reverse=True)[:2])) assert full < 0.5 < local assert abs(sum(softmax([1000.0, 999.0])) - 1.0) < 1e-12 threshold = 0.8 # 仅用于说明,未经过任务校准 assert (full >= threshold) is False assert (local >= threshold) is True print("full=%.6f top2-renormalized=%.6f" % (full, local))这个反例不需要模型就能复现。它验证分母的差异,没有验证早退后的语言质量,更不能说明某个阈值适合设备控制。
缓存缺口不是指针问题
自回归模型在深层注意力中会读取历史位置的 K、V。如果上一个位置在浅层退出,深层对应位置就没有经过该层投影。把浅层指针复制过去,只能获得一段形状可能相同的数据,不能得到数学上等价的深层 K、V。
可选方案包括回补计算、训练专门的预测器,或在模型结构上约束退出深度。每条路都有质量和开销。2022 年的 CALM 论文已把缺失历史隐状态列为关键挑战;它不是今年才出现的问题,也不意味着任意开源 SLM 都能直接套用。
工程评估至少要同时保留完整模型的结果、退出层分布和长序列误差。只统计平均层数会遗漏 CPU/NPU 往返、探针输出和回补缓存的代价。温度、频率、批量、上下文长度都应固定后再比较。
工业命令需要另一个出口
读传感器可以被解释为查询;复位报警、改变设定值会改变设备状态。语言模型即使给出高概率,也不能越过权限、参数范围和设备联锁。更适合落地的第一步,是让模型生成受限的候选动作,再由确定性规则核验;未通过就拒绝或转人工。
本文没有训练中间头,没有执行真实模型、缓存回补或设备控制。先消除局部概率冒充全局置信度的问题,再考虑为一个经过校准的模型投入早退工程量,顺序会更稳妥。