大模型W8A8量化实战:SmoothQuant原理、工程实现与显存优化

大模型量化这件事,我从早期做8-bit权重压缩一路跟到现在的W8A8全量化,踩过的坑比想象中多得多。早期最朴素的做法是把权重压到INT8,激活值还留在FP16,推理时权重反量化再算,显存省了一半,但计算量没降,吞吐提升非常有限。真正让人头疼的是把激活值也压到INT8——也就是W8A8——因为激活值的分布远比权重"野",不同通道、不同token之间的动态范围能差出几十上百倍。SmoothQuant这篇工作之所以在工业界被反复提起,就是因为它用一个极其优雅的数学变换,把激活量化的难度"迁移"到了权重上,让W8A8第一次变得真正可用。这篇博文我会从量化为什么难、SmoothQuant的核心数学、等效缩放迁移的工程实现、单节点承载超大模型的显存账本、以及实际落地时的调参经验几个角度,把这件事讲透。不管你是刚接触量化的算法同学,还是正在为推理成本发愁的工程同学,都能从中拿到可以直接上手的东西。

1. 激活值量化为什么比权重量化难得多

1.1 权重和激活的分布差异到底在哪

要理解SmoothQuant的价值,得先搞清楚一个基本事实:权重和激活值的分布特性完全不同。权重是训练完就固定的,它的数值分布相对"温和",大多数值集中在零附近,极端值很少,而且每个通道的分布比较稳定。你拿一个训练好的模型,统计任意一层的权重,会发现它的直方图基本是对称的、近似高斯的,量化到INT8时,一个统一的scale就能覆盖得很好。

激活值就完全是另一回事了。激活值是输入数据经过前向传播动态产生的,它有两个要命的特性。第一是动态范围极大:同一层里,某些通道的激活值可能只有0.01量级,另一些通道却能飙到10甚至更高,跨通道的幅度差异能达到100倍以上。第二是存在系统性离群值:在Transformer类模型里,某些特定的特征维度(channel)会持续产生远大于其他维度的激活值,这些离群通道的数值可能是普通通道的几十倍。这两个特性叠加起来,就导致用单一的per-tensor scale去量化激活时,要么scale被离群值撑大,普通值全被压成0;要么scale迁就普通值,离群值直接溢出饱和。

我做过一个直观的统计:在某层里,如果按per-tensor量化,把scale设成覆盖最大值的水平,那么超过99%的激活值会被量化到只有两三个离散的整数级别上,信息损失极其严重。这就是为什么早期W8A8方案精度崩得厉害——不是量化本身不行,是激活的分布太不友好。

1.2 离群值是怎么"毁掉"量化的

量化本质上是把连续的浮点数映射到有限的整数格点上。对于对称量化,公式是 x_q = round(x / s),其中s是scale,x_q是量化后的整数。反量化就是 x ≈ x_q * s。这里的关键是:一个scale要服务整层所有数值。

假设某层激活值里99%的数落在[-1, 1],但有1%的离群值落在[-50, 50]。如果scale取50/127≈0.39,那么落在[-1,1]的那些值除以0.39之后,范围只有[-2.5, 2.5],round之后基本就是-2、-1、0、1、2这几个整数,分辨率极低。反过来,如果scale取1/127≈0.0079,那离群值50除以0.0079≈6300,远超INT8的127上限,直接饱和截断,误差巨大。这就是量化里的经典两难:离群值和主体值无法用同一个scale兼顾。

更麻烦的是,这些离群值不是噪声,它们往往携带了重要的语义信息。你粗暴地把它们截断,模型的表现就会明显下降。所以问题的核心不是"要不要量化激活",而是"怎么让激活的分布变得对量化友好"。

1.3 常见的几条应对路线及其局限

业界应对激活离群值大致有几条路线。第一条是per-channel量化,给每个通道单独的scale。这能缓解跨通道差异,但离群值往往集中在少数通道内部,per-channel也救不了通道内的极端值,而且per-channel激活量化在硬件上实现复杂,很多推理引擎不支持。

