《Python神经网络编程》

写在最前面

“以能够让中学生可以理解的方式来解释神经网络,满足大家对人工智能的好奇心。”这是作者塔里克.拉希德在本书中的目标。他以一种尽可能简单易懂、简洁明了的方式介绍神经网络的基本思路,让只要拥有中学以上数学知识的人,经由本书,就能理解神经网络的工作原理并亲手实现一个自己的神经网络。

我的读后感是:作者实现了他的目标,作者循序渐进,从计算机和人的差异比较出发,分析人为什么会在辨识类问题上能力优异;基于总结出的反馈机制,结合神经元特性的数学建模,作者搭建了一个三层神经元网络,并详细计算了模型中每一层的信号流动,得到正向传播的输出值;紧接着利用目标值和输出值的偏差,构建误差模型,根据误差的梯度下降方法来修正整个神经网络。

阅读这本书,我觉得不超过16小时,你就能理解神经网络的基本工作原理;按照本书实践,不需要超过24小时,你就能亲手写出一个基础的神经网络模型,并能够实现0-9的数字识别。


神经网络如何工作

1. 计算机和人的差异

有些任务,对传统的计算机而言很容易,对人类而言却很难。例如,对数百万个数字进行乘法运算。另一方面,有些任务对传统的计算机而言很难,对人类而言却很容易。例如,从一群人的照片中识别出面孔。


2. 思考模式

为什么会这样呢?一个重要的差别是,当我们不能精确知道一些事情是如何运作时,我们会尝试使用模型来估计其运作方式,这个模型中包括了可以调整的参数。我们利用模型输出和期望之间的偏差来不断修正模型中的参数,直到偏差到了可接受的范围才停止。

神经网络模型就是参考这个模式构建的。有上图可以看到,整个模式有一个正向传输流(“输入-处理方式-输出-偏差”)和一个反向传播流(“偏差-修正-处理方式”)。另外,这里有三个重点问题:核心的“处理方式”应该怎么构建?偏差应该如何选取?修正方法是什么样的?

3. 神经元——构建处理方式的核心

生物神经元都是沿着轴突,将电信号从树突传到树突,在受到刺激时,神经元不会立即反应,而是会抑制输入,直到输入增强,强大到可以触发输出。在数学上,S函数恰好能模拟这种有阶跃效果且能连续反应的特性。

对应的函数表达如下,其中e为欧拉常数2.71828:

S函数还有一个优点,它的导数计算简单不需要使用除法,这在进行神经网络的参数修正时这非常有用。通常S函数也成为sigmoid函数。

此外,生物神经元可以接受许多输入。基于这个特性,在构建神经元的模型时,我们需要将多个输入进行相加得到最终总和,作为S函数的输入,然后输出结果,具体如下图所示。

最后,我们还要考虑到自然界中,神经元彼此相连的特性,对应到神经网络模型中,就是要构造多层神经元,每一层中的神经元都与在其前后层的神经元互相连接。

针对上图的三层神经网络,第一层为输入层,神经网络中规定,输入层仅作为输入,不对输入值应用激活函数。最后一层为输出层,中间层我们称之为隐藏层。通过调整连接间的强度,我们就可以让模型学习起来了。


4. 在神经网络中追踪信号——正向传输流

以三层神经网络为例,我们计算一下信号在各层中的传输过程。


观察上图可知3个输入分别是0.9、0.1和0.8。因此,输入矩阵I如下图所示,由于输入层无需激活函数,所以我们已经完成了第一层输入层的计算。

Winput_hidden是输入层和隐藏层之间的权重矩阵,参数如下。

根据公式Xhidden=Winput_hidden · I,我们可以求得隐藏层各个节点的组合输入Xhidden。

有了各节点的组合输入之后,我们需要使用sigmoid函数进行激活。

根据公式Ohidden=sigmoid(Xhidden),我们可以得到隐藏层的输出值如下。

得到隐藏层输出Ohidden之后,按照相同的过程我们可以计算得到输出层。

Xoutput=Whidden_output·Ohidden


S函数激活输出层各节点的组合输入Xoutput。

最终得到神经网络的输出Ooutput。


5. 多个输出节点反向传播误差——反向传输流

得到神经网络的输出值之后,将输出值与期望值进行比较,计算出误差。我们需要使用这个误差值来更新链接权重,进而改进神经网络的输出值。

如何更新链接权重呢?神经网络按照不等分的思想,为较大链接权重的连接分配更多的误差。

以下图中的神经网络为例,每层有两个节点,输出o1由权重w1,1和w2,1决定。


反向传播时,误差e1会安比例分配给权重w1,1和w2,1。

考虑到上图中分数的分母是一种归一化因子。为了简化计算,我们可以忽略分母,仅将权重信息作为误差分配的重要因素,如下图所示。

这样,我们得到的最终矩阵表达如下图所示:

