神经网络入门 第4章 神经网络可以模拟任意函数

    前言

    神经网络是一种很特别的解决问题的方法。本书将用最简单易懂的方式与读者一起从最简单开始,一步一步深入了解神经网络的基础算法。本书将尽量避开让人望而生畏的名词和数学概念,通过构造可以运行的Java程序来实践相关算法。

    关注微信号“逻辑编程"来获取本书的更多信息。

    上一章我们给神经元加入了S函数,它是组成神经网络的前提条件。这一章我们就探讨一下神经元如何组合成神经网络,它有什么样的表达能力。以及S函数的重要作用。

    

    神经网络往往由多层,每层有多个神经元,有多个输入及输出。输入和输出的数量往往是由问题的输入和输出规模决定的。我们现在还是先从单个输入和输出开始,看如何用多个神经元组成网络。

    

    前边两张我们讨论了单个神经元的行为。如果我们把两个或多个个神经元串联起来它能有什么样的表达能力呢?

    

    从上图中可以直观看出前一个神经元的输出作为后一个神经元的输入,即网络的函数是f1(f(x))。

    当我们使用第一章的线性函数神经元时,我们可以推导出 f1(f(x))=w1*(w*x+b) +b1 = w1*w*x + w1*b + b1。这看起来不太妙-两个神经元加起来还是一次函数,还是一条直线,这跟一个神经元的表达能力没有区别。下图是图形化的表示:

    那么使用带S函数的神经元呢?函数挺复杂,我们看一下两个例子的图形化,红黄绿分别表示 f, f1, f1(f)。非常让人失望,还是个sigmoid函数:

    

    下面我们看看另外一种组合方式,把一个输入并行给两个神经元,然后把输出再汇总到一起。像下面这样:

    我们通常把上边的网络看做三层神经网络,左边输入层,中间隐藏层,右边输出层。

    上图的神经网络相当于两个函数f1,f2的结果作为f3的输入。当神经元有多个输入时,把每个输入乘以各自的权重在求和,也就是说y=w*x+b中的w和x都是数组。对线性神经元,我们可以推导出f3=w31*(w1*x +b1) + w32*(w2*x + b2) + b3 = (w31*w1+w32*w2)*x + w31*b1 + w32*b2 + b3。还是一条直线。

    我们看看S函数加起来的效果。下面图中红色和黄色两个S函数曲线,它们的和是绿色的。但是绿线不是S函数!而是阶梯状的,我们也很容易用肉眼直观地验证这样是合乎逻辑的。

我们再看一个三个S函数加起来的例子,这个形状更特别。深绿色的是上边三条线的和,并加上了一个负的偏移量方便我们看的更清楚。

    我们可以想象一下, 如果我们再加入更多输入S函数,就可以让这个形状更复杂。并且还记得上一章中的图中S函数中每个函数变化处的斜率也是可以不同的。如果我们能加入足够多的神经元,我们就能足够精确地模拟任意的函数曲线。也就是说一个足够大的神经网络可以计算任意函数,并且只需要一个三层神经网络。

    上面我们讨论的是只有一个输入变量的情况。当有两个输入时,我们可以模拟每一个输入的任意函数。两个输入一个输出的函数可以看做是三维空间中的一个面。这个面将可以是任意的形状!更多输入变量时相当于N维空间中的一个任意形状的面。也就是说通过调整w和b,足够多神经元组成的神经网络可以调整到模拟任何想要的函数。

    那么如何调整神经网络的参数,或者说如何训练三层或者多层神经网络呢?我们后续章节再说。

        关注微信号“逻辑编程"来获取本书的更多信息。

原文地址:https://www.cnblogs.com/javadaddy/p/6732908.html