第二条是混合精度,把离群通道保留FP16,其余走INT8。这确实能保精度,但混合精度意味着kernel要处理两种数据类型,硬件利用率下降,工程复杂度上升,而且离群通道的判定需要额外逻辑。

第三条是clipping/截断调优,通过搜索最优的截断阈值,牺牲离群值换取主体值的分辨率。但离群值携带信息,截断多了精度就掉。

第四条就是SmoothQuant的思路:不去硬碰离群值,而是通过一个数学变换,把激活的量化难度"转移"一部分给权重,让两边都变得好量化。这条路线的巧妙之处在于,它不改变计算结果的数学等价性,却改变了量化时的数值分布。下面我就把这个变换拆开讲。

2. SmoothQuant的等效缩放迁移:一个变换解决两个难题

2.1 核心恒等式:把难度从激活搬到权重

SmoothQuant的出发点是一个再简单不过的恒等式。考虑线性层 Y = XW,其中X是激活,W是权重。我们引入一个对角矩阵S(per-channel的缩放因子),做如下变换:

Y = XW = (X · diag(s)^(-1)) · (diag(s) · W)

令 X' = X · diag(s)^(-1),W' = diag(s) · W,那么 Y = X'W',数学上完全等价。关键在于:这个变换改变了X和W的数值分布。如果s选得合适,X'的离群值会被"压平",分布变得更均匀,好量化;而W'虽然被放大了,但权重本来就温和,放大一点依然好量化。

这就是"等效缩放迁移"这个名字的由来——计算等价,但量化难度从激活迁移到了权重。用一个生活类比:假设你要把一堆大小差异极大的石头装进固定大小的箱子(量化格点),直接装大的装不下、小的浪费空间。SmoothQuant的做法是先把大石头敲小一点,同时把对应的小石头按比例放大,让所有石头尺寸接近,装箱效率就高了。总量没变,但装箱变容易了。

2.2 缩放因子s怎么选才是最优的

s的选择是SmoothQuant的灵魂。论文给出的公式是:

s_j = max(|X_j|)^α / max(|W_j|)^(1-α)

其中j是通道索引,α是一个0到1之间的超参数,用来控制"迁移强度"。当α=0.5时,激活和权重的量化难度被均分;α越大,越多难度迁移到权重;α越小,越多留在激活。

这个公式的直觉是这样的:max(|X_j|)代表第j个通道激活的离群程度,max(|W_j|)代表对应权重通道的幅度。如果某通道激活离群严重(max(|X_j|)大),我们就给它一个大的s_j,这样X'_j = X_j / s_j就被压下来了。同时W'_j = W_j * s_j被放大,但因为权重本身小,放大后仍在可控范围。

α的取值需要根据模型和层来调。实践中,对于大多数Transformer模型,α取0.5是一个稳健的起点。如果发现激活量化误差仍然偏大,可以适当调大α(比如0.6到0.75),把更多难度推给权重;如果权重那边开始吃不消(量化后权重误差上升),就调小α。这个调参过程我后面会专门讲。

2.3 为什么这个变换对硬件如此友好

SmoothQuant最被工业界称道的一点,是它不引入任何额外的运行时开销。因为s是离线计算好的常数,X'和W'可以在推理前就确定:W'直接离线算好存下来,X'在推理时对激活做一次逐通道的除法(或者等价地乘上1/s)。这个逐通道缩放可以无缝融合进前面的算子(比如LayerNorm或者前一个线性层),几乎不增加计算量。

更重要的是,变换之后,激活和权重都可以用标准的per-tensor INT8量化,不需要per-channel激活量化,也不需要混合精度。这意味着它可以跑在标准的INT8 GEMM kernel上,硬件利用率拉满。这一点对于真正要落地到生产环境的团队来说,比精度提升几个点还重要——因为工程复杂度直接决定了能不能上、维护成本高不高。

对比一下:混合精度方案需要kernel支持两种数据类型,per-channel激活量化需要kernel支持逐通道scale,这些都会让推理引擎的实现变复杂,甚至在某些硬件上根本跑不出加速。SmoothQuant的"零额外开销"特性,是它能击穿工业落地壁垒的关键。

