ResidualQuant:面向循环Transformer KV Cache的2-bit残差量化方案

做模型推理优化这几年,我最大的一个体感是:真正卡住长上下文生成的,往往不是算力,而是内存带宽和缓存容量。模型权重可以离线反复压缩,已经卷到 4-bit、甚至更低;可 KV Cache 是运行时动态增长的数据,每生成一个 token 都得把这些缓存整个读一遍。逐步量化的思路很自然,但砍到 2-bit 这种程度,单靠普通量化器很难稳住精度。这篇论文讲的 ResidualQuant,正是针对循环 Transformer 这一类架构的 KV Cache,提出了“2-bit 主量化 + 残差量化”的组合方案,核心思想是:既然第一次量化必然丢精度,那就把丢掉的误差单独存下来,再用一组独立的量化器去补。我会把它要解决的问题、方案细节、实验结果,以及我自己的落地建议都摊开讲,适合正在做长上下文推理优化、或者研究循环/线性注意力架构部署的朋友。

1. 循环 Transformer 的缓存问题:为什么状态缓存成了解码路径上的新瓶颈

1.1 解码过程其实是“搬运数据”的过程

自回归生成的特点是逐 token 输出,第 t 步生成的 token 会成为第 t+1 步的输入。每一步,模型都要把权重和 KV Cache 搬进计算单元。批量推理时,比如 batch 到 64、上下文拉到 8K,KV Cache 很容易涨到几十 GB。这些数据每步都要从 HBM 里读一遍,内存带宽于是成了硬约束。业界常用的 FlashAttention 解决了 attention 计算过程中的中间矩阵搬运问题,但 KV Cache 本身的总量和读取还是躲不掉。这也是为什么 KV Cache 量化在推理优化里的地位越来越重,已经从“锦上添花”变成“必需品”。

模型权重量化之所以先卷起来,一个重要原因是权重是静态的,可以用大量校准数据慢慢调参,量化一次后反复使用。但 KV Cache 不一样,它是运行中逐步生成的,量化器没法离线预计算 scale,必须在推理路径上轻量地完成量化。更麻烦的是,普通的 KV 量化方法通常假定缓存是按位置追加、按位置读取的,这个假设在循环架构里并不成立。

1.2 循环架构的缓存与标准 Transformer 的差别在哪

标准 Transformer 的 KV Cache 是“只追加”的:每个新 token 算出一组 K/V,拼到缓存后面,Attention 计算时按位置索引读取。循环/线性注意力架构则不同,它们把完整的注意力矩阵换成某种递推的状态更新,不需要保存所有历史 token 的 KV,但会维护一个压缩了全部历史信息的固定大小状态缓存。每一步,状态缓存都要被读取,结合当前输入做更新,再写回去。

这个差别带来两件事。一是状态缓存大小不随序列长度线性增长,这是循环架构省内存的根源;二是状态缓存是每步整体更新的,读写规律,不像普通 KV Cache 那样随机访问。所以对它做量化,必须考虑“读-更新-写回”这个完整流程,而不是简单地把历史 KV 分块处理。另外,不少混合架构仍保留一部分局部 Attention 或外显 KV 缓存,这部分同样有压缩需求,只是论文主要讨论的核心是那个逐步递推的状态缓存。

1.3 为什么已有 KV Cache 量化方案不直接适用

现在主流的 KV Cache 量化方案,比如 4-bit 分组量化、按通道混合精度,大多围绕标准 Transformer 的 KV 分布设计。它们量化的是历史 KV 的“静态”副本,可以提前按统计信息选好 scale,Attention 读取时反量化就行。但循环 Transformer 的状态缓存更接近“动态张量”,每步更新,分布缓慢漂移,没法用离线校准集一次性确定量化参数。

另一个问题是,普通 KV Cache 量化可以容忍把缓存分块处理,或在高精度和低精度之间做通道选择;状态缓存如果只量化一部分,可能导致递推误差出现偏置。循环架构的误差还会在时间步之间传播,一步的误差会影响后续所有状态,这意味着量化方法必须追求更低的误差,而且误差的行为要可控。ResidualQuant 的残差思路,恰好把矛头对准了这一点。

2. 直接砍到 2-bit 的量化方案为什么在长序列上顶不住

