bp神经网络传递函数的激活函数和传递函数有什么区别?

【图文】常见的几种神经网络_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
常见的几种神经网络
大小:1.46MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢BP神经网络_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
BP神经网络
&&哈工大模式识别BP神经网络实验报告
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩15页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢6235人阅读
Deep Learning(43)
本博客仅为作者记录笔记之用,不免有很多细节不对之处。
还望各位看官能够见谅,欢迎批评指正。
更多相关博客请猛戳:
如需转载,请附上本文链接:
日常 coding 中,我们会很自然的使用一些激活函数,比如:sigmoid、ReLU等等。不过好像忘了问自己一(n)件事:
为什么需要激活函数?激活函数都有哪些?都长什么样?有哪些优缺点?怎么选用激活函数?
本文正是基于这些问题展开的,欢迎批评指正!
(此图并没有什么卵用,纯属为了装x …)
Why use activation functions?
激活函数通常有如下一些性质:
非线性:&当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。但是,如果激活函数是恒等激活函数的时候(即f(x)=x),就不满足这个性质了,而且如果MLP使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的。可微性:&当优化方法是基于梯度的时候,这个性质是必须的。单调性:&当激活函数是单调的时候,单层网络能够保证是凸函数。f(x)≈x:&当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要很用心的去设置初始值。输出值的范围:&当激活函数输出值是&有限&的时候,基于梯度的优化方法会更加&稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是&无限&的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate.
这些性质,也正是我们使用激活函数的原因!
Activation Functions.
Sigmoid 是常用的非线性的激活函数,它的数学形式如下:&
f(x)=11+e-x
正如前一节提到的,它能够把输入的连续实值“压缩”到0和1之间。&
特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.&
sigmoid 函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它的一些&缺点:
Sigmoids saturate and kill gradients.&(saturate 这个词怎么翻译?饱和?)sigmoid 有一个非常致命的缺点,当输入非常大或者非常小的时候(saturation),这些神经元的梯度是接近于0的,从图中可以看出梯度的趋势。所以,你需要尤其注意参数的初始值来尽量避免saturation的情况。如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradient kill掉,这会导致网络变的很难学习。Sigmoid 的 output 不是0均值.&这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。&
产生的一个结果就是:如果数据进入神经元的时候是正的(e.g.&x&0&elementwise
in&f=wTx+b),那么&w&计算出的梯度也会始终都是正的。&
当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。
tanh 是上图中的右图,可以看出,tanh 跟sigmoid还是很像的,实际上,tanh 是sigmoid的变形:&
tanh(x)=2sigmoid(2x)-1
与 sigmoid 不同的是,tanh 是0均值的。因此,实际应用中,tanh 会比 sigmoid 更好(毕竟去粗取精了嘛)。
近年来,ReLU 变的越来越受欢迎。它的数学表达式如下:&
f(x)=max(0,x)
很显然,从图左可以看出,输入信号&0时,输出都是0,&0&的情况下,输出等于输入。w&是二维的情况下,使用ReLU之后的效果如下:
ReLU 的优点:
&发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(看右图)。有人说这是因为它是linear,而且 non-saturating相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
ReLU 的缺点:&当然 ReLU 也有缺点,就是训练的时候很”脆弱”,很容易就”die”了. 什么意思呢?
举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。
如果这个情况发生了,那么这个神经元的梯度就永远都会是0.
实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。&
当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
Leaky-ReLU、P-ReLU、R-ReLU
Leaky ReLUs:&就是用来解决这个&“dying ReLU”&的问题的。与 ReLU 不同的是:&
f(x)=αx,(x&0)
f(x)=x,(x&=0)
这里的&α&是一个很小的常数。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。
关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有些实验则证明并不是这样。
Parametric ReLU:&对于 Leaky ReLU 中的α,通常都是通过先验知识人工赋值的。&
然而可以观察到,损失函数对α的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢?&
Kaiming He的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。
公式非常简单,反向传播至未激活前的神经元的公式就不写了,很容易就能得到。对α的导数如下:
δyiδα=0,(ifyi&0),else=yi
原文说使用了Parametric ReLU后,最终效果比不用提高了1.03%.
Randomized ReLU:&
Randomized Leaky ReLU 是 leaky ReLU 的random 版本 (α&是random的).&
它首次试在 kaggle 的NDSB 比赛中被提出的。
核心思想就是,在训练过程中,α&是从一个高斯分布&U(l,u)&中
随机出来的,然后再测试过程中进行修正(有点像dropout的用法)。
数学表示如下:
在测试阶段,把训练过程中所有的&αij&取个平均值。NDSB
冠军的&α&是从&U(3,8)&中随机出来的。那么,在测试阶段,激活函数就是就是:&
yij=xijl+u2
看看 cifar-100 中的实验结果:
Maxout出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。&
Maxout 公式如下:&
fi(x)=maxj∈[1,k]zij
假设&w&是2维,那么有:&
f(x)=max(wT1x+b1,wT2x+b2)
可以注意到,ReLU 和 Leaky ReLU 都是它的一个变形(比如,w1,b1=0&的时候,就是
Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。作者从数学的角度上也证明了这个结论,即只需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多.
所以,Maxout 具有 ReLU 的优点(如:计算简单,不会 saturation),同时又没有 ReLU 的一些缺点 (如:容易 go die)。不过呢,还是有一些缺点的嘛:就是把参数double了。
还有其他一些激活函数,请看下表:
How to choose a activation function?
怎么选择激活函数呢?
我觉得这种问题不可能有定论的吧,只能说是个人建议。
如果你使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让你的网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
友情提醒:最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1643009次
积分:12886
积分:12886
排名:第1021名
原创:28篇
转载:464篇
评论:168条
(1)(18)(13)(3)(2)(8)(21)(1)(2)(10)(4)(2)(11)(15)(4)(4)(15)(1)(12)(14)(1)(1)(1)(14)(22)(23)(19)(15)(23)(9)(46)(1)(2)(18)(35)(6)(10)(4)(8)(4)(12)(19)(19)(11)(3)(6)容易出现gradient vanishing
函数输出并不是zero-centered
幂运算相对来讲比较耗时
Gradient Vanishing
优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。 Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。
原因在于两点:
在上图中容易看出,当中较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0
Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,&,通过10层后为1/1048576。请注意这里是&至少&,导数达到最大值这种情况还是很少见的。
输出不是zero-centered
Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。
举例来讲,对,如果所有均为正数或负数,那么其对的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。
解决了sigmoid中的zero-centered的输出问题
有以下几大优点:
解决了gradient vanishing问题 (在正区间)
计算速度非常快,只需要判断输入是否大于0
收敛速度远快于sigmoid和tanh
第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生
ReLU也有几个需要特别注意的问题:
ReLU的输出不是zero-centered
Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
ReLU 的缺点:&当然 ReLU 也有缺点,就是训练的时候很&脆弱&,很容易就&die&了. 什么意思呢?
举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。
如果这个情况发生了,那么这个神经元的梯度就永远都会是0.
阅读(...) 评论()神经网络常用激活函数对比:sigmoid VS sofmax
神经网络常用激活函数对比:sigmoid VS sofmax
更多深度文章,请关注:/cloudSoftmax函数与Sigmoid函数之间的区别作者介绍:Saimadhu Polamuri:是一名自学成才的数据科学家,对数据科学有热爱和兴趣,他认为学习意味着生活,擅长使用python编程,业余时间在quora上回答问题。领英:/in/saimadhu/博客:/author/saimadhu/Softmax函数VS Sigmoid函数在学习逻辑回归概念时,主要的困惑在于计算概率的函数,由于在逻辑回归模型中会使用计算出的概率来预测目标类别,经常用到的两个函数是Softmax和Sigmoid函数。从函数水平(帮助预测目标类别)上来看,这两个函数是相同的,但存在许多明显的数学差异,应用在深度学习和其他领域中,发挥了至关重要的作用。所以在这篇文章中将进一步了解这两个函数及其应用之间的根本区别。在开始之前,介绍本文的目录:什么是S型函数?S形函数的性质Sigmoid函数的使用在Python中实现Sigmoid函数创建Sigmoid函数图像形什么是Softmax函数?Softmax函数的性质Softmax函数的使用在Python中实现Softmax函数创建Softmax函数图像形Sigmoid函数与Softmax函数之间的差异结论什么是S型函数?从数学定义上来看,Sigmoid函数取任何范围的实数,返回的输出值在0到1的范围内。S形函数产生“S”型曲线,这些曲线也用于统计,使用累积分布函数(输出范围为0到1)。S形函数的性质sigmoid函数返回一个实值输出。S形函数的一阶导数是非负的或非正的。非负数:如果数字大于或等于零。非正数:如果数字小于或等于零。Sigmoid函数的使用Sigmoid函数用于逻辑回归模型中的二进制分类。在创建人造神经元时,Sigmoid函数用作激活函数。在统计学中,S形函数图像是常见的累积分布函数。在Python中实现Sigmoid函数现在让我们在Python中实现sigmoid函数# Required Python Package以上是Sigmoid函数的实现代码。该函数将以列表形式的值作为输入参数。列表中的每个元素/值将被视为Sigmoid函数的输入,并计算输出值。代码1 / float(1 + np.exp(-x))是用于计算sigmoid分数的函数。接下来,我们将一个列表sigmiod_inputs作为函数的输入,列表值为2,3,5,6,经过sigmoid函数计算后获得Sigmoid分数。脚本输出Sigmoid Function Output :: [0.4, 0.3]创建Sigmoid函数图像现在使用上面的函数来创建图像,以方便了解Sigmoid函数的性质。传递一个包含0到21范围内的数字的列表。计算输入列表的sigmoid分数。然后使用输出值来显示图像。# Required Python Packages创建一个包含0到21范围内的数字的graph_x列表。之后在graph_y列表中,存储给定graph_x输入的计算sigmoid分数。调用line_graph函数,该函数采用图像的x,y和标题来创建线形图。脚本输出Graph X readings: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]图像成功运行上述代码后,屏幕上将显示以下图像。如果上述代码在你的系统中运行失败。检查机器学习包的设置。从上图可以看出,随着输入值的增加,sigmoid得分增加到1。图的顶部表示在0.9到0.99范围内的值。什么是Softmax函数?Softmax函数计算事件超过'n'个不同事件的概率分布。一般来说,这个函数将会计算每个目标类别在所有可能的目标类中的概率。计算出的概率将有助于确定给定输入的目标类别。使用Softmax的主要优点是输出概率的范围,范围为0到1,所有概率的和将等于1。如果将softmax函数用于多分类模型,它会返回每个类别的概率,并且目标类别的概率值会很大。指数公式计算给定输入值的指数和输入中所有值的指数值之和。那么输入值的指数与指数值之和的比值就是softmax函数的输出。Softmax函数的性质以下是softmax函数的几个性质。计算出的概率将在0到1的范围内。所有概率的和等于1。Softmax函数的使用用于多重分类逻辑回归模型。在构建神经网络中,在不同的层使用softmax函数。在Python中实现Softmax函数现在让我们在Python中实现softmax函数:# Required Python Package脚本输出Softmax Function Output :: [ 0....]我们观察到输入值6的函数输出是高概率,这是可以从softmax函数预先知道的。之后在分类任务中,可以使用高概率值来预测给定输入特征的目标类别。创建Softmax函数图像现在让我们使用实现的Softmax函数创建图像来了解这个函数的表现。创建一个包含0到21范围内的值的列表。之后将通过此列表来计算已实现函数的分数。使用列表和估计分数创建图像。# Required Python Packages该图显示了softmax函数的基本属性,值越大,其概率越高。Sigmoid函数与Softmax函数之间的差异以下是Sigmoid和Softmax函数之间的差异表格:结论在本文中,详细了解确定逻辑回归模型的两个函数。Softmax:用于多分类任务。Sigmoid:用于二进制分类任务。附件为原文的pdf本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百家号 最近更新:
简介: 提供最新的动态信息,分享最新鲜的事
作者最新文章}

我要回帖

更多关于 神经网络常用传递函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信