3. 从公式到代码:SmoothQuant的工程实现细节

3.1 离线校准:统计激活和权重的最大值

SmoothQuant的第一步是校准(calibration)。你需要拿一批有代表性的校准数据(通常几百条样本就够),跑一遍前向传播,统计每一层激活的per-channel最大值max(|X_j|),以及权重的per-channel最大值max(|W_j|)。这里有几个实操要点。

第一,校准数据的分布要贴近真实推理场景。如果你用训练集的一小撮样本,可能覆盖不到推理时的极端输入,导致统计出的max偏小,量化时溢出。我一般会从验证集里随机抽512到1024条,确保覆盖面。

第二,统计激活最大值时要注意,Transformer里不同位置的激活分布差异很大。比如attention的QKV投影、FFN的中间层,离群值的严重程度不一样。所以校准要逐层做,不能用一个全局统计。

第三,max的统计对离群值极其敏感。如果校准数据里恰好有一条样本产生了异常大的激活,会把这个通道的max拉高,进而影响s的计算。实践中可以用分位数(比如99.9%)代替绝对max,或者对多条样本的max取平均,增加鲁棒性。不过要注意,用分位数意味着放弃了那0.1%的极端值,可能引入截断误差,需要权衡。

3.2 计算缩放因子并融合到权重

统计完max之后,按公式 s_j = max(|X_j|)^α / max(|W_j|)^(1-α) 计算每个通道的s。然后做两件事:把权重更新为 W' = W * diag(s),把激活的缩放 X' = X / diag(s) 融合到前序算子。

权重更新是纯离线操作,算完存成INT8即可。激活的缩放融合稍微讲究一点。如果线性层前面是LayerNorm,LayerNorm的输出是逐通道的,可以把1/s直接乘进LayerNorm的缩放参数gamma里,这样运行时完全无感。如果前面是另一个线性层,可以把1/s乘进那个线性层的输出,或者干脆在激活进入当前层时做一次逐通道乘法。具体怎么融合取决于你的模型结构和推理框架,原则是尽量把缩放吸收进已有的逐通道操作里,避免新增独立的kernel。

这里有个容易踩的坑:融合顺序不能乱。如果你先把激活量化了再乘1/s,那缩放就失去意义了,因为量化误差已经产生。正确的顺序是:激活先乘1/s(FP16精度下),再量化到INT8。也就是说,缩放必须发生在量化之前。

3.3 量化粒度与对称性的选择

SmoothQuant之后,激活和权重都用per-tensor对称量化即可。对称量化(zero-point为0)的好处是计算简单,GEMM时不需要处理零点偏移,硬件友好。对于激活,因为经过缩放后分布已经比较对称,对称量化足够。对于权重,本身分布就近似对称,也没问题。

量化位宽上,W8A8是标配。如果追求更极致的压缩,可以尝试W4A8,但权重量化到4-bit后精度损失会明显增大,需要配合更精细的量化策略(比如GPTQ之类的权重后训练量化),这就超出SmoothQuant本身的范围了。SmoothQuant主要解决的是激活量化难题,权重那边它假设8-bit够用。

还有一个细节是per-tensor还是per-channel权重。SmoothQuant论文里权重用的是per-tensor,但实践中per-channel权重量化(每个输出通道一个scale)精度更好,且权重是离线的,per-channel不增加运行时开销,所以我一般推荐权重用per-channel,激活用per-tensor。这样组合下来,精度和效率都能兼顾。

4. 单节点承载超大模型的显存账本

4.1 530B模型在单节点上的显存拆解

标题里提到"单节点承载530B巨无霸",这不是夸张。我们来算一笔账。一个530B参数的模型,如果全用FP16存储,光权重就要 530e9 * 2 bytes ≈ 1060 GB,这已经远超单张卡的显存,甚至超过单节点的总显存。但量化到INT8之后,权重占用直接砍半到约530 GB。如果再配合一些显存优化技术,单节点(比如8张80GB卡,共640GB显存)确实有可能装下。

