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的方便之处在于不用编写循环和计算快!