2.1 2-bit 只有四个格子,装不下矩阵的真实动态范围

2-bit 量化意味着每个数值只有 4 个量化等级。对于一组真实的张量,动态范围往往跨越几个数量级:少数维度承担关键语义,数值偏高;大量维度接近零,数值平缓。给这组值选一个 scale,如果照顾大值,小值之间几乎无法区分,全挤到同一个格子;如果照顾小值,大值直接溢出。换成分组量化,每个小组 32 或 64 个元素配一个 scale,能缓解一点,但 scale 本身也要存储,分组越细,存储和带宽开销越大,跟“为省内存而量化”的目标互相打架。

KV 和状态缓存的分布还有一个特点:经过层间变换后,某些维度会形成明显的“能量集中”现象,少数维度上的幅值远高于同一组的其他维度。这是 Transformer 里被反复观察到的模式。2-bit 量化遇到这种维度结构,几乎注定产生大的误差。你要是只看全局 max 选 scale,那么绝大多数普通值就被压到同一个桶里,等于用最低精度去表达最重要的部分;要是按分位点选 scale,又会有不少离群值直接溢出到边界。怎么选都会损伤信息。

2.2 循环递推会让每一步的量化误差“利滚利”

这是论文最关键的一个动机。

标准 Transformer 里,KV Cache 的量化误差只影响“这一步查询时”的计算:Attention 从缓存里把 K、V 读出来,误差进入注意力分数,影响当前 token 的预测。之后模型会生成新 token,但旧缓存不会被更新,误差不会被写回再参与下一步。循环架构不同,状态缓存 S_t 既是上一步的输出,又是下一步递推的输入。量化 S_t 时引入的误差,会随着状态更新公式被写进新的状态,成为下一步输入的一部分,误差不是一次性消费掉,而是递归累积。

正因如此,评测时必须看长序列。论文里的现象很典型:直接 2-bit 量化在短文本困惑度上看不出灾难,但生成序列一旦拉长,文本出现重复、脱轨这类退化症状,这就是递归误差放大的表现。我建议做类似优化的人,把“量化后的长文本生成质量”当成必测项目,而不是只看 PPL。实测下来,序列长度翻倍之后,退化速度比大多数人的直觉快得多。

2.3 分组、离群值分离等补丁方案的代价

面对 2-bit 精度不够,常见的补丁有三类。第一类是更细的分组量化,比如把 group 从 64 降到 16,精度确实上去了,但 scale 开销也上去了,实际等效 bit 可能从 2 变成 3 甚至 4,压缩率大打折扣。第二类是离群值分离:把大值挑出来用高精度单独存,其余用 2-bit。问题在于离群值的位置是动态的,每次缓存更新后都要重新扫描和记录索引,索引要占空间,还会打乱内存布局。第三类是混合精度通道:根据激活统计识别重要通道,重要通道用高精度。对于静态权重,这招很有效;但循环状态是逐步演化的,通道重要性不是固定不变的,在线检测通道重要性的开销大得惊人。

ResidualQuant 没有去和“让 2-bit 本身更准”死磕,而是换了个思路:承认 2-bit 量化会丢精度,就把丢掉的误差单独拿出来,用另一组专门设计的量化器去存。因为误差的分布通常比原始值集中得多,反而更容易压缩。这个思路让主量化器可以保持简单高效,精度问题交给第二级去修补。逻辑上很像“先记大概,再记偏差”,写数字先写整数位再补小数位,比试图用一个数字同时表达两个尺度靠谱得多。

3. ResidualQuant 的核心机制:对量化误差再做一次独立量化

3.1 两级量化的完整流程与存储结构

给定一个待写入缓存的状态张量,比如形状为 [维度] 或 [层, 维度],ResidualQuant 的处理流程分四步。先做第一级量化:按分组粒度(比如 32 个连续元素一组)给每组计算 scale 和 zero point,用 2-bit 把每个元素量化到 4 个等级,得到主量化编码值和一组主 scale。接着做反量化,用主编码和主 scale 重建出近似值。原始张量减重建值,得到残差张量 R = S - S_hat。这个 R 就是第一级量化器丢掉的误差。然后,对 R 做第二级独立量化:同样按分组计算残差 scale,把 R 量化成另一组低比特编码,可以是 1-bit 或 2-bit。存储时,把主编码、主 scale、残差编码、残差 scale 一起写进缓存。读取时,分别解码主值和残差值,相加,就得到近似重建的 S。

