神经网络中的**函数
一、为什么需要**函数?
首先回忆一下单层感知器的结构。
在前面的文章中,我们提到了感知器,单层感知器的基本表达式如式(1)所示,假设该表达式中如果去除**函数f,则每一层输出的都是上一层输入的线性函数,无法解决非线性问题,因此我们需要通过**函数将非线性因素引入网络中。
还记得之前的异或问题吗?我们采用的是多层感知器去进行分类,其中使用的**函数是step**函数(即阶跃函数),因此基于这一点我们可以看出**函数有助于解决非线性问题。多层感知器确实能够解决异或问题等非线性问题,但是因为step函数是线性的**函数,它是通过线性组合的方式解决,因此我们可以采用一些非线性的**函数来更高效地解决非线性问题,因为非线性函数具有曲率,**函数若具有非线性特性,则将有利于复杂的应用。下面对**函数展开介绍。
二、**函数介绍
1、阶跃函数(step)
阶跃函数即之前提到的step函数,该函数应用于感知器,一般阶跃函数是以阈值为分界,当输入小于等于0,输出0,否则输出1,如图1所示。如果阈值不为0,比如设阈值h,当输入小于等于h,输出0,否则输出1,如图2所示。
阶跃函数属于线性**函数,不是很适合用于解决非线性问题,因此下面引入较为流行的非线性**函数。
2、流行的**函数
3、Step函数和Sigmoid函数的对比和联系
Sigmoid函数对应的是平滑的曲线,输出随着输入发生连续性变化,变化平缓,而阶跃函数是分段函数,在0或者阈值的临界点上,输出发生了急剧变化。在数值方面,阶跃函数只能返回0或1,而sigmoid函数返回0-1之间的连续值。如果将感知器的step函数替换为sigmoid等函数,则会从感知机步入神经网络中,这也是神经网络为什么能解决非线性问题的原因。
三、好的**函数的衡量标准
1、是否出现梯度消失
在权衡**函数的好坏与否,经常会提到一个问题,那就是梯度消失。接下来讲解一下梯度消失。
(1)什么是梯度消失
根据梯度下降一文中的讲解,梯度展示了权重的调整量,如果梯度消失,那就是权重更新量非常小,这样一来,在误差反向传播的过程中,越靠近输入层,更靠近输入层与隐藏层的权重更新就会停止,这样就不能顺利实现反向传播,相当于后几层隐含层自己在学习,影响学习效果。
(2)为什么会产生梯度消失
还是在前面梯度下降一文中,我们提到梯度的求解可视为求偏导,还提到在求偏导的过程中需要根据连续求导法则进行,也就是复合函数的链式求导,得到完整的偏导表达式(即梯度的表达式),假设记为L。链式求导的过程中一定会对**函数进行求导得到表达式,假设记为S,而且求导表达式S会包含在偏导表达式L中,在反向传播的过程中会逐层将偏导表达式L相乘,如果结果越来越小,当变为0时,就出现了梯度消失。
比如sigmoid,其导数图如下:
(图来源网络)
根据上面描述,在偏导的表达式中(即梯度表达式),会乘上f’(x),上图中我们也可以看出sigmoid函数导数的取值范围在0-0.25之间,随着层数的增加,不同层的导数值相乘次数越来越多,而且导数值都是小于1,因此会慢慢趋于零,导致梯度消失。
由于Tanh函数是sigmoid的变形,其导数值也是在0-1之间,如下图所示,因此也存在梯度消失的问题。
(图来源网络)
但是Relu不会存在梯度消失,为什么呢?通过下图,Relu的导数图,我们可以看出,正数部分的导数恒为1,因此随着层数增加,梯度表达式不会为0,因此不会出现梯度消失。
(图来源网络)
2、输出是否以0为中心
如果不是以0为中心,则会致神经网络收敛偏慢,这需要从更新过程中符号问题进行分析,较为冗长,此处暂不分析。
所谓的收敛速度是指在训练过程中,如果需要的很多迭代轮次才能找到最优解,则称收敛速度慢;反之,称收敛速度快。
四、基于Relu的改进**函数
Relu函数是目前神经网络中最为流行的**函数,很多学者对于其中的不足都进行了改进,如下图列举的两种,如果有兴趣可以深入研究。
以上仅个人理解,如有问题,欢迎交流讨论。