关于Softmax作为分类预测输出层的近似实现疑问及FPGA部署优化
关于Softmax预测阶段归一化的疑问与近似实现分析
你这个观察非常犀利,而且你的近似方法确实切中了Softmax在预测阶段的核心本质——我们根本不需要严格的概率归一化,只要能保留输出的相对大小,argmax就能给出正确的类别索引。下面来拆解你的疑问和实现:
1. argmax只关心相对排序,和为1与否无关
argmax函数的作用是找出数组中数值最大的元素索引,它只在意元素之间的相对大小关系,完全不关心元素的绝对数值,也不关心所有元素的总和是多少。
标准Softmax的归一化(让输出和为1)是为了让输出符合概率分布的定义,方便我们理解“每个类别的置信度”,但对于argmax来说,只要对所有输出做正的单调变换(比如除以一个固定正数、乘以一个固定正数),元素的相对排序都不会改变,argmax的结果自然也完全一致。
2. 你的近似方法为什么和标准Softmax分类结果一致?
我们来对比两个函数的输出:
- 标准Softmax输出:
S_i = e^{z_i} / sum_{j=1}^N e^{z_j},其中z_i = matmul(a,w)+b - 你的近似方法输出:
A_i = e^{z_i} / sum(e^w)
这里sum(e^w)是一个固定的正数(因为预测阶段权重w是不变的,可以提前离线计算好),所以A_i = S_i * (sum_{j=1}^N e^{z_j} / sum(e^w))——相当于把标准Softmax的所有输出都乘以了一个正的常数系数。这种缩放完全不会改变元素的相对大小,所以两者的排序结果(argsort后的索引)必然完全相同,argmax的结果自然也一致。
3. 这种近似对FPGA实现的意义
你的思路非常适合FPGA这类硬件平台:
- 标准Softmax需要两次遍历计算:先计算所有指数值,再求和,最后逐个做除法,这会增加计算延迟和资源占用;
- 你的近似方法只需要计算一次指数值,然后除以一个预计算好的固定常数,省去了求和步骤,大大简化了硬件逻辑,降低了延迟和资源消耗,非常适合FPGA的低延迟、高并行需求。
4. 关键前提:只适用于预测阶段
一定要注意,这种近似只在预测阶段有效。在训练阶段,我们需要用真实的概率分布来计算交叉熵损失,这时候Softmax的归一化(和为1)是必须的——否则损失函数的计算会偏离预期,导致梯度更新出错,模型无法正确收敛。
你的代码验证(附注释)
import numpy as np classes = 10 classes_list = ['dog', 'cat', 'monkey', 'butterfly', 'donkey', 'horse', 'human', 'car', 'table', 'bottle'] # 模拟ReLU激活后的前层输出和权重、偏置 a = np.random.normal(0, 0.5, (classes,512)) # 前层输出 w = np.random.normal(0, 0.5, (512,1)) # 输出层权重 b = np.random.normal(0, 0.5, (classes,1)) # 输出层偏置 # 标准Softmax实现:输出和为1的概率分布 def softmax(a, w, b): a = np.maximum(a, 0) # 模拟ReLU激活 x = np.matmul(a, w) + b e_x = np.exp(x - np.max(x)) # 数值稳定技巧:减去最大值避免指数溢出 return e_x / e_x.sum(axis=0), np.argsort(e_x.flatten())[::-1] # 近似实现:输出和不为1,但保留相对大小 def softmax_app(a, w, b): a = np.maximum(a, 0) # 模拟ReLU激活 w_exp = np.exp(w) coef = np.sum(w_exp) # 预计算固定系数(预测阶段可提前算好) matmul = np.exp(np.matmul(a,w) + b) res = matmul / coef return res, np.argsort(res.flatten())[::-1] teor = softmax(a, w, b) approx = softmax_app(a, w, b) class_teor = classes_list[teor[-1][0]] class_approx = classes_list[approx[-1][0]] print(np.array_equal(teor[-1], approx[-1])) # 排序结果完全一致 print(class_teor == class_approx) # 预测类别完全一致
内容的提问来源于stack exchange,提问作者Diego Ruiz
相关产品推荐
相关产品推荐

