通常,一层中的神经元经过加权求和,然后再经过非线性方程得到的结果转化为输出,或者作为下一层的输入。激励函数,说白了就是非线性方程。
激励函数的作用:通过激活函数会将数据压缩到一定的范围区间内,得到的数据的大小将决定该神经元是否处于活跃状态,即:是否被激活。这使得神经网络可以更好地解决较为复杂的问题。
常见的激励函数:sigmoid函数、tanh函数、ReLu函数、SoftMax函数等等。
先来看下sigmoid函数表达式:
sigmoid函数图像:
优点:
1.输出结果在(0, 1)之间,输出范围有限,优化起来稳定可控;
2.单调连续,求导方便;
缺点:
1.根据图像也可容易看出:极易饱和。
当输入范围在(-∞, -4)或(4, +∞)时,就落入了饱和区,一阶导数接近0,这就使得容易产生梯度消失,进而导致训练出现问题。
2.输出是在(0, 1)之间,这是优点;但不是以0为中心,所以也是缺点。
tanh函数表达式及图像:
优点:
1.输出结果在(-1, 1)之间,输出范围有限,且以0为中心;
2.单调连续,收敛速度比sigmoid更快;
缺点:
1.根据图像也可容易看出:同sigmoid一样,极易饱和。
当输入范围在(-∞, -2)或(2, +∞)时,就落入了饱和区,一阶导数接近0,这就使得容易产生梯度消失,进而导致训练出现问题。
ReLu函数表达: f(x) = max(0, x)
ReLu函数图像:
优点:
1.收敛速度比sigmoid、tanh函数更快;
2.当x>0时,保持梯度不衰减,从而可以有效缓解梯度消失的问题。
缺点:
1.当x<0时,硬饱和,这会导致部分输入对应的权重无法更新,可能会出现“神经元死亡”。
softplus 函数对 relu函数 做了平滑处理,其表达式为: f(x) = log(1 + e^x)
我们先来看看这种激励函数出现的输出层是什么样子:
从样子上来看这种方式跟普通的全连接层没有什么区别,但是激励函数的形式却大大 不同 。
首先后面一层作为预测分类的输出节点,每一个节点就代表一个分类 ,那么这 7个节 点就最多能够表示 2 个分类的模型 。 任何一个节点的激励函数都是:
其中 i就是节点的下标次序,而:
也就是说这是一个线性分类模型的输出作为自然常数e的指数。 最有趣的是最后这一层有这样一个特性,那就是:
也就是说最后一层的每个节点的输出值加和是1。 这种激励函数从物理意义上可以解释为一 个样本通过网络进行分类的时候在每个节点上输出的值都是小于等于1的,是它从属于这个分类的概率。
在训练的时候方法大家可能也已经猜到了,就是拿到一个训练样本和给分 类标签一个下标序号,然后对应的节点给1,其他给0。
说明:SoftMax这种激励函数使用的损失函数看上去比较特殊,叫做交叉熵 (cross entropy) 损失函数。 什么叫交叉摘损失函数呢,如何理解这种函数呢? 等后面总结代价函数时专门介绍。
当一个神经元以概率 keep_prob 为标准决定是否被激活,如果被激活,那么该神经元的输出将被放大到原来的 1/keep_prob 倍;如果不被激活,则神经元的输出为0。
默认情况下,每个神经元是否被激活是相互独立的。dropout激活函数格式为:
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
激励函数在神经网络中起着非常重要的作用,理论上添加激励函数的神经网络可以收敛为任意一个函数,因激励函数各有特色,所以使用时,应根据具体情况具体分析。一般选用规则为:
-当输入的数据特征相差明显时,用tanh效果更好;
-当特征相差不明显时,用sigmoid函数比较好;
-sigmoid和tanh作为激励函数需要对输入进行规范化处理,否则激活后的值可能进入饱和区,而relu不会出现这种情况,有时relu甚至不需要要求输入规范化,因此目前85%~90%的神经网络会采用relu函数。
tf.sigmoid(features, name=None)
tf.tanh(features, name=None)
tf.nn.relu(features, name=None)
tf.nn.softplus(features, name=None)
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
对神经网络学习中的激励函数进行总结。激励函数,说白了就是非线性方程。
(1)对于深度神经网络,中间的隐层的输出必须有一个激活函数。否则多个隐层的作用和没有隐层相同。这个激活函数不一定是sigmoid,常见的有sigmoid、tanh、relu等。(2)对于二分类问题,输出层是sigmoid函数。这是因为sigmoid函数可以把实数域光滑的映射到[0,1]空间。函数值恰好可以解释为属于正类的概率(概率的取值范围是0~1)。另外,sigmoid函数单调递增,连续可导,导数形式非常简单,是一个比较合适的函数
(3)对于多分类问题,输出层就必须是softmax函数了。softmax函数是sigmoid函数的推广
“net=need”这条指令看起来是个两层隐藏层的网络试试改为net=newff(minmax(p),[10,10,1],{‘logsig’,’logsig’,’purelin’},’trainlm’)
注意其中的半角符号,手机打字,见谅。
推荐trainbr这个方法,模型的泛化能力较好。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)