激活函数(activation funcation)
激活函数运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经网络。
神经网络之所以能够解决非线性问题(如语音、图像识别)本质是是激活函数加入了非线性因素,弥补了线性模型的表达能力,把“激活的神经元的特征”通过函数保留并映射到下一层。
因为神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入和输出也是可微的。那么激活函数在Tensorflow中是如何表达的?
NO.1 sigmoid函数
传统神经网络最常用的激活函数之一(另一个是tanh)。
函数公式
图像
优点
输出映射在(0,1)内,单调连续,非常适合作输出层,求导容易。
缺点
因为软饱和性,一旦落入饱和区,f·(x)就会变得接近于0,很容易产生梯度消失。
软饱和性(软饱和是指激活函数h(x)在取值趋于无穷大时,它的一阶导数趋于0。
硬饱和是指当|x|>c时,其中c为常数,f·(x)=0。
relu是一类左侧硬饱和和激活函数。
梯度消失:指在更新模型参数时采用链式求导法则反向求导,越往前梯度越小,最
终结果是到达一定深度后梯度对模型的更新就没有任何贡献了。
#使用示例
a = tf.constant([[1.0,2.0],[1.0,2.0],[1.0,2.0]])
sess = tf.Session()
print(sess.run(tf.sigmoid(a)))
NO.2tanh函数
tanh函数也具有软饱和性,因为他的输出以0为中心,收敛速度比sigmoid要快,
但是仍然无法解决梯度消失的问题。
NO.3relu函数
函数
f(x)=max(x,0)
f(x)=log(1+exp(x))
NO.4 dropout函数
dropout函数
一个神经元将以概率keep_prob决定是否被抑制,如果被抑制,该神经元的输出
就为0;如果不被抑制,那么该神经元的输出值将被放大到原来的1/keep_drop倍。
在默认情况下,每个神经元是否被抑制是相互独立的。但是否被抑制也可以通过
noise_shape来调节。当noise_shape[i]==shape(x)[i]时,x中的元素是相互独立的。
如果shape(x)=[k,l,m,n],x中的维度的顺序分别为批、行、列和通道,如果
noise_shape=[k,l,l,n],那么每个批和通道都是相互独立的,但是每行每列的数据
都是关联的,也就是说,要不都为0,要不都还是原来的值。
"""
#使用示例
a = tf.constant([[-1.0,2.0,3.0,4.0]])
withtf.Session()assess:
b = tf.nn.dropout(a,0.5,noise_shape=[1,4])
print(sess.run(b))
b = tf.nn.dropout(a,0.5,noise_shape=[1,1])
print(sess.run(b))
//
激活函数的选择
//
激活函数的选择,当输入特征相差明显时,用tanh的效果会很好,
且在循环过程中会不断扩大特征效果并显示出来。当特征相差不明显时,
sigmoid效果比较好,同时,用sigmoid和tanh作为激活函数时,需要
对输入进行规范化,否则激活后的值全部进入平坦区,隐层的输出会全
部趋同,丧失原有的特征表达。而relu会好很多,有时候不需要输入规
范化来避免上述情况。
因此,现在大部分的卷积神经网络都采用relu作为激活函数。
在自然语言处理上,大概有85%-90%的神经网络会采用relu,10%-15%
的神经网络会采用tanh。
好看请点这里~
领取专属 10元无门槛券
私享最新 技术干货