而后,基于隐藏层的误差errorhidden,我们可以继续计算输入成的误差,利用它调整输入层与隐藏层的权重。下图是误差信息流反向传播来修正链接权重的直观表达。


6. 我们实际上如何更新权重——误差选取和链接更新

由于我们没有办法通过直接求解来得到权重的最佳组合,所以适当转变思路,改为使用误差来指导如何调整链接权重,从而改进神经网络输出的总体答案。

这是什么意思呢?想象在一个非常复杂、有波峰波谷的地形以及连绵的群山峻岭。在黑暗中,伸手不见五指。你知道你是在一个山坡上,你需要到坡底。对于整个地形,你没有精确的地图,只有一把手电筒。你能做什么呢?你可能会使用手电筒,做近距离的观察。你不能使用手电筒看得更远,无论如何,你肯定看不到整个地形。你可以看到某一块土地看起来是下坡,于是你就小步地往这个方向走。通过这种方式,你不需要完整的地图,也不需要事先制定路线,你一步一个脚印,缓慢地前进,慢慢地下山。在数学上,这种方法称为梯度下降(gradient descent)。


误差选取

误差函数的表现形式有如下三种:

a)(目标值-实际值)由于正负误差相互抵消,我们得到误差总和为0。总和为零意味着没有误差。这明显不符合实际情况。

b) |目标值-实际值|  由于斜率在最小值附近不是连续的,这使得梯度下降方法无法很好地发挥作用,由于这个误差函数,我们会在V形山谷附近来回跳动,因此这个误差函数没有得到广泛应用。

c)(目标值-实际值)^2目前通用的误差计算方法是c),因为它有如下优点:

1.使用误差的平方,我们可以很容易使用代数计算出梯度下降的斜率。

2.误差函数平滑连续,这使得梯度下降法很好地发挥作用—没有间断,也没有突然的跳跃。

3.越接近最小值,梯度越小,这意味着,如果我们使用这个函数调节步长,超调的风险就会变得较小。

基于梯度下降方法的链接权重更新

为了使用梯度下降的方法,我们需要计算出误差函数相对于权重的斜率。以隐藏层和最终输出层之间的链接权重为例。

我们计算k层误差ek对j,k层权重链接wj,k的修正公式。

这个表达式表示了当权重wj,k改变时,误差E是如何改变的。这是误差函数的斜率,也就是我们希望使用梯度下降的方法到达最小值的方向。

首先,让我们展开误差函数,这是对目标值和实际值之差的平方进行求和,这是针对所有n个输出节点的和。

由于,在节点k的输出ok只取决于连接到这个节点的权重链接,所以上式中的偏微分可转化为

根据求导法则可以进行如下推导:



由于我们只对误差函数的斜率方向感兴趣,因此可以去掉常数2。这就是我们一直在努力要得到的最后答案,这个表达式描述了误差函数的斜率,这样我们就可以调整权重wj, k了。

仔细观察上面这个表达式:

1. 紫色部分是(目标值-实际值)。

2. 红色部分是sigmoid函数的微分表达。其中在sigmoid中的求和表达式也很简单,就是进入最后k层节点的信号之和,我们可以称之为ik。这是应用激活函数之前,进入节点的信号。

3.绿色部分是前一隐藏层节点j的输出。

到此为止,我们终于可以写出权重Wj,k的更新公式了。考虑到权重改变的方向与梯度方向相反和使用学习因子来调节变化这两个特性,我们得到的权重更新公式如下:

其中,符号α是学习率,它是人工设置的调节因子,这个因子可以调节这些变化的强度,确保不会超调。最终的权重更新矩阵如下图所示。


7. 准备数据

到此为止,我们已经完成了神经网络中所有核心要素的梳理,已经可以搭建一个属于自己的神经网络了。

不幸的是,并不是所有使用神经网络的尝试都能够成功,这有许多原因。其中一些问题可以通过改进训练数据、初始权重、设计良好的输出方案来解决。

输入

由于我们使用梯度来学习新的链接权重,根据如下的梯度公式可知,权重的改变取决于激活函数的梯度和k层节点的输入(Oj)。

当输入过大时会导致激活函数的梯度变小,学习能力下降;当输入过小时,由于(Oj)的影响,链接权重的梯度也会变小。因此,一个好的建议是重新调整输入值,将其范围控制在0.01到1.0。


输出

考虑到激活函数的输出值不会超出范围0~1,所以设置目标值时常见的使用范围为0.0~1.0。


随机初始权重

由于大的初始权重会造成大的信号传递给激活函数,导致网络饱和,从而降低网络学习到更好的权重的能力,因此应该避免大的初始权重值。数学家所得到的经验规则是,我们可以在一个节点传入链接数量平方根倒数的大致范围内随机采样,初始化权重。


注:文中所有图片均来自《Python神经网络编程》。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容