激活函数在神经网络中具有重要的地位。在SIGAI之前的公众号文章“理解神经网络的激活函数”中,我们回答了3个关键的问题:
为什么需要激活函数?
什么样的函数能用作激活函数?
什么样的函数是好的激活函数?
这篇文章从理论的角度介绍了激活函数的作用。承接上篇,在今天这篇文章中,SIGAI将为大家介绍当前深度学习中常用的一些激活函数,包括它们的工程实现。我们将以Caffe为例。
激活函数实现的是一对一的变换,即用相同的函数对输入向量的每个分量进行映射,得到输出向量,输入和输出向量的维数相同:
其中x和y都是n维向量。写成分量的形式为:
在工程实现时,如果将激活函数作为一个单独的层,则在正向传播时对输入向量的每个分量计算激活函数值f(x)。在反向传播时对输入数据计算导数值f’(x),然后乘以后一层送入的误差项,得到本层的误差项,送人前一层中:
如果你对反向传播算法的原理还不清楚,请阅读SIGAI之前的公众号文章“反向传播算法推导-全连接神经网络”。这里的乘法是向量逐元素对应相乘。由于激活函数没有需要学习训练得到的参数,因此无需根据误差项计算本层参数的导数值。
在神经网络的早期阶段,sigmoid函数,tanh被广为使用。在AlexNet出现之后,ReLU函数逐渐取代了这两个函数,得到了广泛使用,因为ReLU函数更不容易产生梯度消失问题。如果你对梯度消失问题,激活函数的饱和性还不清楚,请阅读我们之前的公众号文章“理解神经网络的激活函数”。
由于当前被提出的激活函数众多,为了便于大家理解与记忆,我们对此做了总结。各种常用的激活函数与它们的导数如下表所示:
根据这些函数的定义,我们很容易计算出它们的导数。
下面我们以Caffe为例,介绍这些激活函数的具体实现细节。在Caffe中,激活函数是一个单独的层,把它和全连接层,卷据层拆开的好处是更为灵活,便于代码复用和组合。因为无论是全连接层,还是卷据层,它们激活函数的实现是相同的,因此可以用一套代码来完成。
激活函数由神经元层完成,它们的基类是NeuronLayer,所有的激活函数层均从它派生得到,下面分别进行介绍,限于篇幅,我们只介绍一部分,其他的原理类似。此外,Dropout机制也由神经元层实现。
SigmoidLayer类实现了标准sigmoid激活函数。正向传播函数对每个输入数据计算sigmoid函数值,在这里count是输入数据的维数。实现代码如下:
TanHLayer类实现了tanh激活函数。正向传播函数实现代码如下:
类ReLULayer实现ReLU激活函数,和前面介绍的标准ReLU不同,这里做了改进,定义为:
其中a是人工设定的大于0的参数。显然该函数的导数为:
下面来看正向传播函数的代码:
反向传播函数的实现如下:
这样可以通过函数值得到导数值,减少计算量。正向传播函数的实现如下:
类PReLULayer实现了PReLU激活函数。正向传播函数的实现如下:
反向传播函数的实现如下:
类DropoutLayer实现Dropout机制。在训练阶段,随机丢掉一部分神经元,用剩下的节点进行前向和后向传播。这里实现时通过二项分布随机数来控制神经元是否启用,如果随机数取值为1则启用,否则不启用。正向传播函数的实现如下:
推荐阅读
[1]?机器学习-波澜壮阔40年?SIGAI 2018.4.13.
[2]?学好机器学习需要哪些数学知识?SIGAI 2018.4.17.
[3]?人脸识别算法演化史?SIGAI 2018.4.20.
[4]?基于深度学习的目标检测算法综述?SIGAI 2018.4.24.
[5]?卷积神经网络为什么能够称霸计算机视觉领域??SIGAI 2018.4.26.
[6]?用一张图理解SVM的脉络?SIGAI2018.4.28.
[7]?人脸检测算法综述?SIGAI 2018.5.3.
[8]?理解神经网络的激活函数?SIGAI 2018.5.5.
[9]?深度卷积神经网络演化历史及结构改进脉络-40页长文全面解读?SIGAI2018.5.8.
[10]?理解梯度下降法?SIGAI 2018.5.11.
[11]?循环神经网络综述—语音识别与自然语言处理的利器?SIGAI2018.5.15
[12]?理解凸优化?SIGAI 2018.5.18
[13]?【实验】理解SVM的核函数和参数?SIGAI2018.5.22
[14]?【SIGAI综述】行人检测算法?SIGAI2018.5.25
[15]?机器学习在自动驾驶中的应用—以百度阿波罗平台为例(上) SIGAI 2018.5.29
[16]?理解牛顿法?SIGAI 2018.5.31
[17]?【群话题精华】5月集锦—机器学习和深度学习中一些值得思考的问题?SIGAI 2018.6.1
[18]?大话Adaboost算法?SIGAI2018.6.2
[19]?FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法?SIGAI2018.6.4
[20]?理解主成分分析(PCA)?SIGAI 2018.6.6
[21]?人体骨骼关键点检测综述?SIGAI2018.6.8
[22]?理解决策树?SIGAI 2018.6.11
[23]?用一句话总结常用的机器学习算法?SIGAI 2018.6.13
[24]?目标检测算法之YOLO?SIGAI 2018.6.15
[25]?理解过拟合?SIGAI 2018.6.18
[26]?理解计算:从√2到AlphaGo ——第1季 从√2谈起?SIGAI 2018.6.20
[27]?场景文本检测——CTPN算法介绍?SIGAI2018.6.22
[28]?卷积神经网络的压缩和加速?SIGAI2018.6.25
[29]?k近邻算法?SIGAI 2018.6.27
[30]?自然场景文本检测识别技术综述?SIGAI 2018.6.27
[31]?理解计算:从√2到AlphaGo ——第2季 神经计算的历史背景?SIGAI2018.7.4
[32]?机器学习算法地图?SIGAI2018.7.6
[33]?反向传播算法推导-全连接神经网络SIGAI2018.7.9
[34]?生成式对抗网络模型综述SIGAI0709.
[35]?怎样成为一名优秀的算法工程师SIGAI0711.
[36]理解计算:从根号2到AlphaGo——第三季 神经网络的数学模型?SIGAI0716
[38]?基于深度负相关学习的人群计数方法?【获取码】SIGAI0718
[39]?流形学习概述【获取码】SIGAI0720
[40]?关于感受野的总结?【获取码】SIGAI0723
[41]?随机森林概述?【获取码】SIGAI0725
[42]基于内容的图像检索技术综述 传统经典方法?【获取码】SIGAI0727
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。