You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决C#中SoftMax实现的溢出及求和非1问题?

问题分析与解答

你的SoftMax实现是正确的,求和结果略偏离1属于浮点数有限精度导致的正常现象,并非代码错误或对SoftMax的理解偏差。

核心原因

SoftMax的数学定义确实满足输出和为1,但计算机使用的双精度浮点数(double)只有约15-17位有效数字,在以下环节会引入微小误差:

  • Math.Exp的计算本身存在舍入误差;
  • 多个浮点数求和时,累积的舍入误差会进一步放大;
  • 最终的除法运算也会引入额外误差。
    这些误差叠加后,就会导致总和与1产生极小的偏差(通常在1e-10到1e-15量级,你的测试结果偏差稍大可能是因为随机向量规模较大,误差累积更多)。

关于你的优化版本

减去输入向量最大值的优化是正确的,它解决了指数运算溢出的问题(当输入值较大时,Math.Exp会返回无穷大),但无法消除浮点数固有的精度误差——这是所有数值计算都无法避免的问题。

测试代码的小优化

你的测试代码中每次循环都创建新的Random实例,可能导致生成的随机数重复(因为默认种子依赖系统时钟,短时间内创建的Random会使用相同种子),建议改为复用同一个实例:

var rnd = new Random();
IEnumerable<double> vector = Enumerable.Range(0, 100).Select(n => rnd.NextDouble());

不过这不是导致求和偏离的原因,只是代码的健壮性优化。

结论

这种微小的偏差在机器学习场景中完全可以忽略,不会影响模型的训练或推理效果。如果需要严格验证数学正确性,可以使用高精度数值库(如针对decimal类型实现指数运算),但在实际工程中没有必要。

内容的提问来源于stack exchange,提问作者Cade Bryant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:32:43