【神经网络和深度学习】笔记 - 第四章 神经网络能够实现任意函数的直观解释

文章导读:git

1. 两个前提数组

2. 单输入单输出的状况网络

3. 通常情形:多输入多输出状况 app

4. 使用sigmoid之外的神经元函数

5. 修正阶跃函数spa

6.总结设计

 

神经网络最使人激动的一个性质,就是它能够实现任意功能的函数。并且是即便对于只有一个隐藏层的神经网络,这个结论依然成立。3d

大部分神经网络的使用者都知道这个性质,可是并不理解为何神经网络会有这样的性质。而其理论证实对于非数学专业的同窗来讲并很差理解,因此本章旨在用直观的方式帮助你们理解这个性质。对象

 

一. 两个前提

神经网络能够计算任意函数实际上是有前提的。blog

首先要明白的是它并非能够彻底准确的计算原函数的值,可是经过增长隐藏层神经元的值咱们能够愈来愈逼近原函数。就是说对于一个须要实现的函数$f(x)$,要求实现精度为$\epsilon > 0$,也就是须要足够的隐藏层神经元使得神经网络输出$g(x)$知足$|g(x) - f(x)| < \epsilon$对全部输入$x$。

第二个前提是被模拟的函数是连续函数,不过有的时候对于非连续函数,神经网络获得的连续近似已经足够知足要求了。

 

二. 单输入单输出的状况

先考虑最基础的单输入单输出的函数状况。为了理解怎么利用神经网络去计算给定函数$f$,咱们先考虑只有一个隐藏层的状况,其中含有两个神经元。

考虑隐藏层第一个神经元,其输出由$\sigma (wx+b)$决定。改变其参数$w$和$b$能够发现以下规律:

  • 改变b不会使函数形状发生改变,只会使其左右偏移。由于$f(x) = \frac{1}{1+e^{wx+b+b_0}} = \frac{1}{e^{w(x+\frac{b_0}{w}) + b}}$,$b_0>0$时即$b$增大时,至关于图像向左移动,$b_0<0$时即$b$减少时,至关于图像向右移动。
  • 改变w则会改变函数的形状,由于$f(x) = \frac{1}{1+e^{(w+w_0)x+b}} = \frac{1}{1+e^{wx\frac{w+w_0}{w} + b}}$,至关于在横轴上进行了放缩。当$|w|$($w<0$的时候,函数会在x轴上反转,不过不影响咱们理解)变的愈来愈大的时候,函数就会变的愈来愈陡峭。实际中观察,当$w=100$左右时,函数的陡峭程度已经接近于阶跃函数了。

 

继续增大$w$的值使得其输出更加接近阶跃函数:

当咱们对隐藏层的神经元的输出进行加权求和的时候,分析阶跃函数要比分析sigmoid函数容易。咱们很容易能够知道两个阶跃函数的和是什么形式,可是对于两个sigmoid函数就没有这么容易获得。因此咱们先假设这些神经元输出函数就是阶跃函数,固然这也是一种近似,咱们随后再看这和真正的状况相比会有什么影响。

再考虑另一个问题,咱们知道标准的$\sigma (z)$的中点在$z=0$处,当它近似为一个阶跃函数的时候,阶跃点在哪呢?容易知道就是在$wx+b = 0$处,即$s = -\frac{b}{w}$。因而对于已经近似被认为是阶跃函数的神经元就能够只用一个参数$s = -\frac{b}{w}$来代替以前的两个参数$w$和$b$。

接着再来考虑整个神经网络的状况。

右边展现的是加权输出的结果$w_1 a_1 + w_2 a_2$,其中$a_1$和$a_2$分别是隐藏层两个神经元的输出。不过注意到这里神经网络最终的输出为$\sigma (w_1 a_1 + w_2 a_2 +b)$。

