Python与人工神经网络(10)——神经网络可以干什么
2017-04-12 18:51
1221 查看
这可能是最难写的一期。
实际上这期的内容,在作者原作上并不长,而且我看前面的就已经明白后面的是什么意思了。所以我只看了一个晚上,后面的部分就范范的翻了一下,看大概跟自己的理解没太大区别,就过了。之所以我这么快理解,是因为作者做了很多交互动画,大概是这样的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/516e604d82cf89750be010e24eaab9c2)
然而我没法把所有的交互都拿动画录下来,因为这种交互的体验实在是录不下来,所以强烈建议各位去看看原文:http://neuralnetworksanddeeplearning.com/chap4.html
不过我还是要把这篇文章写下去:作者做这么多交互是干嘛的,这跟我们这期的主题,神经网络可以干什么有啥关系。
神经网络可以干什么呢,作者在这章开头说,神经网络基本上可以计算任何函数,比如我们通常看到的函数f(x):
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/02632fed9a8643986d8348bb3716b937)
当然如我们之前用到的,多个输入值,多个输出值也是OK的:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/8a8bbea6583fa00d181f056721d658ac)
这里需要说明两点:第一,神经网络没法精确的计算出一个函数。比如上图说的,我们有一些数据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),也就是说只有一个输入值,一个输出值,我们再假设中间也只有一个隐藏神经元。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/e59f00eac33bd7cc59c0f19b7874ab7e)
还记得S曲线神经网络的前馈函数么:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/7c3143acbf791da25d45217a7b7ac8d4)
所以对于一个输入神经元,一个输出神经元,一个隐藏神经元的神经网络,输出值就是:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/7da9102f010c844b4db118bdca8d6a9d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/926f45c533bd2c493c6e260069a0ee88)
我们可以找出这么一组w1,b1,使得x变化很小,a1的变化很大,形成一条十分陡峭的曲线的。比如当w1非常大(正值)。w1·x+b1因为x的微小变化,瞬间从-5变化到+5,以至于a1瞬间从接近于0变化到接近于1,而且我们能通过改变w1和b1找到这个变化点。同样的,我们也能找到x微小的变化,导致输出值瞬间变化的,就像以下的曲线:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/5c0593abaeeb383637d1ff8f8aba1ad7)
那么,当我们加一个神经元的时候,是不是可以成这样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/0c6b0dd04b7f317c1f6a966371df7433)
保持隐藏神经元的值不同,调整隐藏层和输出层之间的w值,还可以成这样:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/c89de3c50d9e8d6f65011e063ced57dd)
现在我们猜想,如果我们再多家一些神经元:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/4958c8f8e538e934b56b2a6d027a05f8)
是不是就能模拟的更精细了。
至于几个输入值,几个输出值的,那就是多维了,毕竟四维没人画得出来,勉强用一张三维的图来表意:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201704/46983936aace3c7243d1f12991979888)
好了。我不准备再说下去了,大概的意思就是这样。作者确实没从理论上去证明,而是给了一个视觉体验上的证明,我确实不知道怎么描述。还是去看作者的原作比较靠谱。
欢迎关注我的微信公众号获取最新文章:
实际上这期的内容,在作者原作上并不长,而且我看前面的就已经明白后面的是什么意思了。所以我只看了一个晚上,后面的部分就范范的翻了一下,看大概跟自己的理解没太大区别,就过了。之所以我这么快理解,是因为作者做了很多交互动画,大概是这样的:
然而我没法把所有的交互都拿动画录下来,因为这种交互的体验实在是录不下来,所以强烈建议各位去看看原文: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值,还可以成这样:
现在我们猜想,如果我们再多家一些神经元:
是不是就能模拟的更精细了。
至于几个输入值,几个输出值的,那就是多维了,毕竟四维没人画得出来,勉强用一张三维的图来表意:
好了。我不准备再说下去了,大概的意思就是这样。作者确实没从理论上去证明,而是给了一个视觉体验上的证明,我确实不知道怎么描述。还是去看作者的原作比较靠谱。
欢迎关注我的微信公众号获取最新文章:
![](http://img.my.csdn.net/uploads/201702/03/1486122312_1773.jpg)
相关文章推荐
- Python与人工神经网络(8)——改进神经网络
- Python tensorflow实战3.神经网络 - 理解到底什么是神经网络,编程原理
- Python与人工神经网络(2)——使用神经网络识别手写图像
- Python与人工神经网络:使用神经网络识别手写图像介绍
- 用BP人工神经网络识别手写数字——《Python也可以》之三
- 用BP人工神经网络识别手写数字——《Python也可以》之三
- 一家戏院,网络,客户数据库,一个独自看电影的男生,一个独自看电影的女生,可以组合出什么故事呢?
- (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二
- (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二
- Qt Webkit可以做什么(二)——显示网页&获取网络服务
- 【Introduction】什么是神经网络?
- (已加马赛克)10 行代码判定色*情*图片——Python 也可以系列之二
- 数学之路(3)-机器学习(3)-机器学习算法-神经网络[10]
- Learn Python The Hard Way学习(10) - 那是什么?
- 神经网络与机器学习 第一讲(2)——什么是神经网络
- 用BP人工神经网络识别手写数字——《Python也可以》之三
- 一家戏院,网络,客户数据库,一个独自看电影的男生,一个独自看电影的女生,可以组合出什么故事呢?
- 人工神经网络之我见-【神经网络的原理】
- 10 行代码判定色*情*图片——Python 也可以系列之二 (转载)
- Qt Webkit可以做什么(二)——显示网页&获取网络服务