【问题标题】:Why use softmax only in the output layer and not in hidden layers?为什么只在输出层使用softmax而不在隐藏层使用?
【发布时间】:2016-10-02 00:00:31
【问题描述】:

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

  • 不使用 softmax 函数作为隐藏层激活函数的理论依据是什么?
  • 有没有关于这方面的出版物,有什么可以引用的?

【问题讨论】:

  • 为什么还要考虑在隐藏层中使用 softmax 激活?你有这样做的动力吗?
  • 只是一致性 - 这样我会在整个网络中使用相同的激活。
  • 另一个动机是我们可以将每一层解释为多项逻辑回归,以及它包含的所有良好的统计属性(例如,存在权重的解释)。

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


【解决方案1】:

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

【讨论】:

  • 你间接回答了我的问题:想象一个隐藏层有 2000 个单位。输出总和为 1,softmax 为每个输出引导两个极小的数字。我仍然想知道一些关于此的出版物。
  • 在输出层和隐藏层使用softmax仍然可以保证输出向量之和等于1。问题是为什么only在输出层。
【解决方案2】:

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

1.变量独立性:大量的正则化和努力是为了让你的变量保持独立、不相关和相当稀疏。如果您使用 softmax 层作为隐藏层 - 那么您将保持所有节点(隐藏变量)线性相关,这可能会导致许多问题和较差的泛化性。

2。训练问题: 试着想象一下,为了让你的网络更好地工作,你必须让隐藏层的激活部分稍微低一点。然后 - 您会自动将其余部分设置为更高级别的平均激活,这实际上可能会增加错误并损害您的训练阶段。

3.数学问题:通过对模型的激活创建约束,您会在没有任何逻辑解释的情况下降低模型的表达能力。在我看来,努力使所有激活都相同是不值得的。

4.批量标准化做得更好:人们可能会考虑这样一个事实,即来自网络的恒定平均输出可能对训练有用。但另一方面,一种称为 Batch Normalization 的技术已经被证明效果更好,而据报道,在隐藏层中将 softmax 设置为激活函数可能会降低准确性和学习速度。 p>

【讨论】:

  • 谢谢!我认为这些要点是在出版物中搜索的好指南。论证的结构扎实且易于理解。
  • “这不是最好的主意”,直到有人尝试并发现了一些很棒的东西!
【解决方案3】:

实际上,Softmax 函数已经在神经网络的深处使用,在某些情况下,在处理可微记忆和注意力机制时!

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

总而言之,这些架构是RNNs/LSTMs,它们已被修改为包含一个可微分(神经)内存矩阵,可以通过时间步进行写入和访问。

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

此外,Softmax 用于注意力机制,例如机器翻译,例如this paper。在那里,Softmax 能够对注意力分布的位置进行归一化,以便“柔和地”保留要注意的最大位置:也就是说,也以柔和的方式对其他地方给予一点关注。然而,正如论文中所解释的,这可以被认为是一个处理注意力的小型神经网络,在大网络中。因此,Softmax 是否只用在神经网络的末端还是有争议的。

希望对你有帮助!

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

【讨论】:

    【解决方案4】:

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

    深度学习(Goodfellow、Bengio、Courville)的第 198 页

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

    【讨论】:

      【解决方案5】:

      Softmax 函数是神经网络中深度学习中使用的最重要的输出函数之一(请参阅 Uniqtech 的《Understanding Softmax in minute》)。 Softmax 函数适用于存在三类或更多类结果的情况。 softmax 公式将 e 提高到每个值 score 的指数分数,然后除以 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 的输出,可以帮助我们理解和解释 Multinomial Logit Model。如果您喜欢这些想法,请在下方留下您的 cmets。

      【讨论】:

      • 在神经网络深度学习中使用 softmax 输出函数(参见 Uniqtech 的《Understanding Softmax in minute》)。
      猜你喜欢
      • 2017-10-28
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 2019-05-29
      • 2016-07-07
      • 2013-03-28
      • 2021-01-13
      相关资源
      最近更新 更多