经过调节这些参数能够观察到:

  • 调节$s_1$的大小$s_2$分别控制上下两个神经元的激活先后顺序。例如$s_1<s_2$的状况下,右边函数的第一个阶梯由第一个神经元输出决定,由于它先被激活,第二个阶梯才是二者之和
  • 调节$w_1$和$w_2$分别控制两个神经元输出在输出神经元的权重,当其中一个为0时,只剩下一个输入,右边的函数也显示为只有一个阶跃函数。

最后,试着让$w_1 = 0.8, w_2 = -0.8$,而后$s_1 = 0.4, s_2 = 0.6$就获得一个在(0.4, 0.6)上的门函数:

 若是咱们固定$s_1$和$s_2$,而后$w_1 = -w_2$,这样就能够将门函数看做是只有一个参数$h$的模型,其中$h = w_1$,对应着就是门函数的“门梁”的位置。

经过组合神经元咱们就能够轻易获得两个门函数组合的状况:

一样的方法,咱们能够构造任意数量任意高度的门函数。由于对于[0,1]这个区间的划分是能够有无限多N个的,只要使用N对隐藏层神经元就,而后分别配上对应的$h$就能够达到要求了。

上图就是一个五个宽度同样的门函数的情形,高度由各自的参数$h$决定。可是仅仅这样就能说明神经网络能够计算任意函数吗?看下面这个例子:

这个函数来自:

$$f(x)=0.2 + 0.4x^2 + 0.3x sin(15x) + 0.05 cos(50x) \quad (113)$$

看上去这个函数形式和神经网络彻底没什么联系,接下来就来看看神经网络是怎么去近似计算它的。

前面提到过$w_1 a_1 + w_2 a_2 + ...$并非神经网络最终输出,最终输出为$\sigma (\sum_j w_j a_j + b)$,那么为了让最终输出为须要的函数$f(x)$,就要求$\sigma$函数的输入为$\sigma^{-1} (f(x))$,即隐藏层输出的加权和为$\sigma^{-1} (f(x))$,其中$\sigma^{-1}$为$\sigma$的反函数。

 

 因而只要有方法可让隐藏层输出和近似等于上面反函数,就至关于神经网络的最终输出近似等于$f(x)$了。对于上面五个门函数的情形,经过调节各自的$h$获得符号近似要求的结果:

这虽然只是一个粗略的近似,结果也不惟一,可是只要经过增长门函数的个数,即增长隐藏层神经元的个数,就可让结果愈来愈精确。将这个获得的模型转换到咱们的神经网络参数上,隐藏层的$w$取了很大的数$w=1000$,因为$s=-\frac{b}{w}=0.2$,获得$b = -1000*0.2=-200$。

输出层的权重由$h$决定,例如第一个$h=-1.3$,说明它表明的两个权重分别为-1.3和1.3,以此类推,输出层的bias这里被设置为0。

这样就完成了经过构造一个神经网络来逼近目标函数的目的了,并且经过增长隐藏层神经元的个数可使得这个近似结果更加准确。事实上,咱们的目标函数$f(x)=0.2+0.4x^2+0.3sin(15x)+0.05cos(50x)$的形式可有可无,本质上咱们使用一个单层神经网络构建了一个lookup表,不一样区间对应不一样的值,区间分的越细小,就越准确。

 

三. 通常情形:多输入多输出状况 

 先考虑两个输入的状况:

咱们将$x$和$y$看做是变量,其加权输出和为因变量,这样就将以前的平面图像转变为了3d图像,不妨先设$w_2 = 0$,这样图像为:

能够看到平行于x轴的任意截面都是以前看到的平面上的曲线形式。一样的原理,改变$w_1$和$b$分别改变曲线的形状和位置。一样将$w_1$设定为一个很大的数,曲线转变为阶跃函数,位置为$s_x = -\frac{b}{w_1}$:

这里对应着$w_1 = 1000, w_2 = 0$。一样能够设定$w_2 = 1000, w_1 = 0$这样就成了平行于y轴的曲线:

接着经过组合,咱们获得了对应门函数的一个3d状况:

注意这里的y并无起到做用,和y相连的权重都被设置成了0。相似也有只有y的版本,将和x的相连的权重设置为0:

