当前位置: 首页>編程日記>正文

深度学习中的激活函数及其作用

深度学习中的激活函数及其作用

0、从深度学习开始说起

今天检索多标签分本分类的文献时,遇到一个关于激活函数的疑惑:

如果有大牛看到,知道如何更好的理解这句话的含义,希望在评论里解惑!

由惑而生,所以我打算总结一下深度学习模型中常用的激活函数的一些特性,方便大家日后为模型选择合适的激活函数。
  说到激活函数,就不能不提神经网络或者深度学习,从一个新手入门深度学习领域,我觉得首先需要理解三个基本的构成要素:


我把理解激活函数作为深度学习入门的第一个构成要素,因为按照正常的逻辑,我们习惯从输入层--->隐藏层--->输出层的顺序来来理解模型,在****输入层--->隐藏层之间就需要用到了我们的激活函数,所以我把理解它放在最开始,本篇文章就主要就激活函数**展开。

1、激活函数用在哪?

假设我们当前要处理一个评论文本情感分类任务:判断一条评论句子的情感极性,即该评论是好评还是差评。这是一个典型的分类的问题,输入是文本,输出是情感类别。

                                                        某电商评论区

首先,要将句子向量化,可以使用word2vec词向量,也可以使用简单的一种方式是计算每句话的TFIDF特征值,TFIDF是使用词频除以文档频率来表示一个词的重要性权重,这种处理使得文字转变为向量,从而可以输入到模型中的输入层,而且向量中的值还携带着句子的信息。

神经元中的激活函数

输出层中的激活函数

其次,将得到的TFIDF向量输入到上面这样的单层网络中,网络将输出一个其为好评的概率值。其中x_n为TFIDF向量的各维上的值,w是随机初始化的权重,激活函数选用常用的sigmoid激活,输出层只有一个输出值y,输出0表示差评,1表示好评。这个和逻辑回归是一样的,这里就不再赘诉。

2、为什么需要激活函数

"神经网络中的激活函数的真正功能是什么?请阅读这篇概述文章并查看下最下面的速查表吧。本文作者是来自密歇根州立大学的 Sebastian Raschka,她是《Python Machine Learning》一书的作者。"

逻辑回归(一种泛化的线性模型)其决策面(decision surface)是线性的,从这个层面上来看它仍然是一种线性分类器:


线性分类

  如果数据类别可以线性划分,逻辑回归分类器对此可以工作的很好,但我们考虑一个棘手的例子:


线性分类

  数据类别非线性可分。对于此处这个例子,一个非线性的分类器可能会是更好的选择,例如在一个多层神经网络,我训练了一个简单的多层感知器,其有一个包含 200 个这种逻辑 S 型激活函数的隐藏层。让我们从下图看一下现在决策面看起来是怎样的:
非线性分类

网络的每一层在输出时,都需要进行一次非线性变换,被称为激活。如果不进行激活,则网络中各层均进行线性变换,这样无论网络包含多少层,最终的输出都可以用输入的线性变换表示出来,也就和1层的线性网络没有差别了。非线性的变换能够让网络存储的信息大大增加,而非线性变换的方式并不固定。下表列出了常用的非线性变换的函数形状(其中第三项是线性变换,是用作对比的)。

总结一下,激活函数在神经网络中的功能即通过对加权的输入进行非线性组合产生非线性决策边界(non-linear decision boundary)。

几种常见激活函数对比

除上面这些之外,还有几种高级的激活函数。
Relu激活函数

PRelu激活函数

ELU激活函数

MPELU激活函数

3、常用的激活函数

3.1Sigmoid函数

Sigmoid函数是神经网络中最常用的激活函数之一,其函数表达式为:

Sigmoid函数

函数曲线如下图所示:

Sigmoid函数的函数曲线

   
  Sigmoid函数是传统神经网络中最常用的激活函数,一度被视为神经网络的核心所在。
  从数学上来看,Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果。
  从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。

导数形式为:

Sigmoid求导

