FHE 同态加密】我们如何实现同态加密推理(十):密文里的 attention——没有 max,softmax 怎么办(旋转移位 × 加法掩码)

简介: 本文提出FHE密文Attention实现方案:以定标替代不可行的max操作,将score压缩至窄区间,用6次多项式逼近exp与倒数函数,并通过旋转移位和加法掩码完成密文softmax计算,兼顾可行性与工程落地。

【FHE 同态加密】我们如何实现同态加密推理(十):密文里的 attention——没有 max,softmax 怎么办(旋转移位 × 加法掩码)

关键词:同态加密 | FHE | attention | softmax | 密文 Attention | 旋转移位 | 掩码 | 大模型推理 | 多项式逼近

导读:在密文里做 attention,最大的障碍是 softmax 的第一步"减去最大值"——而 max 要比较、要分支,同态加密里根本没有分支。本篇讲我们的替代方案:用定标常数把 max-sub 换掉,把 exp 的输入压进一个窄到能用 6 次多项式覆盖的区间,并用旋转实现移位、用加法实现掩码。

项目仓库
Gitee 主仓:https://gitee.com/pei-xiaoguang/kestrel-llm
GitHub 镜像:https://github.com/m13253246268-ship-it/kestrel-llm

相关文档
术语与数据口径 |
性能与基准 |
构建与复现 |
快速上手 |
架构总览

0. 一句话结论

明文实现 softmax 时,第一件事是减去最大值(exp(x − max(x)))——这是防溢出的标准技巧。

但在密文里,max 是最不该出现的操作:它不是多项式,要比较,要分支,而密文里"分支"根本不存在。

我们的替代方案是:用定标常数把 max-sub 换掉。

score 槽 = (q·k / √d)          ← 链内消息已隐式除以 F = 4096²
num      = EXP_Q(score / F)     ← 对全部 s 求 exp(此时还没有 mask)
den      = Σ_{s≤t} num          ← 掩码后用求和
inv      = recip(den)           ← 拟合的倒数多项式
p        = num · inv

关键在第二行:因为 score 在链内已经被隐式缩放了 4096² 倍,所以喂给 exp 的输入天然落在一个非常窄的区间里——窄到可以用一条 6 次多项式精确覆盖。


1. 明文侧的 softmax 为什么不能照搬

标准 softmax:

p_i = exp(s_i − max_j s_j) / Σ_j exp(s_j − max_k s_k)

减 max 的唯一目的是:防止 exp 溢出。exp(50) 就超过 float32 范围了。

但这条路径在密文里每一步都走不通:

需要的能力 明文里有 密文里有吗
求 max 一行代码 ❌ 需要比较 + 分支
逐元素减同一个数 广播 ⚠️ 可以做(同态加法/标量乘),但需要先把 max 求出来
exp 库函数 ❌ 只有多项式

第一行是死结。 所以我们必须换一个思路。


2. 替代方案:用定标把 exp 的输入"框"进窄区间

思路是绕开 max,改用已知的、固定的定标:

  1. 先测:在明文侧统计真实 score 的取值范围;
  2. 再框:让链内消息携带一个隐式的大定标(F = 4096²),于是 exp 的输入被压进一个预先已知的窄区间;
  3. 后拟合:在那个窄区间上拟合 exp 为一条 6 次多项式。

这个方案的代价非常明确:它依赖"score 分布不会跑出统计区间"。一旦真实推理时的 score 越界,拟合多项式在区间外的行为没有任何保证。

这就是"用定标换掉 max-sub"的代价:max-sub 是自适应的(永远安全),定标是预定的(区间外失效)。


3. 拟合的实际做法

规划脚本 _cfold_plan.py 里保留了这条流水线的完整语义(注释原文):

# 折叠语义与 t23_m3p.c C 段一致:
#   score 槽 = (q·k/√d) [链内消息已隐式除 F=4096²]
#   num = EXP_Q(score/F)(引擎对全 s 求 exp,再 causal mask)
#   den = Σ_{s≤t} num;inv = recip(den);p = num·inv

而 _attn_fit.py 负责实际拟合。它的做法值得逐条看:

3.1 exp:窄区间 + 无平移 + 6 次

lo, hi = -0.6, 0.5
z = u            # 直接对 S 拟合(无平移,系数小)
c = np.polyfit(z, np.exp(z), 6)

三个细节:

  • 区间 [-0.6, 0.5]:这是实测出来的 score 范围(脚本先打印 score range [min, max] 再定区间),不是猜的;
  • 不做平移:因为区间本来就窄且靠近 0,直接拟合的系数很小(|c|max 会打印出来核对)——平移反而会引入额外误差;
  • 6 次足够:窄区间上的 exp 极其平滑,deg=5/6 都能到很小的误差。

3.2 为什么"对全 s 求 exp 再 mask"

注意上面注释里那句:引擎对全 s 求 exp,再 causal mask。

顺序是 exp → mask,而不是 mask → exp。原因很实际:密文里没有条件分支,你没法"跳过"某些位置的计算,只能全算完再乘 0/1 掩码。好在"乘 0/1"在同态里是廉价的(标量乘法)。

而 causal mask 的作用是"位置 t 只能看到 ≤ t 的位置",于是在求和那一步:

den = Σ_{s≤t} num

求和范围就自然被掩码限制住了。

3.3 recip:倒数也要拟合

