Python与人工神经网络(10)——神经网络可以干什么

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxhm001/article/details/70146179
这可能是最难写的一期。

实际上这期的内容,在作者原作上并不长,而且我看前面的就已经明白后面的是什么意思了。所以我只看了一个晚上,后面的部分就范范的翻了一下,看大概跟自己的理解没太大区别,就过了。之所以我这么快理解,是因为作者做了很多交互动画,大概是这样的:

然而我没法把所有的交互都拿动画录下来,因为这种交互的体验实在是录不下来,所以强烈建议各位去看看原文:http://neuralnetworksanddeeplearning.com/chap4.html
不过我还是要把这篇文章写下去:作者做这么多交互是干嘛的,这跟我们这期的主题,神经网络可以干什么有啥关系。
神经网络可以干什么呢,作者在这章开头说,神经网络基本上可以计算任何函数,比如我们通常看到的函数f(x):

当然如我们之前用到的,多个输入值,多个输出值也是OK的:

这里需要说明两点:第一,神经网络没法精确的计算出一个函数。比如上图说的,我们有一些数据x1,x2,x3,预期的输出结果是f1(x1,x2,x3),f2(x1,x2,x3)。神经网络无法精确的计算出f1()和f2(),但是他能拟合出g1(),g2(),使得|g1(x1,x2,x3)-f1(x1,x2,x3)|<ϵ1,|g2(x1,x2,x3)-f2(x1,x2,x3)|<ϵ2。也就是说,只要训练数据足够,就可以让神经网络计算与任何函数足够近似的函数。这个函数有啥用呢?比如我们用到的图像识别,图像和文字之前的关系是函数;比如语音识别,输入的语音和具体的文字之间的关系是函数;比如翻译,中文文本和英文文本之间的关系是函数;比如推荐系统,我们在亚马逊看了什么,买了什么,和他推荐给我们什么之间的关系,也是函数……等等等等,不胜枚举。
第二,得是连续可导函数。我们之前的章节中疯狂的运用导数,要是后来发现函数在某个地方本身不可导,那就是一个笑话了。
上面这一堆东西,叫神经网络的通用性定理。既然是定理,那就得证明!实际上呢,先贤们确实是证明了的,第一个证明的人叫 George Cybenk,在一篇叫Approximation by superpositions of a sigmoidal function的论文里面,地址:http://www.dartmouth.edu/~gvc/Cybenko_MCSS.pdf。有兴趣的朋友可以下来看看,反正我是没看,因为在证明的过程中用到了哈恩-巴拿赫定理、里斯表示定理以及一些傅里叶分析。我的数学就是垃圾,所以没去找虐。那么问题来了,作者怎么给我们证明呢?作者要丢出那些东西来,我也就看不下去了,所以机智的作者没有从理论上去证明,而是做了好多交互的小程序,让我们从视觉上有一个体验,有一个感觉,知道这么个意思就可以了。
所以现在我就比较为难了,公众号里没法把作者的那些个小程序搬过来。我来勉强说说看吧,看能不能把作者的意思说清楚。
首先我们来看看单个输入值单个输出值的情况,比如我们要利用S曲线神经网络实现本篇文章第二幅图说的任意一个一维函数f(x),也就是说只有一个输入值,一个输出值,我们再假设中间也只有一个隐藏神经元。

还记得S曲线神经网络的前馈函数么:

所以对于一个输入神经元,一个输出神经元,一个隐藏神经元的神经网络,输出值就是:

我们可以找出这么一组w1,b1,使得x变化很小,a1的变化很大,形成一条十分陡峭的曲线的。比如当w1非常大(正值)。w1·x+b1因为x的微小变化,瞬间从-5变化到+5,以至于a1瞬间从接近于0变化到接近于1,而且我们能通过改变w1和b1找到这个变化点。同样的,我们也能找到x微小的变化,导致输出值瞬间变化的,就像以下的曲线:

那么,当我们加一个神经元的时候,是不是可以成这样:

保持隐藏神经元的值不同,调整隐藏层和输出层之间的w值,还可以成这样:

现在我们猜想,如果我们再多家一些神经元:

是不是就能模拟的更精细了。
至于几个输入值,几个输出值的,那就是多维了,毕竟四维没人画得出来,勉强用一张三维的图来表意:

好了。我不准备再说下去了,大概的意思就是这样。作者确实没从理论上去证明,而是给了一个视觉体验上的证明,我确实不知道怎么描述。还是去看作者的原作比较靠谱。

欢迎关注我的微信公众号获取最新文章:


展开阅读全文

没有更多推荐了,返回首页