网站首页 > 文章精选 正文
1.为什么神经网络需要使用激活函数?
- 不使用激活函数,神经网络的每一层输出都是上层输入的线性函数,由于线性成分的叠加还是线性成分,无论神经网络有多少层,整个神经网络依然相当于线性回归,输出都是输入的线性组合,并不能拟合非线性假设。
- 使用激活函数,改变线性规则,能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到更多的非线性模型中。
- 解决反向传播过程中的梯度消失问题,在反向传播的公式中,求取参数的梯度时要反复乘上g'(x)的值。实践中发现,经常乘着乘着值很快趋于0了,导致参数更新幅度太小,收敛过于缓慢,这被称为梯度消失,梯度消失跟激活函数、网络结构等都有关。
2.常用的激活函数
2.1ReLU激活
ReLU是修正线性单元(Rectified Linear Unit)的缩写,指线性整流函数。它的计算公式和曲线如下,
ReLu作为激活函数的优势是它在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征。
该函数在正区间导数恒为1,不会导致梯度消失,它的计算非常便捷。在实际应用上,他的表现相当好,神经网络收敛比Sigmoid和tanh快得多,是目前应用最广泛的激活函数。
优点:目前最受欢迎的激活函数,在x<0时,硬饱和,在x>0时,导数为1,所以在x>0时保持梯度不衰减,从而可以缓解梯度消失的问题,能更快收敛,并提供神经网络的稀疏表达能力。
缺点:随着训练的进行,在负区间上导数恒为0,不会继续传递梯度,导致无法更新权重,称为‘神经元死亡’。少量节点死亡问题不大,但是大量节点死亡,就会出现拟合效果很差且不能改进的局面(loss一直很大)。应对的方法一般有:
- 减小学习率,学习率太大,容易让参数更新太猛,导致一些神经元死亡;
- 改用Leaky ReLU函数,即 max(αx,x),其中α 是一个很小的正数。
2.2Leak ReLU激活
ReLU激活激活的变种,负值信号 传递一点出来,一般用在生成网络(GAN)中。其他的ReLU激活变种还有,基本都是对负值信号做一些处理,这里就不展开介绍了。
2.3Sigmoid激活
sigmoid, 名为S型函数. 它是一类函数,但通常指代standard logistic distribution分布。在Sigmoid函数中,a的值在[0,1]之间,我们可以将其理解为一个阀,就像是人的神经元一样,当我们一个神经元受到的刺激时,我们并不是立刻感觉到,而是当这个刺激值超过了阀值,才会让神经元向上级神经元发出信号。
函数公式和曲线图如下,
求导,
函数曲线图:
优点:在于输出映射在(0,1)范围内,单调连续,适合用作输出层,求导容易;
缺点:一旦输入落入饱和区,一阶导数接近0,就可能产生梯度消失的情况,计算时涉及到指数函数,比较费时。
对于Logistic回归而言,Sigmoid函数用于预测输入属于某一类别的概率,只能用它。但是在神经网络中,使用Sigmoid函数仅仅是作为非线性成分,而且往往它的表现并不好,我们可以考虑使用其他的非线性函数。
2.4 tanh 激活
双曲正切函数tanh的公式如下,
函数图像如下
它实际上是Sigmoid的变形,因为
它避免了Sigmoid输出恒正的缺点,并且扩大了导数值。但它也容易导致梯度消失,且计算较慢。
2.5softplus函数
该函数对relu做了平滑处理,更接近脑神经元的激活模型。
2.6 softmax函数
除了用于二分类还可以用于多分类,将各个神经元的输出映射到(0,1空间)。在目标检测模型的最后一层一般会用到softmax来激活。
2.7 dropout函数
tf.nn.dropout(x,keep_prob,noise_shape=None,seed=None,name=None)
一个神经元以概率keep_prob决定是否被抑制,如果被抑制,神经元的输出为0,如果不被抑制,该神经元将被放大到原来的1/keep_prob倍,默认情况下,每个神经元是否被抑制是相互独立的。
3.Tensorflow中的激活函数API
TensorFlow提供了多种激活函数,
import tensorflow as tf
tf.sigmoid()
tf.tanh()
tf.nn.relu()
tf.nn.softplus()
tf.nn.softmax()
tf.nn.dropout()
tf.nn.elu()
在CNN中一般使用tf.nn.relu的原因是因为,尽管relu会导致一些信息的损失,但是性能突出。在刚开始设计模型时,都可以采用relu的激活函数。高级用户也可以自己创建自己的激活函数,评价激活函数是否有用的主要因素参看如下几点:
- 1)该函数是单调的,随着输入的增加增加减小减小,从而利用梯度下降法找到局部极值点成为可能;
- 2)该函数是可微分的,以保证函数定义域内的任意一点上导数都存在,从而使得梯度下降法能够正常使用来自这类激活函数的输出。
总结:
激活函数用于对某些运算的结果进行平滑或者微分,其目标是为神经网络引入非线性,曲线能够刻画出输入的复杂的变化,更符合现实真实的情况。在实际项目中一般这样来选择激活函数,当输入数据特征相差明显时,用tanh效果很好,当特征相差不明显时用sigmoid效果比较好,sigmoid和tanh作为激活函数需要对输入进行规范化,否则激活后的值进入平坦区,而relu不会出现这种情况,有时也不需要输入规范化,因此85%-90%的神经网络会使用relu函数。
- 上一篇: 用Keras实现使用自归一化神经网络来解决梯度消失的问题
- 下一篇: 常见激活函数的使用介绍
猜你喜欢
- 2025-01-09 图注意力网络论文详解和PyTorch实现
- 2025-01-09 使用scikit-learn为PyTorch 模型进行超参数网格搜索
- 2025-01-09 神经网络调试:梯度可视化
- 2025-01-09 涨姿势!「手动」调试神经网络,可以这样做
- 2025-01-09 图深度学习,入门教程七,残差多层图注意力模型
- 2025-01-09 深度学习的秘密武器:用 PyTorch 的 torch.nn.ReLU 打造高效模型
- 2025-01-09 #轻松学习深度学习(AI) 4 神经元的一般化
- 2025-01-09 基于深度学习的运动想象脑机接口研究综述
- 2025-01-09 使用多尺度patch合成来做高分辨率的图像复原
- 2025-01-09 神经网络训练tricks
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 稳压管的稳压区是工作在什么区 (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)