softmax 的分母要取倒数,而 1/x 同样不是多项式。所以倒数也要拟合——而且它的区间是可以推出来的:

# den = sum_s exp(S(h,s)) in [4*exp(lo), 4*exp(hi)]
dlo, dhi = 4*math.exp(lo), 4*math.exp(hi)

因为序列长度是 4(这一层处理 4 个 token),每项落在一个 2 次多项式在区间里的范围,4 项求和后区间就是 [4·exp(lo), 4·exp(hi)]。然后按这个区间标准化、拟合 deg=8。

_cfold_plan.py 里的实现更讲究一点——用 Chebyshev 拟合再转成普通多项式:

u = np.cos(np.pi * (np.arange(n) + 0.5) / n)      # Chebyshev 节点
p = Chebyshev.fit(u, 1.0/den, deg, domain=[-1,1]).convert(kind=Polynomial)

Chebyshev 节点在区间端点附近更密,能压住端点误差——这是数值拟合的标准手法,比等距 linspace 上的普通最小二乘更稳。

3.4 拟合的产物直接是 C 数组

这两个脚本直接打印出可粘贴进 C 源码的系数数组:

const double EXP_Q[7] = {
    ... };
const double RECIP_Q[9] = {
    ... };

也就是说:Python 侧负责拟合,C 侧只负责当常量和求值(Horner 法)。这个分工把"数值优化"与"密文运算"彻底隔开——密文侧一行拟合代码都没有(这就是本系列第 2 篇说的"两个世界")。

EXP_Q 的实际值(升幂,取自 _cfold_plan.py):

EXP_Q = [0.0013345331468413693, 0.0084199656748899163, 0.041687167024342969,
         0.16665574107235029, 0.49999829447852773, 1.0000003483277793, 1.0000000191319709]

注意前几个系数很小、最后两个接近 1.0——这是"在 [-0.6, 0.5] 上拟合 exp"应有的形状(exp(x) ≈ 1 + x + x²/2 + …,且区间关于 0 大致对称)。


4. 一个模型结构上的细节:GQA

拟合脚本里 NQ = 16, NKV = 8, HD = 128,而代码里映射 head 的方式是:

hk = h % NKV      # 16 个 query head 共享 8 个 KV head

这是 GQA(分组查询注意力):16 个 query head 对应 8 个 KV head,每个 KV head 被两个 query head 复用。

在密文里这件事的意义是:KV 侧的密文数量只有一半,而"多算的一份 K/V"在明文里是免费的(只是索引复用),在密文里是实打实的密文乘法。所以 GQA 对我们的性能是净收益——这不是我们选的,是模型结构给的便宜。


5. 安全边界(务请读完)

本文所述参数为机制验证级,远低于 HE 参数标准的 128-bit 水平,不得用于保护真实数据。
本文主张的是:密文下 attention 的实现取舍。
本文不主张:安全强度、性能优越性(本文不含与明文实现的性能对比)。

6. 这一篇的未解问题

  1. score 越界后没有兜底。定标方案假定 score 落在统计区间内。如果某个输入让它越界,拟合多项式会给出无意义的值——而且不会有任何报错。这是本文最担心的一处。可能的缓解:在明文侧统计时留更宽的余量,或在多项式上做区间外的钳制(但钳制本身也需要比较)。
  2. 区间余量取了多大,没有记录。[-0.6, 0.5] 是实测范围还是加了余量后的范围?这份数据我们没有归档。
  3. 掩码的实现细节我没有在密文侧逐行确认。本文描述的顺序(exp → mask → 求和)来自规划脚本的注释与仿真代码;C 侧的实际算子序列以 t23_m3p.c 为准,这一处需要读者(以及我们自己)对照源码复核。
  4. 拟合精度到整链精度的传递没有量化。exp 的 max_abs_err 和 recip 的 max_abs_err 脚本里都打印了,但"它贡献了整链 max|err| 的多少"没有做归因。

下一篇我们回到协议层:密文链的两条不变式——lay 与 boot 为什么这样交替,以及 112 与 2100 这两个素数数字是怎么分工的。

相关文章
|
5天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1241 4
|
28天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9785 32
|
8天前
|
存储 人工智能 安全
千问办公官网入口网页版登录:qwenwork.cn 注册送2000积分、登录送100积分
阿里云千问办公(QwenWork)是AI智能工作平台,支持一句话生成PPT、表格、网页、视频及数据分析。个人免费版送2000积分+每日登录赠100分,含1GB存储、5个发布页;企业版198元/席/月起。阿里千问办公QwenWork官网:https://t.aliyun.com/U/0VCTGt 阿里AI工作平台,一句话完成数据分析、PPT 生成、视频剪辑、网页搭建等复杂任务
|
3天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
|
14天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
5天前
|
Web App开发 人工智能 JavaScript
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
REA(Reverse Engineer Anything)是近期爆火的开源AI逆向工具,4月发布,1个月内斩获15万+ Star。它让AI Agent无需源码即可分析二进制、APK、JS/Electron、HAR包等17类目标,自动反编译、生成可运行代码,并强制返回带证据与局限的结论。全本地执行,MIT协议,支持Hopper/Ghidra/IDA等引擎,一行命令即可上手。
625 1
太猛了,一个月干到15W+,给大家推荐一个最近爆火的开源逆向工具:REA
|
13天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
928 1
|
9天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
592 0

热门文章

最新文章