神经网络:激活函数

激活函数

Sigmoid

sigmoid将输入实数值“挤压”到0到1范围内。更具体地说,很大的负数变成0,很大的正数变成1。它对于神经元的激活频率有良好的解释:从完全不激活到在求和后的最大频率处的完全饱和(saturated)的激活。然而现在sigmoid函数实际很少使用了,这是因为它有两个主要缺点:

Sigmoid函数饱和使梯度消失。sigmoid神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。在反向传播的时候,这个(局部)梯度将会与整个损失函数关于该门单元输出的梯度相乘。因此,如果局部梯度非常小,那么相乘的结果也会接近零,这会有效地“杀死”梯度,几乎就有没有信号通过神经元传到权重再到数据了。还有,为了防止饱和,必须对于权重矩阵初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习了。

Sigmoid函数的输出不是零中心的。在神经网络后面层中的神经元得到的数据将不是零中心的。这一情况将影响梯度下降的运作,因为如果输入神经元的数据总是正数(比如在f=w^Tx+b中每个元素都x>0),那么关于w的梯度在反向传播的过程中,将会要么全部是正数,要么全部是负数(具体依整个表达式f而定)。这将会导致梯度下降权重更新时出现z字型的下降。然而,可以看到整个批量的数据的梯度被加起来后,对于权重的最终更新将会有不同的正负,这样就从一定程度上减轻了这个问题。因此,该问题相对于上面的神经元饱和问题来说只是个小麻烦,没有那么严重。

Tanh

将实数值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和问题,但是和sigmoid神经元不同的是,它的输出是零中心的。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。tanh神经元是一个简单放大的sigmoid神经元,具体说来就是:tanh(x)=2\sigma(2x)-1

ReLU

函数公式是f(x)=max(0,x)。,这个激活函数就是一个关于0的阈值(如上图左侧)。使用ReLU有以下一些优缺点:

优点:

  • 相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用(6倍之多)。据称这是由它的线性,非饱和的公式导致的。
  • sigmoid和tanh神经元含有指数运算等耗费计算资源的操作,而ReLU可以简单地通过对一个矩阵进行阈值计算得到。

缺点:

  • 在训练的时候,ReLU单元比较脆弱并且可能“死掉”。举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。例如,如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过合理设置学习率,这种情况的发生概率会降低。

神经网络结构

命名规则

当我们说N层神经网络的时候,我们没有把输入层算入。因此,单层的神经网络就是没有隐层的(输入直接映射到输出)。

输出层

和神经网络中其他层不同,输出层的神经元一般是不会有激活函数的(或者也可以认为它们有一个线性相等的激活函数)。这是因为最后的输出层大多用于表示分类评分值,因此是任意值的实数,或者某种实数值的目标数(比如在回归中)。

表达能力

拥有至少一个隐层的神经网络是一个通用的近似器。给出任意连续函数f(x)和任意\epsilon >0,均存在一个至少含1个隐层的神经网络g(x)(并且网络中有合理选择的非线性激活函数,比如sigmoid),对于\forall x,使得|f(x)-g(x)|<\epsilon。换句话说,神经网络可以近似任何连续函数。

既然一个隐层就能近似任何函数,那为什么还要构建更多层来将网络做得更深?

答案是:虽然一个2层网络在数学理论上能完美地近似所有连续函数,但在实际操作中效果相对较差。神经网络在实践中非常好用,是因为它们表达出的函数不仅平滑,而且对于数据的统计特性有很好的拟合。同时,网络通过最优化算法(例如梯度下降)能比较容易地学习到这个函数。类似的,虽然在理论上深层网络(使用了多个隐层)和单层网络的表达能力是一样的,但是就实践经验而言,深度网络效果比单层网络好。

层的尺寸

尽可能使用大网络,然后用正则化技巧来控制过拟合。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×