什么是激活函数?
激活函数是人工神经网络的一个极其重要的特征。它决定一个神经元是否应该被激活,激活代表神经元接收的信息与给定的信息有关。
可以不用激活函数吗?答案是否定的
如果激活函数增加了许多复杂性,我们可以不用激活函数吗?
当然不行!当我们不用激活函数时,权重和偏差只会进行线性变换。线性方程很简单,但解决复杂问题的能力有限。没有激活函数的神经网络实质上只是一个线性回归模型。激活函数对输入进行非线性变换,使其能够学习和执行更复杂的任务。我们希望我们的神经网络能够处理复杂任务,如语言翻译和图像分类等。线性变换永远无法执行这样的任务。
激活函数使反向传播成为可能,因为激活函数的误差梯度可以用来调整权重和偏差。如果没有可微的非线性函数,这就不可能实现。
深度神经网络中常用的激活函数如下:
1).Sogmoid函数 (Logistic 函数)
将实数映射到(0,1),可用来二分类
f(x)=1/(1+e^-x)
让我们来看一下Sigmoid函数的梯度
缺点: 激活函数计算量大 反向传播时,容易出现梯度消失的情况
它是平滑的,依赖于x值,这意味着在反向传播过程中,我们可以使用这个函数。误差可以被反向传播,权重也可以相应地更新。
即使在今天,sigmoid函数也被广泛使用,但我们仍然需要解决一些问题。正如之前所看到的,这个函数在[-3,3]之外是相当平坦的。这意味着一旦x值不在[-3,3]内,梯度就变得很小,接近于零,而网络就得不到真正的学习。
sigmoid函数的另一个问题是,y轴取值范围[0,1]。这个函数在原点周围不对称,得到的值都是正的。我们不希望下一个神经元得到的值在任何时候都是正值,不过可以通过缩放sigmoid函数来解决这个问题,而这需要在tanh函数中发生。
2) tanh函数
tanh函数与Sigmoid函数非常相似。它实际上只是Sigmoid函数的一个放大版本。
tanh(x)=2sigmoid(2x)-1
还可以直接表示为:
tanh(x)=2/(1+e^(-2x)) -1
Tanh函数与sigmoid函数相似,但原点对称。它的范围从- 1到1。
它基本上解决了所有值符号相同的问题,而其他属性都与sigmoid函数相同。函数具有连续性和可微性。你可以看到函数是非线性的,所以我们可以很容易地将误差进行反向传播。
tanh函数的梯度
与Sigmoid函数相比,tanh函数的梯度更陡。 使用sigmoid函数还是tanh函数取决于问题陈述中对梯度的要求。 但是tanh函数出现了Sigmoid函数类似的问题,梯度渐趋平坦,并且值非常低。
3)ReLU函数
ReLU是近几年非常受欢迎的激活函数。其定义为:f(x)=max(0,x)
ReLU是如今设计神经网络时使用最广泛的激活函数。首先,ReLU函数是非线性的,这意味着我们可以很容易地反向传播误差,并激活多个神经元。
ReLU函数优于其他激活函数的一大优点是它不会同时激活所有的神经元。这是什么意思?如果输入值是负的,ReLU函数会转换为0,而神经元不被激活。这意味着,在一段时间内,只有少量的神经元被激活,神经网络的这种稀疏性使其变得高效且易于计算。
ReLU函数的梯度
ReLU函数也存在着梯度为零的问题。看上图,x<0时,梯度是零,这意味着在反向传播过程中,权重没有得到更新。这就会产生死神经元,而这些神经元永远不会被激活。好在当我们遇到问题时,我们总能找到解决方案。(Leaky ReLU)
4) Leaky ReLU函数
Leaky ReLU函数只是一个ReLU函数的改良版本。我们看到,在ReLU函数中,x < 0时梯度为0,这使得该区域的神经元死亡。为了解决这个问题, Leaky ReLU出现了。这是它的定义:
f(x)= ax, x<0
= x, x>=0
我们所做的,只是用一个非水平线简单地替换了水平线。这里a是一个很小的值,如0.01。见下图。
替换水平线的主要优点是去除零梯度。在这种情况下,上图左边的梯度是非零的,所以该区域的神经元不会成为死神经元。梯度图如下
与Leaky ReLU函数类似的,还有PReLU函数,它的定义与Leaky ReLU相似。
f(x)= ax, x<0
= x, x>=0
在PReLU函数中,a也是可训练的函数。神经网络还会学习a的价值,以获得更快更好的收敛。 当Leaky ReLU函数仍然无法解决死神经元问题并且相关信息没有成功传递到下一层时,可以考虑使用PReLU函数
5)Softmax函数
softmax函数也是一种sigmoid函数,但它在处理分类问题时很方便。sigmoid函数只能处理两个类。当我们想要处理多个类时,该怎么办呢?只对单类进行“是”或“不是”的分类方式将不会有任何帮助。softmax函数将压缩每个类在0到1之间,并除以输出总和。它实际上可以表示某个类的输入概率
比如,我们输入[1.2,0.9,0.75],当应用softmax函数时,得到[0.42,0.31,0.27]。现在可以用这些值来表示每个类的概率。
softmax函数最好在分类器的输出层使用
如何选择正确的激活函数?
现在我们已经了解了这么多的激活函数,接下来就需要分析在哪种情况下应该使用哪种激活函数了。激活函数好或坏,不能凭感觉定论。然而,根据问题的性质,我们可以为神经网络更快更方便地收敛作出更好的选择。
用于分类器时,Sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。ReLU函数是一个通用的激活函数,目前在大多数情况下使用。如果神经网络中出现死神经元,那么PReLU函数就是最好的选择。请记住,ReLU函数只能在隐藏层中使用。
一点经验:你可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试其他激活函数
https://zhuanlan.zhihu.com/p/30510596