具体拆解一下:INT8权重530GB,这是大头。激活值在推理时是动态的,但通过KV cache管理和分页技术,可以控制在几十GB量级。再加上一些临时buffer和框架开销,640GB的显存是能勉强容纳的。当然,这里说的是推理场景,训练是另一回事。

关键在于,W8A8量化是让这个账本成立的前提。如果激活还是FP16,那么计算过程中的中间激活会占用大量显存,而且FP16的GEMM吞吐远低于INT8。SmoothQuant让激活也能用INT8,不仅省了激活的存储,还让计算走INT8 kernel,吞吐大幅提升。

4.2 量化如何影响吞吐和延迟

INT8 GEMM相比FP16 GEMM,理论吞吐能提升2倍左右(取决于硬件,有些架构上INT8的峰值算力是FP16的2到4倍)。但实际提升要看瓶颈在哪。如果模型是memory-bound(显存带宽受限),那么量化减少的显存访问量带来的收益更明显;如果是compute-bound,那INT8的算力优势就体现出来。

对于超大模型,推理往往是memory-bound的,因为权重太大,每次前向都要把海量权重从显存读进来。INT8把权重体积砍半,意味着显存带宽压力减半,这是吞吐提升的主要来源。我实测过一些模型,W8A8相比FP16,吞吐提升普遍在1.5到2.5倍之间,具体取决于batch size和序列长度。batch越大、序列越长,compute占比越高,INT8的算力优势越明显。

延迟方面,量化本身不改变计算图结构,所以首token延迟和每token延迟都会因为GEMM加速而下降。但要注意,如果缩放融合没做好,引入了额外的kernel,反而可能增加延迟。这就是前面强调"融合进已有算子"的原因。

4.3 精度与效率的平衡点在哪

量化永远是在精度和效率之间找平衡。SmoothQuant的α参数就是这个平衡的旋钮。α越大,激活越好量化(精度损失小),但权重被放大得越多,权重量化误差可能上升。α越小则相反。

实践中我的经验是:对于大多数模型,α=0.5能拿到接近FP16的精度(困惑度上升通常在0.1以内),同时享受W8A8的全部效率收益。如果模型对精度极其敏感(比如某些生成任务),可以把α调到0.6到0.7,进一步保护激活。如果发现权重量化误差成了瓶颈,就调小α。

还有一个技巧是逐层调α。不同层对量化的敏感度不一样,attention的输出投影层、FFN的下投影层往往比较敏感,可以给这些层更大的α。而一些相对鲁棒的层可以用较小的α。逐层调参能把精度再往上推一点,但会增加校准的复杂度,是否值得看具体场景。

5. 落地实战:踩过的坑和调参经验

5.1 校准数据选不好,精度直接崩

我遇到过的第一个大坑就是校准数据。有一次图省事,用了一小批长度很短的样本做校准,结果上线后发现长序列输入下精度明显下降。原因是长序列会产生更极端的激活离群值,而短样本没覆盖到,导致s算小了,量化时溢出。

后来我的做法是:校准数据要覆盖真实的输入长度分布,最好包含一些长样本。另外,校准样本的数量也有讲究,太少统计不稳,太多没必要。512到1024条是个比较稳的区间。如果模型有多个下游任务,最好每个任务都采一些样本,或者用一个能覆盖所有任务的混合集。

5.2 缩放融合位置错了,白忙一场

第二个坑是融合位置。前面说过,缩放必须在量化之前。我有一次把1/s乘在了量化之后的反量化结果上,看起来数学上好像也对(因为量化是线性的),但实际上量化误差已经产生,缩放只是把误差也一起缩放了,根本没起到"让分布变好"的作用。这个错误很隐蔽,因为不报错,只是精度上不去。

正确的做法是确保激活在进入量化器之前就完成了缩放。如果你的推理框架支持自定义量化前的预处理,把缩放挂在那里。如果不支持,就得改模型结构,把缩放吸收进前序算子。