整体看,两级量化器各管一段精度:主量化器负责大尺度结构,残差量化器负责细粒度补偿。这样做的一个额外好处是,如果你发现某个层对量化特别敏感,可以单独为那一层增加残差 bit,而完全不动其他层,获得一种类似“按层分配精度预算”的灵活性。这在传统单级量化里实现起来更麻烦。

3.2 残差量化器和主量化器不能共享一套参数

这里有个容易被忽视的工程问题:如果残差 R 只是被同一个 2-bit 量化器再量化一遍,大概率效果不好。因为 R 的分布和 S 的分布完全不同。R 近似是量化噪声,分布类似零均值、有界均匀分布或拉普拉斯分布,但它的标准差比 S 小一两个数量级。若还用原来的 scale 校准,量化器的大部分区间都浪费了,小值全落在 0 附近。论文的做法是,第二级量化器使用独立的校准逻辑,直接对 R 做统计,然后决定自己的 scale。

这个点听起来简单,但我见过很多第一次做残差量化的人栽在这里:保留主量化器的 scale 给残差用,省一步计算,结果精度退化得比直接 2-bit 还差。其实只要单独统计残差的 max 或分位数,效果立刻就不一样了。另一个提升空间来自分组粒度:残差相对同质,可以用比主量化更粗的分组,比如主量化 32 一组,残差 64 或 128 一组,让残差 scale 的存储摊得更薄。

3.3 内存布局与循环状态的逐步更新适配

工程上,残差量化能否落地,内存布局很关键。循环 Transformer 的缓存更新模式是“读取-计算-写回”,每步访问范围固定,不像标准注意力那样回溯读取全部历史位置。因此,主编码和残差编码可以紧凑打包在连续内存块里,解码时顺序读取,内存带宽利用率很高。写回时,新算出的状态可以先保留在高精度计算副本里,等完成更新后再执行两级量化、写入缓存。量化本身只是查表、乘 scale 和四舍五入,属于非常简单的向量操作,不会成为推理路径上的瓶颈。

有一种实现技巧值得提:残差编码使用稍大的分组,但主量化编码保持较细分组。理由前面说过——残差分布均匀,对 scale 变化不敏感;主量化面对原始数据的大动态范围,反而需要更细的 scale 来压制离群值影响。这样分配之后,总存储几乎没增加,精度却比“主粗残差细”的配置更稳。

3.4 一个最小原型:伪代码与关键选择

我整理一个很小的 PyTorch 风格伪代码,只展示核心逻辑,实际工程还要考虑 zero-point、向量化、内存对齐:

def residual_quantize(x, group=32, residual_group=64, bits_main=2, bits_res=2): # x: [..., dim] x_flat = x.reshape(-1, group) max_main = x_flat.abs().amax(dim=1, keepdim=True) scale_main = max_main / (2 ** (bits_main - 1) - 1) q_main = torch.clamp(torch.round(x_flat / scale_main), -(2 ** (bits_main - 1)), 2 ** (bits_main - 1) - 1) recon_main = q_main * scale_main residual = (x_flat - recon_main).reshape(-1, residual_group) max_res = residual.abs().amax(dim=1, keepdim=True) scale_res = max_res / (2 ** (bits_res - 1) - 1) q_res = torch.clamp(torch.round(residual / scale_res), -(2 ** (bits_res - 1)), 2 ** (bits_res - 1) - 1) recon = recon_main + q_res * scale_res return q_main, scale_main, q_res, scale_res

这里没写 zero-point,实际用对称量化比较常见;如果状态矩阵均值明显偏置,建议加 zero-point 或非对称量化。bits_res=0时,就退化成单纯的 2-bit 分组量化,方便自己对比残差分支到底带来了多少收益。我自己的经验是,先用这种几十行的原型在单层上跑通,观察重建误差变化,再决定要不要继续往完整推理引擎里集成,不要一上来就改底层缓存格式。

4. 实验与账本:同样的存储预算,残差路径把精度用了两次

4.1 评测方式:短文本 PPL 会骗人

