为什么只在输出层使用 softmax 而在隐藏层不使用?

Why use softmax only in the output layer and not in hidden layers?

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

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

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

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

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

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

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

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

Softmax 层可用于神经网络,例如 Neural Turing Machines (NTM) and an improvement of those which are Differentiable Neural Computer (DNC)

总而言之,这些架构 RNNs/LSTMs 已被修改为包含可微分(神经)记忆矩阵,可以通过时间步长写入和访问。

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

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

希望对您有所帮助!

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

只要你想为多项式分布建模,就使用 softmax 激活函数。这可能(通常)是一个输出层 y,但也可以是一个中间层,比如一个多项式潜在变量 z。正如此线程中针对输出 {o_i} 所述,sum({o_i}) = 1 是线性相关性,这是这一层有意为之的。额外的层可以提供所需的稀疏性 and/or 下游特征独立性。

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

Any time we wish to represent a probability distribution over a discrete variable with n possible values, we may use the softmax function. This can be seen as a generalization of the sigmoid function which was used to represent a probability distribution over a binary variable. Softmax functions are most often used as the output of a classifier, to represent the probability distribution over n different classes. More rarely, softmax functions can be used inside the model itself, if we wish the model to choose between one of n different options for some internal variable.

Softmax 函数是神经网络深度学习中使用的最重要的输出函数之一(参见 Uniqtech 的 Understanding Softmax in minute)。 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. returnz/z.sum()
  5. 分数 = [3.00, 2.0, 1.00, 0.10]
  6. 打印(softmax(分数))

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

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