本文想通过可视化的过程来让你直观理解,为什么即使只有一层的神经网络理论上也可以拟合任意函数。

拟合直线

让我们从拟合最简单的线性函数开始。

我们知道在二维空间里的任一条直线都可以用 y=wx+b 这样的线性方程来拟合。
比如下边这条直线,可以通过y=2x+1来表示。

下边这条直线,可以通过y=-1x+2来表示。

下边这条直线,可以通过y=0.2x+4来表示。

拟合曲线

但是对于下边这样的曲线:

线性函数就无能为力了。但是我们可以换个思路,将这个曲线可以分拆为三部分,我们用三个函数来分别拟合其中一部分。为了让函数在x区间里都有定义,我们把其余部分都用常数来补齐。

我们假设这个曲线用y=f(x)来表示,我们就把对一个f(x)的拟合转化为对三个函数a_1(x),a_2(x),a_3(x)的拟合了。因为我们给三个函数添加了常数部分的缘故,这时为了让函数a_1,a_2,a_3加起来正好等于函数f,我们把除了第一个a_1外的a_2,a_3都沿着y轴平移,让函数起始x对应的y=0.

通过这个变化,函数a_1,a_2,a_3相加就刚好等于函数fa_1,a_2,a_3看着都像一个阶梯,我们接下来就称他们为阶梯函数。之前我们已经看过线性函数可以拟合二维平面里的任意直线。我们这里也想找到可以拟合任意阶梯折线的函数a(x)a(x)通过调整参数的,可以得到刚才我们分解出来的三个具体函数a_1(x),a_2(x),a_3(x)
首先,我们想到的是sigmoid函数,它的函数表达式和图像是这样的。嗯,和我们想要的阶梯函数还是有些差距。并且也没有参数可以让我们控制来调整它的形状。

刚才我们看到线性函数通过调整x的权重w,和截距b,可以改变函数的形状。那我们也尝试让sigmoid函数不是直接输入x,而是x的线性函数。

    \[a(x)=sigmoid(linear(x))=\frac{1}{1+e^{-(w*x+b)} }\]

如果令w=8,它的函数图像为:

我们发现通过改变w的值,可以在原来sigmoid函数图像的基础上沿x轴方向进行压缩,同理如果w小于1,则可以沿x轴方向进行拉伸。如果w为一个负值,还可以改变阶梯的方向。接着我们来改变b的值,让b=5,看函数图像会发生什么变化。

我们发现函数图像沿着x轴方向发生了平移。通过上边的实验,我们发现对sigmoid函数的输入x增加权重w,一个偏差b。则可以让sigmoid函数图像沿着x轴方向进行伸缩和平移。此时我们的函数a(x)=sigmoid(linear(x))离可以拟合任意的阶梯函数已经非常接近了。但是还有一个问题就是此时a(x)的函数曲线的值域还一直是0到1。
我们也想对当前的a(x)图像可以沿y轴进行伸缩和平移,之前我们是对sigmoid函数的输入x进行了线性变化,达到了函数图像在x轴方向进行伸缩和平移的效果,那么我们接下来对sigmoid函数的输入同样进行线性变化。则:

    \[a(x)=linear(sigmoid(linear(x)))=W\frac{1}{1+e^{-(w*x+b)} }+B\]

这样我们就又多了两个参数W,B。让我们来调整一下W,B来试试。我们固定sigmoid函数的输出,只调整W,B,我们让W=2,B=-2。这时来看一下函数的曲线。

我们发现此时的a(x)可以在y轴方向进行伸缩和平移了。

太好了,这样我们就找到了我们的a(x)函数,他就是在sigmoid的基础上可以把函数图像在x,y轴上进行平移和拉伸的一个函数。有了w,b,W,B这四个参数,我们就可以任意控制这个阶梯函数的图像了。

    \[a(x)=linear(sigmoid(linear(x)))=W\frac{1}{1+e^{-(w*x+b)} }+B\]

接下来我们就用我们找到的这个可以拟合任意阶梯曲线的a(x)来拟合我们最开始分解的那三个阶梯曲线:

看起来不错,接着我们让我们用a(x)拟合的这三个阶梯曲线相加来构成最初我们想要拟合的f(x)

但这和神经网络又有什么关系呢? 实际上这就是一个神经网络了:

我们让a(x)里的参数都回到它在神经网络结构图中应有的位置上。这时你就可以发现,w,b分别隐藏层的weight和bias。W,B分别对应输出层的weight和bias。sigmoid就是激活函数。

最后,我们再来补全最后一块拼图,任意曲线都可以看做是由很多的线段拼接而成。所以说一个隐藏层的神经网络理论上就可以拟合任意函数。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注