为什么仅在输出层而不是在隐藏层中使用softmax?

时间:2016-06-02 10:01:08

标签: machine-learning neural-network classification softmax activation-function

用于分类任务的神经网络的大多数示例我已经看到使用softmax层作为输出激活函数。通常,其他隐藏单元使用sigmoid,tanh或ReLu函数作为激活函数。据我所知,在这里使用softmax函数也可以用数学方法计算出来。

  • 不使用softmax函数作为隐藏层激活函数的理论依据是什么?
  • 是否有任何关于此的出版物,引用什么?

5 个答案:

答案 0 :(得分:14)

我还没有找到任何关于为什么使用softmax作为隐藏层中的激活不是最好的想法的出版物(除了你可能已经读过的Quora问题)但是我会尝试解释为什么它是在这种情况下使用它不是最好的主意:

<强> 1。变量独立性:为了保持变量独立,不相关和非常稀疏,需要进行大量的正则化和努力。如果您使用softmax图层作为隐藏图层 - 那么您将保留所有节点(隐藏变量)线性相关,这可能会导致许多问题和一般性差。

<强> 2。培训问题:试着想象一下,为了让您的网络更好地工作,您必须将隐藏层的激活部分降低一点。然后 - 自动地让你的其他人在更高的水平上进行平均激活,这实际上可能会增加错误并损害你的训练阶段。

第3。数学问题:通过创建模型激活的约束,可以降低模型的表达能力,而无需任何逻辑解释。在我看来,努力让所有激活都相同是不值得的。

<强> 4。批量标准化可以做得更好:可以考虑这样一个事实,即网络的恒定平均输出可能对培训有用。但另一方面,已经证明一种称为批量标准化的技术可以更好地工作,而据报道,将softmax设置为隐藏层中的激活功能可能会降低学习的准确性和速度。

答案 1 :(得分:6)

实际上,Softmax函数已经在神经网络中深入使用,在某些情况下,当处理可微分的内存和注意机制时!

Softmax图层可用于神经网络,例如Neural Turing Machines (NTM),以及Differentiable Neural Computer (DNC)的神经网络。

总而言之,这些体系结构是RNNs/LSTMs,它们已被修改为包含可区分(神经)存储矩阵,可通过时间步骤进行写入和访问。

快速解释一下,这里的softmax函数可以对存储器的获取和其他类似的怪癖进行归一化,以实现对内存的基于内容的寻址。关于这一点,我真的很喜欢this article,它说明了NTM和其他最近使用交互式数字的RNN架构中的操作。

此外,Softmax用于机器翻译的注意机制,例如this paper。在那里,Softmax能够将注意力分散的地方标准化,以便“轻柔地”保留最大的注意位置:也就是说,也可以以柔和的方式对其他地方进行一点点关注。然而,正如本文所解释的那样,这可以被认为是一个小型神经网络,可以在大型网络中处理注意力。因此,可以讨论Softmax是否仅在神经网络结束时使用。

希望它有所帮助!

编辑 - 最近,甚至可以看到神经机器翻译(NMT)模型,其中只使用注意力(使用softmax),没有任何RNN或CNN:http://nlp.seas.harvard.edu/2018/04/03/attention.html

答案 2 :(得分:2)

Softmax函数仅用于输出层(至少在大多数情况下),以确保输出向量的分量之和等于1(为清楚起见,请参见softmax成本函数的公式)。这也意味着输出的每个组件(类)的出现概率是多少,因此概率(或输出组件)的总和等于1.

答案 3 :(得分:2)

在想要对多项分布建模的任何位置使用softmax激活。这可能(通常)是输出层y,但也可以是中间层,比如多项潜在变量z。正如此线程中针对输出{o_i}所述,sum({o_i}) = 1是线性依赖关系,在此层是有意的。附加层可以在下游提供所需的稀疏性和/或特征独立性。

深度学习(Goodfellow,Bengio,Courville)

  

任何时候我们希望用具有n个可能值的离散变量表示概率分布,我们可以使用softmax函数。这可以看作是用于表示概率的S形函数的推广   分布在二进制变量上。   Softmax函数最常用作分类器的输出,以表示n个不同类的概率分布。更少见的是,如果我们希望模型在某个内部变量的n个不同选项之一中进行选择,则可以在模型内部使用softmax函数。

答案 4 :(得分:0)

Softmax函数是神经网络内深度学习中使用的最重要的输出函数之一(请参阅Uniqtech在几分钟内了解Softmax)。 Softmax函数适用于有三类或更多类结果的情况。 softmax公式将e提升到每个值得分的指数得分,并用e提升指数得分值的总和来表示。例如,如果我知道这四个类别的Logit分数为:[3.00、2.0、1.00、0.10],则为了获得概率输出,可以按如下方式应用softmax函数:

  1. 将numpy导入为np

  2. def softmax(x):

  3. z = np.exp(x-np.max(x))
  4. 返回z / z.sum()
  5. 得分= [3.00,2.0,1.00,0.10]
  6. print(softmax(scores))

  7. 输出:概率(p)= 0.642 0.236 0.087 0.035

所有概率的总和(p)= 0.642 + 0.236 + 0.087 + 0.035 = 1.00。您可以尝试替换以上分数中已知的任何值,您将获得不同的值。所有值或概率的总和将等于1。这是有道理的,因为所有概率的总和等于1,从而将Logit分数转换为概率分数,以便我们可以更好地进行预测。最后,softmax输出可以帮助我们理解和解释多项式Lo​​git模型。如果您喜欢这些想法,请在下面留下您的评论。