深度学习基础系列:softmax

Softmax函数

softmax函数常用于多分类问题,我们希望模型的输出可以作为预测的概率,即输出值越大的那个参数在预测的时候很有可能就是正确答案。

但是回想一下概率的计算公式(扔骰子),对于总的概率空间样本来说,其概率的总和一定是1,而我们的预测输出基本上总和不可能是1,这里softmax函数的作用就是压缩这些输出值,从而使用概率的方式进行表示

softmax函数长这样

给定一个K维向量$ z=[z_1,z_2,…,z_K]$,Softmax函数的定义为:

这里,$\mathbf{z}$ 是一个K维向量,$z_j$ 是向量中的第 $j$ 个元素,$ 1 \leq j \leq K$。

$$ \sigma(\mathbf{z})j = \frac{e^{z_j}}{\sum{k=1}^{K} e^{z_k}} $$

计算过程

对于给定的一个list输入,先计算得到softmax函数的分母值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import math
input = [1, 2, 3]

# 分母是math.exp形式
ans = list()
sumVal = 0.0
for val in scores:
    sumVal += math.exp(val) # 分母

for val in scores:
    ans.append(math.exp(val) / sumVal)

print(ans)

我们也可以使用numpy进行计算

1
2
3
4
5
6
7
8
import numpy as np
def softmax(scores: list[float]) -> list[float]:
	temp = np.array(scores) # 转换为ndarray
	exp_temp = np.exp(temp) # 计算所有值的exp值
	exp_sum = np.sum(exp_temp) # 和为分母
	# 计算分子 exp_temp
	ans = np.round(exp_temp / exp_sum, 4) # 每个exp值除以分母,并保留4位小数
	return ans

numpy的方便之处在于不用编写循环和计算快!

花有重开日,人无再少年
使用 Hugo 构建
主题 StackJimmy 设计