若是咱们将这两个方向垂直的门函数相加呢:

改变$h$的大小能够改变图像的高度,很容易能够知道中间最高的地方是边上的两倍高。咱们因而想到可否用中间的高度做为中间区间上的值,这种方法去将定义域分割成一个个区间呢,而后每一个区间对应一个值,区间分的越细就越逼近原函数。相似于以前单输入的状况,此次是一个二维的lookup表。

可是这就须要咱们获得的是一个下图相似的塔函数:

可是咱们获得的状况是除了中间是高的($2h$),边上并非平的,也有必定的高度($h$),并不知足塔函数的条件。怎么将其转变为塔函数的形状呢?注意到,这里只是隐藏层的加权输出和,并非输出神经元的输出,也就是说还有一个$\sigma$函数的做用没有考虑,就能够尝试调节输出神经元的bias$b$来进行调节。

考虑门函数的输出值由$h$决定,咱们能够获得神经网络的输出值(再也不是隐藏层的输出了)中间区域的值近似为$f_{max} = \frac{1}{1+e^{-(2h+b)}}$,边上区域的值近似为$f_{min} = \frac{1}{1+e^{-(h+b)}}$。咱们想要$f_{max}$可以近似等于须要的值$g$,这种状况下获得条件一:$2h+b=c$,其中$c$为一个常数。又为了让$f_{min} \approx 0$,就须要条件二:$h+b<<0$。这样就能够经过调节$h$与$b$的值使得这两个条件都成立,由于只要$h$足够大,$h+b = c - h$就会足够小。不妨选择$h=10, b \approx -\frac{3h}{2}$,获得:

注意到这里的图像是输出神经元的输出,也就是通过$\sigma$函数后的结果。能够看到,这已经获得了一个形式不错的塔函数了,继续增长$h$的值,调节$b=-\frac{3h}{2}$,效果会更加明显。

接着咱们将两个相似这样的神经网络组合去获得两个塔函数:

每一个塔函数对应着第二个隐藏层的每一个神经元的输出,调节两个$w$的值能够分别调节其高度。一样的方式咱们能够获得任意多个自定义高度的塔函数,每一个塔函数对应2维平面上的一个区域,经过这样的2维lookup就可使得第二个隐藏层的加权输出能够近似等价于任意关于两个变量的函数$f(x,y)$。

可是这毕竟不是输出层的输出,因而相似的方法咱们使用$\sigma$函数的反函数,让第二个隐藏层加权输出等价于$\sigma^{-1} (f(x,y))$便可。

若是输入变量个数多余两个呢?

先看一下三个变量的状况$x_1, x_2, x_3$。相似于上面的状况,下面这个神经网络能够获得一个四维空间上的塔函数:

这里$x_1,x_2,x_3$为神经网络的输入,$s_1,t_1,s_2,t_2$都是控制门函数的位置,其中第一层隐藏层的权重已经足够大了使得它们各自的输出为阶跃函数,而后各自的误差由$b=-sw$获得。而后第二层隐藏层的权重所有为$h$和$-h$,而后不妨令其bias为$-\frac{5h}{2}$,验证仍然知足以前构造塔函数的条件$h+b = -\frac{3h}{2} << 0$和$3h+b = \frac{h}{2} = c$(c为一常数)。

随着增大$h$到必定程度,这个神经网络因而就至关于对于3维上一块区域$x_1 \in (s_1,t_1), x_2 \in (s_2, t_2), x_3 \in (s_3, t_3)$,其值为1,其余任意位置为0的塔函数。

经过组合这样的神经网络就能够将多个塔函数相组合就能够近似替代任意三个变量的函数。一样的想法能够拓展到$m$维空间,只要记得将进行组合处的神经元bias设置为$(-m+\frac{1}{2})h$使得函数形式为中间凸起,旁边为0。

 这样就获得了使用神经网络逼近任意输出为一维的函数的方法了。可是神经网络的输出常常是多维的$f(x_1, ..., x_m) \in R^n$,例如前面的MNIST问题时输出为10维,这种状况怎么处理呢?

