Deep learning 关于在预测中作为输出层的Softmax函数

Deep learning 关于在预测中作为输出层的Softmax函数,deep-learning,neural-network,classification,softmax,Deep Learning,Neural Network,Classification,Softmax,我知道softmax激活函数:具有softmax激活的输出层之和始终等于1,也就是说:输出向量被归一化,这也是必要的,因为最大累积概率不能超过1。好的,这是清楚的 但我的问题是:当softmax用作分类器时,使用argmax函数来获取类的索引。那么,如果重要参数是获得正确类的索引,那么获得一个或更高的累积概率有什么区别 在python中的一个示例中,我制作了另一个softmax(实际上不是softmax函数),但分类器的工作方式与使用真正softmax函数的分类器的工作方式相同: import

我知道softmax激活函数:具有softmax激活的输出层之和始终等于1,也就是说:输出向量被归一化,这也是必要的,因为最大累积概率不能超过1。好的,这是清楚的

但我的问题是:当softmax用作分类器时,使用argmax函数来获取类的索引。那么,如果重要参数是获得正确类的索引,那么获得一个或更高的累积概率有什么区别

在python中的一个示例中,我制作了另一个softmax(实际上不是softmax函数),但分类器的工作方式与使用真正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)

两种方法之间获得的类总是相同的(我说的是预测,而不是训练)。我这样问是因为我正在FPGA设备中实现softmax,使用第二种方法,不需要运行两次来计算softmax函数:首先查找指数矩阵及其和,然后执行除法。

让我们回顾一下softmax的用法:

  • 如果出现以下情况,应使用
    softmax

  • 您正在训练NN,并希望在训练期间限制输出值的范围(您可以使用其他激活函数)。这会略微有助于剪裁渐变
  • 您正在对NN执行推理,并且希望获得分类结果“置信度”的度量(在0-1范围内)
  • 您正在对NN执行推理,并希望获得
    top K
    结果。在这种情况下,建议使用“置信度”指标对其进行比较
  • 您正在对几个NN(集成方法)执行推理,并希望将它们平均化(否则它们的结果不容易比较)
  • 如果出现以下情况,则不应使用(或删除)
    softmax

  • 您正在对NN执行推理,并且只关心顶级。请注意,神经网络可以使用Softmax进行训练(以获得更好的精度、更快的收敛速度等)

在您的情况下,您的见解是正确的:
Softmax
作为最后一层中的激活函数,如果您的问题只要求您在推理阶段获取最大值的索引,那么它是毫无意义的。此外,由于您的目标是FPGA实现,这只会给您带来额外的麻烦。

Hi@ibarrond还有一个问题:在第三点中,您说“您正在对NN执行推理,希望得到前K个结果”。在我的实验中,使用我的示例或实际softmax函数的类的顺序也总是相等的。那么,当你提到度量中的置信度时,你是在说推理类之间的距离概率?是的!您可以将其视为“距离”和/或“概率”。