神经网络激活函数及导数

ICML 2016 的文章[Noisy Activation Functions]中给出了激活函数的定义:激活函数是映射 h:R→R,且几乎处处可导。

神经网络中激活函数的主要作用是提供网络的非线性建模能力,如不特别说明,激活函数一般而言是非线性函数。假设一个示例神经网络中仅包含线性卷积和全连接运算,那么该网络仅能够表达线性映射,即便增加网络的深度也依旧还是线性映射,难以有效建模实际环境中非线性分布的数据。加入(非线性)激活函数之后,深度神经网络才具备了分层的非线性映射学习能力。

1、Sigmoid函数

Sigmoid 是使用范围最广的一类激活函数,具有指数函数形状 。正式定义为:

代码:

x=-10:0.001:10; 
%sigmoid和它的导数
sigmoid=1./(1+exp(-x));
sigmoidDer=exp(-x)./((1+exp(-x)).^2);
figure;
plot(x,sigmoid,‘r‘,x,sigmoidDer,‘b--‘);
axis([-10 10 -1 1]);
grid on;
title(‘Sigmoid函数(实线)及其导数(虚线)‘);
legend(‘Sigmoid原函数‘,‘Sigmid导数‘);
set(gcf,‘NumberTitle‘,‘off‘);
set(gcf,‘Name‘,‘Sigmoid函数(实线)及其导数(虚线)‘);

输出:

可见,sigmoid 在定义域内处处可导,且两侧导数逐渐趋近于0,即:

Bengio 教授等将具有这类性质的激活函数定义为软饱和激活函数。与极限的定义类似,饱和也分为左侧软饱和与右侧软饱和:

左侧软饱和:

右侧软饱和:

与软饱和相对的是硬饱和激活函数,即:f‘(x)=0,当 |x| > c,其中 c 为常数。

同理,硬饱和也分为左侧硬饱和和右侧硬饱和。常见的ReLU 就是一类左侧硬饱和激活函数。

Sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。具体来说,由于在后向传递过程中,sigmoid向下传导的梯度包含了一个f‘(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f‘(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象[Understanding the difficulty of training deep feedforward neural networks]。梯度消失问题至今仍然存在,但被新的优化方法有效缓解了,例如DBN中的分层预训练,Batch Normalization的逐层归一化,Xavier和MSRA权重初始化等代表性技术。

Sigmoid 的饱和性虽然会导致梯度消失,但也有其有利的一面。例如它在物理意义上最为接近生物神经元。(0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如Sigmoid交叉熵损失函数

2、tanh函数

代码:

x=-10:0.001:10;
tanh=(exp(x)-exp(-x))./(exp(x)+exp(-x));
tanhDer=1-tanh.^2;
figure;
plot(x,tanh,‘r‘,x,tanhDer,‘b--‘);
grid on;
title(‘tanh函数(实线)及其导数(虚线)‘);
legend(‘tanh原函数‘,‘tanh导数‘);
set(gcf,‘NumberTitle‘,‘off‘);
set(gcf,‘Name‘,‘tanh函数(实线)及其导数(虚线)‘);

输出:

tanh也具有软饱和性。[Backpropagation applied to handwritten zip code recognition]中提到tanh网络的收敛速度要比sigmoid快。因为tanh的输出均值比sigmoid更接近0,SGD会更接近 natural gradient[Natural gradient works efficiently in learning](一种二次优化技术),从而降低所需的迭代次数。

3、Softsign函数

代码:

x=-10:0.001:10;
softsign=x./(1+abs(x));
%分段函数的表示方法如下
%y=sqrt(x).*(x>=0&x<4)+2*(x>=4&x<6)+(5-x/2).*(x>=6&x<8)+1*(x>=8);
softsignDer=(1./(1+x).^2).*(x>=0)+(1./(1-x).^2).*(x<0);
plot(x,softsign,‘r‘,x,softsignDer,‘b--‘);
axis([-10 10 -1 1]);%加在第一个plot后面
grid on;
title(‘softsign函数 x/(1+|x|)(实线)及其导数(虚线)‘);
legend(‘softsign原函数‘,‘softsign导数‘);
set(gcf,‘NumberTitle‘,‘off‘);
set(gcf,‘Name‘,‘softsign函数 x/(1+|x|)(实线)及其导数(虚线)‘);

输出:

4、RELU

定义为:

代码:

x=-10:0.001:10;
relu=max(0,x);
%分段函数的表示方法如下
%y=sqrt(x).*(x>=0&x<4)+2*(x>=4&x<6)+(5-x/2).*(x>=6&x<8)+1*(x>=8);
reluDer=0.*(x<0)+1.*(x>=0);
figure;
plot(x,relu,‘r‘,x,reluDer,‘b--‘);
title(‘Relu函数max(0,x)(实线)及其导数0,1(虚线)‘);
legend(‘Relu原函数‘,‘Relu导数‘);
set(gcf,‘NumberTitle‘,‘off‘);
set(gcf,‘Name‘,‘Relu函数(实线)及其导数(虚线)‘);

输出:

可见,ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。

ReLU还经常被“诟病”的一个问题是输出具有偏移现象[7],即输出均值恒大于零。偏移现象和 神经元死亡会共同影响网络的收敛性。

还有其他一些激活函数,如下表:

http://mp.weixin.qq.com/s?__biz=MzI1NTE4NTUwOQ==&mid=2650325236&idx=1&sn=7bd8510d59ddc14e5d4036f2acaeaf8d&scene=23&srcid=0801gLlTVomApzBI0xVX9yS7#rd

http://blog.csdn.net/memray/article/details/51442059

时间: 2024-08-01 23:32:29

神经网络激活函数及导数的相关文章

[转]神经网络-激活函数

神经网络之激活函数(Activation Function) 本博客仅为作者记录笔记之用,不免有很多细节不对之处. 还望各位看官能够见谅,欢迎批评指正. 更多相关博客请猛戳:http://blog.csdn.net/cyh_24 如需转载,请附上本文链接:http://blog.csdn.net/cyh_24/article/details/50593400 日常 coding 中,我们会很自然的使用一些激活函数,比如:sigmoid.ReLU等等.不过好像忘了问自己一(n)件事: 为什么需要激

机器学习笔记:形象的解释神经网络激活函数的作用是什么?

此文转自知乎,哈工大NLPer 忆臻 原出处:https://zhuanlan.zhihu.com/p/25279356 查阅资料和学习,大家对神经网络中激活函数的作用主要集中下面这个观点: 激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题. 下面我分别从这个方面通过例子给出自己的理解~ @lee philip@颜沁睿俩位的回答已经非常好了,我举的例子也是来源于他们,在这里加入了自己的思考,更加详细的说了一下~ 开讲~ 首先我们有这个需求,就是二分类问题,如我要将下面的三角形和圆形点

神经网络激活函数

# Activation Functions #---------------------------------- # # This function introduces activation # functions in TensorFlow # Implementing Activation Functions import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from tensorflo

卷积神经网络(CNN)代码实现(MNIST)解析

在http://blog.csdn.net/fengbingchun/article/details/50814710中给出了CNN的简单实现,这里对每一步的实现作个说明: 共7层:依次为输入层.C1层.S2层.C3层.S4层.C5层.输出层,C代表卷积层(特征提取),S代表降采样层或池化层(Pooling),输出层为全连接层. 1.        各层权值.偏置(阈值)初始化: 各层权值.偏置个数计算如下: (1).输入层:预处理后的32*32图像数据,无权值和偏置: (2).C1层:卷积窗大

卷积神经网络(CNN)的简单实现(MNIST)

卷积神经网络(CNN)的基础介绍见http://blog.csdn.net/fengbingchun/article/details/50529500,这里主要以代码实现为主. CNN是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成. 以MNIST作为数据库,仿照LeNet-5和tiny-cnn( http://blog.csdn.net/fengbingchun/article/details/50573841 ) 设计一个简单的7层CNN结构如下: 输入层Inpu

CS231n 卷积神经网络与计算机视觉 6 数据预处理 权重初始化 规则化 损失函数 等常用方法总结

1 数据处理 首先注明我们要处理的数据是矩阵X,其shape为[N x D] (N =number of data, D =dimensionality). 1.1 Mean subtraction 去均值 去均值是一种常用的数据处理方式.它是将各个特征值减去其均值,几何上的展现是可以将数据的中心移到坐标原点,Python中的代码是 X -= np.mean(X, axis = 0). 对于图像处理来说,每个像素的值都需要被减去平均值 ( X -= np.mean(X)), 也可以分别处理RGB

卷积神经网络 模型分析

由于在看这类文章时专业名词较多,所以在正式开始前,我先介绍一些同义专业名词,各名词具体含义以及之间的关系在文中介绍. 卷积层 = C层 采样层 = 池化层(pooling层),S层 平面 = 特征图(feature map),通道,map 卷积核 = 权向量,滤波器 神经元 = 特征,结点,单元,像素点,patch 局部感受野的大小 = 滤波器的大小 1. 引入 在人工神经网络中,当网络层数增多时,网络中的权值以成倍的速度在增长.比如当输入为一个1000*1000图片时(假如网络总共有6层,每层

BP神经网络的数学原理及其算法实现

标签: 分类器神经网络 出处http://blog.csdn.net/zhongkejingwang/article/details/44514073 上一篇文章介绍了KNN分类器,当时说了其分类效果不是很出色但是比较稳定,本文后面将利用BP网络同样对Iris数据进行分类. 什么是BP网络 BP神经网络,BP即Back Propagation的缩写,也就是反向传播的意思,顾名思义,将什么反向传播?文中将会解答.不仅如此,关于隐层的含义文中也会给出个人的理解.最后会用Java实现的BP分类器作为其

《Noisy Activation Function》噪声激活函数(一)

本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51736830 Noisy Activation Functions是ICML 2016年新发表的一篇关于激活函数的论文,其中对以往的激活函数进行了深入的分析,并提出了训练过程中添加噪声的新方法,效果不错,觉得很有意义,目测会在今后的深度学习领域产生比较大的影响,因此将其原论文翻译,并略作注解(计划分两篇博客来写,本文涵盖从摘要到第三节的