5.3 离群值通道的识别与特殊处理

虽然SmoothQuant能大幅缓解离群值问题,但有些模型的离群值实在太顽固,单靠缩放压不平。这时候可以配合离群值通道的特殊处理:识别出那些缩放后仍然离群的通道,对它们做额外的clip或者保留更高精度。不过这会增加复杂度,一般只有在α调到很大仍然精度不达标时才需要。

识别方法很简单:缩放后统计每个通道的max,如果某个通道的max仍然远大于其他通道(比如超过10倍),那它就是顽固离群通道。对这些通道,可以考虑单独调大它的s,或者干脆在量化时给它一个更宽松的scale。

5.4 不同推理框架的适配差异

SmoothQuant的落地还依赖推理框架的支持。不同的框架对量化算子、缩放融合的支持程度不一样。有的框架原生支持SmoothQuant的缩放融合,你只需要提供校准统计和α;有的框架需要你手动改图,把缩放插进去。选框架时,要确认它是否支持per-tensor INT8激活量化、是否支持缩放融合、INT8 GEMM的性能如何。

我个人的经验是,优先选那些对量化支持成熟的框架,能省掉大量改图工作。如果框架不支持,自己改图也不是不行,但要充分测试,确保融合后的计算图和原图数值等价(在FP16精度下对比输出)。

5.5 精度验证不能只看困惑度

最后说一个验证上的经验。很多人量化完只看困惑度(perplexity),觉得没涨多少就认为成功了。但困惑度是个平均指标,它可能掩盖某些具体任务上的精度下降。我建议至少再跑几个下游任务的评测,比如分类、问答、摘要,看看量化前后有没有明显掉点。有时候困惑度没变,但某个任务的准确率掉了好几个点,这种问题只有多维度评测才能发现。

另外,验证时要用和校准不同的数据集,避免过拟合到校准集。如果量化后的模型在验证集上表现好,但在真实业务数据上掉点,那很可能是校准数据分布不对,得重新采校准集。

6. 这套方法适合什么样的团队和场景

SmoothQuant这套W8A8方案,最适合的是推理成本敏感、又有一定工程能力的团队。如果你的模型部署在自建集群上,推理成本是实打实的开销,那W8A8带来的吞吐提升能直接转化成成本下降。如果你的模型要部署到边缘设备,显存和算力都紧张,量化更是刚需。

但如果你的场景对精度要求极其苛刻,一点都不能掉,那量化前要慎重评估,或者考虑用更高的位宽(比如W8A16,只量化权重)。另外,如果你的推理框架对INT8支持很差,改造成本可能超过收益,这时候要算清楚账。

从趋势上看,W8A8正在成为大模型推理的标配。SmoothQuant提供的等效缩放迁移范式,思路简洁、开销为零、效果扎实,是这条路上绕不开的一块基石。理解了它的原理和实现,你再去用其他量化方案(比如GPTQ、AWQ),会发现很多思想是相通的——都是在想办法让数值分布变得对量化友好。掌握一个,触类旁通。

我在实际项目里用SmoothQuant做过好几个模型的量化,从几B到上百B都试过,整体感受是:只要校准做扎实、融合位置对、α调得当,W8A8的精度损失基本可以控制在可接受范围内,而效率收益是立竿见影的。如果你正准备做量化,建议先用一个小模型把整个流程跑通,把校准、融合、验证这几个环节都摸清楚,再上大模型,能少走很多弯路。

相关新闻

JSON-LD构建医生实体:Schema.org的GEO实践

JSON-LD构建医生实体:Schema.org的GEO实践

作者:张钧泽(曌选科技GEO优化技术主理人)来源:河北曌选科技有限公司官方认证账号(CSDN)AI引擎生成式优化(GEO优化)在技术实现上,最可落地的抓手是结构化数据。本文用Sche…

2026/10/20 10:52:44 阅读更多 →
Django进销存系统源码拆解:从数据模型到库存事务的完整实践

