归一化简单案例

仅用于个人学习

js归一化方法

复制代码
function softmax(logits) {
  // 第1步:找到 logits 数组中的最大值(对应公式里的 max(x))
  const maxLogit = Math.max(...logits); 
  
  // 第2步:对每个元素,先减最大值,再求指数(对应公式分子的 exp(x_i - max(x)))
  const exps = logits.map(x => Math.exp(x - maxLogit)); 
  
  // 第3步:求所有指数值的总和(对应公式分母的 sum(exp(x_j - max(x))))
  const sumExps = exps.reduce((a, b) => a + b, 0);     
  
  // 第4步:每个指数值除以总和,得到概率(对应公式的 分子/分母,完成归一化)
  return exps.map(exp => exp / sumExps);                
}

举例

我们不用长度 1000 的数组,用简单的 logits = new Float32Array(2, 4, 1) 来演示整个流程:

  • 第 1 步:找最大值
    maxLogit = Math.max(2,4,1) = 4
  • 第 2 步:减最大值 + 求指数
    • 第 1 个元素:Math.exp(2-4) = Math.exp(-2) ≈ 0.135
    • 第 2 个元素:Math.exp(4-4) = Math.exp(0) = 1
    • 第 3 个元素:Math.exp(1-4) = Math.exp(-3) ≈ 0.0498
      所以 exps ≈ [0.135, 1, 0.0498]
  • 第 3 步:求指数和
    sumExps ≈ 0.135 + 1 + 0.0498 ≈ 1.1848
  • 第 4 步:归一化求概率
    • 第 1 个概率:0.135 / 1.1848 ≈ 0.114(11.4%)
    • 第 2 个概率:1 / 1.1848 ≈ 0.844(84.4%)
    • 第 3 个概率:0.0498 / 1.1848 ≈ 0.042(4.2%)
      最终概率数组:0.114, 0.844, 0.042,总和≈1,符合要求。

总结

这个 softmax 函数的流程可以浓缩为 4 步,每一步都和公式严格对应:

1、 找最大值(防溢出的关键)

2、 每个元素 "减最大值 + 求指数"(得到分子原始值)

3、 求所有指数值的总和(得到分母)

4、 每个指数值除以总和(归一化,得到概率)

最终输出的概率数组,既能反映原始 logits 的 "大小关系"(原始值越大,概率越高),又能满足 "0~1 区间、总和为 1" 的概率特性,方便后续的分类判断。

相关推荐
晊晌_h28 分钟前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦1 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考1 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客2 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨5 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F6 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper6 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-7 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台7 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰8 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展