为什么求导形式很重要?
  如果你已经知道反向传播+梯度求导,就应该晓得,此时如果激活函数的求导方式足够的简单,能够极大的减少我们模型的运算量【反正我是这样理解的,有不准确之处欢迎指出】。

损失函数求导

Sigmoid的缺陷
通过Sigmoid的函数图像我们可以直观的看到,当输入值X>5或者X<-5的时候,函数的变化曲线已经非常平缓了,这就意味着此时的偏导(即切线的斜率)非常小接近0,这就导致误差反向传播无法通过导数传递到上一层,进而导致训练无法正常训练(导数为0无法更新参数)。为了避免梯度饱和效应的产生,Hinton等人与2010年又提出了ReLU函数,可以有效的避免梯度饱和产生(后面会有介绍)。
  
Sigmoid存在梯度饱和的风险

3.2Softmax函数

我们可以看到,Sigmoid函数实际上就是把数据映射到一个(−1,1)的空间上,也就是说,Sigmoid函数如果用来分类的话,只能进行二分类,而这里的softmax函数可以看做是Sigmoid函数的一般化,可以进行多分类。Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,待分类的类别数量大于2,且类别之间互斥。比如我们的网络要完成的功能是识别0-9这10个手写数字,若最后一层的输出为[0,1,0, 0, 0, 0, 0, 0, 0, 0],则表明我们网络的识别结果为数字1。

Softmax的公式为:


  可以直观看出如果某一个zj大过其他z,那这个映射的分量就逼近于1,其他就逼近于0,并且对所有输入数据进行归一化。

举个例子,通过若干层的计算,在输出层,最后得到的某个训练样本的向量的分数是[ 1, 5, 3 ], 那么概率分别就是

输出层输出值
输出层的softmax函数
3.3tanH函数

TanHyperbolic(tanh)函数又称作双曲正切函数,数学表达式为:

tanH函数

其函数曲线与Sigmoid函数相似,tanh函数与Sigmoid函数的函数曲线如下所示:  

 
比较
  

  在具体应用中,tanh函数相比于Sigmoid函数往往更具有优越性,这主要是因为Sigmoid函数在输入处于[-1,1]之间时,函数值变化敏感,一旦接近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值。而tanh的输出和输入能够保持非线性单调上升和下降关系,符合BP网络的梯度求解,容错性好,有界,渐进于0、1,符合人脑神经饱和的规律,但比sigmoid函数延迟了饱和期。

3.4ReLu函数和softplus函数

ReLu函数的全称为Rectified Linear Units,函数表达式为:
y=max(0,x),softplus函数的数学表达式为y=log(1+ex)
,它们的函数表达式如下:
  

ReLu与softplus函数对比
 
  可以看到,softplus可以看作是ReLu的平滑。根据神经科学家的相关研究,softplus和ReLu与脑神经元激活频率函数有神似的地方。也就是说,相比于早期的激活函数,softplus和ReLu更加接近脑神经元的激活模型,而神经网络正是基于脑神经科学发展而来,这两个激活函数的应用促成了神经网络研究的新浪潮。ReLU是目前深度学习模型中应用最火热的激活函数之一。

为什么引入Relu呢?

  • 采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多.
  • 对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成误差信息丢失从而无法完成深层网络的训练。
  • Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

4、如何选择为自己的模型选择合适的激活函数?

到底应该在自己构建的神经网络中使用哪种激活函数,并没有固定的答案。根据前人总结的经验:

  • 通常使用tanh激活函数要比sigmoid收敛速度更快;
  • 在较深层的神经网络中,选用relu激活函数能使梯度更好地传播回去,但当使用softmax作为最后一层的激活函数时,其前一层最好不要使用relu进行激活,而是使用tanh作为替代,否则最终的loss很可能变成Nan;
  • 当选用高级激活函数时,建议的尝试顺序为ReLU->ELU->PReLU->MPELU,因为前两者没有超参数,而后两者需要自己调节参数使其更适应构建的网络结构。

关于激活函数就写到这里了,以后有机会再来写入门深度学习中剩下的两个基本要素吧!




https://www.fengoutiyan.com/post/14202.html

相关文章:

  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機