论文实验部分最值得注意的不是某个孤立的指标,而是它对评测方式的选择:重点对比了随序列长度增长的误差曲线。这个选择很有针对性。直接 2-bit 在短上下文 PPL 上可能只差一点点,因为模型有很强的语言先验,几个 token 的短期预测不会立刻崩。但状态缓存的误差跨步长叠加之后,生成到上千 token,输出质量就会快速下滑。只看短 PPL 就把方案放行,后面上线时很容易吃大亏。

所以在验证这类方案时,我建议至少做三组测试:短文本 PPL、长文本 PPL、以及开放生成的长文本连贯性(可以用重复率、困惑度差、人工抽样判断等)。只跑短 PPL 就下结论,是很多 KV 量化项目踩过的坑。特别提醒一句:连标准 Attention 架构的 KV 量化测试,也同样适用这套评测方法,因为长上下文中的误差累积是普遍现象,只是循环架构更严重。

4.2 核心结果的大方向:同样的 bit 预算,误差小了

整体结论概括起来就是:在相同等效存储预算下,残差量化的重建误差和下游精度,明显好于直接用 2-bit;换成“2bit+2bit”和直接 4-bit 相比,普遍可以达到相当甚至更好的精度。原因就是量化误差被两级量化器拆开了,残差分支专门处理低位量化最容易丢的细节。

这背后的道理值得多说一句。直接 4-bit 量化器在数值范围大的张量上,依然存在“scale 只能取一个值”的尴尬。虽然 4-bit 的格子比 2-bit 多,但原始张量里大小值之间的跨度还是可能把很多中间值挤到同一格子里。残差方案相当于把一次较粗但有偏的量化,加上一次针对偏差的精确修正,比一个单量化器盲扫整个动态范围更高效。从信息论角度理解,自然语言张量的信息本身就可以分为“显著分量”和“弱信号分量”,残差量化恰好对应这种分解,因此同等 bit 数下信息保留率更高。

4.3 带宽和容量的实际收益怎么算

我按自己的经验算一笔账。设 baseline 每元素用 fp16(16bit)。方案一直接 4-bit 分组量化,group=32 时 scale 开销约 0.5bit,等效约 4.5bit,压缩约 3.5 倍。残差方案“主2bit+残差2bit”,主和残差的 scale 都算上,等效约 4.5~5bit,压缩约 3.2~3.5 倍。存储上两者非常接近,但残差方案的精度更好。如果目标是压缩率优先,可以用“主2bit+残差1bit”,等效约 3.3~3.6bit,压缩能到 4.5 倍左右。

方案主量化bit残差bit等效bit/元素(含scale)相对fp16压缩比精度风险
直接2bit20约2.5约6.4x高,长序列退化
2bit+1bit残差21约3.5约4.5x中
2bit+2bit残差22约4.5约3.5x低,接近4bit精度
直接4bit40约4.5约3.5x中低,但优于直接2bit

这个表格是我个人计算,具体折损要看实际分组大小和 scale 存储格式。带宽方面同理:每步读缓存的数据量按等效 bit 下降,但 scale 和残差编码的解码也要计入。残差分支不是白送的,它的价值在于把同样的 bit 花得更值,而不是让 bit 总数变得更少。

4.4 和同类方案对比的判断逻辑

做论文解读,不能只看作者自己报出来的数字,还要看对比的公平性。ResidualQuant 和直接 4-bit 比较时,必须确保两者的总内存消耗接近,而不是只对比“量化 bit 数”。如果论文只写“我们的主通道是 2bit”,不把残差和 scale 算进去,那在工程上是不可信的。这类账如果算不清楚,论文的实验部分价值就大打折扣。

还有一个对比难点是“直接 4-bit 的分组粒度”是否经过调优。如果直接 4-bit 用了很粗的分组,残差方案用了较细分组,那精度差距可能来自分组粒度而不是残差本身。所以真正可信的对比,应该把直接 4-bit 的分组粒度也调到最优再比。我在自己评估类似方法时,会先做这一步再看待结论,否则数据好看不一定说明方案真的好。

5. 落地视角:值得采纳的地方和需要绕开的坑

5.1 残差不是白送的:开销要细算