这种状况能够看做是$n$个独立的函数:$f^1 (x_1, ..., x_,m), f^2 (x_1, ..., x_m)$,咱们分别设计神经网络近似表示$f_1, f_2$等等,而后简单的将它们组合便可。

拓展:

上面介绍了如何用两个隐藏层的神经网络去近似表示函数,可否证实只须要一层隐藏层就能够完成这样的设计?试着在两个输入的状况下,依次证实:(a)除了x轴,y轴之外,能够构造任意方向的阶跃函数;(b)经过将大量的(a)中的函数叠加,能够获得一个底面形状再也不是长方形而是圆形的塔函数;(c)使用这些圆形的塔函数,能够近似表示任意函数。

(a):

 先看一下以前获得的方向为何是x轴,y轴,或者说这些方向是由什么决定的。$\frac{1}{1+e^{-(w_1 x+ w_2 y +b)}}$,以前选择w_2为0时,获得的阶跃函数时x轴方向的,能够发现阶跃函数的方向是和直线$w_1 x+ w_2 y +b = 0$垂直的方向。因此说只要根据须要的方向构造与该方向垂直的直线$w_1 x + w_2 y + b = 0$中的$w_1$和$w_2$便可,也就是说如今的阶跃函数的构造不只仅依靠一个输入神经元,而是两个都须要。

(b):

两个长方形垂直相交的重叠部分是方形,若是三个,四个呢?这个也许很差想象,可是换一个思路,对一个长方形绕着其中心旋转,中间不变的部分就是以中心为圆心的内切圆,因此只要组合足够多不一样方向的(a)中阶跃函数,就能够获得近似圆形底面的塔函数。

(c):

长方形区域很容易能够拼成一块大的区域,可是圆形却不行,它们之间老是有缝隙的。能够经过本文后面部分介绍的方法,将这些未覆盖的部分当成是“失败区域”,使用函数近似表示原函数的$\frac{1}{M}$,每次移动$\frac{1}{M}$单位个步长,最后叠加就获得覆盖满全部区域的目标函数。

这里按照做者给出的提示解答完了这三步,可是我仍是不大清楚这和能用一个隐藏层有什么联系,由于圆形的塔函数依然面临以前的一个问题,就是除了中间高的区域外,还存在边上的不为0的区域,仍是要依靠一个神经元将其转变为真正的塔的形式,中间凸出,边缘为0。我理解的一个隐藏层能够解决的缘由是相似于在进行傅立叶级数展开的时候,咱们将函数表示成一组三角函数基函数的线性叠加。其实任意连续函数均可以看做为一组基函数的叠加,而后在一个隐藏层选择合适的基函数叠加便可。

 四. 使用sigmoid之外的神经元

前面已经证实了以sigmoid神经元为基础的神经网络能够计算任意函数。回忆一下sigmoid函数的形式,对于输入$z=\sum_j w_j x_j +b$,$\sigma(z)$的形式为:

若是将其换成一个不同的激活函数$s(z)$:

会出现什么状况呢?

一样得方法,咱们用这个函数也能够获得阶跃函数。试着增大$w=100$:

相似于sigmoid函数的状况,新的激活函数同样会收缩,随着$w$的继续增大,它最终也会成为一个阶跃函数的近似表示。而后经过改变$b$的值就能实现对该阶跃函数的移动。使用以前同样的方法就能够构造神经网络近似表示所需的目标函数。

那么是否是全部的激活函数$s(z)$都知足这样的要求能够获得阶跃函数呢?事实上只须要$s(z)$在$z\rightarrow -\infty$和$z \rightarrow \infty$时极限存在,而且这两个极限的值不相等便可。相等的话就不是阶跃了,而是一个“平”的常量函数了。激活函数知足这些性质以后,神经网络就能够逼近任意函数了。

拓展:

拓展一:

证实以前介绍的RELU神经元不知足上述的条件,可是RELU函数同样能够构造上述神经网络近似表示任意函数。

答案:

RELU在$x>0$时是一个线性增加的函数,当$x\rightarrow \infty$时,$RELU(x) \rightarrow \infty$,极限值并不存在,因此不知足要求。

虽然一个RELU函数按照以前改变参数的方法怎么也变不成阶跃函数,可是能够经过两个RELU函数相叠加获得。对于$y=wx$和$y=-wx+b(k>0)$,后者相对前者向右移动了$\frac{b}{w}$,因而二者相加获得了一个分段函数

$$s(x) = \left\{\begin{align*} & 0 \quad if x \leqslant 0 \\ & wx \quad if 0<x\leqslant \frac{b}{w} \\ & b \quad if x > \frac{b}{w} \end{align*}\right.$$

经过增大$w$就能够减少$\frac{b}{w}$从而让这个分段函数中间增加的部分变的更窄,使之近似为阶跃函数。

 

拓展二:

考虑激活函数为线性函数$s(z)=z$的神经元,证实该函数不知足上述条件,也没法构造上述神经网络近似表示任意函数。

答案:

这个函数在$x\rightarrow \infty$和$x \rightarrow -\infty$处的极限都不存在,显然不知足上面的条件。

线性函数自身不具备这样的性质,线性函数的线性组合仍是连续的线性函数,依然是没法知足阶跃函数的要求的。

五. 修正阶跃函数

以前已经证实了咱们经过对神经元进行组合获得近似的阶跃函数,但这始终是近似表示,其中还存在一段函数并不是阶跃函数的“失败区域”:

虽然经过增大wegiths,可使得这块区域愈来愈窄,也就是说与阶跃函数的差异愈来愈小。不过还有其余的处理这个问题的方法的话固然就更好了。

事实上,这个问题并不难解决。设想对于一个一维函数$f(x)$,按照以前的方法,咱们须要隐藏层的输出能够表示成:

按照以前的方法,咱们使用一系列的门函数去表示这个函数:

能够看到,只要门函数足够多,门的宽度足够窄就可使得对目标函数的近似表示越好,除了在交界处的“失败区域”。

此次咱们不用上面的近似,咱们使用目标函数值的一半做为近似对象,$\sigma ^{-1}(\frac{f(x)}{2})$:

接着使用另一套隐藏层去近似表示这样的函数:它是上面门函数组成的函数横向平移半个门宽度获得的:

当咱们把这两个函数叠加到一块儿的时候就会获得一个$\sigma ^{-1}(f(x))$的近似。这个近似虽然仍是会存在“失败区域”,可是比以前的近似已经好多了。这是由于,对于一个点在一个近似函数的“失败区域”时,它将不会出如今另外一个近似函数的“失败区域”。

经过减少每次移动的步长为窗口的$\frac{1}{M}$,将M个$\sigma^ {-1}(f(x)/M)$的近似函数叠加,即获得更好的原始函数的近似表示。

六.总结

这一章描述了神经网络拟合函数的广泛性,可是这固然不是实际中咱们使用神经网络计算的方式。不过它让咱们知道之后在面对一个问题的时候,不是去怀疑神经网络能不能表示这个函数,而是考虑更重要的事,怎么才能找到一个这个函数的好的近似。

咱们的讨论用了两层神经元,不过一层神经元也能够完成这样的工做。那咱们为何还要去用那些层数更多的深度神经网络呢?

理论上这是可能的,不过实际上咱们有不少理由相信深度网络更好。在第一章已经讨论过,现实中的问题和知识体系每每是由浅入深的层级关系,而深度网络的层级结构就很是切合这一点。例如对于图像识别的问题,只是着眼于单个像素点的理解固然是不够的,咱们更但愿它可以识别出更复杂的模式:从简单的线条到复杂的几何形状等等。在随后的章节也会看到,深度网络对于这种层级的问题处理结果的确要好于浅层网络。

总之就是,单层的神经网络就已经能够计算任何函数,可是经验告诉咱们,在解决现实问题上,深度网络更加适合。

相关文章
相关标签/搜索