【周末AI课堂】隐藏单元的设计原则(理论篇)| 机器学习你会遇到的“坑”
AI课堂开讲,就差你了!
很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“周末学习课堂”——每周就AI学习中的一个重点问题进行深度分析,课程会分为理论篇和代码篇,理论与实操,一个都不能少!
来,退出让你废寝忘食的游戏页面,取消只有胡吃海塞的周末聚会吧。未来你与同龄人的差异,也许就从每周末的这堂AI课开启了!
读芯术读者交流群,请加小编微信号:zhizhizhuji。等你。后台回复“周末AI课堂”,查阅相关源代码。
全文共2316字,预计学习时长6分钟
数学准备
• non-zero-center:非零对称的函数
获得更好的优化是深度学习的核心任务之一,具体来说,就是让学习变得更容易。当我们固定好神经网络结构,在训练的过程中,要把数据本身包含的信息有效地传递给每一个参数,一方面,这与优化算法密切相关,另一方面,则需要设计更好优化的结构。
从表示学习的角度来看,神经网络前面的所有层,都可以看做获得一个更好的表示,只有最后一层将表示转化为输出,所以,神经元可以分为隐藏单元和输出单元。事实上,神经网络优化性能提升的主要来源就是这两类神经元的改变。
本文主要聚焦在隐藏单元,也就是激活函数,我们以喜闻乐见的sigmoid函数为出发点去理解激活函数的设计方法。
非零中心与梯度消失
如果神经网络中每一层都是线性变换,那么最后的变换一定是线性的,我们可以假设某个神经网络由l层构成,但每一层都只有一个神经元,同时神经元的阈值为零,最后的输出是:
激活函数重要性就体现在它的存在直接使得整个网络变为非线性的,例如sigmoid函数,将会使得最后的输出变为复杂的非线性函数,表现为多层复合函数:
使用BP算法去估计参数,假设我们的损失函数为L,学习率为1,同时根据sigmoid函数中,权重系数与输入相乘的形式,第l层的权重系数变化为:
在这里,我们将会面对非零中心带来的问题,永远是正的,而也永远是正的。
如图,sigmoid函数和其导数均为正,另一条很重要的性质是,在值较大和较小区域,sigmoid函数的导数会变得很小。
唯一决定其更新方向只有Loss对输出的偏导,但对于某一确定的数据,这一项也是常数。也就是说,在sigmoid作为激活函数的情况下,存在多个参数的情况下,权重系数的更新会全部沿着同一个方向,我们假设存在两条权重边连入到其中,另一个参数的更新也与上述情况类似。比如,我们进行两个参数的更新:
因为均为正,其余的条件均一样,w1和w0的更新沿着同一个方向,当我们遇到需要减小一个参数,而增大另一个参数的时候,此种性质会造成迭代的冗余。
如图,当我们需要增大w0,减小w1时,由于上一步sigmoid函数的输出永远为正,参数只能沿同一个方向更新,要么全部增大,要么全部减小,就形成了Z形折线。
在此基础上,我们所更新的第l-1层权重系数变化为:
注意到第一项仍然要使用链式法则,同时使用sigmoid函数性质:
需要注意到,当我们对w或者x进行求导时,别忘记还有一层复合函数,第一项就可以写作:
同时,第二项也可以记为:
那么,权重系数更新为:
在这里,我们可以看到,上一层的梯度直接进入了此层的更新,我们可以将参数的更新理解为,梯度在层与层之间流动。用l-1层的参数变换除以层的参数变换,就可以反映出更新幅度的大小:
对于确定的一个数据点,如果当时,参数的更新幅度为零,也就是梯度变小了。如果我们继续向后传播,后面的层与起点的l层的比值所形成的链会越变越长,sigmoid函数的导数最大也不会超过0.25,所以比值会越变越小,参数变换幅度也会越来越小。换而言之,sigmoid函数进入的自变量太大或者太小时,随着传播,非常容易地进入“饱和区”,这就是所谓的梯度消失。
激活函数的性质
根据上述存在的问题,我们可以大概明确激活函数必须要满足的几条性质:
- 非线性。这是万能近似定理的要求,线性单元的线性组合不会学习到非线性的表示。
- 连续性。我们希望对于每一个输入,都有输出。当某个可能的数值在激活函数上没有定义时,这个激活函数将没有输出,这是不被允许的。注意,输出为零与没有输出是两种截然不同的情况。
- 几乎可微。完全可微性经常被人误以为是激活函数的必要条件,因为总是要计算梯度,实际上,我们不需要保证对所有的点都存在导数,有限的几个点不存在导数仍然是可以接受的,我们会用左导数或者右导数来替代导数没有定义的点。
此外,为了更好让神经网络得到更好的优化,少部分出于获得更好的表示,我们希望激活函数还可以满足以下特质:
- 单调性。这一点存在着一些争议,因为有些激活函数并不是单调性的,但效果却很好,一般认为,单调性的激活函数会带来更好的收敛效果。
- 小的饱和区域,甚至不饱和。我们已经在上文中看到,大量的饱和区域会使得深层的网络参数很难得到大幅度的更新,我们希望激活函数的梯度在很小的区域内为零。除此之外,函数本身等于零的区域也要尽量少。
- 更小的计算量。一方面,我们希望激活函数计算起来较为简单,另一方面,我们希望激活函数尽量少参数,因为激活函数每增加一个参数,整个神经网络要相应增加隐层包含神经元数量之和的参数数量,这对于优化仍然是不利的。
- 近似线性化。在上述的过程中,我们可以看到梯度在层与层之间的流动,为了避免大的梯度和小的梯度在深层网络中传播时对优化的影响,若梯度为1,则可以避免一些麻烦,但是,完全的线性又会违反万能近似定理,所以我们希望激活函数在某个区间内保持线性。
读芯君开扒
课堂TIPS
• 在缓解梯度消失问题时,另一个想法是,我们不使用基于梯度的优化算法,而是使用二阶优化。例如在《理解优化算法》中提到的牛顿法,它是一阶信息与二阶信息的比值,从理论上这是可行的。因为函数趋于饱和时,一阶导数和二阶导数可能具备相同的变化趋势,那么比值反而恒定,但是仍然存在鞍点和计算复杂度太高的情形。
• 对激活函数的研究是神经网络的一个重要课题,我们会在下篇文中针对性详细介绍一些性质良好的激活函数。本文所讲的激活函数的性质,可以成为我们设计激活函数的指导原则,但有些原则缺乏理论支撑,仍然存在我们无法解释的情形,比如softplus函数应该比relu效果更好,但实际上却没有,在某种程度上,目前激活函数的设计原则仍然是启发式的。
留言 点赞 发个朋友圈
我们一起探讨AI落地的最后一公里
作者:唐僧不用海飞丝
如需转载,请后台留言,遵守转载规范
相关资讯
相关礼包
更多-
剩余:-462%
-
剩余:50%
-
剩余:100%
-
剩余:33%