工程化落地时,最容易踩的坑就是忽略 scale 和残差编码的额外开销。残差本身也要占带宽。如果残差用 2bit,主缓存从 2bit 涨到 4bit,和直接用 4bit 量化在内存总量上几乎一样。残差方案的优势在精度,不在压缩率。你要想清楚自己的目标:如果是“同样的内存占用下把精度提上去”,那残差非常合适;如果是“极限压缩到接近 2bit”,那残差 bit 必须压得很低,比如 1bit,这时省下的带宽才明显。把这两件事混为一谈,很容易在项目汇报时产生误解。

还有一个常见的误解是“残差方案一定比直接量化快”。解码速度取决于带宽降低幅度和反量化计算量。两级解码比单级多一次加法、一次乘法和一次查表,这些开销不大,但也不能忽略。尤其在小 batch、短序列场景,访存不一定完全吃满,额外计算的占比会更高。优化的重点应该是让解码阶段把主残差两块数据顺序读出来,能一次内存拷贝尽量别拆两次。

5.2 残差量化器的在线稳定性问题

二级量化器的 scale 由残差统计量决定,但推理中每一步的残差最大值都会波动。如果某个 token 触发特别大的残差,scale 被拉大,其他残差的量化就会变粗糙;如果 scale 设小了,又会溢出。这种波动在循环架构里会被递推放大,所以不能天真地每步更新最大值。

我在实际实现中会给残差 scale 加一点平滑,用滑动平均或指数衰减估计残差最大值/分位数,避免单步噪声影响。另一个技巧是量化残差前对幅度做缩尾处理,clamp 到分位数水平,牺牲少量离群残差,换取整体更稳的重建精度。这两个细节论文里未必强调,但对上线稳定性的影响非常明显。

5.3 这套思路能不能扩展到普通 Transformer

残差量化本身不挑架构,普通 Transformer 的 KV Cache 也可以用类似的主量化+残差量化思路。差别在工程层面:标准 Attention 需要按位置随机读取历史 KV,如果主编码和残差编码分开存,每次读取要合并并对齐到不同内存块,访问碎片化,时序开销可能抵消量化省下的带宽。循环架构的状态更新是规律的整体读写,天然适合这种编码方式。

所以如果要在普通 Transformer 上做,最好把残差编码和主编码放进同一段缓存行,尽量保证按块连续读取。另一个思路是只对 KV Cache 的一部分做残差量化,比如只用残差量化 V,K 保持直接分组量化,因为 K 的分布更尖锐,V 更平滑,两者对量化误差的敏感度不同。这个用法论文没有展开,但我认为值得一试。

5.4 我建议的工程配置与验证方法

如果是我来落地,会先跑一组最小实验确定参数。第一步,固定分组粒度,用 grid search 做主 bit 和残差 bit 的不同组合,指标用长文本 PPL 和重建误差。第二步,固定 bit 预算,对比残差方案和直接低比特方案,并保证两者的等效存储相同,这样得出的结论才公平。第三步,专门测长序列生成质量,比如生成 2K token 以上,观察重复率和连贯性。

我个人推荐的最低配置是“主2bit + 残差1bit”,它在中等任务上性价比很高;重要场景上到“主2bit + 残差2bit”。分组上,主量化用 32、残差量化用 64 或 128,能压低 scale 开销。scale 的存储格式可以考虑用 bf16 而不是 fp16,在精度损失可忽略的情况下再省一点带宽。对状态维度较大的模型,我会额外关注每层的敏感度,必要时给敏感层单独调高残差 bit,其他层保持低配,这样整体压缩率不会牺牲太多。

最后聊一点我自己的体会。做 KV Cache 量化这几年,最大的一个教训是:不要指望单个量化器同时搞定所有尺度的信息。直接 2-bit 之所以容易翻车,就是因为它既要保住大尺度结构,又想保留细节,最终两头都顾不上。ResidualQuant 把精度预算分成主、残差两条通道,等于给了量化误差一条专门的处理路径,思路朴素,但在循环 Transformer 这种状态递归更新的场景里特别对症。如果你也在做长上下文推理优化,建议先拿自己的模型跑一组简单的长文本评测,把“直接 2-bit”和“2bit+1bit 残差”放一起对比,大概率会亲眼看到我说的差距。这比读论文更直观,顺手还能把分组和残差 bit 的配置一起调到位。

相关新闻

FunctionCall函数调用全解析:从原理到实战,让大模型真正“动手干活”

