虽然隐藏层的激活函数的选择非常明确(主要是 sigmoid 或 tanh),但我想知道如何决定输出层的激活函数。常见的选择是线性函数、sigmoid 函数和 softmax 函数。但是,我什么时候应该使用哪一个?
输出层的激活函数是什么?
- 回归:线性(因为值是无界的)
- 分类:softmax(简单的 sigmoid 也可以,但 softmax 效果更好)
仅当您的输出允许多个“真实”答案时才使用简单的 sigmoid,例如,检查图像中是否存在各种对象的网络。换句话说,输出不是概率分布(不需要总和为1)。
我可能会迟到,但这里似乎有一些事情需要清理。
首先:激活函数在输出层通常取决于您的成本函数。这样做是为了生成导数成本函数关于输入在最后一层易于计算。
例如,我们可以使用均方误差损失。在回归设置中。通过设置(线性激活函数),我们找到导数
这就是为什么线性激活通常用于回归和逻辑/softmax 激活用于二元/多类分类的原因。但是,没有什么能阻止您尝试不同的组合。虽然表达式为可能不会那么好,这并不意味着您的激活函数会执行得更差。
其次,我想补充一点,有很多激活函数可用于隐藏层。Sigmoids(如逻辑函数和双曲正切)已被证明确实可以很好地工作,但正如Jatin所指出的,当您的网络变得太深时,它们会遭受梯度消失的困扰。在那种情况下,ReLU 变得流行起来。不过我想强调的是,有更多可用的激活函数,不同的研究人员一直在寻找具有不同/更好的性能
总结:在寻找最好的激活函数时,要有创意。尝试不同的东西,看看哪些组合可以带来最佳性能。
附录:对于更多对损失函数和激活,您可能想要寻找(规范)链接函数
Sigmoid 和 tanh 不应该用作隐藏层的激活函数。这是因为梯度消失问题,即,如果您的输入位于较高的一侧(sigmoid 变平),那么梯度将接近于零。这将导致在反向传播期间学习非常缓慢或没有学习,因为权重将使用非常小的值进行更新。
详细解释在这里:http ://cs231n.github.io/neural-networks-1/#actfun
因此,隐藏层的最佳函数是 ReLu。
Softmax输出产生一个非负向量,总和为 1。当您有互斥类别时它很有用(“这些图像只包含猫或狗,而不是两者”)。如果你有,你可以使用 softmax 互斥标签。
使用 sigmoid输出产生一个向量,其中每个元素都是一个概率。当您拥有不互斥的类别(“这些图像可以包含猫、狗或同时包含猫和狗,或者既不包含猫也不包含狗”)时,它会很有用。您使用与类别一样多的 sigmoid 神经元,并且您的标签不应相互排斥。
一个可爱的技巧是,如果您遇到互斥二进制问题,您也可以使用单个sigmoid 单元;因为可以使用单个 sigmoid 单元来估计, Kolmogorov 公理意味着当是二进制的,我们有.
当您的输出无界时,使用恒等函数作为输出会很有帮助。例如,某些公司一个季度的损益可能在任何一方都是无限的。
当输出在上方(或下方,如果您反转符号)有界时,ReLU单元或类似变体可能会有所帮助。如果输出仅限于非负,则使用 ReLU 激活作为输出函数是有意义的。
同样,如果输出以某种方式被限制在, tanh可能有意义。
神经网络的好处是它们是非常灵活的工具,输出激活的灵活性是这种灵活性的一个方面。