02 第一章、神经网络如何工作 1.9到1.16

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014772246/article/details/83246797

第 1 章、神经网络如何工作

1.9、使用矩阵乘法的三层神经网络示例

  本节介绍了使用矩阵的方法,来模拟在一个3*3的神经网络上各个数据的变化情况。
  首先,初始情况如下图所示:
在这里插入图片描述
  得到已知的数据,输入矩阵I:
在这里插入图片描述
  第一层到第二层的权值矩阵Winput_hidden
在这里插入图片描述
  第二层到第三层的权值矩阵Whidden_output
在这里插入图片描述
  然后计算第二层,即hidden层的输入Xhidden,由上一节的结论有:
  Xhidden=Winput_hidden·I 即:
在这里插入图片描述
  整理一下神经网络的示意图,如下所示:
在这里插入图片描述
  隐藏层的输入Xhidden有了,之后就是根据激活函数S计算隐藏层的输出Ohidden:
  Ohidden=sigmoid(Xhidden
  带入数字计算得:
在这里插入图片描述
  整理一下神经网络的示意图,如下所示:
在这里插入图片描述
  隐藏层的输出有了,之后的事情就是重复一遍之前的操作。
  Xoutput=Whidden_output·Ohidden即:
在这里插入图片描述
  整理一下神经网络的示意图,如下所示:
在这里插入图片描述
  输出层的输入Xoutput有了,之后就是根据激活函数S计算输出层的输出Ooutput
  Ooutput=sigmoid(Xoutput
  带入数字计算得:
在这里插入图片描述
  整理一下神经网络的示意图,最后结果如下所示:
在这里插入图片描述
  至此,模拟计算完毕!

1.10、学习来自多个节点的权重

  在最开始几节,讲到了通过调整节点线性函数的斜率参数,来调整简单的线性分类器。我们使用误差值,也就是节点生成了答案与所知正确答案之间的差值,引导我们进行调整。实践证明,误差与所必须进行的斜率调整量之间的关系非常简单,调整过程非常容易。
  但是,如果,一个误差是来自多个及节点的话,如何使用这个误差对各个节点的权值进行更新呢?
  本节介绍了两种情况:
  1、在所有造成误差的节点中平分误差,如下图所示:
在这里插入图片描述
  2、不等分误差,为较大链接权重的连接分配更多的误差,因为权重较大的节点对造成的误差的贡献较大,如下图所示:
在这里插入图片描述
  总结:我们在两件事上使用了权重,一个是将信号从输入层向前传播到输出层,另一个是将误差从输出向后传播到网络中,我们称此为反向传播。

1.11、多个输出节点反向传播误差

  1、误差的由来
  已知,神经网络如下图所述:
在这里插入图片描述
  则误差e1的定义为:由训练数据提供的所期望的输出值t1与实际输出值O1之间的差,即e1=(t1- O1)。
  2、更新误差
  我们使用e1的一部分来更新W1,1
在这里插入图片描述
  用e1的另一部分来更新W2,1
在这里插入图片描述
  即误差e1要分割更大的值给较大的权重,分割较小的值给较小的权重。

1.12、反向传播误差到更多层中

  神经网络通过调整链接权重进行学习。这种方法由误差引导,误差就是训练数据所给出正确答案和实际输出之间的差值。
  简单地说,在输出节点处的误差等于所需值与实际值之间的差值。
  然而,与内部节点相关联的误差并不显而易见。一种方法是按照链路权重的比例来分割输出层的误差,然后在每个内部节点处重组这些误差。
  公式如下所示:
在这里插入图片描述
  如果用图来表示:
在这里插入图片描述
在这里插入图片描述

1.13、使用矩阵乘法进行反向传播误差

  根据前一节说到的计算误差的方式,将其变为矩阵乘法,则如下所示:
在这里插入图片描述
  但是,这个式子稍显复杂,我们将归一化因子切除,如下所示:
在这里插入图片描述
  就有如下规律:
在这里插入图片描述
  这是个好事!!!
  但是,这样做可以吗?可以,原因如下:
  实践证明,这种相对简单的误差信号反馈方式,与我们先前相对复杂的方式一样有效。这本书的相关博客中,有一篇博文就显示了使用不同方法进 行反向误差传播的结果。如果这种相对简单的方式行之有效,那么我们就应该坚持这种方法。
  如果我们要进一步思考这个问题,那么我们可以观察到,即使反馈的误差过大或过小,在下一轮的学习迭代中,网络也可以自行纠正。重要的是,由于链接权重的强度给出了共享误差的最好指示,因此反馈的误差应该遵循链接权重的强度。

1.14、我们实际上如何更新权重

1、问题的提出

  输入的数据通过每一种权重组合都能计算出一个结果,如果将这些权重组合当成若干个分类器,就可以对这些结果进行分类,但是,找到适合的权重组合,这就得搞清楚权重在整个计算过程中扮演什么角色。
  很显然,权重特别多,这就导致了如果用一个表达式来表示会非常困难。太多的权重组合,我们难以逐个测试,以找到一种最好的组合。能不能找出一种方法来呢。

2、分析问题

  我们有更多可以悲观的理由。训练数据可能不足,不能正确地教会网络;训练数据可能有错误,因此即使我们的假设完全正确,神经网络可以学到一些东西,但却有缺陷;神经网络本身可能没有足够多的层或节点,不能正确地对问题的解进行建模。
  这意味着,我们必须承认这些限制,采取实际的做法。如果我们从实际出发可以找到一种办法,虽然这种方法从数学角度而言并不完美,但是由于这种方法没有做出虚假的理想化假设,因此实际上给我们带来了更好的结果。

3、设想,梯度下降

  现在,想象一下,这个复杂的地形是一个数学函数。梯度下降法给我们带来一种能力,即我们不必完全理解复杂的函数,从数学上对函数进行求解,就可以找到最小值。如果函数非常困难,我们不能用代数轻松找到最小值,我们就可以使用这个方法来代替代数方法。当然,由于我们采用步进的方式接近答案,一点一点地改进所在的位置,因此这可能无法给出精确解。但是,这比得不到答案要好。总之,我们可以使用更小的步子朝着实际的最小值方向迈进,优化答案,直到我们对于所得到的精度感到满意为止。

4、联系和区别

  这种酷炫的梯度下降法与神经网络之间有什么联系呢?好吧,如果我们将复杂困难的函数当作网络误差,那么下山找到最小值就意味着最小化误差。这样我们就可以改进网络输出0这就是我们希望做到的!
  我们要改变步子的大小,避免超调,这样就会避免在最小值的地方来回反弹,这是一个必要的优化。
  为了避免终止于局部最优化,我们从全部输入的不同点开始,多次训练神经网络,确保并不总是终止于局部最优化。
  梯度下降法是求解函数最小值的一种很好的办法,当函数非常复困难,并且不能轻易使用数学代数求解函数时,这种方法却发挥很好的作用。
  重要的是,当函数有很多参数,一些其他方法不切实际,或者得出错误答案,这种方法依然可以适用。
  这种方法也具有弹性,可以容忍不完善的数据,如果我们不能完地描述函数,或我们偶尔意外地走错了一步,也不会错得离谱。

扫描二维码关注公众号,回复: 4732049 查看本文章

5、误差函数

  误差函数的选择,我们使用误差的平方,我们可以很容易使用代数计算出梯度下降的斜率。而且,误差函数平滑连续,这使得梯度下降法很好地发挥作用没间断,也没有突然的跳跃。最重要的是,越接近最小值,梯度越小,这意味着,如果我们使用这个函数节步长,超调的风险就会变得较小。

6、梯度下降在神经网络中斜率的问题

  在神经网络中,误差E和权重矩阵W的斜率的关系如下式所示:
在这里插入图片描述
  这个表达式表示了当权重Wj,k改变时,误差E是如何改变的。这误差函数的斜率,也就是我们希望使用梯度下降的方法到达最小值方向。
  之前说了误差函数是使用误差的平方,那么展开有:
在这里插入图片描述
  因为对于所有的n个Ek,某一个确定的Ok和Ek只影响对应的Wj,k,所以,表达式可以写成:
在这里插入图片描述
  因为有链式法则:
在这里插入图片描述
  所以,可以写成如下形式:
在这里插入图片描述
  而Ok可以写成前一层Oj和前一层的W矩阵的乘积,所以有:
在这里插入图片描述
  因为一个定理:
在这里插入图片描述
  所以,可以做如下计算:
在这里插入图片描述
  最前面的2可以去掉,因为我们只对误差函数的斜率方向感兴趣,所以表达式前面的常数不影响方向,可以去掉。
  然后就有了如剩下表达式:
在这里插入图片描述
  这个函数是输出层和其前一层的,同理,我们可以得到输入层到隐藏层的函数:
在这里插入图片描述

7、对权重矩阵的调整

  记住权重改变的方向与梯度方向相反,我们使用学习因子,调节变化,我们可以根据特定的问题,调整这个学习因子。当我们建立线性分类器,作为避免被错误的训练样本导太远的一种方式,同时也为了保证权重不会由于持续的超调而在最小附近来回摆动,我们都发现了这个学习因子。用数学的形式来表达这个因子:
在这里插入图片描述
  通常称学习因子为学习率。
  所以,有如下表达:
在这里插入图片描述
  因为学习率只是一个常数,并没有真正改变如何组织矩阵乘法,因此将学习率去掉,所以有:
在这里插入图片描述
  写成矩阵形式为:
在这里插入图片描述
  如果加上学习率,得到最终公式:
在这里插入图片描述

1.15、权重更新成功范例

  如下图所示的一个神经网络:
在这里插入图片描述
  假如要更新权值W1,1
  1、第一项(tk-ok)得到误差e1=0.8
  2、S函数内的求和∑jwj,koj为(2.0*0.4)+(3.0*0.5)=2.3
  3、sigmoid 1/(1+e-2.3)为0.909。中间的表达式为0.909*(1-0.909)=0.083
  4、由于要的是权重W1,1,其中j=1,因此最后一项oj=o1=0.4
  5、这三项相乘,还要加前面的负号,最后得到-0.0265
  6、如果学习率为0.1,那么得出的改变量为-(0.1*0.02650)=+0.002650,因此新的W1,1就是原来的2.0加上0.002650等于2. 002650

1.16、准备数据

1、输入

  输入值应控制在0.0到1.0之间,不包含0.0,因为使用非常小或者非常大的输入可能会丧失精度。

2、输出

  目标输出值应控制在0.00到1.00之间,不包含0.00和1.00,因为超过这个范围的目标值是不可能到达的范围,因为激活函数sigmoid的值域就是0.00到1.00之间。

3、随机初始权重

  最好可以再-1.0到+1.0之间随机均匀地选择初始权重,比起使用非常大的范围要好。
  数学家所得到的经验规则是我们可以在一个节点传入链接数量平方根倒数的大致范围内随机采样,初化权重。因此,如果每个节点具有3条传入链接,那么初始权重的范围应在从-1/√(3)到+1/√(3),即-0.577到+0.577之间。如果每个节点具有100条传入链接那么权重的范围应该在-1/√(100)至+1/√(100),即-0.1到+0.1之间。
  直觉上说,这是有意义的。一些过大的初始权重将会在偏置方向偏置激活函数,非常大的权重将会使激活函数饱和。一个节点的传入接越多,就有越多的信号被叠加在一起。因此,如果链接更多,那么小权重的范围,这个经验法则是有道理的。
  如果你已经熟悉从概率分布中进行采样的思想,那么这一经验法则际上讲的是,从均值为0、标准方差等于节点传入链接数量平方根倒数正态分布中进行采样。但是,由于经验法则所假设的一些事情,可能不是真的,因此,我不必太担心要精确正确地理解这个法则。
在这里插入图片描述
  不管你做什么,禁止将初始权重设定为相同的恒定值,特别是禁止初始权重设定为0。
  如果设置为相同的很定值,因为误差是按照权重比例进行分割的,那么整个网络的权重将永远保持一样,训练不出结果。
  如果权重都为0,输入信号也会归0,取决于输入信号的权重更新函数也因此归零,网络丧失了更新权重的能力。

4、总结

  如果输入、输出和初始权重数据的准备与网络设计和实际求解的题不匹配,那么神经网络并不能很好地工作。
  一个常见的问题是饱和。在这个时候,大信号(这有时候是由权重带来的)导致了应用在信号上的激活函数的斜率变得非常缓。这降低了神经网络学习到更好权重的能力。
  另一个问题是零值信号或零值权重。这也可以使网络丧失学习更权重的能力。
  内部链接的权重应该是随机的,值较小,但要避免零值。如果节的传入链接较多,有一些人会使用相对复杂的规则,如减小这些重的大小。
  输入应该调整到较小值,但不能为零。一个常见的范围0.01~0.99,或-1.0~1.0,使用哪个范围,取决于是否匹配了问题。
  输出应该在激活函数能够生成的值的范围内。逻辑S函数是不可生成小于等于0或大于等于1的值。将训练目标值设置在有效的范之外,将会驱使产生越来越大的权重,导致网络饱和。一个合适范围为0.01~0.99。

另:一些说明
1、本博客仅用于学习交流,欢迎大家瞧瞧看看,为了方便大家学习。
2、如果原作者认为侵权,请及时联系我,我的qq是244509154,邮箱是[email protected],我会及时删除侵权文章。
3、我的文章大家如果觉得对您有帮助或者您喜欢,请您在转载的时候请注明来源,不管是我的还是其他原作者,我希望这些有用的文章的作者能被大家记住。
4、最后希望大家多多的交流,提高自己,从而对社会和自己创造更大的价值。

猜你喜欢

转载自blog.csdn.net/u014772246/article/details/83246797