FunctionCall函数调用全解析:从原理到实战,让大模型真正“动手干活”

如果你正在做AI对话类产品,不管是客服助手、内容助手还是企业内部的知识问答系统,大概率会遇到这样一个让人头疼的瞬间:用户问“帮我查一下昨天订单的物流状态”,模型回了一句“很抱歉,我无法访问你的订单系统”。不是…

2026/10/20 5:19:03 阅读更多 →
PyInstaller打包Python脚本实战:从原理到多平台发布

PyInstaller打包Python脚本实战:从原理到多平台发布

Python 脚本写完之后,最常被问到的一个问题就是:怎么把它交给一个没装 Python 的人也能跑起来?你总不能让人家先装解释器、再配环境变量、再 pip install 一堆依赖。PyInstaller就是干这个的——把.py文件连同解释器和依赖库一起打包成单个可…

2026/10/20 5:19:03 阅读更多 →
Pulsar创新实践:消息中间件架构演进与生产落地指南

Pulsar创新实践:消息中间件架构演进与生产落地指南

最近不少技术群都在倒计时:COSCon‘25 同场活动 Pulsar Developer Day 还有 3 天就要开了。这个开发者日把主题定在“消息中间件创新实践”,我个人觉得比泛泛的技术布道更有看头。原因很简单:消息中间件这几年变化太快,快到“选型…

2026/10/20 5:19:03 阅读更多 →

最新新闻

从单体到弹性扩展:高并发架构改造的完整实战复盘

从单体到弹性扩展:高并发架构改造的完整实战复盘

1. 项目背景与架构需求拆解1.1 最初的系统,和它一步步暴露出的问题先说下背景。这个代号为"arch-system"的架构改造项目,源于团队负责的一条核心业务链路。最初的系统是典型的三层单体:一个应用服务承载所有接口,MySQL …

2026/10/20 6:03:23 阅读更多 →
PPT-Master:用PowerPoint构建业务操作系统的方法论

PPT-Master:用PowerPoint构建业务操作系统的方法论

1. “PPT-Master”不是软件名,而是一类人的生存状态最近在几个技术协作群和设计交流社区里,“PPT-Master”这个词高频出现,但没人把它当产品名说——它更像一句带点自嘲又透着狠劲的行业暗号。我第一次听到是在某次跨部门复盘会上&#xff0c…

2026/10/20 6:03:23 阅读更多 →
图灵奖60年:人机环境系统智能的演进与落地

图灵奖60年:人机环境系统智能的演进与落地

六十年前,那个以一位计算机先驱命名的奖项第一次颁出时,大概没有人想到,它会成为一部无声的“智能观变迁史”。这六十年间,获奖成果背后的工作其实都在回答同一个问题:机器到底怎样才算有智能?答案从“会算…

2026/10/20 6:03:23 阅读更多 →
浙江高考VB排序系列:冒泡与选择排序代码实现及应试技巧

浙江高考VB排序系列:冒泡与选择排序代码实现及应试技巧

1. 从一道排序题说起:为什么VB排序值得单独拎出来讲每年到了技术科目备考的冲刺阶段,总有一批同学在排序算法这块反复栽跟头。选择题里问“冒泡排序第三轮结束后序列长什么样”,填空题里给一段残缺代码让你补全循环边界,上机操作题…

2026/10/20 6:03:23 阅读更多 →
图灵奖六十年:从机器能否思考到人机环境系统智能的跃迁

图灵奖六十年:从机器能否思考到人机环境系统智能的跃迁

图灵奖整整六十年了。作为计算机科学领域最负盛名的荣誉,它这些年一直被当作衡量学术巅峰的标尺。可如果你把六十年来历届获奖者所代表的方向串成一条时间线,会发现一个远比"学术成就"更有意思的东西正在浮现:整个领域对"智能…

2026/10/20 6:03:23 阅读更多 →
主动学习新思路:损失预测模块如何精准筛选高价值样本

主动学习新思路:损失预测模块如何精准筛选高价值样本

1. 为什么主动学习要换一种采样思路做深度学习项目,尤其在数据标注预算有限的时候,大家最先想到的办法多半是“先随便标一部分,训练一版模型,再用模型挑一些‘难样本’送给标注员”。这套逻辑本身没问题,难就难在“难样…

2026/10/20 6:02:23 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →