深度学习探秘之三:激活函数和梯度下降算法

今天继续填坑,因为赞赏功能打开了,动力十足啊。

接上文,我们引出了一个神经元的结构,通过对我们历史数据的学习可以得到一个我们梦寐以求的公式,以后就可以用这个公式来判别网友性别了。这里我给大家展现的结构中多了一个叫激活函数的东西,它是干什么的呢?还记得我们前面讲的那个例子中的sign函数么?它是一个符号函数,对于参数x,sign(x)的输出就是三种结果正、负、零。我们忽略掉零,那么它输出的结果刚好就可以对应我们想要的男、女结果。在这里,这个sign函数其实就是一个激活函数。

激活函数并不是真的要去激活什么东西,其实它的引入是为我们带来一些非线性的因素。因为对于权重W和属性X,他们的乘积和是一种线性关系(注意,实际上W和X都是向量,但是仍然不影响他们在高维空间是一种线性关系,这里需要一点抽象思维)。在最简单的问题中,数据可能是线性可分的,那么一条直线就可以区分他们,但是如果复杂一点再复杂一点呢?观察下面的图片就知道了,激活函数可以让神经网络更好地处理复杂的问题。(这里的图都不是我画的所以要给大家一个来源链接 https://www.quora.com/What-is-the-role-of-the-activation-function-in-a-neural-network-How-does-this-function-in-a-human-neural-network-system)

常见的激活函数有以下几种(不是全部),大家不用去记住公式之类的,记住名字就行了。因为大多数深度学习的平台都有提供。

有朋友可能要问了,为啥选这些激活函数呢?我用其他的函数行不行?可以,但是选激活函数是有条件的,我们先按下不讲,后面有分晓。

下面我们要讲的是最重要的概念,梯度下降算法

还是回到我们之前举的例子,再那个例子中我们事先知道了一部分用户的性别,所以我们才能让机器去学习这些规律。这种做法我们称之为监督学习,因为对于假设函数h(x),我们已经告诉了机器如果我输入x,得到的实际值应该是y,这是一种已经有标注数据的训练方式(听说很多都是找实习生来标数据的)。另外一类学习方法叫做无监督学习,这种方法的训练样本中只有x而没有y。模型可以总结出特征x的一些规律,但是无法知道其对应的答案y。后来还发展出了强化学习主动学习,这些我们都要放到很后面的文章才能讨论了。

好了,下面我们看看在监督学习中,我们是如何让假设函数真的可以起作用,而不是瞎子算命胡猜呢?放心,他一定是科学的,但是接下来会有一串串数学公式,高能预警!

对于假设函数h(x),还记得么?他大概就是权重W和X的内积和,X是已知的输入,W怎么来?初始化一个就好了。你说那不对吧,随便初始化一个W,计算出来的不是y是y`(y一撇)啊,肯定和y有误差。哎对!肯定有误差,但是如果我能把误差修正,是不是就可以了呢?看下图的推导过程。

你看,通过上面的推导,我们就把问题变成了根据X和Y去求W的过程了。那么模型训练的过程,就是求合适的w,使得E(w)最小,这就成了数学上的一个优化问题,而E(w)就是我们的目标函数。

学过高数的朋友们都知道极值的求法,就是对于一个函数f(x),求他的导数f`(x)为0的时候,那么这个点可能就是他的极值。不懂高数的同学没关系,我们把这个误差函数画一个简单的图看看。如下图你一眼能看出极值在哪里吧?

那么人眼可以看出来,画不出的图的可以解方程,但是计算机既不会看也不会解方程,但是计算机可以一步一步试出来。

首先,我们随便选择一个点开始,比如上图的起始值。然后每次向离最小值方向移动一个点,经过数次迭代后最终达到函数最小值点(注意,实际上可能并不是最小值点,而是收敛到极值附近)。

有朋友会问,不对啊,你怎么知道要往哪个方向移动呢?因为我们每次都是向函数的梯度的相反方向来修改。梯度是一个向量,它指向函数值上升最快的方向。显然,梯度的反方向当然就是函数值下降最快的方向了。之所以是最小值附近而不是最小值那个点,是因为我们每次移动的步长不会那么恰到好处,有可能最后一次迭代走远了越过了最小值那个点。

步长的选择是门手艺,如果选择小了,那么就会迭代很多轮才能走到最小值附近;如果选择大了,那可能就会越过最小值很远,收敛不到一个好的点上。

说到这里,我们可以得出来一个算法公式:

新的权重=旧的权重 - 步长*误差函数的梯度

这个算法就叫做梯度下降算法。

那我们回到刚才讲的激活函数,因为激活函数也是假设函数的一部分。而我们刚才讲我们需要去计算梯度,那么大家知道梯度计算实际上就是计算函数对于各变量的偏导数(公式太多,我忽略了,相信大家也不想看)。所以在这种优化方法里面,激活函数基本上要求是要可导。另外,考虑复杂的情况,我们的误差函数不一定像我们举的例子一样梯度方向是基本一致的。会不会突然出现在某个点梯度消失,也就是没有方向,并且这个时候还不是我们想要的极小值呢?这是有可能的,因为考察到激活函数的饱和性(什么是饱和性,看下图)。

所以刚才讲步长是个手艺活,其实激活函数也是。目前常用的几个激活函数,都是大家用的比较多的,啥优点缺点已经一目了然了。

最后,再讲一种常见的情况,就是误差函数实际上并不会像我们的例子那样简单,很多时候它相当复杂,甚至在高维中,它是像一张地形图(有山峰有山谷)。当你从某个点开始沿梯度下降的方向去走,只会走到一个局部极小点,而不是全局极小点。这个时候再怎么训练,你的误差也不会降下去了。所以其实梯度下降算法还有很多细分的技巧,我们留到以后再讲。

好了,今天就给大家分享到这里了。下一篇将要引出我们绝对的主角,深度神经网络,我们要真正地去讲一些实际的结构,甚至去动手写一个实例。

不过,在此之前我要休息一整周了,本周事情比较多,可能没空整理。但是坑我一定会填,敬请期待!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180626G0BVVR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券