关于 Softmax 函数作为预测中的输出层
About Softmax function as output layer in preddictions
我知道softmax激活函数:有softmax激活的输出层之和总是等于1,也就是说:输出向量被归一化了,这也是必要的,因为最大累积概率不能超过1 .好了,这就清楚了。
但我的问题如下:当softmax用作classifier时,是使用argmax函数获取class的索引。那么,如果重要参数是获得正确 class 的索引,则获得 1 或更高的累积概率有什么区别?
python 中的示例,其中我创建了另一个 softmax(实际上不是 softmax 函数)但是 classifier 的工作方式与 classifier 的工作方式相同真正的 softmax 函数:
import numpy as np
classes = 10
classes_list = ['dog', 'cat', 'monkey', 'butterfly', 'donkey',
'horse', 'human', 'car', 'table', 'bottle']
# This simulates and NN with her weights and the previous
# layer with a ReLU activation
a = np.random.normal(0, 0.5, (classes,512)) # Output from previous layer
w = np.random.normal(0, 0.5, (512,1)) # weights
b = np.random.normal(0, 0.5, (classes,1)) # bias
# correct solution:
def softmax(a, w, b):
a = np.maximum(a, 0) # ReLU simulation
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]
# approx solution (probability is upper than one):
def softmax_app(a, w, b):
a = np.maximum(a, 0) # ReLU simulation
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)
两种方法得到的class总是一样的(我说的是预测,不是训练)。我问这个是因为我在 FPGA 设备中实现 softmax 并且使用第二种方法不需要运行 2 次来计算 softmax 函数:首先找到取幂矩阵及其总和,然后执行除法。
让我们回顾一下softmax
的用法:
如果:
你应该使用softmax
- 您正在训练 一个 NN 并希望在训练期间限制输出值的范围(您可以改用其他激活函数)。这可以稍微帮助剪裁渐变。
- 您正在 NN 上执行 推理 ,并且您想要获得关于 class 化结果的“置信度”的度量(在0-1).
- 您正在神经网络上执行 推理 并希望获得
top K
结果。在这种情况下,建议使用“置信度”指标来比较它们。
- 您正在对几个 NN(集成方法)进行推理,并希望对它们进行平均(否则它们的结果不容易比较)。
您不应使用(或删除)softmax
if:
- 你正在对一个神经网络进行推理,你只关心顶部 class。请注意,NN 可以使用 Softmax 进行训练(以获得更好的准确性、更快的收敛等)。
在你的情况下,你的见解是正确的:Softmax
如果你的问题只要求你在推理阶段获得最大值的索引,那么作为最后一层的激活函数是没有意义的。此外,由于您的目标是 FPGA 实现,这只会让您更加头疼。
我知道softmax激活函数:有softmax激活的输出层之和总是等于1,也就是说:输出向量被归一化了,这也是必要的,因为最大累积概率不能超过1 .好了,这就清楚了。
但我的问题如下:当softmax用作classifier时,是使用argmax函数获取class的索引。那么,如果重要参数是获得正确 class 的索引,则获得 1 或更高的累积概率有什么区别?
python 中的示例,其中我创建了另一个 softmax(实际上不是 softmax 函数)但是 classifier 的工作方式与 classifier 的工作方式相同真正的 softmax 函数:
import numpy as np
classes = 10
classes_list = ['dog', 'cat', 'monkey', 'butterfly', 'donkey',
'horse', 'human', 'car', 'table', 'bottle']
# This simulates and NN with her weights and the previous
# layer with a ReLU activation
a = np.random.normal(0, 0.5, (classes,512)) # Output from previous layer
w = np.random.normal(0, 0.5, (512,1)) # weights
b = np.random.normal(0, 0.5, (classes,1)) # bias
# correct solution:
def softmax(a, w, b):
a = np.maximum(a, 0) # ReLU simulation
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]
# approx solution (probability is upper than one):
def softmax_app(a, w, b):
a = np.maximum(a, 0) # ReLU simulation
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)
两种方法得到的class总是一样的(我说的是预测,不是训练)。我问这个是因为我在 FPGA 设备中实现 softmax 并且使用第二种方法不需要运行 2 次来计算 softmax 函数:首先找到取幂矩阵及其总和,然后执行除法。
让我们回顾一下softmax
的用法:
如果:
你应该使用softmax
- 您正在训练 一个 NN 并希望在训练期间限制输出值的范围(您可以改用其他激活函数)。这可以稍微帮助剪裁渐变。
- 您正在 NN 上执行 推理 ,并且您想要获得关于 class 化结果的“置信度”的度量(在0-1).
- 您正在神经网络上执行 推理 并希望获得
top K
结果。在这种情况下,建议使用“置信度”指标来比较它们。 - 您正在对几个 NN(集成方法)进行推理,并希望对它们进行平均(否则它们的结果不容易比较)。
您不应使用(或删除)
softmax
if:- 你正在对一个神经网络进行推理,你只关心顶部 class。请注意,NN 可以使用 Softmax 进行训练(以获得更好的准确性、更快的收敛等)。
在你的情况下,你的见解是正确的:Softmax
如果你的问题只要求你在推理阶段获得最大值的索引,那么作为最后一层的激活函数是没有意义的。此外,由于您的目标是 FPGA 实现,这只会让您更加头疼。