首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

激活函数有什么用?

看了前面几章,能感觉到机器学习也不是那么难理解,确实是这样,如果一门技术看懂都很难,想有大规模的应用就更难。

激活函数,我认为是Deeplearning中最难以捉摸和把控的地方,网上有好几种主流的解释,都有一些道理,但是觉得都不能完全解释心中疑惑。

先来看看激活函数的重要性吧,下面这张图来自网络,用CNN(卷积神经网络)来做图形的分类识别:

会看到每层卷积结束都会把输出值送到一个Relu激活函数中,这个激活函数就是大名鼎鼎的Relu函数,激活函数很多,还在不断的被发明出来。深度学习的过程看起来就像是做千层饼,不断的叠加函数处理的过程。

ReLu函数非常简单:f(x)=max(0,x) ,第一次看到这个函数的时候,我的第一反应是这也太简单了,怎么会有这么大的用途?实际应用效果好像确实比较好。

如果没有激活函数会怎么样?

1. 对于y=ax+b 这样的函数,当x的输入很大时,y的输出也是无限大小的,经过多层网络叠加后,值更加膨胀的没边了,这显然不符合我们的预期,很多情况下我们希望的输出是一个概率

2. 线性的表达能力太有限了,即使经过多层网络的叠加,y=ax+b无论叠加多少层最后仍然是线性的,增加网络的深度根本没有意义。线性回归连下面这个最简单的“异或”x1 XOR x2,都无法拟合:

所以需要对线性输出做非线变换

这个变换要满足什么条件?

非线性,这样增加网络的深度才有意义

可导的,不然怎么做梯度下降

易于计算的

输出空间最好是有限的,这条好像也不是必须的,Relu就没有遵循这条

基于这些限制,专家们发掘出了好多个激活函数,这就是一个先有实践再总结理论的过程。一个函数在实际应用中发现效果很好时,再反过来去推导它为什么会有道理

举例几个激活函数:

sigmoid函数

前面“逻辑回归”中有介绍,非线性,输出空间在【0,1】可以直接作为输出函数,但是存在一个问题:当x很大或者很小时,函数的梯度会变得很小,利用梯度下降去收敛误差变得非常缓慢。

比如下图中:

x=4时,f(x)=0.98,梯度为:f(x)*(1-f(x))=0.0196

x=1.5时,f(x)=0.82,梯度为:f(x)*(1-f(x))=0.1476

这个梯度做前向传播时参数更新会非常缓慢,这就是梯度消失现象

宁外一个问题是sigmoid函数的输出永远是正数,在继续往下一层传递后,利用反向传播梯度时会出现一个问题:w*x(x为sigmoid函数的输出)中,w的梯度总是正数x,这时候梯度更新会出现锯齿形波动

Tanh函数

跟sigmoid很像,但是解决了sigmoid输出永远是正数的问题,但是没有解决“梯度消失问题”

Relu函数

这个函数乍一看,好像也是线性的嘛,怎么能用来做激活函数呢?

但它确实是非线性的,如下图:

关于Relu函数的作用,网上一些文章上来就跟人脑的结构,单侧抑制(左脑和右脑每次只有一个在主要发生作用)..联系在一起来试图说明Relu就是“真理”,显然是牵强附会的。Relu在图片识别中表现确实很好,我认为跟CNN的处理机制有关,每个卷积核只抽取处理图像中的少部分特征,其余特征被忽略掉,而且像素的表示范围在一个正数区间(0,255)。

Relu的好处是不会有梯度消失问题,但是也有缺点:f(x)=max(0,x) 中,如果x

为了克服Relu的弊端,又衍生了一些变体。激活函数是大量试验的产物,同样的激活函数再某些场景下表现很好,但换个数据集合,效果可能会很差。这跟我们做软件工程很不一样,一套系统能解决什么问题,解决到什么程度,在编码之前就有很大的把握了,DeepLearning则不是这样。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180607G1GZ2F00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券