热门游戏
屠龙破晓屠龙破晓
热血单机1.76热血单机1.76
剑荡江湖剑荡江湖
大神捕鱼大神捕鱼
鱼潮来了鱼潮来了
妖怪宝可萌妖怪宝可萌
权倾天下权倾天下
不服小天王不服小天王
传奇来了传奇来了
决战沙城决战沙城
当前位置:首页 > 资讯 > 交流 > 【周末AI课堂】隐藏单元的设计原则(理论篇)| 机器学习你会遇到的“坑”

【周末AI课堂】隐藏单元的设计原则(理论篇)| 机器学习你会遇到的“坑”

2018-11-14 09:14:12 来源:迅雷玩游戏 作者:迅雷玩游戏

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落地的最后一公里

作者:唐僧不用海飞丝

如需转载,请后台留言,遵守转载规范

最新游戏

更多
返回顶部