今天检索多标签分本分类的文献时,遇到一个关于激活函数的疑惑:
由惑而生,所以我打算总结一下深度学习模型中常用的激活函数的一些特性,方便大家日后为模型选择合适的激活函数。
说到激活函数,就不能不提神经网络或者深度学习,从一个新手入门深度学习领域,我觉得首先需要理解三个基本的构成要素:
我把理解激活函数作为深度学习入门的第一个构成要素,因为按照正常的逻辑,我们习惯从输入层--->隐藏层--->输出层的顺序来来理解模型,在****输入层--->隐藏层之间就需要用到了我们的激活函数,所以我把理解它放在最开始,本篇文章就主要就激活函数**展开。
假设我们当前要处理一个评论文本情感分类任务:判断一条评论句子的情感极性,即该评论是好评还是差评。这是一个典型的分类的问题,输入是文本,输出是情感类别。
首先,要将句子向量化,可以使用word2vec词向量,也可以使用简单的一种方式是计算每句话的TFIDF特征值,TFIDF是使用词频除以文档频率来表示一个词的重要性权重,这种处理使得文字转变为向量,从而可以输入到模型中的输入层,而且向量中的值还携带着句子的信息。
其次,将得到的TFIDF向量输入到上面这样的单层网络中,网络将输出一个其为好评的概率值。其中x_n为TFIDF向量的各维上的值,w是随机初始化的权重,激活函数选用常用的sigmoid激活,输出层只有一个输出值y,输出0表示差评,1表示好评。这个和逻辑回归是一样的,这里就不再赘诉。
"神经网络中的激活函数的真正功能是什么?请阅读这篇概述文章并查看下最下面的速查表吧。本文作者是来自密歇根州立大学的 Sebastian Raschka,她是《Python Machine Learning》一书的作者。"
逻辑回归(一种泛化的线性模型)其决策面(decision surface)是线性的,从这个层面上来看它仍然是一种线性分类器:
如果数据类别可以线性划分,逻辑回归分类器对此可以工作的很好,但我们考虑一个棘手的例子:
网络的每一层在输出时,都需要进行一次非线性变换,被称为激活。如果不进行激活,则网络中各层均进行线性变换,这样无论网络包含多少层,最终的输出都可以用输入的线性变换表示出来,也就和1层的线性网络没有差别了。非线性的变换能够让网络存储的信息大大增加,而非线性变换的方式并不固定。下表列出了常用的非线性变换的函数形状(其中第三项是线性变换,是用作对比的)。
总结一下,激活函数在神经网络中的功能即通过对加权的输入进行非线性组合产生非线性决策边界(non-linear decision boundary)。
Sigmoid函数是神经网络中最常用的激活函数之一,其函数表达式为:
函数曲线如下图所示:
Sigmoid函数是传统神经网络中最常用的激活函数,一度被视为神经网络的核心所在。
从数学上来看,Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果。
从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。
其导数形式为:
为什么求导形式很重要?
如果你已经知道反向传播+梯度求导,就应该晓得,此时如果激活函数的求导方式足够的简单,能够极大的减少我们模型的运算量【反正我是这样理解的,有不准确之处欢迎指出】。
Sigmoid的缺陷
通过Sigmoid的函数图像我们可以直观的看到,当输入值X>5或者X<-5的时候,函数的变化曲线已经非常平缓了,这就意味着此时的偏导(即切线的斜率)非常小接近0,这就导致误差反向传播无法通过导数传递到上一层,进而导致训练无法正常训练(导数为0无法更新参数)。为了避免梯度饱和效应的产生,Hinton等人与2010年又提出了ReLU函数,可以有效的避免梯度饱和产生(后面会有介绍)。
我们可以看到,Sigmoid函数实际上就是把数据映射到一个(−1,1)的空间上,也就是说,Sigmoid函数如果用来分类的话,只能进行二分类,而这里的softmax函数可以看做是Sigmoid函数的一般化,可以进行多分类。Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,待分类的类别数量大于2,且类别之间互斥。比如我们的网络要完成的功能是识别0-9这10个手写数字,若最后一层的输出为[0,1,0, 0, 0, 0, 0, 0, 0, 0],则表明我们网络的识别结果为数字1。
Softmax的公式为:
举个例子,通过若干层的计算,在输出层,最后得到的某个训练样本的向量的分数是[ 1, 5, 3 ], 那么概率分别就是
TanHyperbolic(tanh)函数又称作双曲正切函数,数学表达式为:
其函数曲线与Sigmoid函数相似,tanh函数与Sigmoid函数的函数曲线如下所示:
在具体应用中,tanh函数相比于Sigmoid函数往往更具有优越性,这主要是因为Sigmoid函数在输入处于[-1,1]之间时,函数值变化敏感,一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值。而tanh的输出和输入能够保持非线性单调上升和下降关系,符合BP网络的梯度求解,容错性好,有界,渐进于0、1,符合人脑神经饱和的规律,但比sigmoid函数延迟了饱和期。
ReLu函数的全称为Rectified Linear Units,函数表达式为:
y=max(0,x),softplus函数的数学表达式为y=log(1+ex)
,它们的函数表达式如下:
为什么引入Relu呢?
到底应该在自己构建的神经网络中使用哪种激活函数,并没有固定的答案。根据前人总结的经验:
- 通常使用tanh激活函数要比sigmoid收敛速度更快;
关于激活函数就写到这里了,以后有机会再来写入门深度学习中剩下的两个基本要素吧!