Tensorflow2.0——激活函数

十万个为什么

为什么需要激活函数且为非线性函数?

神经网络结构的输出为所有输入的加权和,这导致整个神经网络是一个线性模型。而线性模型不能解决异或问题,且面对多分类问题,也显得束手无策。所以为了解决非线性的分类或回归问题,激活函数必须是非线性函数。
神经网络中激活函数的主要作用是提供网络的非线性建模能力。

为什么激活函数要连续可导(允许部分点不可导)?

这是因为反向传播算法就是从输出层到输入层求出导数,且本质上是使得误差函数最小,最小就是梯度等于0.所以激活函数必须要连续可导。

成为激活需要哪些条件?

1、 连续可导(允许少数点处不可导)非线性函数,激活函数连续可导就可以使用数值优化方法来寻优。
2、激活函数及其导函数要计算简单,有利于提高网络计算效率。
3、激活函数导函数的值域要在一个合理的区间内。如果过大或者过小,会影响网络训练速度和稳定性。

常用激活函数及对应特点

sigmoid函数 tf.sigmoid()


导数:f`(x) = f(x)*[1-f(x)]

目前神经网络几乎不使用此函数。
缺点:
1、Sigmoid容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中就能看出来。这将使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新,出现梯度消失的情况。
2、输出不是0均值的,导致输出信号均值不为0,对梯度产生影响。

优点:
1、函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。
2、求导容易。

后续又有相关sigmoid 衍生的激活函数,比如:softplus、softmax、softsign。

  • 方法说明

有两种方式可以调用sigmoid函数,tf.keras.activations.sigmoid(x)和tf.sigmoid(x)。参数x表示x轴上的点。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

x = tf.linspace(-5., 5.,1000)
y = tf.keras.activations.sigmoid(x)
tf.sigmoid(x)
plt.plot(x,y)
plt.show()

softmax函数 tf.keras.activations.softmax

softmax函数是sigmoid函数的进化,在处理分类问题是很方便,它可以将所有输出映射到成概率的形式,即值在[0,1]范围且总和为1。

其中xi是分类器类别的输出,分母是分类器所有的值进行处理。

tf.nn.softmax(tf.constant([[-3.,2.,-1.,0.]]))
y =  tf.keras.activations.softmax(tf.constant([[-3.,2.,-1.,0.]]))
y.numpy()
#array([[0.0056533 , 0.8390245 , 0.04177257, 0.11354961]], dtype=float32)

Tanh函数 tf.keras.activations.tanh

  • 导数

导数 f`(x) = 1 - f(x)2

  • sinhx函数 coshx函数

双曲正弦函数是双曲函数的一种。双曲正弦函数在数学语言上一般记作sinh。
定义: sinhx=(ex-e-x)/2

双曲余弦函数记作cosh.
定义:coshx=(ex+e-x)/2

  • 优缺点

相比于sigmoid函数,它的均值为0,梯度下降效果更好。但同样存在着致命缺陷就是容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了。

  • 方法说明
x = tf.linspace(-5., 5.,100)
y =  tf.keras.activations.tanh(x)
plt.plot(x,y)
plt.show()

ReLU函数 tf.keras.activations.relu

ReLU函数(又称修正线性单元或整流线性单元)是目前最受欢迎、也是使用最多的激活函数之一,且Relu已经变成激活函数的默认选择了,当你不知道隐藏层到底该用哪个激活函数时,就可以用relu。其数学表达式和函数图像:

优点:
1、大于0的时候,导函数值为1,在一定程度上可以缓解梯度消失问题,加快梯度下降的收敛速度。
2、相较于sigmoid和tanh函数,ReLU 对于 SGD(梯度下降优化算法) 的收敛有巨大的加速作用。
3、由于x小于0时,值为0,故提供了神经网络的稀疏表达能力。
4、计算更加简单,相比于 sigmoid和tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的(指数)运算。

缺点:
1、“死亡“ReLU问题:实际中,如果学习率设置得太高,可能会发现网络中 40% 的神经元都会死掉。如一个非常大的梯度经过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这种情况发生,那么从此所有流过这个神经元的梯度将都变成 0,即这个ReLU单元在训练中将不可逆转的死亡,导致了数据多样化的丢失。

后续又有相关ReLU衍生的激活函数,比如:ReLU6、SReLU、Leaky ReLU 、PReLU、RReLU、CReLU

  • 方法说明

tf.keras.activations.relu( x, alpha=0.0, max_value=None, threshold=0 )
参数说明:
1、alpha:上图中左半边部分图像的斜率,也就是x值为负数(准确说应该是小于threshold)部分的斜率,默认为0
2、max_value:最大值,当x大于max_value时,输出值为max_value
3、threshold:起始点,也就是上面图中拐点处x轴的值

x = tf.linspace(-5., 5.,100)
y =  tf.keras.activations.relu(x)
plt.plot(x,y)
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值