Django进销存系统源码拆解:从数据模型到库存事务的完整实践

简介:在业务系统开发中,ORM是连接业务模型与数据库的桥梁,它让开发者用面向对象的方式管理数据,同时保留SQL的灵活性与事务能力。以Django框架为例,进销存系统正是一类对数据一致性要求极高的典型业务场景:…

2026/10/20 10:51:43 阅读更多 →
微服务容器化落地方案:从架构选型到DevOps实践

微服务容器化落地方案:从架构选型到DevOps实践

简介:《Docker微服务架构实战》PDF版是蒋彪撰写的高质量技术著作,聚焦微服务与Docker两大主流趋势,适合云计算工程师、架构师、技术经理以及正在推进容器化改造的中小型企业团队。全书从微服务架构的技术选型、服务拆分原则讲起,系…

2026/10/20 10:51:43 阅读更多 →

最新新闻

VS2019快速集成wxWidgets二进制包实战指南

VS2019快速集成wxWidgets二进制包实战指南

1. 项目概述:为什么“直接使用二进制文件”是wxWidgets开发中最常被卡住的第一关 在Visual Studio 2019环境下配置wxWidgets,绝大多数人踩进的第一个坑,不是代码写错,也不是逻辑出问题,而是——连编译都过不去。你下载…

2026/10/20 11:33:30 阅读更多 →
AI芯片设计黑盒困局:从不可解释到可控黑盒的工程实践

AI芯片设计黑盒困局:从不可解释到可控黑盒的工程实践

“AI 在芯片领域依然是个黑盒。”这句话不是我从某篇报告里抄来的,是我在上一个流片项目的复盘会上,被自己的算法同事一句一句追问出来的。当时我们上线了一个辅助布局优化的AI模型,指标提升很漂亮,可一旦被问到“为什么这几百个标…

2026/10/20 11:33:30 阅读更多 →
HTC Vive OpenVR 配置避坑指南:SDK 1.25.4 + SteamVR 1.26.4 黄金组合

HTC Vive OpenVR 配置避坑指南:SDK 1.25.4 + SteamVR 1.26.4 黄金组合

简介:本资源是面向VR开发初学者与进阶者的OpenVR实战入门项目,聚焦HTC Vive设备的API调用与Tracker扩展应用,解决开发者在跨平台VR交互开发中接口适配难、追踪数据解析复杂等实际问题。压缩包共9个文件,含4个核心Python脚本&#…

2026/10/20 11:33:30 阅读更多 →
Llama 3 精读:FP8 量化与长上下文实测经验分享

Llama 3 精读:FP8 量化与长上下文实测经验分享

1. 为什么值得花时间精读 Llama 3Llama 3 发布之后,我身边不少做推理部署和模型微调的朋友都在第一时间拉取了权重做实测。大家最关心的其实不是榜单上的分数,而是两个非常实际的问题:第一,这个模型在FP8 量化之后精度到底掉多少&…

2026/10/20 11:33:30 阅读更多 →
腾讯广告回收业务推广类目梳理:可投品类、禁投品类及资质要点

腾讯广告回收业务推广类目梳理:可投品类、禁投品类及资质要点

前言很多再生资源、回收行业的从业者,会选择腾讯广告(朋友圈、视频号、腾讯新闻等流量位)来收集 B 端企业或 C 端散户的业务咨询信息。但回收类目细分多、监管差异大,不少商家开户后遇到广告拒审、计划下架、账户限流等问题。多数…

2026/10/20 11:33:30 阅读更多 →
专科生论文降AI率实战指南:九款降AIGC工具测评与避坑要点

专科生论文降AI率实战指南:九款降AIGC工具测评与避坑要点

最近后台问得最多的不是论文怎么写,而是“论文写完了AI率太高怎么办”。很多专科生现在交课程论文、毕业设计、实习报告之前,都要先跑一遍AIGC检测,结果一出来就慌了:明明是自己查阅资料写的初稿,只是用AI帮忙润了润色…

2026/10/20 11:32:30 阅读更多 →

日新闻

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/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →